MACRO Submappen maken van een bestaande map

Hallo

Ik zou je verlichting nodig hebben. Ik ben op zoek naar een macro die 3 submappen van een bestaande map zou maken.
De bestaande map heet BASE en de 3 submappen heten Option1/Option2/Option3.
Ik heb aan deze code gesleuteld, maar de macro kan de BASE-map niet vinden, dus geen submappen aanmaken...

Heeft u alstublieft oplossingen? :smiling_face_with_tear:

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

Sub main()
    ' Initialisation appli SolidWorks
    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    
    ' Vérification doc assemblage
    If Part.GetType <> swDocASSEMBLY Then
        MsgBox "Le document actif n'est pas un assemblage. Veuillez lancer la macro sur un assemblage."
        Exit Sub
    End If
    
    ' Vérification existance dossier "BASE"
    Dim plotFolder As Object
    On Error Resume Next
    Set plotFolder = Part.FeatureManager.FeatureByName("BASE")
    On Error GoTo 0

    If plotFolder Is Nothing Then
        MsgBox "Le dossier "BASE" n'existe pas. Créer ce dossier avant d'exécuter la macro."
        Exit Sub
    End If
    
    ' Sélectionner le dossier "BASE" pour y insérer les sous-dossiers
    boolstatus = Part.Extension.SelectByID2("BASE", "FEATURE", 0, 0, 0, False, 0, Nothing, 0)
    
    ' Création sous-dossier "Option1"
    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    boolstatus = Part.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, "Option1")
    
    ' Création sous-dossier "Option2"
    Set myFeature = Part.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    boolstatus = Part.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, "Option2")
    
    ' Création sous-dossier "Option3"
    Set myFeature = Part.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    boolstatus = Part.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, "Option3")
    
    ' Tout désélectionner
    Part.ClearSelection2 True
    
    MsgBox "Les 3 sous-dossiers ont été créés avec succès dans le dossier "BASE"."
End Sub

Hallo @MLG ,

FeatureByName is een methode van een onderdeel of assemblagedocument, niet het FeatureManager-object...

Aan de andere kant werkt het maken van een map alleen als een component in de boom is geselecteerd. Om submappen van de map " BASE " aan te maken, moet deze dus ten minste één component bevatten.
Als dat het geval is, worden de submappen gemaakt.
De bijgevoegde macro zou moeten werken.

CreationSsFolders.swp (43 KB)

3 likes

De lege mappen kunnen ook worden gemaakt en vervolgens worden verplaatst naar de BASE-map.

Hier is de gewijzigde/bijgewerkte versie van de macro die door @m_blt wordt gedeeld, waarbij submappen worden toegevoegd aan de lege BASE-map.

CreationSsDossiersV1.swp (40 KB)

1 like

Dank u @Deepak_Gupta voor het aanvullende antwoord.
En erg blij om te verwelkomen op dit forum, een van de grote bijdragers sw van een ander bekend forum! :smiley:

2 likes

Bedankt @sbadenis :smiling_face_with_three_hearts:

1 like

HARTELIJK DANK aan @m_blt & @Deepak_Gupta voor hun onschatbare hulp :+1:

Ik heb uw codes aangepast en de aanmaak van de PLOTS-map (oorspronkelijk ter vervanging van BASE) toegevoegd als deze niet bestaat. Ik heb ook het maken van afgeleide configuraties toegevoegd aan de +SOL+PLOTS configuratie (en het maken als het niet bestaat).

Hier is mijn code:

'----------------------------------------------------------------------
'MACRO CREATION DOSSIER/SOUS DOSSIERS PLOTS + CREATION CONFIG/SOUS CONFIGS PLOTS
'----------------------------------------------------------------------

Option Explicit

Sub Main()
    Dim swApp           As SldWorks.SldWorks
    Dim swAssemb        As AssemblyDoc
    Dim swFeature       As Feature
    Dim boolstatus      As Boolean
    Dim swPlotFolder    As FeatureFolder
    Dim myFeature       As Feature
    Dim swModel         As SldWorks.ModelDoc2
    Dim swConfMgr       As SldWorks.ConfigurationManager
    Dim swConf          As SldWorks.Configuration
    Dim swDerivConf     As SldWorks.Configuration
'----------------------------------------------------------------------
    Set swApp = Application.SldWorks
    Set swAssemb = swApp.ActiveDoc

    ' Vérif doc assemblage
    If swAssemb.GetType <> swDocASSEMBLY Then
        MsgBox "Le document actif n'est pas un assemblage. Veuillez lancer la macro sur un assemblage."
        Exit Sub
    End If

    ' Vérif existance dossier 'PLOTS'
    Set swFeature = swAssemb.FeatureByName("PLOTS")

    If swFeature Is Nothing Then
        ' Création dossier 'PLOTS' s'il n'existe pas
        boolstatus = swAssemb.Extension.SelectByID2("", "FEATUREMANAGER", 0, 0, 0, False, 0, Nothing, 0)
        Set swFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
        swFeature.Name = "PLOTS"
        MsgBox "Le dossier 'PLOTS' a été créé.", vbInformation, "Résultat"
    End If

    ' Une fois le dossier 'PLOTS' trouvé ou créé, ajouter les sous-dossiers
    boolstatus = swAssemb.Extension.SelectByID2("PLOTS", "FTRFOLDER", 0, 0, 0, False, 0, Nothing, 0)
    
    ' Sous-dossier "PLOTS LONGS"
    Set myFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    myFeature.Name = "PLOTS LONGS"
    boolstatus = swAssemb.Extension.ReorderFeature("PLOTS LONGS", swFeature.Name, swMoveLocation_e.swMoveToFolder)
    
    ' Sous-dossier "PLOTS COURTS"
    Set myFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    myFeature.Name = "PLOTS COURTS"
    boolstatus = swAssemb.Extension.ReorderFeature("PLOTS COURTS", swFeature.Name, swMoveLocation_e.swMoveToFolder)
    
    ' Sous-dossier "PLOTS MISE EN PLAN"
    Set myFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    myFeature.Name = "PLOTS MISE EN PLAN"
    boolstatus = swAssemb.Extension.ReorderFeature("PLOTS MISE EN PLAN", swFeature.Name, swMoveLocation_e.swMoveToFolder)
    
    ' Mise à jour FeatureManager
    swAssemb.FeatureManager.UpdateFeatureTree

'----------------------------------------------------------------------

    'Traitement de configurations

    Set swModel = swApp.ActiveDoc

    Set swConfMgr = swModel.ConfigurationManager
    
    ' Vérifier si la configuration cible existe
    Set swConf = swModel.GetConfigurationByName("+SOL+PLOTS")
    If swConf Is Nothing Then
        ' Créer la configuration +SOL+PLOTS si elle n'existe pas
        Set swConf = swConfMgr.AddConfiguration("+SOL+PLOTS", "Configuration principale pour les PLOTS", "", 0, "", "")
        If swConf Is Nothing Then
            MsgBox "Impossible de créer la configuration '+SOL+PLOTS'.", vbCritical
            Exit Sub
        Else
            MsgBox "La configuration '+SOL+PLOTS' a été créée avec succès.", vbInformation
        End If
    End If
    
    ' Vérifier si la configuration dérivée existe déjà
    Set swDerivConf = swModel.GetConfigurationByName("PLOTS COURTS")
    If Not swDerivConf Is Nothing Then
        MsgBox "La configuration dérivée 'PLOTS COURTS' existe déjà.", vbInformation
        Exit Sub
    End If
    
    ' Créer les configurations dérivées
    Set swDerivConf = swConfMgr.AddConfiguration("PLOTS COURTS", "Configuration dérivée de +SOL+PLOTS", "", 1, swConf.Name, "")
    Set swDerivConf = swConfMgr.AddConfiguration("PLOTS LONGS", "Configuration dérivée de +SOL+PLOTS", "", 1, swConf.Name, "")

    
    ' Vérifier si la configuration a été créée
    If swDerivConf Is Nothing Then
        MsgBox "Échec de la création de la configuration dérivée.", vbCritical
    Else
        MsgBox "Configurations dérivées 'PLOTS COURTS' et 'PLOTS LONGS' créées avec succès.", vbInformation
    End If
    
    ''' Activation de la config +SOL+PLOTS
    boolstatus = swModel.ShowConfiguration2("+SOL+PLOTS")

    MsgBox "DOSSIER + SOUS-DOSSIERS PLOTS A JOUR  -  CONFIG + SOUS-CONFIG PLOTS A JOUR.", vbInformation, "Résultat"

End Sub

De MACRO werkte goed in het geval van een assemblage met 3 TEST-onderdelen:

Maar tijdens het testen op andere assemblages, heb ik vanaf het begin een MACRO-crash:

image

Ik begrijp niet waarom hij me vertelt dat een variabele niet is gedefinieerd terwijl het bij de eerste test wel werkte.

En bij het debuggen vertelt het me deze regel:

Heb je enig idee waarom het met sommige onderdelen werkt en niet met andere?

Dit is de juiste fout, aangezien er niets is geselecteerd om de lege map eerder toe te voegen. En aangezien er geen map wordt toegevoegd, kan de functie (map) niet worden hernoemd.

Dus in een leeg bestand kun je de Mates selecteren (laatste functie) en de map ervoor toevoegen (zoiets als onderstaande codes)

If swFeature Is Nothing Then
    
        Dim featCount As Long
        featCount = swAssemb.GetFeatureCount
        
        Dim swLastFeat As SldWorks.Feature
        Set swLastFeat = swAssemb.FeatureByPositionReverse(0)
        swLastFeat.Select2 False, -1

        ' Création dossier 'PLOTS' s'il n'existe pas
        'boolstatus = swAssemb.Extension.SelectByID2(swLastFeat.Name, "FEATUREMANAGER", 0, 0, 0, False, 0, Nothing, 0)

        Set swFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
        swFeature.Name = "PLOTS"
        MsgBox "Le dossier 'PLOTS' a été créé.", vbInformation, "Résultat"
    End If
4 likes