Macro STL corps unitaire pour chaque configuration

J’utilise 2 macros: une pour réaliser des STL unitaire de chaque corps dans une pièce. Et une autre macro qui réalise un STL complet du fichier mais toutes les configuration.

Mon souhait serrai de faire une macro qui puisse faire des STL unitaires de chaque corps de toutes les configurations de la pièce.

Je suis sur SW2023 et j’utilise des anciennes macro. Mais je ne sais pas comment la modifier pour faire cela pouvez vous m’aider la dessus ?

Je vous transmet les 2 macro dans le sujet.

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

et

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

Bonjour,

En gros il faut mettre toute la partie du code qui gère l’export des corps dans la boucle :

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 « J'aime »

J’ai essayer de reproduire cela mais cela me fait quand même des erreur de compilation… je comprend pas …

Dim swApp As Object
Dim Part As ModelDoc2
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Dim swBodies As Object
Dim swBody As Body2
Dim savePath As String

Const swAllBodies As Long = 0 ’ Constante pour obtenir tous les corps

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."

End Sub

Bonjour,

Pas d’erreur de compilation à mon niveau sur ce code. Ca bloque à quelle ligne?

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

Et je comprend pas pourquoi…

j’ai essayer d’autre méthode mais ca veut quand même pas…

J’ai fait le test avec un pieces qui a des config et des corps differents mais rien …

C’est une erreur d’exécution, pas de compilation.
Possibilité de mettre à dispo un fichier pour tester? (j’ai pas ça sous la main)

Biensur !

Piece test corps.SLDPRT (186,6 Ko)

Bonjour,

Alors j’ai regardé un peu plus précisément le code. Donc en l’état l’erreur vient du fait que la ligne Set swBodies = Part.GetBodies2(swAllBodies, False) est erronée.
Part.GetBodies2(swAllBodies, False) Attend en retour une variable de type variant.
A mon sens le plus simple est d’avoir qu’une seule macro.
A partir du code de la première macro pour les fichiers sans configuration, changer le code de la sub main par le code ci-dessous:

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 « J'aime »

Enregistre en STL unitaire tout les corps V4 Valid .swp (67,5 Ko)
Piece test corps.SLDPRT (186,6 Ko)

Bon, j’ai modifier pour reprendre exemple sur la première macro, elle est valide mais ne fait pas le travail demander hahah.
J’ai essayer de ressouder le problème mais je ne vois pas la!

Bonjour,

Le problème vient du contrôle sur swErrors de cette ligne If swErrors <> 0 Or swWarnings <> 0 Then
Dans le cas de l’export de corps via SaveToFile2 l’erreur 512 est normale.
swFileSaveError_e Enumeration - 2023 - SOLIDWORKS API Help
Deux options, soit ne pas surveiller les erreurs, soit prendre en compte le fait que l’erreur 512 est valide.

2 « J'aime »

Piece test corps.SLDPRT (211,1 Ko)
Enregistre en STL unitaire tout les corps V10.swp (62,5 Ko)

Alors merci beaucoup Cyril.f pour ton aide, ca m’a beaucoup aider!
Il me reste un petit soucis pour cette macro, elle fait le travail mais par exemple, sur cette pièce test qui sert d’exemple elle me fait bien la macro et les fichiers pour la configuration 1corp et 2corps mais pas pour la 3corps (elle s’arrête en laissant les fichiers Stock ouvert). Je ne sais pas ce qui peut entrainer cela. Je pense que après cela la fonction serra nickel haha

Bonjour,

Je regarde ça si j’ai 5 minutes sinon semaine prochaine.

Bonjour;

Il faut sans doutes juste contrôler les limites Ubound(V) pour voir s’il correspond bien à la quantité de configurations:

Et éventuellement la remplacer par :
For i = LBound(V) To UBound(V)+1

(Je dis cela mais je n’ai pas testé la macro alors…)

pour info Solidworks considère « Défaut » comme une configuration:
image

Bonjour,

Pas de problème avec les bornes, que la configuration s’appelle défaut ou xxx la macro compte le nombre de configurations.
Pas pu utiliser le fichier de test (version future) donc j’ai pris celui d’origine du sujet.
Je n’avais pas vérifié le reste du code (je me suis basé sur le code d’origine que j’avais déjà donné pour les sujets initiaux dont est issu le code au début du sujet).
Après tests, le problème est dans la fonction DoTheWork. Il faut fermer les fichiers ouverts au fur et à mesure, le code modifié ci-dessous fonctionne:

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 « J'aime »