SolidWorks MakroMania - Masse aller Baugruppenkomponenten auslesen

SolidWorks MakroMania ist eine Beispielsammlung einiger Makros, die Ihnen eine Vorstellung davon geben soll, was man auch schon mit Makros in SolidWorks alles anstellen kann. Der Code des Makros sollte so gut dokumentiert sein, dass Sie damit ohne weitere Anleitung verstehen, was gemacht wird.

< voriges
MakroMania
Übersicht


nächstes >

Nummer 02
Masse aller Baugruppenkomponenten auslesen

Download
ZIP, 13 KB

Ich übernehme keine Haftung für die korrekte Funktion der Routinen oder irgendwelcher Schäden bei der Anwendung dieser Beispiele. Das gesamte Risiko trägt der Benutzer selbst. - Sorry, muss sein.

Man kann ohne Schwierigkeiten die Masse einer gesamten Baugruppe von SolidWorks bekommen, aber wenn man eine Übersicht haben will, was jede einzelne Komponente oder Unterbaugruppe wiegt artet das schnell in viel handarbeit aus. Aber sowas kann man ja auch automatisieren.

In diesem Fall hab ich Excel benutzt, da die Ausgaben dort direkt weiterverarbeitet werden können und vor allem zum Auslesen der Masseneigenschaften mit SafeArrays gearbeitet werden muss, was ja bekanntermaßen Makros nicht können.

Wer das Excelsheet nicht runterladen will hier die zwei Funktionen dafür: macht euch einfach einen Befehlbutton in euer Excelblatt und nehmt den Code per Copy/Paste herüber:

' Globale Variable
Dim zeile As Integer        ' Zeilenzähler für Ausgabe im Blatt

Private Sub CommandButton1_Click()
    ' aus aktivem SolidWorks Assembly für alle Komponenten
    ' Dichte und Masse auslesen. Keine Fehlerabragen etc.
    ' SolidWorks sollte oben und das zu untersuchende Assembly
    ' als aktives Dokument geladen sein. Auf Basis des Traverse-Assy
    ' aus dem API-HELP File von SolidWorks
    ' 12.09.2000 Stefan Berlitz http://solidworks.cad.de

    Dim swApp As Object
    Dim AssemblyDoc As Object
    Dim Configuration As Object
    Dim RootComponent As Object

    ' an SolidWorks anklinken und aktives Assembly holen
    Set swApp = CreateObject("SldWorks.Application")
    Set AssemblyDoc = swApp.ActiveDoc

    ' Root-Komponente des Assemblies als Ausgangspunkt festmachen
    Set Configuration = AssemblyDoc.GetActiveConfiguration()
    Set RootComponent = Configuration.GetRootComponent()

    ' erst Blatt leeren, dann Spaltenbeschriftung im Excel-Blatt
    Cells.Select
    Selection.ClearContents
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "Level"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "Komponentenname"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "Masse in kg"
    zeile = 2   ' Zeilenzähler zur Ausgabe in Tabellenblatt

    ' und jetzt rekursiv durch alle Ebenen
    If Not RootComponent Is Nothing Then
        TraverseComponent 1, RootComponent
    End If

End Sub

Private Function TraverseComponent(Level As Integer, Component As Object)
    ' rekursive Routine, die alle Komponenten durchläuft

    Dim i As Integer
    Dim Children As Variant
    Dim Child As Object
    Dim ChildCount As Integer
    Dim ModelDoc As Object
    Dim ConfigName As String
    Dim MassProp As Variant
    Dim ret As Boolean

    ' in Excelblatt den aktuellen level, den Komponentennamen eintragen ...
    Range("A" & zeile).Select
    ActiveCell.FormulaR1C1 = Level
    Range("B" & zeile).Select
    ActiveCell.FormulaR1C1 = Component.Name

    ' und dann für diese Komponente die Masse auslesen
    Range("C" & zeile).Select
    If Component.IsSuppressed Then
        ActiveCell.FormulaR1C1 = "*** Komponente unterdrückt ***"
    Else
        ' dann das ModelDoc der Komponente herausholen
        ConfigName = Component.ReferencedConfiguration
        Set ModelDoc = Component.GetModelDoc()
        If Not ModelDoc Is Nothing Then
            ' und die MassProperties auslesen
            ModelDoc.ShowConfiguration (ConfigName)
            MassProp = ModelDoc.GetMassProperties()
            ' die Reihenfolge der MassProps im Variant ist:
            ' CenterOfMassX, CenterOfMassY, CenterOfMassZ, Volume, Area, Mass,
            ' MomXX, MomYY, MomZZ, MomXY, MomZX, MomYZ
            ' Masse ist die 6. Eigenschaft, also Index 5
            ActiveCell.FormulaR1C1 = MassProp(5)
        Else
            ActiveCell.FormulaR1C1 = "*** Kein ModelDoc, Rootkomponente? ***"
        End If
    End If
    ' dann für die Ausgabe nächste Zeile vorbelegen
    zeile = zeile + 1
    ' schauen, ob's ein Subassy ist und ggf. über die Kinder rüberschauen
    Children = Component.GetChildren
    ChildCount = UBound(Children) + 1
    For i = 0 To (ChildCount - 1)
        Set Child = Children(i)
        TraverseComponent Level + 1, Child
    Next i

End Function

Zurück zum Seitenanfang

hr.gif (4491 Byte)

counter Kritik und Anregungen bitte an Stefan Berlitz. Letzte Änderung dieser Seite am Donnerstag, 01. Februar 2007 17:40