| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Stückliste von einzelnen Membern einer iAssembly auslesen (2015 mal gelesen)
|
WilliamSpiderWeb Mitglied Dipl.-Ing. (FH) Physikalische Technik
Beiträge: 96 Registriert: 09.01.2012
|
erstellt am: 19. Feb. 2013 15:00 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, Ich versuche gerade folgendes in VBA zu realisieren: Ist eine Baugruppe geöffnet, möchte ich per Knopfdruck die Stückliste der Baugruppe auslesen und in eine csv-Datei schreiben. Handelt es sich bei der Baugruppe um eine iAssembly, soll die Stückliste für jedes iAssembly Member mit den entsprechenden Unterschieden geschrieben werden. Das Lesen der Stückliste an sich und das irgendwo hinschreiben ist kein Problem. Problematisch wird es beim Unterscheiden der einzelnen iAssembly Member. Ich weiß, in der Inventor Funktion "Stückliste" kann man in der Symbolleiste wählen, ob man die Spalte "Anzahl" für eine bestimmte Variante oder für alle Varianten anzeigen möchte. Im VBA-Code kann ich die Eigenschaft "ItemQuantity" der Klasse "BOMRow" auslesen. Das ist allerdings lediglich die Anzahl für das derzeit berechnete iAssembly-Member (Im Modell-Browser unter Tabelle die derzeit aktivierte Variante). Wenn mir jemand sagen kann, ob ich die "ItemQuantity" für bestimmte iAssembly Member auslesen kann wäre das super. Alternativ habe ich versucht (Workaround), den Inventor alle iAssembly Member nacheinander aktivieren zu lassen und dann die Stückliste auszulesen. In dem Fall bekomme ich bei drei Varianten zwar drei Stücklisten, allerdings sind die Werte der Spalte "Anzahl" in allen drei ausgelesenen Stückliste gleich - und zwar gleich der zu allererst aktivierten Variante. Mein Quellcode mit dem Workaround:
Code:
Public Sub BOMQuery() Dim oDoc As AssemblyDocument Dim bIAssembly As Boolean Set oDoc = ThisApplication.ActiveDocument If oDoc.DocumentType <> kAssemblyDocumentObject Then Exit Sub If oDoc.ComponentDefinition.iAssemblyFactory.TableRows.Count > 1 Then bIAssembly = True Else bIAssembly = False End If For Each row In oDoc.ComponentDefinition.iAssemblyFactory.TableRows oDoc.ComponentDefinition.iAssemblyFactory.DefaultRow = row Dim oBOM As BOM Set oBOM = oDoc.ComponentDefinition.BOM oBOM.StructuredViewFirstLevelOnly = False oBOM.StructuredViewEnabled = True Dim oBOMView As BOMView Set oBOMView = oBOM.BOMViews.Item("Strukturiert") Debug.Print Debug.Print Debug.Print "Zeichn.-Nr."; Tab(15); "Rev"; Tab(30); "Art.-Nr."; Tab(45); "Menge"; Tab(60); "Zeichn.-Nr."; Tab(75); "Rev"; Tab(90); "Art.-Nr." Debug.Print "--------------------------------------------------------------------------------------------------------------------" Call QueryBOMRowProperties(oDoc.ComponentDefinition, oBOMView.BOMRows) Next End Sub Private Sub QueryBOMRowProperties(oCompDef As ComponentDefinition, oBOMRows As BOMRowsEnumerator) Dim sPropSet As String sPropSet = "Inventor User Defined Properties" Dim ZNr1 As String Dim Rev1 As String Dim ArtNr1 As String ZNr1 = readProperty(oCompDef, sPropSet, "Zeichnungsnummer") Rev1 = readProperty(oCompDef, sPropSet, "Revision") ArtNr1 = readProperty(oCompDef, sPropSet, "Artikelnummer") Dim i As Long For i = 1 To oBOMRows.Count Dim oRow As BOMRow Set oRow = oBOMRows.Item(i) Set oCompDef = oRow.ComponentDefinitions.Item(1) Dim Menge As String Dim ZNr2 As String Dim Rev2 As String Dim ArtNr2 As String Menge = oRow.ItemQuantity ZNr2 = readProperty(oCompDef, sPropSet, "Zeichnungsnummer") Rev2 = readProperty(oCompDef, sPropSet, "Revision") ArtNr2 = readProperty(oCompDef, sPropSet, "Artikelnummer") 'If Int(Menge) > 0 Then Debug.Print ZNr1; Tab(15); Rev1; Tab(30); Artnr1; Tab(45); Menge; Tab(60); ZNr2; Tab(75); Rev2; Tab(90); ArtNr2 If Not TypeOf oCompDef Is VirtualComponentDefinition Then If Not oRow.ChildRows Is Nothing Then Call QueryBOMRowProperties(oCompDef, oRow.ChildRows, ItemTab) End If End If 'End If Next End Sub
Mein Ergebnis sieht folgendermaßen aus: (Zur besseren Übersicht wurden hier die meisten Stücklisteneinträge und alle die Artikelnummern entfernt. Die betroffenen Zeilen wurden fett gedruckt)
Code:
Zeichn.-Nr. Rev Art.-Nr. Menge Zeichn.-Nr. Rev Art.-Nr. -------------------------------------------------------------------------------------------------------------------- Z30060-01 01 1 Z30051-01 01 Z30060-01 01 1 Z30052-01 02 Z30060-01 01 4 Z30050-04 00 Z30060-01 01 1 Z30054-01 01 Z30060-01 01 1 Z30055-01 01 Z30069-01 00 3 Z30066-01 01 Z30060-01 01 0 Z30070-01 01 Zeichn.-Nr. Rev Art.-Nr. Menge Zeichn.-Nr. Rev Art.-Nr. -------------------------------------------------------------------------------------------------------------------- Z30060-02 01 1 Z30051-01 01 Z30060-02 01 1 Z30052-01 02 Z30060-02 01 4 Z30050-04 00 Z30060-02 01 1 Z30054-01 01 Z30060-02 01 1 Z30055-01 01 Z30069-01 00 3 Z30066-01 01 Z30060-02 01 0 Z30070-01 01
Aus diesen Tabellen kann man nun ablesen, dass pro Zeile das rechte Zeichnungsnummer-Revisions-Paar X-mal im linken Zeichnungsnummer-Revisions-Paar verbaut ist. In der Variante Z30060-02 müsste nun eigentlich die Z30055-01 mit 0x und die Z30070-01 mit 1x angegeben sein. Warum passiert das nicht? Viele Grüße, Alexander Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 19. Feb. 2013 18:50 <-- editieren / zitieren --> Unities abgeben: Nur für WilliamSpiderWeb
Hallo Ich kann es grad nicht testen (keine iAssembly da), aber versuch mal nach dem
Code: oDoc.ComponentDefinition.iAssemblyFactory.DefaultRow = row
einfach ein
Code: oDoc.Update
Vielleicht aktualisiert Inventor nach dem Umschalten nicht automatisch.------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WilliamSpiderWeb Mitglied Dipl.-Ing. (FH) Physikalische Technik
Beiträge: 96 Registriert: 09.01.2012
|
erstellt am: 20. Feb. 2013 09:50 <-- editieren / zitieren --> Unities abgeben:
Danke für die schnelle Antwort. Der Lösungsvorschlag liefert aber leider auch nicht den Erfolg. Sowohl mit als auch ohne
Code: oDoc.update
sieht man in der geöffneten Baugruppe, dass alle iAssembly-Tabelleneinträge nacheinander ausgewählt werden. Trotzdem wird mir immer die selbe Stückliste ausgegeben.Ich hatte auch schon versucht, eine ca. 2 sek. lange Pause nach dem oDoc.update einzuprogrammieren, für den Fall dass vielleicht der Quellcode schneller abgearbeitet wird, als das Modell aktualisiert wird. Hat aber auch nichts gebracht. [Diese Nachricht wurde von WilliamSpiderWeb am 20. Feb. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WilliamSpiderWeb Mitglied Dipl.-Ing. (FH) Physikalische Technik
Beiträge: 96 Registriert: 09.01.2012 DELL Precision 3620 Core i7-6900K @ 4,00 GHz 16,00GB RAM Grafik: AMD FirePro W5100 --- Win7 Pro 64bit SP1 --- Inventor Professional 2021 Vault Workgroup 2021 Visual Basic .NET 2010 Express ... dabei seit Inventor 5
|
erstellt am: 20. Feb. 2013 11:58 <-- editieren / zitieren --> Unities abgeben:
Ich weiß nicht genau, was ich jetzt anders gemacht habe, aber nu funktioniert es. Irgendwo beim Umstrukturieren des "Spagetti-Codes" muss ich was entscheidendes geändert haben. Das Problem hat mich nun fast nen ganzen Tag gekostet. Trotzdem danke. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 20. Feb. 2013 14:46 <-- editieren / zitieren --> Unities abgeben: Nur für WilliamSpiderWeb
|
MichlB1003 Mitglied Konstrukteur
Beiträge: 42 Registriert: 07.03.2013
|
erstellt am: 11. Apr. 2013 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für WilliamSpiderWeb
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|