STL-macro-eenheidsbehuizing voor elke configuratie

Ik gebruik 2 macro's: één om eenheids-STL's te maken van elk lichaam in een kamer. En nog een macro die een volledige STL van het bestand uitvoert, maar alle configuratie.

Mijn wens is om een macro te maken die unitaire STL's van elk lichaam kan maken van alle configuraties van het onderdeel.

Ik ben op SW2023 en ik gebruik oude macro's. Maar ik weet niet hoe ik het moet aanpassen om dit te doen, kun je me hierbij helpen?

Ik stuur je de 2 macro's in het onderwerp.

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

en

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

Kortom, je moet het hele deel van de code dat de export van lichamen beheert in de lus zetten:

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 like

Ik heb geprobeerd dit te reproduceren, maar het geeft me nog steeds compilatiefouten... Ik begrijp het niet...

Dim swApp als object
Dim deel als ModelDoc2
Dim boolstatus als Booleaanse
Dim longstatus As Long, longwarnings As Long
Dim swBodies als object
Dim swBody As Body2
Dim savePath als tekenreeks

Const swAllBodies As Long = 0 ' Constant om alle lichamen te krijgen

Sub hoofd()

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

Einde Sub

Hallo

Geen compilatiefout op mijn niveau op deze code. Welke lijn blokkeert het?

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

En ik begrijp niet waarom...

Ik heb andere methoden geprobeerd, maar het wil nog steeds niet...

Ik heb de test gedaan met een onderdeel dat verschillende configuraties en lichamen heeft, maar niets ...

Dit is een runtime-fout, geen compilatiefout.
Mogelijkheid om een bestand ter beschikking te stellen om te testen? (Dat heb ik niet bij de hand)

Biensur !

Het korps van de stuktest. SLDPRT (186,6 Ko)

Hallo

Dus ik heb wat beter naar de code gekeken. Dus zoals het er nu uitziet, komt de fout voort uit het feit dat de regel Set swBodies = Part.GetBodies2(swAllBodies, False) verkeerd is.
Part.GetBodies2(swAllBodies, False) Verwacht er een variantvariabele voor terug.
Naar mijn mening is de gemakkelijkste manier om slechts één macro te hebben.
Verander vanuit de code van de eerste macro voor bestanden zonder configuratie de code van de sub-main naar de onderstaande 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 likes

Registreert alle V4 geldige .swp bodies in STL (67.5 KB)
Lichaamstest onderdeel. SLDPRT (186,6 kB)

Nou, ik heb aangepast om het voorbeeld op de eerste macro te nemen, het is geldig, maar doet niet het werk om te vragen hahah.
Ik heb geprobeerd het probleem op te lossen, maar ik zie het niet!

Hallo

Het probleem komt voort uit de controle van swErrors van deze regel If swErrors <> 0 Or swWarnings <> 0 Then
In het geval van exporterende lichamen via SaveToFile2 is de 512-fout normaal.
swFileSaveError_e Opsomming - 2023 - SOLIDWORKS API Help
Er zijn twee opties: ofwel niet controleren op fouten, ofwel rekening houden met het feit dat de 512-fout geldig is.

2 likes

Lichaamstest onderdeel. SLDPRT (211.1 KB)
Slaat alle V10.swp-body's op in één STL (62,5 KB)

Dus heel erg bedankt Cyril.f voor je hulp, het heeft me veel geholpen!
Ik heb nog steeds een klein probleem voor deze macro, het doet zijn werk, maar bijvoorbeeld, op dit testonderdeel dat als voorbeeld dient, doet het de macro en de bestanden voor de 1corp en 2body configuratie, maar niet voor de 3body (het stopt met het open laten van de Stock bestanden). Ik weet niet wat hiertoe kan leiden. Ik denk dat daarna de functie nikkel zal zijn haha

Hallo

Ik zal hier naar kijken als ik 5 minuten heb, zo niet volgende week.

Hallo;

U hoeft waarschijnlijk alleen maar de Ubound(V)-limieten te controleren om te zien of deze overeenkomt met het aantal configuraties:

En eventueel vervangen door:
Voor i = LBound(V) Naar UBound(V)+1

(Ik zeg dit, maar ik heb de macro dan niet getest...)

Ter info, Solidworks beschouwt " Standaard " als een configuratie:
image

Hallo

Geen probleem met de terminals, of de configuratie nu standaard of xxx wordt genoemd, de macro telt het aantal configuraties.
Kon het testbestand (toekomstige versie) niet gebruiken, dus nam ik de originele van het onderwerp.
Ik had de rest van de code niet gecontroleerd (ik baseerde me op de originele code die ik al had gegeven voor de eerste onderwerpen waaruit de code aan het begin van het onderwerp kwam).
Na het testen zit het probleem in de DoTheWork functie. Je moet de geopende bestanden sluiten terwijl je bezig bent, de gewijzigde code hieronder werkt:

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 likes