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) ?
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é.
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 ?
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.
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)
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.
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
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
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.