Czy puste rozstrzelone kroki mogą być automatycznie usuwane?

Witam

Regularnie pracuję z mieszankami, które przeszły wiele ewolucji. Kiedy przerabiam widok rozstrzelony, zdaję sobie sprawę, że niektóre etapy eksplozji są nadal obecne, ale nie są już powiązane z żadnym elementem zespołu (dziedzictwo przeszłości...)
To znacznie komplikuje zrozumienie widoku rozstrzelonego i denerwuje mnie, gdy otwieram każdy krok, aby sprawdzić, czy to nadal ma sens...

Czy znasz sposób na oczyszczenie rozstrzelonego drzewa widoku (automatycznie lub za pomocą makra)?

Z góry dzięki!

1 polubienie

Po szybkim wyszukiwaniu nie znajdziemy zbyt wiele w makro na temat wybuchów.
Jedyny temat, który był odpowiedni pod każdym względem, nigdy nie doczekał się najmniejszej odpowiedzi:

Chyba, że któryś z naszych ekspertów od makr coś znajdzie, nie jest to łatwe.

1 polubienie

Nie mam w tej chwili zbyt wiele czasu na grzebanie, ale mam wrażenie, że byłaby tu jakaś ziarno do zmielenia:

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

Tak, rzeczywiście, licząc liczbę ciał (GetBodies) w kroku, z pewnością jest grywalny.

1 polubienie

Witaj @s.descamps ,

Wyświetlenie listy konfiguracji, wyszukanie każdej z nich, jeśli istnieje jeden lub więcej widoków rozstrzelonych, wyszczególnienie każdego kroku rozstrzelenia i liczby zawartych w nim komponentów jest całkiem możliwe, a następnie usunięcie kroku, jeśli nie zawiera żadnych komponentów.

Pytanie: jak uzyskać konfigurację z rozstrzeleniem, gdzie co najmniej jeden krok nie zawiera żadnych komponentów. Nie mogę tego pojąć, ani przy tworzeniu, ani przy zmianie sceny...
Wygląda na to, że SolidWorks sprząta swój własny bałagan.
Czy możesz podać przykład zespołu z rozstrzelonym krokiem pozbawionym komponentów?

2 polubienia

Dziękuję za odpowiedź.
Rzeczywiście, kiedy testuję nowy plik, oprogramowanie wydaje się czyścić po usunięciu komponentu.
Myślę, że mój problem dotyczy bardziej starych złożeń, stworzonych w starej wersji i przeszłych wiele ewolucji.
Niestety, ze względu na ochronę prywatności, nie będę w stanie zamieścić tutaj konkretnego przykładu.

1 polubienie

Załącznik makra to sposób na udzielenie odpowiedzi na Twoje pytanie.
Ze względu na brak wykonalnego przykładu niemożliwe jest wyjście poza ten projekt, z szeroko zakrojonymi testami i rozważeniem różnych możliwych sytuacji.
Pozdrowienia.
Plik MacroEclate.swp (60,5 KB)

1 polubienie

Dziękuję bardzo m.blt :grinning: !
Przyjrzę się temu

Otrzymuję komunikat "niezgodność typów" w następującym wierszu:
viewNames = swAssemb.GetExplodedViewNames2(swConfig.Name)

Jednak ta funkcja musi zwracać typ "string" :thinking: ?

OK

Brakuje obsługi błędów.
Gdy korzystam z domyślnej konfiguracji, nie ma problemu, ponieważ obecny jest widok rozstrzelony.
Z drugiej strony na konfiguracji symetrii ten sam komunikat niezgodność, ponieważ moim zdaniem nie można znaleźć rozstrzelonego widoku, stąd chyba komunikat o błędzie.
image

To właśnie mówiłem, kiedy sprawdzałem wcześniej, czy występuje widok rozstrzelony, działa, tylko brakowało obsługi tego błędu:

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

Dziękuję! Robimy postępy :wink:

Otrzymuję komunikat "Podpowiedź nie należy do zaznaczenia" w następującym wierszu:

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

Nie mam tego błędu, ale spróbuj tego zamiast tego (jeśli nie ma widoku rozstrzelonego w następującej konfiguracji >):

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

Po prostu przeniesiono koniec, jeśli uwzględniono całą resztę kodu, jeśli nie ma widoku rozstrzelonego w konfiguracji

Dobra wiadomość: świetnie, działa!
Zła wiadomość: w moim podzbiorze testowym pusty krok nie jest usuwany :exploding_head:

Umieściłem szpiega na nbComps i widzi komponent na kroku, o którym mowa

1 polubienie

Zaznaczam, że na pozostałych etapach posiadam odpowiednią ilość komponentów

1 polubienie

Rzeczywiście odtwarzam problem w SW2020
Jeśli usunę komponent z mojego łańcucha 2, znajdzie go dla mnie w kroku łańcucha 2 pod numerem 1
Podczas gdy w 2 nie może go już znaleźć. A w 3 część nie jest już w widoku drzewa, ponieważ została usunięta po utworzeniu kroku.

Z drugiej strony, nie jest to problem z kodem, ale z solidworks, ponieważ ręcznie odtwarzamy błąd części widoczny w kroku...
Nie jestem pewna, czy mogłabym zrobić coś więcej.

Podczas testowania zdałem sobie sprawę, że "GetComponentName" zwraca wartość "–NA–", jeśli nie ma dołączonego komponentu.

Dodałem więc ten warunek do testu:

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

Do przetestowania, ale może to załatwić sprawę

Redagować:
Zmieniłem linię

                    Comp = explStep.GetComponentName(0)

Ponieważ wartość (1) zwróciła drugi składnik, a my usunęliśmy kroki z dołączonym tylko jednym komponentem.
Testuję z różnymi zestawami, ale na razie wygląda to dobrze.

1 polubienie

Dziękuję sbadenis i m.blt za Twój wkład!:+1: