Die Inventor API erlaubt es mit einfachen Mitteln über verbaute Komponenten in Baugruppen zu iterieren. Dies kann nützlich sein, wenn eine Konstruktion finalisiert wird und man bspw. Prüfen möchte, ob alle verbauten Komponenten sauber gepflegte Properties, Stücklistenoptionen, etc. gesetzt haben.
Autodesk hat eine ausführliche Hilfeseite, die sich dem Thema widmet und das programmspezifische Wording erläutert: File and Document References
Grundsätzlich wird unterschieden zwischen File Obejects und Document Objects. Ersteres behandelt die referenzierten Komponenten auf Datei- und Arbeitsspeicherebene, zweiteres auf Dokumentenebene. In diesem Post werden die Document Objects genutzt, genauer gesagt die Properties:
- AllReferencedDocuments, die rekursiv Komponenten aller Baugruppenebenen auflistet.
- ReferencedDocuments, die nur die erste Ebene verbauter Komponenten auflistet.
Zusätzlich gibt es noch das Konzept der Occurrences, das Inventor unter der Component Definition eines Baugruppendokuments bereit stellt. Die Properties AllReferencedDocuments und ReferencedDocuments liefern immer eine eindeutige Liste mit referenzierten Dokumenten, können aber keine Auskunft darüber geben, wie oft eine Komponente verbaut ist. Dies kann für die erste Baugruppenebene über die Occurrences erfolgen.
Beispielbaugruppe
Für die folgenden drei Code-Beispiele wird die Beispielhafte Baugruppe Nested Assembly.iam mit insgesamt 3 verschachtelten Baugruppenebenen und 7 einzigarten Komponenten verwendet.
Der strukturelle Baugruppenaufbau als Tree Diagram:
Nested Assembly.iam
├── Welded Assembly.iam
│ ├── SheetMetalPart.ipt
│ ├── RevolvedPart.ipt
│ └── Alphabet.iam
│ ├── A.ipt
│ └── B.ipt
├── LST_Bender.ipt
├── LST_Bender.ipt
├── SheetMetalPart.ipt
└── RevolvedPart.ipt
Code-Beispiele
Die folgenden drei Beispiele zeigen sowohl die Methodik mittels AllReferencedDocuments, ReferencedDocuments und Occurrences. Es gilt zu beachten, wie alle drei Methoden eine unterschiedliche Anzahl an referenzierten Dokumenten im Property Count zurückliefern.
Zum besseren Verständnis werden für alle drei Methoden identischer Code demonstriert, der für jedes referenzierte Dokument den Dateinamen im iLogic Logger ausgibt.
AllReferencedDocuments
Diese Methode nutzt das DocumentsEnumerator Object, um über alle referenzierten Dokumente zu iterieren:
Dim oDoc As Document = ThisDoc.Document
Dim oAllRefDocs As DocumentsEnumerator = oDoc.AllReferencedDocuments
For Each oRefDoc As Object In oAllRefDocs
Dim sFileName As String = System.IO.Path.GetFileName(oRefDoc.FullFileName)
Logger.Info("Filename: {0}", sFileName)
Next
Es werden alle 7 Dokumente, über alle Baugruppenebenen, in einer Liste mit eindeutigen Werten zurückgeliefert:
Die Methode eignet sich hervorragend, wenn man alle verbauten Komponenten, über alle Baugruppenebenen, auf bestimmte Bedingungen prüfen möchte.
ReferencedDocuments
Diese Methode nutzt ebenfalls das DocumentsEnumerator Object, um über alle referenzierten Dokumente der ersten Baugruppenebene zu iterieren:
Dim oDoc As Document = ThisDoc.Document
Dim oRefDocs As DocumentsEnumerator = oDoc.ReferencedDocuments
For Each oRefDoc As Object In oRefDocs
Dim sFileName As String = System.IO.Path.GetFileName(oRefDoc.FullFileName)
Logger.Info("Filename: {0}", sFileName)
Next
Es werden lediglich 4 Dokumente in einer Liste mit eindeutigen Werten zurückgeliefert, die identisch mit den verbauten Komponenten auf der ersten Baugruppenebene ist. Untergeordnete Bauteile und weitere verschachtelte Baugruppen, abseits der ersten Baugruppenebene, werden nicht berücksichtigt:
Occurrences
Occurrences sind, wie bereits erwähnt, ein Sonderfall, da sie keine eindeutige Liste zurückliefern, sondern auch Auskunft über die Anzahl der verbauten Komponenten auf der ersten Baugruppenebene geben können.
Dim oDoc As Document = ThisDoc.Document
Dim oOccurences As ComponentOccurrences = oDoc.ComponentDefinition.Occurrences
For Each oOccurrence As ComponentOccurrence In oOccurences
Dim sFileName As String = System.IO.Path.GetFileName(oOccurrence.Definition.Document.FullFileName)
Logger.Info("Filename: {0}", sFileName)
Next
Es werden 5 Dokumente zurückgeliefert, das das Bauteil LST_Bender.ipt auf der ersten Baugruppenebene zweimal platziert wurde:
Anwendungsfall
Möchte man bspw. herausfinden, ob eine der verbauten Komponenten ein bestimmtes Property nicht gepflegt hat, kann man dafür das AllReferencedDocuments Property nutzen. Zum besseren Verständnis von Inventors Property Sets sei an dieser Stelle der Post iLogic: Propertysets empfohlen.
Als Beispiel werden alle Bauteile gelistet, die keinen Eintrag im Project Property Part Number besitzen. Exemplarisch haben alle Dokumente einen gepflegten Wert im Property Part Number bis auf das Bauteil LST_Bender.ipt:
Für die Abfrage werden zwei kombinierte Methoden aus dem Namespace System.String verwendet. IsNullOrWhiteSpace() prüft ob ein Wert vorhanden ist und ob dieser ein Leerzeichen ist und IsNullOrEmpty() prüft ob ein Wert vorhanden ist und dieser gar kein hinterlegtes Zeichen besitzt:
Dim oDoc As Document = ThisDoc.Document
Dim oAllRefDocs As DocumentsEnumerator = oDoc.AllReferencedDocuments
For Each oRefDoc As Object In oAllRefDocs
Dim sFileName As String = System.IO.Path.GetFileName(oRefDoc.FullFileName)
Dim sPartNumber As String = oRefDoc.PropertySets.Item("Design Tracking Properties").Item("Part Number").Value
If (System.String.IsNullOrWhiteSpace(sPartNumber) Or System.String.IsNullOrEmpty(sPartNumber)) Then
Logger.Info("Filename: {0} hat keinen Eintrag im Property 'Part Number'.", sFileName)
End If
Next
Resultat: