Können leere Explosionsschritte automatisch gelöscht werden?

Hallo

Ich arbeite regelmäßig mit Mischungen, die viele Entwicklungen durchlaufen haben. Wenn ich die Explosionsansicht überarbeite, stelle ich fest, dass einige Stadien der Explosion immer noch vorhanden sind, aber nicht mehr mit irgendeinem Element der Montage verbunden sind (Vermächtnis der Vergangenheit...)
Das erschwert das Verständnis der Explosionszeichnung erheblich und es nervt mich, jeden Schritt zu öffnen, um zu sehen, ob er noch Sinn macht...

Kennen Sie eine Möglichkeit, den Explosionszeichnungsbaum zu bereinigen (entweder automatisch oder durch ein Makro)?

Vielen Dank im Voraus!

1 „Gefällt mir“

Nach einer schnellen Suche finden wir im Makro nicht viel zum Thema Explosionen.
Das einzige Thema, das in jeder Hinsicht geeignet war, erhielt nie die geringste Antwort:

Wenn nicht einer unserer Makro-Experten fündig wird, ist es nicht ganz einfach.

1 „Gefällt mir“

Ich habe im Moment nicht allzu viel Zeit zum Graben, aber ich habe den Eindruck, dass es hier etwas Wasser zu mahlen gibt:

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

Ja, in der Tat, wenn man die Anzahl der Körper (GetBodies) in einem Schritt zählt, ist es sicherlich spielbar.

1 „Gefällt mir“

Hallo @s.descamps ,

Es ist durchaus möglich, die Konfigurationen aufzulisten, nach jeder einzelnen Konfigurationen zu suchen, wenn es eine oder mehrere aufgelöste Ansichten gibt, jeden Explosionsschritt und die Anzahl der darin enthaltenen Komponenten aufzulisten und dann den Schritt zu löschen, wenn er keine Komponenten enthält.

Frage: Wie bekomme ich eine Konfiguration mit einer Explosion, bei der mindestens ein Schritt keine Komponenten enthält? Ich kann es nicht bekommen, weder bei der Schöpfung, noch durch das Wechseln der Bühne...
Es scheint, als würde SolidWorks sein eigenes Chaos aufräumen.
Können Sie ein Beispiel für eine Baugruppe mit einer Explosionsstufe ohne Komponenten nennen?

2 „Gefällt mir“

Vielen Dank für Ihre Antwort.
In der Tat, wenn ich eine neue Datei teste, scheint SW aufzuräumen, wenn Sie eine Komponente entfernen.
Ich denke, mein Problem betrifft mehr alte Baugruppen, die in einer alten Version erstellt wurden und viele Entwicklungen durchlaufen haben.
Leider werde ich hier aus Datenschutzgründen kein konkretes Beispiel posten können.

1 „Gefällt mir“

Der Makroanhang ist eine Möglichkeit, Ihre Frage zu beantworten.
In Ermangelung eines praktikablen Beispiels ist es unmöglich, über diesen Entwurf hinauszugehen, indem umfangreiche Tests durchgeführt und verschiedene mögliche Situationen in Betracht gezogen werden.
Herzliche Grüße.
MacroEclate.swp (60.5 KB)

1 „Gefällt mir“

Vielen Dank m.blt :grinning: !
Das werde ich mir anschauen

Ich erhalte die Meldung "Type Mismatch" in der folgenden Zeile:
viewNames = swAssemb.GetExplodedViewNames2(swConfig.Name)

Dennoch muss diese Funktion einen "String :thinking: "-Typ zurückgeben?

OKAY

Es fehlt an Fehlerbehandlung.
Wenn ich auf der Standardkonfiguration bin, kein Problem, weil eine explodierte Ansicht vorhanden ist.
Auf der anderen Seite ist die gleiche Meldung inkompatibel, weil es meiner Meinung nach unmöglich ist, eine explodierte Ansicht zu finden, daher denke ich die Fehlermeldung.
image

Das habe ich gesagt, als ich zuvor überprüft habe, ob eine explodierte Ansicht vorhanden ist, es funktioniert nur, es fehlte nur diese Fehlerbehandlung:

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

Vielen Dank! Wir machen Fortschritte :wink:

Ich bekomme die Meldung "Der Hinweis gehört nicht zur Auswahl" in der folgenden Zeile:

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

Ich habe diesen Fehler nicht, aber versuche es stattdessen (wenn in der folgenden config->-Konfiguration keine explodierte Ansicht vorhanden ist):

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

Ich habe gerade das Ende verschoben, um den Rest des Codes einzuschließen, wenn keine explodierte Ansicht in der Konfiguration enthalten ist

Die gute Nachricht: Super, es läuft!
Schlechte Nachricht: Bei meiner Testteilmenge wird der leere Schritt nicht gelöscht :exploding_head:

Ich habe einen Spion auf nbComps gelegt, und er sieht eine Komponente auf dem fraglichen Schritt

1 „Gefällt mir“

Ich gebe an, dass ich in den anderen Phasen die richtige Anzahl von Komponenten habe

1 „Gefällt mir“

Ich reproduziere das Problem tatsächlich unter SW2020
Wenn ich eine Komponente aus meiner Kette 2 lösche, findet sie sie für mich im Kettenschritt 2 bei Nr. 1
In 2 kann er es nicht mehr finden. Und in 3 befindet sich das Teil nicht mehr in der Baumansicht, da es nach der Erstellung des Schritts gelöscht wurde.

Auf der anderen Seite handelt es sich nicht um ein Codeproblem, sondern um ein Solidworks-Problem, da wir den im Schritt sichtbaren Teilefehler manuell reproduzieren...
Ich bin mir nicht sicher, ob ich noch etwas tun könnte.

Beim Testen habe ich festgestellt, dass "GetComponentName" den Wert "–NA–" zurückgibt, wenn keine Komponente angehängt ist.

Also habe ich diese Bedingung in den Test aufgenommen:

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

Zu testen, aber es könnte vielleicht die Aufgabe erfüllen

Redigieren:
Ich habe die Zeile geändert

                    Comp = explStep.GetComponentName(0)

Weil der Wert (1) die 2. Komponente zurückgegeben hat und wir die Schritte mit nur einer angehängten Komponente gelöscht haben.
Ich teste mit verschiedenen Baugruppen, aber im Moment sieht es gut aus.

1 „Gefällt mir“

Vielen Dank an sbadenis und m.blt für Ihre Beiträge :+1: !