MAKRO Tworzenie podfolderów istniejącego folderu

Witam

Potrzebowałbym twojego oświecenia. Chcę zrobić makro, które utworzyłoby 3 podfoldery istniejącego folderu.
Istniejący folder nazywa się BASE, a 3 podfoldery noszą nazwę Opcja1/Opcja2/Opcja3.
Majstrowałem przy tym kodzie, ale makro nie znajduje folderu BASE, więc nie ma tworzenia podfolderów...

Czy masz jakieś rozwiązania? :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

Witaj @MLG ,

FeatureByName jest metodą dokumentu części lub złożenia, a nie obiektu FeatureManager...

Z drugiej strony, tworzenie folderu działa tylko wtedy, gdy komponent jest zaznaczony w drzewie. Aby utworzyć podfoldery folderu " BASE ", musi on zawierać co najmniej jeden komponent.
Jeśli tak, zostaną utworzone podfoldery.
Załączone makro powinno działać.

CreationSsFolders.swp (43 KB)

3 polubienia

Można również utworzyć puste foldery, a następnie przenieść je do folderu BASE.

Oto zmodyfikowana/zaktualizowana wersja makra udostępniona przez @m_blt , w której podfoldery są dodawane do pustego folderu BASE.

CreationSsDossiersV1.swp (40 KB)

1 polubienie

Dziękuję @Deepak_Gupta za dodatkową odpowiedź.
I bardzo się cieszę, że mogę powitać na tym forum, jednego z wielkich współpracowników sw z innego znanego forum! :smiley:

2 polubienia

Dziękuję Ci @sbadenis :smiling_face_with_three_hearts:

1 polubienie

WIELKIE PODZIĘKOWANIA dla @m_blt & @Deepak_Gupta za ich nieocenioną pomoc :+1:

Dostosowałem Twoje kody i dodałem utworzenie folderu PLOTS (oryginalnie zastępującego BASE), jeśli go nie ma. Dodałem również tworzenie konfiguracji pochodnych do konfiguracji +SOL+PLOTS (i tworzenie, jeśli nie istnieje).

Oto mój kod:

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

MAKRO sprawdziło się w przypadku montażu z 3 częściami TESTOWYMI:

Ale podczas testowania na innych zestawach mam awarię MACRO od początku:

image

Nie rozumiem, dlaczego mówi mi, że zmienna nie jest zdefiniowana, skoro w pierwszym teście zadziałała.

A podczas debugowania mówi mi ten wiersz:

Czy masz pojęcie, dlaczego działa z niektórymi częściami, a z innymi nie?

Jest to poprawny błąd, ponieważ wcześniej nie wybrano niczego, co można by dodać pusty folder. A ponieważ nie jest dodawany żaden folder, nie można zmienić nazwy funkcji (folderu).

Tak więc w pustym pliku możesz wybrać Wiązania (ostatnia cecha) i dodać folder przed nim (coś jak poniżej kody)

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 polubienia