Peut-on supprimer automatiquement les étapes d'éclaté vides?

Bonjour,

je travaille régulièrement avec des assemblages ayant connu de nombreuses évolutions. Quand je retravaille la vue éclatée, je réalise que certaines étapes d’éclatement sont toujours présentes mais ne sont plus rattachées à aucun élément de l’assemblage (héritage du passé…)
Cela complique significativement la compréhension du la vue éclatée et ça m’énerve d’ouvrir chaque étape pour voir si elle a encore un sens…

Connaissez-vous un moyen d’épurer l’arborescence de la vue éclatée (soit automatiquement, soit par une macro) ?

Merci d’avance !

1 « J'aime »

Après une rapide recherche on ne trouve pas grand chose en macro sur le sujet des éclaté (explode).
Le seul sujet qui convenait en tout point n’a jamais reçu la moindre réponse:

A moins que l’un de nos expert macro trouve quelque chose c’est pas vraiment gagné.

1 « J'aime »

Je n’ai pas trop le temps de creuser pour le moment, mais j’ai l’impression qu’il y aurait du grain à moudre ici :

https://help.solidworks.com/2021/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ipartexplodestep_members.html

Oui effectivement en comptant le nombre de corps ( GetBodies) dans un step c’est sûrement jouable.

1 « J'aime »

Bonjour @s.descamps ,

Lister les configurations, rechercher pour chacune s’il y a une ou plusieurs vues éclatées, lister chaque étape d’éclatement et le nombre de composants qu’elle contient est tout à fait possible, puis supprimer l’étape si elle ne contient aucun composant.

Question: comment obtenir une configuration avec un éclaté dont une étape au moins ne contient aucun composant. Je ne parviens pas à l’obtenir, ni à la création, ni ensuite en modifiant l’étape…
Il semble que SolidWorks fait le ménage lui-même.
Pouvez-vous partager un exemple d’assemblage avec une étape d’éclaté vide de composants ?

2 « J'aime »

Merci pour votre réponse.
Effectivement quand je fais des essais sur un nouveau fichier, SW semble faire le ménage quand on supprime un composant.
Je pense que mon problème concerne plus de vieux assemblages, crées dans une ancienne version et ayant subi de nombreuses évolutions.
Malheureusement, pour des questions de confidentialité, je ne vais pas pouvoir poster ici un exemple concret.

1 « J'aime »

La macro jointe est une piste pour répondre à votre question.
Faute d’un exemple exploitable, il est impossible d’aller au-delà de cette ébauche, avec des tests approfondis et en envisageant différentes situations possibles.
Cordialement.
MacroEclate.swp (60,5 Ko)

1 « J'aime »

Merci beaucoup m.blt :grinning: !
Je vais regarder ça

J’ai un message « incompatibilité de type » sur la ligne suivante :
viewNames = swAssemb.GetExplodedViewNames2(swConfig.Name)

Pourtant cette fonction doit bien renvoyer un type « string » :thinking: ?

Ok

Il manque une gestion d’erreur.
Quand je suis sur la config Défaut pas de problème car une vue éclaté est présente.
Par contre sur la config symétrie même message incompatibilité car impossible de trouver une Vue éclaté à mon avis, d’où le message d’erreur je pense.
image

C’est bien ce que je disais en vérifiant avant si une vue éclaté est présente cela fonctionne, il manquait juste cette gestion d’erreur:

Option Explicit

        Dim swApp       As SldWorks.SldWorks
        Dim swModel     As SldWorks.ModelDoc2
        Dim swAssemb    As SldWorks.AssemblyDoc
        Dim swConfig    As SldWorks.Configuration
        Dim cfgNames()  As String
        Dim viewNames() As String
        Dim noCfg       As Long
        Dim explStep    As SldWorks.ExplodeStep
        Dim nbSteps     As Long
        Dim noStep      As Long
        Dim noView      As Long
        Dim nbComps     As Long
  

Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swAssemb = swModel
    
    cfgNames = swModel.GetConfigurationNames
    
    For noCfg = 0 To UBound(cfgNames)                           'Boucle sur toutes les configurations
        swModel.ShowConfiguration2 (cfgNames(noCfg))            'Sélection de la configuration
        swModel.ForceRebuild3 False
        Set swConfig = swModel.ConfigurationManager.ActiveConfiguration
        If swAssemb.GetExplodedViewCount2(swConfig.Name) > 0 Then 'On vérifie le nb de vue éclaté
        viewNames = swAssemb.GetExplodedViewNames2(swConfig.Name)   'Vues éclatées de la config
        End If
        For noView = 0 To UBound(viewNames)                         'Boucle sur les vues éclatées
            swAssemb.ShowExploded2 True, viewNames(noView)          'Activation de la vue éclatée
        
            nbSteps = swConfig.GetNumberOfExplodeSteps              'Nombre d'étapes d'éclatement
            noStep = 1
            While noStep <= nbSteps                                 'Boucle sur les étapes d'éclatement
                Set explStep = swConfig.GetExplodeStep(noStep - 1)  'Sélection de l'étape
                If Not (explStep Is Nothing) Then
                    nbComps = explStep.GetNumOfComponents           'Nbre de composants dans l'étape
                    If nbComps = 0 Then                             'si le nbre de composants dans l'étape est nul
                        swConfig.DeleteExplodeStep (explStep.Name)      'Suppression de l'étape
                        nbSteps = swConfig.GetNumberOfExplodeSteps      'Mise à jour du nombre d'étapes
                    Else
                        noStep = noStep + 1                             'étape suivante
                    End If
                End If
            Wend
        Next noView                                             'Vue suivante
    Next noCfg                                                  'Configuration suivante
   
End Sub

Merci ! On progresse :wink:

J’ai un message « L’indice n’appartient pas à la sélection » sur la ligne suivante :

For noView = 0 To UBound(viewNames)   'Boucle sur les vues éclatées

J’ai pas cette erreur mais essaie ça plutôt (si pas de vue éclaté dans la config-> config suivante):

Option Explicit

        Dim swApp       As SldWorks.SldWorks
        Dim swModel     As SldWorks.ModelDoc2
        Dim swAssemb    As SldWorks.AssemblyDoc
        Dim swConfig    As SldWorks.Configuration
        Dim cfgNames()  As String
        Dim viewNames() As String
        Dim noCfg       As Long
        Dim explStep    As SldWorks.ExplodeStep
        Dim nbSteps     As Long
        Dim noStep      As Long
        Dim noView      As Long
        Dim nbComps     As Long
  

Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swAssemb = swModel
    
    cfgNames = swModel.GetConfigurationNames
    
    For noCfg = 0 To UBound(cfgNames)                           'Boucle sur toutes les configurations
        swModel.ShowConfiguration2 (cfgNames(noCfg))            'Sélection de la configuration
        swModel.ForceRebuild3 False
        Set swConfig = swModel.ConfigurationManager.ActiveConfiguration
        If swAssemb.GetExplodedViewCount2(swConfig.Name) > 0 Then   'Si une vue éclaté est trouvée
            viewNames = swAssemb.GetExplodedViewNames2(swConfig.Name)   'Vues éclatées de la config
            For noView = 0 To UBound(viewNames)                         'Boucle sur les vues éclatées
                swAssemb.ShowExploded2 True, viewNames(noView)          'Activation de la vue éclatée
            
                nbSteps = swConfig.GetNumberOfExplodeSteps              'Nombre d'étapes d'éclatement
                noStep = 1
                While noStep <= nbSteps                                 'Boucle sur les étapes d'éclatement
                    Set explStep = swConfig.GetExplodeStep(noStep - 1)  'Sélection de l'étape
                    If Not (explStep Is Nothing) Then
                        nbComps = explStep.GetNumOfComponents           'Nbre de composants dans l'étape
                        If nbComps = 0 Then                             'si le nbre de composants dans l'étape est nul
                            swConfig.DeleteExplodeStep (explStep.Name)      'Suppression de l'étape
                            nbSteps = swConfig.GetNumberOfExplodeSteps      'Mise à jour du nombre d'étapes
                        Else
                            noStep = noStep + 1                             'étape suivante
                        End If
                    End If
                Wend
            Next noView                                             'Vue suivante
        End If
    Next noCfg                                                  'Configuration suivante
   
End Sub

Juste déplacé le end if pour inclure tout le reste du code si pas de vue éclaté dans la config

Bonne nouvelle : Super, ça tourne !
Mauvaise nouvelle : sur mon sous-ensemble test, l’étape vide n’est pas supprimée :exploding_head:

J’ai mis un espion sur nbComps, et il voit un composant sur l’étape en question

1 « J'aime »

Je précise que sur les autres étapes, j’ai le bon nombre de composants

1 « J'aime »

Je reproduit effectivement le problème sous SW2020
Si je supprime un composant de ma chaine 2 il me le trouve dans l’étape chaine 2 au N°1
Alors qu’en 2 il ne le trouve plus. Et en 3 la pièce n’est plus dans l’arborescence puisque supprimé après création de l’étape.

Par contre c’est pas un problème de code mais un problème de solidworks puisque manuellement on reproduit le bug pièce visible dans l’étape…
Pas sûr de pouvoir faire quoi que ce soit de plus.

En testant, j’ai réalisé que « GetComponentName » renvoie la valeur « –NA– » s’il n’y a pas de composant attaché.

Du coup j’ai ajouté cette condition au test :

Option Explicit

        Dim swApp       As SldWorks.SldWorks
        Dim swModel     As SldWorks.ModelDoc2
        Dim swAssemb    As SldWorks.AssemblyDoc
        Dim swConfig    As SldWorks.Configuration
        Dim cfgNames()  As String
        Dim viewNames() As String
        Dim noCfg       As Long
        Dim explStep    As SldWorks.ExplodeStep
        Dim nbSteps     As Long
        Dim noStep      As Long
        Dim noView      As Long
        Dim nbComps     As Long
        Dim NbSup       As Integer
        Dim Comp As Variant
              

Sub main()

Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swAssemb = swModel
    
    NbSup = 0
    cfgNames = swModel.GetConfigurationNames
    
    For noCfg = 0 To UBound(cfgNames)                           'Boucle sur toutes les configurations
        swModel.ShowConfiguration2 (cfgNames(noCfg))            'Sélection de la configuration
        swModel.ForceRebuild3 False
        Set swConfig = swModel.ConfigurationManager.ActiveConfiguration
        If swAssemb.GetExplodedViewCount2(swConfig.Name) > 0 Then 'On vérifie le nb de vue éclaté
        viewNames = swAssemb.GetExplodedViewNames2(swConfig.Name)   'Vues éclatées de la config
        For noView = 0 To UBound(viewNames)                         'Boucle sur les vues éclatées
            swAssemb.ShowExploded2 True, viewNames(noView)          'Activation de la vue éclatée
        
            nbSteps = swConfig.GetNumberOfExplodeSteps              'Nombre d'étapes d'éclatement
            noStep = 1
            While noStep <= nbSteps                                 'Boucle sur les étapes d'éclatement
                Set explStep = swConfig.GetExplodeStep(noStep - 1)  'Sélection de l'étape
                If Not (explStep Is Nothing) Then
                    nbComps = explStep.GetNumOfComponents           'Nbre de composants dans l'étape
                    Comp = explStep.GetComponentName(0)
                    If nbComps = 0 Or Comp = "--NA--" Then              'si le nbre de composants dans l'étape est nul
                        swConfig.DeleteExplodeStep (explStep.Name)      'Suppression de l'étape
                        nbSteps = swConfig.GetNumberOfExplodeSteps      'Mise à jour du nombre d'étapes
                        NbSup = NbSup + 1                               'Incrémente le compteur
                    Else
                        noStep = noStep + 1                             'étape suivante
                    End If
                End If
            Wend
        Next noView                                             'Vue suivante
    End If
    Next noCfg                                                  'Configuration suivante

   MsgBox NbSup & " étapes supprimées"                          'Affiche le nombre d'étapes supprimées

 End Sub

A tester mais ça pourrait peut-être faire le job

Edit :
J’ai modifié la ligne

                    Comp = explStep.GetComponentName(0)

car la valeur (1) renvoyait le 2ème composant, et on supprimait les étapes n’ayant qu’un seul composant attaché.
Je teste avec différents assemblages mais pour le moment ça a l’air pas mal.

1 « J'aime »

Merci sbadenis et m.blt pour vos contributions :+1: !