Kunnen lege geëxplodeerde treden automatisch worden verwijderd?

Hallo

Ik werk regelmatig met blends die al heel wat evoluties hebben ondergaan. Wanneer ik de exploded view herbewerk, realiseer ik me dat sommige stadia van de explosie nog steeds aanwezig zijn, maar niet langer verbonden zijn met enig element van de assemblage (erfenis van het verleden...)
Dit bemoeilijkt het begrip van de exploded view aanzienlijk en het irriteert me om elke stap te openen om te zien of het nog steeds zinvol is...

Weet u een manier om de exploded view boom op te schonen (automatisch of door een macro)?

Bij voorbaat dank!

1 like

Na een snelle zoektocht vinden we niet veel in macro over het onderwerp explodes.
Het enige onderwerp dat in alle opzichten geschikt was, kreeg nooit het minste antwoord:

Tenzij een van onze macro-experts iets vindt, is het niet echt gemakkelijk.

1 like

Ik heb op dit moment niet al te veel tijd om te graven, maar ik heb de indruk dat hier wat koren op de molen zou zijn:

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

Ja inderdaad, als je het aantal lichamen (GetBodies) in een stap telt, is het zeker speelbaar.

1 like

Hallo @s.descamps ,

Het is heel goed mogelijk om de configuraties op te sommen, naar elke configuratie te zoeken als er een of meer exploded views zijn, elke explodeerstap en het aantal componenten dat deze bevat op te sommen, en vervolgens de stap te verwijderen als deze geen componenten bevat.

Vraag: hoe krijg je een configuratie met een geëxplodeerd waarbij ten minste één stap geen componenten bevat. Ik kan het niet krijgen, noch bij de creatie, noch door het podium te veranderen...
Het lijkt erop dat SolidWorks zijn eigen rotzooi aan het opruimen is.
Kun je een voorbeeld geven van een assemblage met een geëxplodeerde trede leeg van componenten?

2 likes

Dank u voor uw antwoord.
Inderdaad, wanneer ik een nieuw bestand test, lijkt SW op te ruimen wanneer je een onderdeel verwijdert.
Ik denk dat mijn probleem meer oude assemblages betreft, gemaakt in een oude versie en die vele evoluties hebben ondergaan.
Helaas kan ik hier om privacyredenen geen concreet voorbeeld plaatsen.

1 like

De macrobijlage is een manier om je vraag te beantwoorden.
Bij gebrek aan een werkbaar voorbeeld is het onmogelijk om verder te gaan dan dit ontwerp, met uitgebreide tests en het overwegen van verschillende mogelijke situaties.
Vriendelijke groeten.
MacroEclate.swp (60,5 kB)

1 like

Heel erg bedankt m.blt :grinning: !
Ik zal daar naar kijken

Ik krijg het bericht 'type komt niet overeen' op de volgende regel:
viewNames = swAssemb.GetExplodedViewNames2(swConfig.Name)

Toch moet deze functie een "string" :thinking: type teruggeven?

OK

Er is een gebrek aan foutafhandeling.
Als ik op de Default config geen probleem omdat er een exploded view aanwezig is.
Aan de andere kant op de symmetrie config hetzelfde bericht incompatibiliteit, omdat onmogelijk om een geëxplodeerde View te vinden naar mijn mening, vandaar de foutmelding denk ik.
image

Dat is wat ik zei toen ik eerder controleerde of er een exploded view aanwezig is, het werkt, het ontbrak alleen aan deze foutafhandeling:

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

Bedankt! We boeken vooruitgang :wink:

Ik krijg de melding "De hint behoort niet tot de selectie" op de volgende regel:

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

Ik heb deze fout niet, maar probeer in plaats daarvan dit (als er geen exploded view is in de volgende config-> config):

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

Ik heb net het einde verplaatst als om de rest van de code op te nemen als er geen exploded view in de configuratie is

Goed nieuws: Geweldig, hij draait!
Slecht nieuws: op mijn testsubset wordt de lege stap niet verwijderd :exploding_head:

Ik heb een spion op nbComps gezet en hij ziet een onderdeel van de stap in kwestie

1 like

Ik geef aan dat ik in de andere fasen het juiste aantal componenten heb

1 like

Ik reproduceer inderdaad het probleem onder SW2020
Als ik een onderdeel uit mijn keten 2 schrap, vindt hij het voor mij in de keten stap 2 bij nr. 1
Terwijl hij het in 2 niet meer kan vinden. En in 3 staat het onderdeel niet meer in de boomstructuur omdat het is verwijderd na het maken van de stap.

Aan de andere kant is het geen codeprobleem, maar een solidworks-probleem, aangezien we handmatig de onderdeelbug reproduceren die zichtbaar is in de stap...
Ik weet niet zeker of ik nog iets meer zou kunnen doen.

Tijdens het testen realiseerde ik me dat "GetComponentName" de waarde "–NA–" retourneert als er geen onderdeel is gekoppeld.

Dus heb ik deze voorwaarde aan de test toegevoegd:

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

Om getest te worden, maar het zou misschien zijn werk kunnen doen

Bewerken:
Ik heb de regel veranderd

                    Comp = explStep.GetComponentName(0)

Omdat de waarde (1) de 2e component retourneerde en we de stappen verwijderden met slechts één component eraan.
Ik ben aan het testen met verschillende assemblages, maar op dit moment ziet het er goed uit.

1 like

Dank u sbadenis en m.blt voor uw bijdragen :+1: !