STL-Makro-Einheitenkörper für jede Konfiguration

Ich verwende 2 Makros: eines, um Einheits-STLs von jedem Körper in einem Raum zu erstellen. Und ein weiteres Makro, das eine vollständige STL der Datei, aber die gesamte Konfiguration ausführt.

Mein Wunsch ist es, ein Makro zu erstellen, das einheitliche STLs für jeden Körper aller Konfigurationen des Teils erstellen kann.

Ich bin auf SW2023 und verwende alte Makros. Aber ich weiß nicht, wie ich es modifizieren soll, um dies zu tun, können Sie mir dabei helfen?

Ich schicke Ihnen die 2 Makros im Betreff.

Option Explicit

Dim swApp As Object
Dim swPart As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim Indent As Long
Dim BodyFolderType(5)  As String
Dim sModelName         As String
Dim iNbCar             As Integer
Dim boolstatus         As Boolean
Dim fileName           As String
Dim file2save          As String
Dim swErrors            As Long
Dim swWarnings          As Long
Dim bRet                As Boolean

Sub main()

    BodyFolderType(0) = "dummy"
    BodyFolderType(1) = "swSolidBodyFolder"
    BodyFolderType(2) = "swSurfaceBodyFolder"
    BodyFolderType(3) = "swBodySubFolder"
    BodyFolderType(4) = "swWeldmentSubFolder"
    BodyFolderType(5) = "swWeldmentCutListFolder"

    Set swApp = Application.SldWorks
    Set swPart = swApp.ActiveDoc
    Call StlParam
    Debug.Print "File = " & swPart.GetPathName
    fileName = swPart.GetPathName
     
     fileName = Strings.Left(fileName, Len(fileName) - 7)


    Indent = -3

    Set swFeat = swPart.FirstFeature
     TraverseFeatures swFeat, True

End Sub
Function StlParam()
boolstatus = swApp.SetUserPreferenceToggle(swSTLBinaryFormat, True) 
boolstatus = swApp.SetUserPreferenceIntegerValue(swExportStlUnits, 0)
boolstatus = swApp.SetUserPreferenceIntegerValue(swSTLQuality, swSTLQuality_e.swSTLQuality_Fine) 
boolstatus = swApp.SetUserPreferenceToggle(swSTLShowInfoOnSave, True) 
boolstatus = swApp.SetUserPreferenceToggle(swSTLComponentsIntoOneFile, True) 
End Function


Function DoTheWork(thisFeat As SldWorks.Feature)

    Dim IsBodyFolder As Boolean
     IsBodyFolder = False

    Dim FeatType As String
     FeatType = thisFeat.GetTypeName

    If FeatType = "SolidBodyFolder" Then IsBodyFolder = True
   
    If IsBodyFolder Then

        Debug.Print Format(String(Indent, " ") & thisFeat.Name, "!" & String(40, "@")); Format(FeatType, "!" & String(30, "@"));

        Dim BodyFolder As SldWorks.BodyFolder
         Set BodyFolder = thisFeat.GetSpecificFeature2

        Dim BodyFolderTypeE As Long
         BodyFolderTypeE = BodyFolder.Type

        Debug.Print Format(BodyFolderType(BodyFolderTypeE), "!" & String(30, "@")); Format(BodyFolderTypeE, "!@@@@");

        Dim BodyCount As Long
         BodyCount = BodyFolder.GetBodyCount

        Debug.Print "Body Count is " & BodyCount

        Dim vBodies As Variant
         vBodies = BodyFolder.GetBodies

        Dim i As Long

        If Not IsEmpty(vBodies) Then
             For i = LBound(vBodies) To UBound(vBodies)
                 Dim Body As SldWorks.Body2
                 Set Body = vBodies(i)
                    sModelName = Body.Name
                     If InStr(sModelName, "[") <> 0 Then
                         iNbCar = Len(sModelName) - (Len(sModelName) - InStr(sModelName, "[")) - 1
                         sModelName = Left(sModelName, iNbCar)
                     End If
                 Debug.Print sModelName
                 boolstatus = swPart.Extension.SelectByID2(Body.Name, "SOLIDBODY", 0, 0, 0, False, 0, Nothing, 0)
                 file2save = fileName & " - " & sModelName & ".STL"
                 Debug.Print file2save
                boolstatus = swPart.SaveToFile2(file2save, swSaveAsOptions_e.swSaveAsOptions_Silent, swErrors, swWarnings)
                 Set swPart = swApp.ActiveDoc
                 swApp.CloseDoc (swPart.GetTitle)
                 Set swPart = swApp.ActiveDoc
                'swPart.ClearSelection2 True
                 Debug.Print Format(String(Indent + 3, " ") & Body.Name, "!" & String(30, "@"))
             Next i
         End If

        Dim FeatureFromBodyFolder As SldWorks.Feature
         Set FeatureFromBodyFolder = BodyFolder.GetFeature

        If Not FeatureFromBodyFolder Is thisFeat Then
             MsgBox "Features don't match!"
         End If
     Else

    End If

End Function

Function TraverseFeatures(thisFeat As SldWorks.Feature, isTopLevel As Boolean)

    Dim curFeat As SldWorks.Feature
     Set curFeat = thisFeat

    Indent = Indent + 3

    While Not curFeat Is Nothing
         DoTheWork curFeat 

        Dim subfeat As SldWorks.Feature
         Set subfeat = curFeat.GetFirstSubFeature

        While Not subfeat Is Nothing
             TraverseFeatures subfeat, False
             Dim nextSubFeat As SldWorks.Feature
             Set nextSubFeat = subfeat.GetNextSubFeature
             Set subfeat = nextSubFeat
             Set nextSubFeat = Nothing
         Wend

        Set subfeat = Nothing

        Dim nextFeat As SldWorks.Feature

        If isTopLevel Then
             Set nextFeat = curFeat.GetNextFeature
         Else
             Set nextFeat = Nothing
         End If

        Set curFeat = nextFeat
         Set nextFeat = Nothing

    Wend
     Indent = Indent - 3

End Function

und

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc

Dim V As Variant
V = swApp.GetConfigurationNames(Part.GetPathName)
   
Dim i As Long
For i = 0 To UBound(V)
    boolstatus = Part.ShowConfiguration2(V(i))
    longstatus = Part.SaveAs3(Part.GetPathName & "-" & V(i) & ".STL", 0, 0)
Next

End Sub

Hallo

Grundsätzlich müssen Sie den gesamten Teil des Codes, der den Export von Körpern verwaltet, in die Schleife einfügen:

For i = 0 To UBound(V)
boolstatus = Part.ShowConfiguration2(V(i))
'Insérer ici le bout de code lié à l'export des corps
longstatus = Part.SaveAs3(Part.GetPathName & « - » & V(i) & " .STL ", 0, 0)
Next

1 „Gefällt mir“

Ich habe versucht, dies zu reproduzieren, aber es gibt mir immer noch Kompilierungsfehler... Ich verstehe nicht...

Dimmen swApp als Objekt
Dimmteil als ModelDoc2
Dim boolstatus als boolescher Wert
Dim longstatus As Long, longwarnings As Long
Dimmen von swBodies als Objekt
Dim swBody As Body2
Dim savePath als Zeichenfolge

Const swAllBodies As Long = 0 ' Konstante, um alle Körper zu erhalten

Sub main()

' Initialiser SolidWorks et le document actif
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc

' Vérifier si le document actif est une pièce
If Part Is Nothing Or Not Part.GetType = swDocPART Then
    MsgBox "Veuillez ouvrir une pièce."
    Exit Sub
End If

' Récupérer les noms de toutes les configurations
Dim V As Variant
Dim configCount As Long
configCount = Part.GetConfigurationCount()

If configCount = 0 Then
    MsgBox "Aucune configuration trouvée."
    Exit Sub
End If

V = Part.GetConfigurationNames() ' Utiliser GetConfigurationNames sur l'objet Part

' Parcourir chaque configuration
Dim i As Long
For i = LBound(V) To UBound(V)
    boolstatus = Part.ShowConfiguration2(V(i))

    ' Vérifier si l'activation a réussi
    If boolstatus Then
        Debug.Print "Exporting configuration: " & V(i)

        ' Obtenir les corps du modèle actif
        Set swBodies = Part.GetBodies2(swAllBodies, False)

        ' Vérifier si des corps existent
        If Not swBodies Is Nothing And swBodies.Count > 0 Then
            ' Parcourir chaque corps
            Dim j As Integer
            For j = 0 To swBodies.Count - 1
                Set swBody = swBodies(j)

                ' Définir le chemin de sauvegarde pour chaque corps
                savePath = Left(Part.GetPathName, InStrRev(Part.GetPathName, ".") - 1) & "-" & V(i) & "_Body" & j & ".stl"
                
                ' Exporter le corps en STL
                longstatus = Part.SaveAs3(savePath, 0, 0)

                Debug.Print "Exported body: " & j & " in configuration: " & V(i)
            Next j
        Else
            Debug.Print "Aucun corps trouvé dans la configuration: " & V(i)
        End If
    Else
        Debug.Print "Failed to activate configuration: " & V(i)
    End If
Next i

MsgBox "Exportation STL terminée pour toutes les configurations et corps."

Ende Sub

Hallo

Kein Kompilierungsfehler auf meiner Ebene bei diesem Code. Welche Leitung blockiert es?

   Set swBodies = Part.GetBodies2(swAllBodies, False) erreur d'execution 424. objet requis.

Und ich verstehe nicht, warum...

Ich habe andere Methoden ausprobiert, aber es will immer noch nicht...

Ich habe den Test mit einem Teil gemacht, das unterschiedliche Konfigurationen und Körper hat, aber nichts ...

Hierbei handelt es sich um einen Laufzeitfehler, nicht um einen Kompilierungsfehler.
Möglichkeit, eine Datei zum Testen zur Verfügung zu stellen? (Das habe ich nicht zur Hand)

Biensur !

Stückversuchskorps. SLDPRT (186.6 Ko)

Hallo

Also habe ich mir den Code etwas genauer angeschaut. So wie es aussieht, kommt der Fehler von der Tatsache, dass die Zeile Set swBodies = Part.GetBodies2(swAllBodies, False) falsch ist.
Part.GetBodies2(swAllBodies, False) Erwartet im Gegenzug eine Variable variant.
Meiner Meinung nach ist es am einfachsten, nur ein Makro zu haben.
Ändern Sie aus dem Code des ersten Makros für Dateien ohne Konfiguration den Code des Sub-Mains in den folgenden Code:

Sub main()

    BodyFolderType(0) = "dummy"
    BodyFolderType(1) = "swSolidBodyFolder"
    BodyFolderType(2) = "swSurfaceBodyFolder"
    BodyFolderType(3) = "swBodySubFolder"
    BodyFolderType(4) = "swWeldmentSubFolder"
    BodyFolderType(5) = "swWeldmentCutListFolder"

    Set swApp = Application.SldWorks
    Set swPart = swApp.ActiveDoc
    
    ' Vérifier si le document actif est une pièce
    If swPart Is Nothing Or Not swPart.GetType = swDocPART Then
        MsgBox "Veuillez ouvrir une pièce."
        Exit Sub
    End If

    Call StlParam
    Debug.Print "File = " & swPart.GetPathName
    fileName = swPart.GetPathName
     
     fileName = Strings.Left(fileName, Len(fileName) - 7)


    Indent = -3
    
    configCount = swPart.GetConfigurationCount()
    If configCount = 0 Then
        Set swFeat = swPart.FirstFeature
        TraverseFeatures swFeat, True
    ElseIf configCount > 0 Then
        V = swPart.GetConfigurationNames() ' Utiliser GetConfigurationNames sur l'objet Part
        For i = LBound(V) To UBound(V)
            boolstatus = swPart.ShowConfiguration2(V(i))
            Set swFeat = swPart.FirstFeature
            TraverseFeatures swFeat, True
        Next i
    End If

End Sub

3 „Gefällt mir“

Registriert alle gültigen .swp-Texte der Version V4 in STL (67,5 KB)
Körpertestteil. SLDPRT (186.6 KB)

Nun, ich habe das Beispiel für das erste Makro geändert, es ist gültig, erfüllt aber nicht die Aufgabe, hahah.
Ich habe versucht, das Problem zu beheben, aber ich sehe es nicht!

Hallo

Das Problem kommt von der Kontrolle von swErrors dieser Zeile If swErrors <> 0 Or swWarnings <> 0 Then
Beim Exportieren von Texten über SaveToFile2 ist der Fehler 512 normal.
swFileSaveError_e Aufzählung - 2023 - SOLIDWORKS API-Hilfe
Es gibt zwei Möglichkeiten, entweder nicht auf Fehler zu überwachen oder die Tatsache zu berücksichtigen, dass der Fehler 512 gültig ist.

2 „Gefällt mir“

Körpertestteil. SLDPRT (211.1 KB)
Speichert alle V10.swp-Körper in einer einzigen STL (62,5 KB)

Also vielen Dank Cyril.f für deine Hilfe, es hat mir sehr geholfen!
Ich habe immer noch ein kleines Problem mit diesem Makro, es erledigt die Arbeit, aber zum Beispiel auf diesem Testteil, der als Beispiel dient, führt es das Makro und die Dateien für die 1corp- und 2body-Konfiguration aus, aber nicht für den 3body (es hört auf, die Stock-Dateien offen zu lassen). Ich weiß nicht, was dazu führen kann. Ich denke, dass danach die Funktion Nickel sein wird, haha

Hallo

Ich werde mir das ansehen, wenn ich 5 Minuten habe, wenn nicht nächste Woche.

Hallo;

Wahrscheinlich müssen Sie nur die Ubound(V)-Limits überprüfen, um zu sehen, ob sie der Anzahl der Konfigurationen entsprechen:

Und ersetzen Sie es möglicherweise durch:
Für i = LBound(V) bis UBound(V)+1

(Ich sage das, aber ich habe das Makro damals noch nicht getestet...)

Zu Ihrer Information, Solidworks betrachtet " Standard " als Konfiguration:
image

Hallo

Kein Problem mit den Terminals, egal ob die Konfiguration default oder xxx heißt, das Makro zählt die Anzahl der Konfigurationen.
Ich konnte die Testdatei (zukünftige Version) nicht verwenden, also habe ich das Original des Themas genommen.
Den Rest des Codes hatte ich nicht überprüft (ich habe mich auf den ursprünglichen Code gestützt, den ich bereits für die ersten Themen angegeben hatte, aus denen der Code am Anfang des Themas stammte).
Nach dem Testen liegt das Problem in der DoTheWork-Funktion. Sie müssen die geöffneten Dateien nach und nach schließen, der unten geänderte Code funktioniert:

Function DoTheWork(thisFeat As SldWorks.Feature)

    Dim IsBodyFolder As Boolean
    IsBodyFolder = False

    Dim FeatType As String
    FeatType = thisFeat.GetTypeName

    If FeatType = "SolidBodyFolder" Then IsBodyFolder = True
   
    If IsBodyFolder Then

        Dim BodyFolder As SldWorks.BodyFolder
        Set BodyFolder = thisFeat.GetSpecificFeature2

        Dim BodyCount As Long
        BodyCount = BodyFolder.GetBodyCount

        Dim vBodies As Variant
        vBodies = BodyFolder.GetBodies

        Dim i As Long

        ' Vérifier si des corps sont présents
        If Not IsEmpty(vBodies) Then
            For i = LBound(vBodies) To UBound(vBodies)
                Dim Body As SldWorks.Body2
                Set Body = vBodies(i)
                
                ' Obtenir le nom du corps
                sModelName = Body.Name
                If InStr(sModelName, "[") <> 0 Then
                    iNbCar = Len(sModelName) - (Len(sModelName) - InStr(sModelName, "[")) - 1
                    sModelName = Left(sModelName, iNbCar)
                End If

                ' Ajouter le nom de la configuration active
                Dim configName As String
                configName = swPart.ConfigurationManager.ActiveConfiguration.Name
                
                ' Créer le nom de fichier pour l'exportation
                file2save = fileName & " - " & configName & " - " & sModelName & ".STL"
                
                ' Sélectionner le corps pour l'exportation
                boolstatus = swPart.Extension.SelectByID2(Body.Name, "SOLIDBODY", 0, 0, 0, False, 0, Nothing, 0)
                
                ' Exporter le corps en STL
                boolstatus = swPart.SaveToFile2(file2save, swSaveAsOptions_e.swSaveAsOptions_Silent, swErrors, swWarnings)
                Set swPart = swApp.ActiveDoc
                swApp.CloseDoc (swPart.GetTitle)
                Set swPart = swApp.ActiveDoc

                ' Vérifier les erreurs d'enregistrement
                If swErrors <> 0 And swErrors <> 512 Then
                    Debug.Print "Erreur lors de l'exportation du corps : " & sModelName & " - Code d'erreur : " & swErrors
                    MsgBox "Erreur lors de l'export de " & sModelName & " avec le code d'erreur : " & swErrors
                Else
                    Debug.Print "Exportation réussie pour le corps : " & sModelName
                End If
            Next i
        End If

    End If

End Function

2 „Gefällt mir“