Macro création de dossiers dans le fearture + classement par propriété

Bonjour,

Je souhaiterais dans mes assemblages créer à l'aide d'une macro (vba) le dossier FI et Visserie et déplacer toutes les pièces ou assemblages de 1er niveau dans ces dossiers.

Pour cela je recherche des pistes pour:

1-Récuperer le nom de chaque pièce ou assemblage de 1er niveau

2-Récuperer la propriété catégorie de chacune de ces pièces ou assemblage

3-Créer un dossier dans le Feature manager

4-Déplacer les pièces ou assemblages avec la propriété catégorie = à visserie ou Fourniture industrielle dans le dossier approprié

 

Si vous avez des pistes pour l'une ou l'autre des étapes (procédure voir même exemple) cela pourrait fortement m'aider ;-)

 

Merci,

Sébastien

Bonjour,

Point 1 : fonction GetChildren avec un exemple ICI

Point 2 : fonction GetModelDoc2

Point 3 : Je ne me souviens plus, ça reviendra plus tard.

Point 4 : idem point 3

Cordialement,

2 « J'aime »

Point 3 et 4 : fonction InsertFeatureTreeFolder2 avec un exemple ICI

Cordialement,

2 « J'aime »

Bonjour,

Et voici pour l'exemple complet :

Option Explicit

' ce code nécessite que la référence "Microsoft Scripting Runtime" soit activée
Dim MonDico As New Scripting.Dictionary

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swAssy As SldWorks.AssemblyDoc
    Dim featureMgr As SldWorks.FeatureManager
    Dim feature As SldWorks.feature
    Dim swConf As SldWorks.Configuration
    Dim swRootComp As SldWorks.Component2
    Dim bRet As Boolean
    Dim Compteur As Long
    Dim TestValeurDico As Variant

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent

    TraverseComponent swRootComp, swRootComp.Name2, "catégorie", "visserie"
    
    Compteur = 1
    For Each TestValeurDico In MonDico.Keys
        Classement swModel, MonDico(TestValeurDico), Compteur, "Visserie"
        Compteur = Compteur + 1
    Next TestValeurDico
    Set MonDico = Nothing
    
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent
    
    TraverseComponent swRootComp, swRootComp.Name2, "catégorie", "Fourniture industrielle"
    
    Compteur = 1
    For Each TestValeurDico In MonDico.Keys
        Classement swModel, MonDico(TestValeurDico), Compteur, "FI"
        Compteur = Compteur + 1
    Next TestValeurDico
    Set MonDico = Nothing
End Sub

Sub TraverseComponent(swComp As SldWorks.Component2, nomAsm As String, nomVar As String, resultVar As String)
    Dim vChildCompArr As Variant
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swSelModel As SldWorks.ModelDoc2
    Dim swCompConfig As SldWorks.Configuration
    Dim Compteur As Long
    
    Compteur = 1
    vChildCompArr = swComp.GetChildren
    For Each vChildComp In vChildCompArr
        Set swChildComp = vChildComp
        If Not swChildComp Is Nothing Then
            Set swSelModel = swChildComp.GetModelDoc2
            GetPropChildren swSelModel, nomAsm, swChildComp.Name2, nomVar, resultVar, Compteur
        End If
        Compteur = Compteur + 1
    Next
End Sub

Sub GetPropChildren(swChild As SldWorks.ModelDoc2, nomAsm As String, nomPrt As String, nomVar As String, resultVar As String, Cle As Long)
    Dim swModelDocExtension As SldWorks.ModelDocExtension
    Dim swCustPropMgr As SldWorks.CustomPropertyManager
    Dim nbrProps As Long
    Dim vpropsnames As Variant
    Dim k As Long
    Dim valeur As String
    Dim val As String
    Dim valout As String
    Dim boolstatus As Boolean
    
    Set swModelDocExtension = swChild.Extension
    Set swCustPropMgr = swModelDocExtension.CustomPropertyManager("")
    
    nbrProps = swCustPropMgr.count
    vpropsnames = swCustPropMgr.GetNames
    
    For k = 0 To nbrProps - 1
        If vpropsnames(k) = nomVar Then
            boolstatus = swCustPropMgr.Get4(nomVar, False, val, valout)
            If valout = resultVar Then
                valeur = nomPrt & "@" & nomAsm
                If Not MonDico.Exists(Cle) Then
                    MonDico.Add Cle, valeur
                End If
            End If
        End If
    Next k
End Sub

Sub Classement(swModel As SldWorks.ModelDoc2, nomComposant As String, Nbr As Long, nomDossier As String)
    Dim swAssy As SldWorks.AssemblyDoc
    Dim featureMgr As SldWorks.FeatureManager
    Dim feature As SldWorks.feature
    Dim swConf As SldWorks.Configuration
    Dim swRootComp As SldWorks.Component2
    Dim bRet As Boolean
    Dim modelDocExt As SldWorks.ModelDocExtension
    Dim selectionMgr As SldWorks.selectionMgr
    Dim selObj As Object
    Dim status As Long
    Dim count As Long
    Dim i As Long
    Dim componentToMove As SldWorks.Component2
    Dim componentsToMove() As Object
    Dim retVal As Boolean

    swModel.ClearSelection2 True
    
    Set modelDocExt = swModel.Extension
    Set selectionMgr = swModel.SelectionManager

    status = modelDocExt.SelectByID2(nomComposant, "COMPONENT", 0, 0, 0, True, 0, Nothing, 0)
    Set selObj = selectionMgr.GetSelectedObject6(Nbr, -1)
    count = selectionMgr.GetSelectedObjectCount2(0)
    ReDim componentsToMove(count - 1)
    For i = 0 To count - 1
        Set componentToMove = selectionMgr.GetSelectedObjectsComponent4(i + 1, 0)
        Set componentsToMove(i) = componentToMove
    Next

    Dim erreur As String
    erreur = "Oui"
    Set swAssy = swModel
    Set featureMgr = swAssy.FeatureManager
    Set feature = swModel.FirstFeature
    Do While Not feature Is Nothing
        If feature.Name = nomDossier Then
            erreur = "Non"
        End If
        Set feature = feature.GetNextFeature
    Loop
    If erreur = "Oui" Then
        Set feature = featureMgr.InsertFeatureTreeFolder2(swFeatureTreeFolder_EmptyBefore)
        feature.Name = nomDossier
    End If
    
    Set feature = swAssy.FeatureByName(nomDossier)
    retVal = swAssy.ReorderComponents(componentsToMove, feature, swReorderComponents_LastInFolder)
    
    swModel.ClearSelection2 True
End Sub

Cordialement,


macroclassement3d.swp
2 « J'aime »

Merci @d.roger, c'est plus une piste c'est un autoroute que tu m'a réalisé!

Cela m'aide grandement je n'étais pas rendu aussi loin, plutôt très loin de là même...

Il me reste un soucis pour 1 cas spécial:

Les pièces créés avec une famille de pièce, ou la Catégorie est renseignée dans la configuration (type Vis ou autre) sont ignorée, il faudrait que je rajoute une condition si la propriété "catégorie" est vide alors regarder la propriété de la configuration.

 

Enfin il faut aussi que j'ajoute une amélioration pour supprimer le dossier Visserie et FI au démarrage de la macro si ils existent déjà. (au cas ou on relance la macro après ajout de nouvelles pièces)

Et enfin je voudrais déplacer les 2 dossiers tout en bas du feature manager si c'est possible (pas trouvé de piste pour déplacer le dossier).

 

 

Bonjour,

Voici une nouvelle version permettant de supprimer les dossiers au démarrage si ceux-ci existent et aussi de chercher la valeur de la variable dans toutes les configurations des éléments 3D.

Je n'ai pas cherché pour mettre les dossiers en fin du feature manager, on verra plus tard si j'ai le temps.

Petit rappel, ce n'est qu'un exemple donc la gestion des erreurs n'est pas faite ...

Cordialement,


macroclassement3d.swp
2 « J'aime »

Dernière version, celle avec le positionnement des dossiers en fin du feature manager ...

Cordialement,


macroclassement3d.swp
3 « J'aime »

Je teste ça dans la journée si j'arrive à trouver15-20mn, mais a 1ère vue semble parfaitement fonctionnel!

Pour la structure dictionnaire je découvre quelque chose de nouveau, dans l'élaboration de macro. Merci.

Je reviens faire un retour fin de journée si tout va bien.

 

Et merci @d.roger d'avoir pris le temps de regarder tout ça.

Après essai:

Il reste au moins 2  bug à résoudre:

- si une pièce est à l'état supprimé (N°1-Image1)-> impossible de trouver la configuration par défaut -> erreur -> il faut que je trouve comment l'ignorer si la pièce est à l'état suppression. (pour bug 2 remettre non supprimé)

- le déplacement de dossier ne fonctionne pas bien le dossier bien se retrouve tout en bas, mais toutes les pièces en dessous de la 1ère à déplacer dans le dossier, se retrouvent également dans le dossier.

Et en plus le dossier ne peut être "étendu" avec la flèche pour en voir le contenu.

Alors que sans le déplacement la flèche est bien là.

Je pense qu'il déplace tout les élément en dessous du dossier dedans y compris les autre dossiers créer ensuite.

Exemple avant la macro (Image 1)

En N°1 assemblage supprimé pour bug 1

En N°2 (Visserie)

En N°3 et 4 (FI)

 

Ci-joint, mon assemblage test, et la macro avec les propriétés avec le bon casse (erreur de ma part lors du 1er poste).


test_dossiers.zip

Bonjour,

Voici une nouvelle version qui permet d'éviter les éléments qui sont à l'état supprimé, j'ai enlevé les lignes qui déplacent les dossiers car effectivement ça bug dans certain cas (à réfléchir comment faire mais plus trop le temps pour le moment).

Cordialement,


macroclassement3d_1.swp
2 « J'aime »

Bonjour,

Merci pour la dernière version qui règle effectivement le soucis sur les pièces supprimés.

Je vais clôturé le sujet malgré le bug sur le déplacement de dossier mais qui n'était pas demandé dans la question de base.

Pour le déplacement de dossier j'ai quelques idées:

- déplacer d'abord les pièces plutôt que le dossier puis créer le dossier

- trouver pourquoi cela bug (en posant la question sur le forum dédié macro solidworks en anglais)

Pour le reste la macro est parfaitement fonctionnel et je te remercie @ d.roger pour le travail parfait effectué, cela m'a fais gagner un temps plus que précieux tout en ayant un code bien plus propre que ce que j'aurais fais avec mon niveau de débutant.
 

 

Bonjour,

Merci pour la dernière version qui règle effectivement le soucis sur les pièces supprimés.

Je vais clôturé le sujet malgré le bug sur le déplacement de dossier mais qui n'était pas demandé dans la question de base.

Pour le déplacement de dossier j'ai quelques idées:

- déplacer d'abord les pièces plutôt que le dossier puis créer le dossier

- trouver pourquoi cela bug (en posant la question sur le forum dédié macro solidworks en anglais)

Pour le reste la macro est parfaitement fonctionnel et je te remercie @d.roger pour le travail parfait effectué, cela m'a fais gagner un temps plus que précieux tout en ayant un code bien plus propre que ce que j'aurais fais avec mon niveau de débutant.

 

1 « J'aime »

Bonjour,

De rien pour le merci, l'entraide est le principe du forum ...

Pour le déplacement des dossiers, la première idée que tu envisage est une chose à laquelle j'ai aussi pensé mais pas le temps de la tester pour le moment. Si tu as une solution fonctionnelle je suis preneur, cela fera du bien à ma culture générale ...

N'oublie pas de retravailler le code pour ajouter la gestion des erreurs.

Cordialement,

1 « J'aime »

Pas de soucis, pur la gestion des erreurs il faut effectivement que j'ajoute un peu de code mais rien a inventer juste à repiquer à droite à gauche ce qui devrait me convenir!

Si je trouve une solution je reposterais la solution ici.