Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Teileanzahl in Stückliste

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



Sehen Sie sich das Profil von 3D-User an!   Senden Sie eine Private Message an 3D-User  Schreiben Sie einen Gästebucheintrag für 3D-User

Beiträge: 75
Registriert: 26.12.2012

HP Workstation Z440
Win10 64Bit
IV 2018

erstellt am: 30. Dez. 2017 23:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von BernoAn an!   Senden Sie eine Private Message an BernoAn  Schreiben Sie einen Gästebucheintrag für BernoAn

Beiträge: 164
Registriert: 16.01.2014

erstellt am: 04. Jan. 2018 07:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 3D-User 10 Unities + Antwort hilfreich

Hallo

Wie wäre es deine Schleife 2mal auszuführen.
Beim erstenmal zählst du die Bauteile und beim zweitenmal
schreibst du das Array?

Gruß
Berno

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Ticky72
Mitglied



Sehen Sie sich das Profil von Ticky72 an!   Senden Sie eine Private Message an Ticky72  Schreiben Sie einen Gästebucheintrag für Ticky72

Beiträge: 35
Registriert: 17.02.2016

Inventor 2019
Win7 64Bit

erstellt am: 04. Jan. 2018 08:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 3D-User 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von 3D-User an!   Senden Sie eine Private Message an 3D-User  Schreiben Sie einen Gästebucheintrag für 3D-User

Beiträge: 75
Registriert: 26.12.2012

HP Workstation Z440
Win10 64Bit
IV 2018

erstellt am: 04. Jan. 2018 09:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von Ticky72 an!   Senden Sie eine Private Message an Ticky72  Schreiben Sie einen Gästebucheintrag für Ticky72

Beiträge: 35
Registriert: 17.02.2016

Inventor 2019
Win7 64Bit

erstellt am: 04. Jan. 2018 11:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 3D-User 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Ticky72 an!   Senden Sie eine Private Message an Ticky72  Schreiben Sie einen Gästebucheintrag für Ticky72

Beiträge: 35
Registriert: 17.02.2016

Inventor 2019
Win7 64Bit

erstellt am: 05. Jan. 2018 10:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 3D-User 10 Unities + Antwort hilfreich

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 ObjectCollection

Public 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



Sehen Sie sich das Profil von RolandD an!   Senden Sie eine Private Message an RolandD  Schreiben Sie einen Gästebucheintrag für RolandD

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 3D-User 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von 3D-User an!   Senden Sie eine Private Message an 3D-User  Schreiben Sie einen Gästebucheintrag für 3D-User

Beiträge: 75
Registriert: 26.12.2012

HP Workstation Z440
Win10 64Bit
IV 2018

erstellt am: 05. Jan. 2018 21:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Stuckliste.jpg

 
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



Sehen Sie sich das Profil von Ticky72 an!   Senden Sie eine Private Message an Ticky72  Schreiben Sie einen Gästebucheintrag für Ticky72

Beiträge: 35
Registriert: 17.02.2016

Inventor 2019
Win7 64Bit

erstellt am: 08. Jan. 2018 08:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 3D-User 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von BernoAn an!   Senden Sie eine Private Message an BernoAn  Schreiben Sie einen Gästebucheintrag für BernoAn

Beiträge: 164
Registriert: 16.01.2014

erstellt am: 08. Jan. 2018 11:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für 3D-User 10 Unities + Antwort hilfreich

Hallo

Such mal hier im Forum

"Bauteilanzahl in asm auslesen"

Diese Version funktioniert

[URL=https://ww3.cad.de/foren/ubb/Forum258/HTML/001362.shtml][/URL]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

3D-User
Mitglied



Sehen Sie sich das Profil von 3D-User an!   Senden Sie eine Private Message an 3D-User  Schreiben Sie einen Gästebucheintrag für 3D-User

Beiträge: 75
Registriert: 26.12.2012

HP Workstation Z440
Win10 64Bit
IV 2018

erstellt am: 08. Jan. 2018 19:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz