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