| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Teileanzahl in Stückliste (2201 mal gelesen)
|
3D-User Mitglied
Beiträge: 75 Registriert: 26.12.2012 HP Workstation Z440 Win10 64Bit IV 2018
|
erstellt am: 30. Dez. 2017 23:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum Ich möchte die Stückliste aus einer Baugruppe in ein zweidimensionales Array schreiben um sie anschließend, etwas verändert in eine .txt Datei exportieren zu können. In diesem Array sind alle Unterbaugruppen aufgelöst und so die Gesamtzahl der Teile einer Baugruppe enthalten. Das funktioniert bisher auch genauso wie ich es will allerdings mit einem statischen Array. Da meine Baugruppen sehr unterschiedlich groß sind (2 – 3000 Teile) wäre ein dynamisches Array doch sicher sinnvoll. Nun zu meiner Frage. Da ich ein zweidimensionales dynamisches Array nicht beliebig ReDimensionieren kann brauche ich schon am Anfang meines Programmes die Information wie viele Teile die Gesamtstückliste enthält. In „oBOMView.BOMRows.Count“ sind nur die Teile der Hauptbaugruppe, nicht die der Unterbaugruppen? Wie kann ich die Anzahl aller Teile in einer Baugruppe abfragen? 3D-User
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BernoAn Mitglied
Beiträge: 164 Registriert: 16.01.2014
|
erstellt am: 04. Jan. 2018 07:43 <-- editieren / zitieren --> Unities abgeben: Nur für 3D-User
|
Ticky72 Mitglied
Beiträge: 35 Registriert: 17.02.2016 Inventor 2019 Win7 64Bit
|
erstellt am: 04. Jan. 2018 08:34 <-- editieren / zitieren --> Unities abgeben: Nur für 3D-User
Hallo 3D-User, ich muss leider nochmal Fragen was du genau Zählen willst? Da die Anzahl der Bauteile in der Stückliste im Reiter "Nur Bauteile" zurückgegeben wird, vermute ich mal du brauchst auch noch die Anzahl aller Baugruppen die in deine Hauptbaugruppe verbaut sind? Grüße Helmut Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
3D-User Mitglied
Beiträge: 75 Registriert: 26.12.2012 HP Workstation Z440 Win10 64Bit IV 2018
|
erstellt am: 04. Jan. 2018 09:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum Die Anzahl der Bauteile abfragen genügt nicht! Ich brauche die Anzahl aller Baugruppen in allen Unterbaugruppen, und ich brauche die Anzahl aller Bauteile in den einzelnen Baugruppen. Es kann durchaus sein das eine Schraube in der Baugruppe 2, 6 und 18 verbaut ist, dafür brauche ich dann drei Zeilen im Array. Natürlich, wenn eine Schraube in derselben Baugruppe 5x verbaut wurde ist das nur eine Zeile. Vermutlich hat BernoAn Recht, man muss im ersten Durchlauf alle Teile Zählen, dann das Array Dimensionieren und dann die Teile Reinschreiben. Den Zeiten Teil davon hab ich schon, fehlt nur noch der Zählalgorithmus. Vielleicht hab ihr da ein Beispiel wie ich das am effizientesten schreiben kann? 3D-User Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ticky72 Mitglied
Beiträge: 35 Registriert: 17.02.2016 Inventor 2019 Win7 64Bit
|
erstellt am: 04. Jan. 2018 11:05 <-- editieren / zitieren --> Unities abgeben: Nur für 3D-User
Hallo 3D-User, in der Inventor Hilfe gibt es ein Beispiel: siehe 'Using the BOM APIs API Sample' habe es umgeschrieben: Code:
Public Sub Baugruppen_Zaehlen() Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument 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") MsgBox "Ich habe " & Fun_Baugruppen_Zaehlen(oBOMView.BOMRows, 0, 1) & " Baugruppen/Bauteile gezählt" End Sub Function Fun_Baugruppen_Zaehlen(oBOMRows As BOMRowsEnumerator, iABG As Long, iBGs As Long) As Long Dim i As Long For i = 1 To oBOMRows.Count Dim oRow As BOMRow Set oRow = oBOMRows.Item(i) Dim oCompDef As ComponentDefinition Set oCompDef = oRow.ComponentDefinitions.Item(1) If TypeOf oCompDef Is VirtualComponentDefinition Then If oCompDef.Document.DocumentType = kAssemblyDocumentObject Then iABG = iABG + oRow.ItemQuantity End If If oCompDef.Document.DocumentType = kPartDocumentObject Then iABG = iABG + 1 End If Else If oCompDef.Document.DocumentType = kAssemblyDocumentObject Then iABG = iABG + oRow.ItemQuantity iBGs = oRow.ItemQuantity End If If oCompDef.Document.DocumentType = kPartDocumentObject Then iABG = iABG + (1 * iBGs) End If 'Recursively iterate child rows if present. If Not oRow.ChildRows Is Nothing Then Call Fun_Baugruppen_Zaehlen(oRow.ChildRows, iABG, iBGs) End If End If Next 'Baugruppenmultiplikator auf 1 zurücksetzen iBGs = 1 Fun_Baugruppen_Zaehlen = iABG End Function
Wichtig: Der Quelltext ist nicht fertig und soll nur als Startpunkt dienen. Grüße Helmut Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ticky72 Mitglied
Beiträge: 35 Registriert: 17.02.2016 Inventor 2019 Win7 64Bit
|
erstellt am: 05. Jan. 2018 10:38 <-- editieren / zitieren --> Unities abgeben: Nur für 3D-User
Hallo, hier noch mal das Ganze ein wenig erweitert. Jetzt werden die Baugruppen, egal wo sie sich in der Baumstruktur befinden, in einer Kollektion zusammengefasst. Dadurch sollten Baugruppen die mehrfach vorkommen nur einfach gezählt werden. Das Zählen der Bauteile wird nach wie vor über die BOM-Struktur und der Anzahl der Baugruppen im BOM-Strukturknoten errechntet. Da ich nur wenige Dateien zum Testen habe, kann ich leider nicht feststellen ob das richtig errechnet wird. Hoffe aber trotzdem dass es vielleicht ein wenig weiter helfen kann. Code:
Option Explicit Dim oOcBG As ObjectCollectionPublic Sub Baugruppen_Auswerten() Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument 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") Set oOcBG = ThisApplication.TransientObjects.CreateObjectCollection Dim oBG As Object For Each oBG In Fun_Baugruppen_Col(oBOMView.BOMRows) Debug.Print oBG.FullFileName Next MsgBox "Ich habe " & Fun_Bauteile_Zaehlen(oBOMView.BOMRows, 0, 1) & " Bauteile in " & oOcBG.Count & " Baugruppen gezählt" End Sub Function Fun_Baugruppen_Col(oBOMRows As BOMRowsEnumerator) As ObjectCollection Dim i As Long For i = 1 To oBOMRows.Count Dim oRow As BOMRow Set oRow = oBOMRows.Item(i) Dim oCompDef As ComponentDefinition Set oCompDef = oRow.ComponentDefinitions.Item(1) If TypeOf oCompDef Is VirtualComponentDefinition Then If oCompDef.Document.DocumentType = kAssemblyDocumentObject Then ' End If If oCompDef.Document.DocumentType = kPartDocumentObject Then ' End If Else If oCompDef.Document.DocumentType = kAssemblyDocumentObject Then Dim oBG As Object Set oBG = oBOMRows.Item(i).ComponentDefinitions.Item(1).Document oOcBG.Add oBG End If If oCompDef.Document.DocumentType = kPartDocumentObject Then ' End If 'Recursively iterate child rows if present. If Not oRow.ChildRows Is Nothing Then Call Fun_Baugruppen_Col(oRow.ChildRows) End If End If Next Set Fun_Baugruppen_Col = oOcBG End Function Function Fun_Bauteile_Zaehlen(oBOMRows As BOMRowsEnumerator, iABG As Long, iBGs As Long) As Long Dim i As Long For i = 1 To oBOMRows.Count Dim oRow As BOMRow Set oRow = oBOMRows.Item(i) Dim oCompDef As ComponentDefinition Set oCompDef = oRow.ComponentDefinitions.Item(1)
If TypeOf oCompDef Is VirtualComponentDefinition Then If oCompDef.Document.DocumentType = kAssemblyDocumentObject Then ' End If If oCompDef.Document.DocumentType = kPartDocumentObject Then iABG = iABG + 1 End If Else If oCompDef.Document.DocumentType = kAssemblyDocumentObject Then iBGs = oRow.ItemQuantity End If If oCompDef.Document.DocumentType = kPartDocumentObject Then iABG = iABG + (1 * iBGs) End If 'Recursively iterate child rows if present. If Not oRow.ChildRows Is Nothing Then Call Fun_Bauteile_Zaehlen(oRow.ChildRows, iABG, iBGs) End If End If Next 'Baugruppenmultiplikator auf 1 zurücksetzen iBGs = 1 Fun_Bauteile_Zaehlen = iABG End Function
Schönes WE Helmut Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RolandD Mitglied
Beiträge: 533 Registriert: 07.01.2005 i7-9700k 32GB DDR4-RAM Nvidia RTX 2060 SSD 970 m.2 Win10-64 (21H2) AIP 2020.3 Dell U3417W
|
erstellt am: 05. Jan. 2018 18:30 <-- editieren / zitieren --> Unities abgeben: Nur für 3D-User
Zitat: Original erstellt von Ticky72: Hallo,Jetzt werden die Baugruppen, egal wo sie sich in der Baumstruktur befinden...
Hast du beachtet, dass alle Bauteile und Unter-Baugruppen in einer auf Referenz gesetzten BG nicht gezählt werden dürfen? ------------------ Gruß Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
3D-User Mitglied
Beiträge: 75 Registriert: 26.12.2012 HP Workstation Z440 Win10 64Bit IV 2018
|
erstellt am: 05. Jan. 2018 21:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Ticky72 Vielen Dank für die Mühe die du dir bisher schon gemacht hast. Ich hab natürlich deinen Code ausgiebig getestet und bin zu folgendem Ergebnis gekommen. Bei einer Testbaugruppe weiß ich dass es 52 Zeilen sein müssen. Deine erste Programmversion brachte als Ergebnis: 88 Zeilen. Deine zweite Programmversion brachte als Ergebnis: 57 Zeilen. Das eine Baugruppen in verschiedenen Unterbaugruppen mehrfach vorkommt ist durchaus möglich, daher sollten diese auch gezählt werden! Was ich bräuchte ist von einer Strukturierten Stückliste die Summe aller Einträge/Zeilen wenn alle Unterbaugruppen aufgeklappt sind (so wie im Bild dargestellt sind es 52). Anbei die Testbaugruppe zur besseren Kontrolle (wenn es klappt). 3D-User
http://ww3.cad.de/foren/ubb/uploads/3D-User/80-Turbine.zip
[Diese Nachricht wurde von 3D-User am 05. Jan. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ticky72 Mitglied
Beiträge: 35 Registriert: 17.02.2016 Inventor 2019 Win7 64Bit
|
erstellt am: 08. Jan. 2018 08:39 <-- editieren / zitieren --> Unities abgeben: Nur für 3D-User
Zitat: Original erstellt von RolandD:
Hast du beachtet, dass alle Bauteile und Unter-Baugruppen in einer auf Referenz gesetzten BG nicht gezählt werden dürfen?
Hallo, leider habe ich nicht beachtet wie wenig Ahnung ich eigentlich über Baugruppen habe. Dachte ich anfangs, das Grundgerüst des Quelltextes aus der Inventor Hilfe wäre ein guter Ausgangspunkt für die Aufgabenstellung, so ärgere ich mich mittlerweile darüber, das Ganze so unüberlegt und vorschnell gepostet zu haben. So kann ich das Ganze nur noch als Beispiel dafür sehen, wie es nicht funktioniert. Gruß Helmut
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BernoAn Mitglied
Beiträge: 164 Registriert: 16.01.2014
|
erstellt am: 08. Jan. 2018 11:36 <-- editieren / zitieren --> Unities abgeben: Nur für 3D-User
|
3D-User Mitglied
Beiträge: 75 Registriert: 26.12.2012 HP Workstation Z440 Win10 64Bit IV 2018
|
erstellt am: 08. Jan. 2018 19:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Ticky72 Trotzdem Danke für deine Mühe! Mittlerweile hab ich von Dennis.Ossadnik/AD-Inventor Forum eine gute Lösung bekommen. Für alle die es auch brauchen können hier der Code: Code: Sub BomRowsStructured() Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument 'Wenn die Struktur-Stückliste nicht aktiviert ist, dann wird das jetzt erledigt If oDoc.ComponentDefinition.BOM.StructuredViewEnabled = False Then oDoc.ComponentDefinition.BOM.StructuredViewEnabled = True End If 'Wenn die Struktur-Stückliste einstufig ist, wird sie auf mehrstufig umgestellt If oDoc.ComponentDefinition.BOM.StructuredViewFirstLevelOnly = True Then oDoc.ComponentDefinition.BOM.StructuredViewFirstLevelOnly = False End If Dim iRows As Integer iRows = 0 Dim tmp As Object For Each tmp In oDoc.ComponentDefinition.BOM.BOMViews If tmp.ViewType = kStructuredBOMViewType Then Call BomRowsStructuredChildRow(tmp.BomRows, iRows) End If Next MsgBox ("Die Struktur-Stückliste hat " & iRows & " Zeilen.") End Sub Sub BomRowsStructuredChildRow(tmpBomRowEnu As BOMRowsEnumerator, iRows As Integer) Dim tmpRow As BOMRow For Each tmpRow In tmpBomRowEnu iRows = iRows + 1 If Not tmpRow.ChildRows Is Nothing Then Call BomRowsStructuredChildRow(tmpRow.ChildRows, iRows) End If Next End Sub
3D-User
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |