Inventor (VBA): Summe aller Bauteile in Stückliste

Inventor (VBA): Summe aller Bauteile in Stückliste

h_schuetzeneder
Enthusiast Enthusiast
4.026Aufrufe
14Antworten
Nachricht 1 von 15

Inventor (VBA): Summe aller Bauteile in Stückliste

h_schuetzeneder
Enthusiast
Enthusiast

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

 


@h_schuetzeneder,

Die Themenüberschrift wurde zum besseren Auffindbarkeit editiert von Dennis.Ossadnik
Original: Summme aller Bauteile in Stückliste


 

0 „Gefällt mir“-Angaben
Akzeptierte Lösungen (1)
4.027Aufrufe
14Antworten
Antworten (14)
Nachricht 2 von 15

S_May
Mentor
Mentor

Hallo @h_schuetzeneder,

 

Willkommen im Forum.Hallo.

Bitte bei Fragen zum System bitte immer mit angeben:
• Aktuelle Inventor Version mit aktuelle SP
• Betriebssystem mit Grafikkarte, RAM, CPU usw.

Bei Fragen zum Modellierung mit angeben:
• Modelle oder Baugruppen mit pack and go packen und anhängen
• Bilder der Probleme
•screencast

https://knowledge.autodesk.com/de/community/screencast
https://knowledge.autodesk.com/de/support/inventor-products/learn-explore/caas/CloudHelp/cloudhelp/2...

Und dann kann es schon losgehen mit der Analyse…

 

Wenn ich das richtig verstehe, willst Du eine Summenstückliste haben, über eine BG die mehrere unter BG´s enthält, und in der Summe sind das bis ca. 3000 Bauteile?

0 „Gefällt mir“-Angaben
Nachricht 3 von 15

h_schuetzeneder
Enthusiast
Enthusiast

Eigentlich will ich nur eine Zahl rausfinden, nämlich wie viele Zeilen mein dyn. Array haben muss damit die Gesamtstückliste (mit aufgelösten Unter BG’s) rein passt.

(Vielleicht sollte ich noch erwähnen das ich mit VBA Programmiere!)

0 „Gefällt mir“-Angaben
Nachricht 4 von 15

S_May
Mentor
Mentor
0 „Gefällt mir“-Angaben
Nachricht 5 von 15

Juergen_Wagner
Advisor
Advisor

Ohne mir das jetzt genauer angeschaut zu haben bekommst du mit allrefdocs die Anzahl aller referenzierter Datei also auch Referenzen und Phantom Komponenten.
https://inventorfaq.blogspot.de/2017/02/inventor-automatisieren-programmieren.html

0 „Gefällt mir“-Angaben
Nachricht 6 von 15

Dennis.Ossadnik
Autodesk Support
Autodesk Support

Hallo @h_schuetzeneder.

 

Frohes neues Jahr! Smiley (überglücklich)

 

Wenn ich es richtig verstanden habe, dann möchtest Du im Vorfeld prüfen, wie viele Zeilen die Stückliste "Nur Bauteile" hat, damit es bei dem Aufspannen des Arrays etwas einfacher ist?

 

Hier ist ein kleiner VBA-Code, wie man das abfragen könnte:

 

Sub BomRows()

'Ermitteln, wie viele Einträge es bei der Stückliste "NUR BAULTEILE" im Moment gibt.

Dim oDoc As AssemblyDocument
Set oDoc = ThisApplication.ActiveDocument

If oDoc.ComponentDefinition.BOM.PartsOnlyViewEnabled = False Then
    oDoc.ComponentDefinition.BOM.PartsOnlyViewEnabled = True
End If

Dim iRows As Integer
iRows = -1

Dim tmp As Object
For Each tmp In oDoc.ComponentDefinition.BOM.BOMViews

    If tmp.ViewType = kPartsOnlyBOMViewType Then
        iRows = tmp.BomRows.Count
    End If

Next

If iRows > -1 Then
    MsgBox ("Die Stückliste >Nur Bauteile< hat " & iRows & " Zeilen.")
Else
    MsgBox ("Zeilenanzahl der Stückliste >Nur Bauteile< konnte nicht bestimmt werden.")
End If

End Sub

Hattest Du so etwas gesucht?

 

Wenn nicht, dann wären ein paar Informationen, welche Werte du ganz genau benötigst sehr hilfreich, um gezielt weiterhelfen zu können.

 


Bitte nutzt den "Als Lösung akzeptieren"-Button, wenn ein Beitrag euer Problem oder eure Frage löst. Für hilfreiche Posts könnt ihr auch gerne Kudos vergeben.



Dennis Ossadnik
Senior Technical Support Specialist
0 „Gefällt mir“-Angaben
Nachricht 7 von 15

Dennis.Ossadnik
Autodesk Support
Autodesk Support

Hallo @h_schuetzeneder,

 

ich habe den vorherigen Code noch einmal erweitert. Er zeigt jetzt auch zusätzlich die Summer der Teile an, die in der Stückliste "Nur Bauteile" enthalten sind.

 

Sub BomRows()

'Ermitteln, wie viele Einträge es bei der Stückliste "NUR BAULTEILE" im Moment gibt.
'Außerdem wird ermittelt, wie viele Bateile insgesamt in der Sückliste "NUR BAUTEILE" enthalten sind.

Dim oDoc As AssemblyDocument
Set oDoc = ThisApplication.ActiveDocument

If oDoc.ComponentDefinition.BOM.PartsOnlyViewEnabled = False Then
    oDoc.ComponentDefinition.BOM.PartsOnlyViewEnabled = True
End If

Dim iRows As Integer
iRows = -1
Dim iCountParts As Integer
iCountParts = 0

Dim tmp As Object
For Each tmp In oDoc.ComponentDefinition.BOM.BOMViews

    If tmp.ViewType = kPartsOnlyBOMViewType Then
        iRows = tmp.BomRows.Count
        
        Dim oRow As BOMRow
        For Each oRow In tmp.BomRows
        
            iCountParts = iCountParts + oRow.ItemQuantity
                   
        Next
        
        
    End If

Next

If iRows > -1 Then
    MsgBox ("Die Stückliste >Nur Bauteile< hat " & iRows & " Zeilen." & vbCrLf & "Insgesamt sind " & iCountParts & " Bauteile enthalten.")
Else
    MsgBox ("Zeilenanzahl der Stückliste >Nur Bauteile< konnte nicht bestimmt werden.")
End If

End Sub

Ergebnis wäre dann jeweils eine Variable, die in der Meldung ausgegeben werden:

 

2018-01-02_16-47-29.jpg

 


Bitte nutzt den "Als Lösung akzeptieren"-Button, wenn ein Beitrag euer Problem oder eure Frage löst. Für hilfreiche Posts könnt ihr auch gerne Kudos vergeben.



Dennis Ossadnik
Senior Technical Support Specialist
0 „Gefällt mir“-Angaben
Nachricht 8 von 15

h_schuetzeneder
Enthusiast
Enthusiast

Der Beitrag von Juergen hat mir schon sehr geholfen!

Vielen Dank für die Zeit und Arbeit die du in deine VBA Schulung reingesteckt hast.

Im deutschsprachigen Raum ist sonst kaum etwas Derartiges zu finden.

Wenn ich mir was wünschen dürfte, dann ist es eine Fortsetzung deines Kurses, gerne auch in Form eines Buches zum Kaufen!

 

Danke Dennis für deine Programmzeilen, Juergen hat diesen Ansatz ja schon fast vorweggenommen.

 

Dennoch ist das Ergebnis von „PartsOnly“ zu gering für mein Array.

In der Strukturieren Stückliste gibt es ja auch für jede Baugruppe einen Eintrag.

Das heißt zu „PartsOnly“ müsste noch die Anzahl aller Baugruppen hinzugezählt werden.

 

Vielleicht gibt es dafür auch noch eine elegante Lösung?

 

……

 

Während ich meine Antwort schrieb hast du schon die Lösung parat!

Ich denke das passt jetzt.

Ich werde den Code mal in mein Projekt einarbeiten und testen.

 

Danke!

0 „Gefällt mir“-Angaben
Nachricht 9 von 15

TFoerst
Advocate
Advocate

Hi @h_schuetzeneder,

ohne mich in VBA Arrays jetzt eingelesen zu haben, aber ist das nicht der Sinn von dynamischen Arrays, das man sich keinen Kopf über die Größe machen muss? Das man die Dimensionen nicht ändern kann klar, aber die Anzahl der Datensätze?

In Powershell mache ich das eigentlich nie das ich die Anzahl der Daten angebe, ich lasse den Wert einfach in der Liste hinzufügen. Oder geht das in VBA nicht?

0 „Gefällt mir“-Angaben
Nachricht 10 von 15

h_schuetzeneder
Enthusiast
Enthusiast

Hallo TFoerst

Eindimensionale Arrays (wie eine Liste) können beliebig mit dem Befehl „ReDim“ angepasst werden.

Bei zweidimensionalen Arrays (wie eine Tabelle) kann nur die Spaltenanzahl verändert werden, die Anzahl der Zeilen nicht mehr.

Aber die Profis hier im Forum können dir das sicher noch besser erklären.

 

@ Dennis

Leider ist das Ergebnis deiner Zeilenberechnung viel zu hoch. Das kommt wohl daher weil viele Teile doppelt gezählt werden. Grundsätzlich ist das kein Problem wenn das Array etwas größer ist als benötigt, aber wir Techniker geben uns nicht mit ungefähren Ergebnissen zufriedenSmiley (zwinkernd).

 

Welche Möglichkeiten gibt es die Anzahl aller enthaltenen Baugruppen in einer Stückliste herauszufinden?

In Summe mit den Einzelteilen müsste das dann besser hinkommen.

0 „Gefällt mir“-Angaben
Nachricht 11 von 15

Dennis.Ossadnik
Autodesk Support
Autodesk Support

Hallo @h_schuetzeneder,

 

wahrscheinlich ist einfach nicht ganz klar, welche Werte Du eigentlich genau brauchst. Alles was Du möchtest, kann natürlich genau bestimmt werden, aber dazu bräuchte ich noch ein paar Informationen, welchen Wert oder welche Werte Du ganz genau bestimmen möchtest.

 

Mein Code ging davon aus, dass Du errechnen möchtest, wie viele verschiedene Bauteile (erster Code) oder wie viele Bauteile sich insgesamt (zweiter Code) in deiner Baugruppe befinden. Das entspricht der BOM-Darstellung "Nur Bauteile".

 

Also errechnet aus dieser Tabelle:

2018-01-05_11-30-46.jpg

 

 

Wie es nun klingt, brauchst Du eine Auflistung der BOM-Darstellung "Strukturiert". Also aus dieser Tabelle:

2018-01-05_11-31-57.jpg

 

 

 

Ist das richtig?

 

Brauchst Du die Teile einstufig (nur die Bauteile und Baugruppen, die in dieser Baugruppe direkt eingebaut sind) oder mehrstufig (alle Bauteile und Baugruppen, die in der kompletten Struktur verbaut sind)?

Möchtest du nur wissen, wie viele verschiedene Komponenten es gibt oder wie viele dann insgesamt in der Baugruppe sind?

 

Oder brauchst du einen ganz anderen Wert?



Dennis Ossadnik
Senior Technical Support Specialist
0 „Gefällt mir“-Angaben
Nachricht 12 von 15

h_schuetzeneder
Enthusiast
Enthusiast

Hallo S_May

Sorry für meine ungeschickte Ausdrucksweise, ich werde versuchen es in Zukunft besser zu machen.

Ein Bild sagt mehr als 1000 Worte, deshalb ein Bild auf dem zu sehen ist was ich brauche.

Von einer Strukturierten Stückliste die Summe aller Einträge wenn alle Unterbaugruppen aufgeklappt sind (in diesem Fall die Zahl 31).

Nicht die Summe der Einzelteile, nicht die Summer der Baugruppen nur die Anzahl der „Zeilen“ so wie in dieser Ansicht.

Ich möchte dann diese Stückliste in ein Array schreiben, ein bisschen bearbeiten und dann in eine .txt-Datei exportieren.

 

 

Stueckliste.jpg

0 „Gefällt mir“-Angaben
Nachricht 13 von 15

S_May
Mentor
Mentor

ich hab doch nix gesagt?

Nachricht 14 von 15

Dennis.Ossadnik
Autodesk Support
Autodesk Support
Akzeptierte Lösung

Hallo @h_schuetzeneder,

 

in der Tat sagt ein Bild mehr als tausend Worte Smiley (zwinkernd)

 

Habe den Code geändert. Nun zählt er durch die Zeilen der mehrstufigen Strukturstückliste. Das wäre das Ergebnis.

2018-01-05_21-01-09.jpg

 

 

Hier der VBA-Code dazu:

 

 

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

 

Gestartet werden muss natürlich BomRowsStructured. BomRowsStructuredChildRow geht dann durch die Stückliste und zählt.

 

Hattest Du so etwas gesucht?

 



Dennis Ossadnik
Senior Technical Support Specialist
Nachricht 15 von 15

h_schuetzeneder
Enthusiast
Enthusiast

Hallo Dennis

 

Perfekt, genau das hab ich gesucht!

Unglaublich wie ihr Profis das so schnell aus dem Ärmel schüttelt.

 

Vielen Dank!... und ein schönes Wochenende.

 

@ S_May Sorry, Verwechslung, ich bin noch neu hier.Smiley (zwinkernd)

0 „Gefällt mir“-Angaben