Korpus jednostki makr STL dla każdej konfiguracji

Używam 2 makr: jednego do tworzenia jednostkowych STL każdego ciała w pomieszczeniu. I kolejne makro, które wykonuje pełne STL pliku, ale całą konfigurację.

Moim życzeniem jest stworzenie makra, które może tworzyć jednolite STL dla każdego ciała we wszystkich konfiguracjach części.

Jestem na SW2023 i używam starych makr. Ale nie wiem, jak go zmodyfikować, aby to zrobić, czy możesz mi w tym pomóc?

Wysyłam Ci 2 makra w temacie.

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

i

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

Witam

Zasadniczo, musisz umieścić całą część kodu, która zarządza eksportem ciał w pętli:

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 polubienie

Próbowałem to odtworzyć, ale nadal powoduje to błędy kompilacji... Nie rozumiem...

Dim swApp As Object
Przyciemnij część jako ModelDoc2
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Dim swBodies jako obiekt
Dim swBody As Body2
Przyciemnij savePath jako ciąg

Const swAllBodies As Long = 0 ' Constant, aby uzyskać wszystkie ciała

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

Koniec subwoofera

Witam

Brak błędu kompilacji na moim poziomie w tym kodzie. Którą linię blokuje?

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

I nie rozumiem dlaczego...

Próbowałem innych metod, ale nadal nie chce...

Zrobiłem test z częścią, która ma różne konfiguracje i ciała, ale nic...

Jest to błąd w czasie wykonywania, a nie błąd kompilacji.
Możliwość udostępnienia pliku do testów? (Nie mam tego pod ręką)

Biensur !

Korpus próbny na sztuki. SLDPRT (186,6 KO)

Witam

Przyjrzałem się więc nieco dokładniej kodowi. Tak więc w obecnej sytuacji błąd wynika z faktu, że linia Set swBodies = Part.GetBodies2(swAllBodies, False) jest nieprawidłowa.
Part.GetBodies2(swAllBodies, False) Oczekuje w zamian zmiennej wariantu.
Moim zdaniem najprościej jest mieć tylko jedno makro.
Z kodu pierwszego makra dla plików bez konfiguracji zmień kod sub main na poniższy kod:

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 polubienia

Rejestruje wszystkie prawidłowe treści .swp w wersji 4 w formacie STL (67,5 KB)
Część testowa ciała. SLDPRT (186.6 KB)

Cóż, zmodyfikowałem, aby wziąć przykład z pierwszym makrem, jest poprawny, ale nie spełnia zadania, zapytaj hahah.
Próbowałem rozwiązać problem, ale go nie widzę!

Witam

Problem wynika z kontroli swErrors tej linii If swErrors <> 0 Or swWarnings <> 0 Then
W przypadku eksportowania treści za pośrednictwem SaveToFile2 błąd 512 jest normalny.
Wyliczenie swFileSaveError_e - 2023 - Pomoc SOLIDWORKS API
Istnieją dwie opcje: albo nie monitorować błędów, albo wziąć pod uwagę fakt, że błąd 512 jest prawidłowy.

2 polubienia

Część testowa ciała. SLDPRT (211.1 KB)
Zapisuje wszystkie treści V10.swp w jednym pliku STL (62,5 KB)

Więc bardzo dziękuję Cyril.f za pomoc, bardzo mi to pomogło!
Nadal mam mały problem z tym makrem, spełnia swoje zadanie, ale na przykład w tej części testowej, która służy jako przykład, wykonuje makro i pliki dla konfiguracji 1corp i 2body, ale nie dla 3body (przestaje pozostawiać otwarte pliki Stock). Nie wiem, co może do tego doprowadzić. Myślę, że po tym funkcją będzie nikiel haha

Witam

Przyjrzę się temu, jeśli będę miał 5 minut, jeśli nie w przyszłym tygodniu.

Witam;

Prawdopodobnie musisz tylko sprawdzić limity Ubound(V), aby zobaczyć, czy odpowiada to liczbie konfiguracji:

I ewentualnie zastąp go na:
Dla i = LBound(V) Do UBound(V)+1

(Mówię to, ale nie testowałem wtedy makra...)

FYI, Solidworks traktuje " Domyślne " jako konfigurację:
image

Witam

Nie ma problemu z terminalami, czy konfiguracja nazywa się domyślna czy xxx makro zlicza ilość konfiguracji.
Nie mogłem użyć pliku testowego (przyszła wersja), więc wziąłem oryginalny plik z tematem.
Nie sprawdziłem reszty kodu (oparłem się na oryginalnym kodzie, który już podałem dla początkowych tematów, z których kod pochodził na początku tematu).
Po przetestowaniu problem tkwi w funkcji DoTheWork. Musisz zamykać otwarte pliki na bieżąco, zmodyfikowany kod poniżej działa:

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 polubienia