Makro SW2020 / Problemy w kodzie VBA

Cze wszystkim

Będąc z zawodu projektantem/redaktorem i małym programistą z pasji, poradziłem sobie z silniejszym ode mnie kodowaniem makr VBA. 

Moim celem jest obniżenie paska odzyskiwania we wszystkich częściach zespołu. Aby to zrobić, chciałbym, aby makro wybierało i otwierało, jedna po drugiej, części (z wyświetlaniem na ekranie lub bez), a następnie przesuwało się w dół paska wznawiania w drzewie i zapisywało część. Gdyby w moim zbiorze miał być podzbiór, chciałbym, aby otworzył ten podzbiór (tak samo jak dla części, z wyświetlaczem lub bez) i zaczął otwierać części jedna po drugiej, aby ponownie rozpocząć pierwszy krok.

Oto mały schemat:

SW ASSEMBLY-----> Otwórz część i tyłek (które nie są usuwane) -------> Jeśli jest to część --------> przejdź w dół paska wznawiania + zapisz + zamknij

                                                                                                                                Ja

                                                                                                                                I-----> Jeśli jest to zgromadzenie, Zrób to samo, co w ramce 2

oto kod i gdzie jestem, to jest kod, który znalazłem w sieci, ale który najwyraźniej został zakodowany trochę "w pośpiechu" na tym forum: https://forum.solidworks.com/thread/159206

Mój kod poprawiłem najlepiej, jak potrafiłem :                            Problem z moim kodem polega na tym, że wszędzie są błędy... błąd 91, a czasami 13.... Jestem zagubiony i potrzebowałbym pomocy jednego z                                                                                       Was, który o tym wie!! Z góry dziękuję ;)

Dim swApp jako SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim swModel1 As SldWorks.ModelDoc2

Dim swAssembly jako SldWorks.AssemblyDoc

Dim CompNum As Integer

Dim CompNum1 jako liczba całkowita

Przyciemnij komponenty jako SldWorks.Component2

Przyciemnij komponenty1 jako SldWorks.Component2

Przyciemnij składnik jako SldWorks.Component2

Dim component1 As SldWorks.Component2

Sub main()


    Ustaw swApp = Application.SldWorks

    Ustaw swModel = swApp.ActiveDoc

    Ustaw swAssembly = swModel
        
    ' Pobieranie liczby komponentów, bez uwzględniania komponentów potomnych w podzespołach

    CompNum = swAssembly.GetComponentCount(True)
    
    components = swAssembly.GetComponents(True)
    
    Dim i jako liczba całkowita
    
    Dla i = 0 do CompNum
 
        Komponent = Komponenty(I)

swModel1 = komponent. Pobierz dokument ModelDoc2

          'Otwórz część z funkcji złożenia (jeśli jest to podzespół, utwórz kolejną pętlę for, korzystając z tej samej procedury)

Jeśli swModel1.GetType = swDocPART to

   Ustaw swModel = swApp.ActivateDoc3(komponent. Nazwa2, Fałsz, swRebuildOnActivation_e.swUserDecision, 0)

    boolstatus = udział. FeatureManager.EditRollback(swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, "")
    boolstatus = udział. EditRebuild3()

swModel.SaveAs (komponent. GetPathName)

 swApp.CloseDoc. GetPathName (Nazwa_ścieżki)

Ustaw swModel = swApp.ActiveDoc

 ElseIf swModel1.GetType = swDocASSEMBLY Then

CompNum1 = swModel1.GetComponentCount(Prawda)

components1 = swModel1.GetComponents(True)

    Sun j jako liczba całkowita
    
    Dla j = 0 TB CompNum1

            Składnik1 = Komponenty1(J)

swModel1 = komponent1. Pobierz dokument ModelDoc2


   Ustaw swModel = swApp.ActivateDoc3(komponent. Nazwa2, Fałsz, swRebuildOnActivation_e.swUserDecision, 0)

    boolstatus = udział. FeatureManager.EditRollback(swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, "")
    boolstatus = udział. EditRebuild3()
    

swModel.SaveAs (komponent. GetPathName)

 swApp.CloseDoc. GetPathName (Nazwa_ścieżki)

Następny

Zakończ jeżeli:

Następny

Koniec subwoofera

 

Witam. Spróbuj tego:

Option Explicit
Dim swApp As SldWorks.SldWorks
Sub main()
    Dim swModel As SldWorks.ModelDoc2
    Dim swConf As SldWorks.Configuration
    Dim swRootComp As SldWorks.Component2
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent3(True)
    TraverseComponent swRootComp
End Sub

Sub TraverseComponent(swComp As SldWorks.Component2)
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swCompConfig As SldWorks.Configuration
    Dim i As Long
    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp
    Next i
    RollBack swComp
End Sub

Sub RollBack(swComp As SldWorks.Component2)
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swComp.GetModelDoc2
    swApp.ActivateDoc3 swComp.Name2, False, swRebuildOnActivation_e.swRebuildActiveDoc, Empty
    If swModel.GetType <> swDocumentTypes_e.swDocPART Then Exit Sub
    swModel.FeatureManager.EditRollback swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, Empty
    swModel.EditRebuild3
    swModel.Save3 swSaveAsOptions_e.swSaveAsOptions_Silent, Empty, Empty
    swApp.CloseDoc swModel.GetPathName
End Sub

 

3 polubienia

Witaj JeromP,

Twój kod działa bez zarzutu!! Jest krótszy niż mój i z tego co widzę, korzysta z funkcji, gdzie znalazłeś potrzebne zasoby, jeśli nie jest to zbyt nachalne?

W każdym razie bardzo dziękuję za szybką i sprawną pomoc!!  

Witam @JeromeP ,

naprawdę ładne makro; Czy dałoby się go zmodyfikować tak, aby schodził w dół paska blokowania?

Jeśli tak, to otwieram nowe pytanie w tej sprawie?

@theo.hecht: Nie ma sprawy. Dostosowałem kod znajdujący się tutaj: Traverse_Assembly_at_Component_and_Feature_Level_Example

@ac cobra 427: Nie jestem pewien, jaki jest pręt zamka. To makro przesuwa się w dół paska odzyskiwania. Czy pasek blokujący jest innym paskiem niż ten?

Edit: Właśnie znalazłem pasek blokujący .

Aby go obniżyć, zamień: swModel.FeatureManager.EditRollback swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, Empty

przez: swModel.FeatureManager.EditFreeze2 swMoveFreezeBarTo_e.swMoveFreezeBarToEnd, Pusty, Prawdziwy, Prawdziwy

 

Witam

Pasek bloku to żółty pasek znajdujący się w plikach części, funkcją, której należy użyć, jest EditFreeze2.

Pozdrowienia

1 polubienie

Tak, właśnie to zobaczyłem. Zredagowałem moją poprzednią odpowiedź.

@JeromeP Dziękujemy ! :)

Pozdrowienia

  @JeromeP tak, jest to listwa, która blokuje funkcje, co uniemożliwia odtworzenie części. Oszczędzają one czas podczas otwierania ASM. Z drugiej strony podmieniłem fragment kodu i to nie działa. Mam zamiar otworzyć pytanie, więc będzie łatwiej, jeśli ktoś szuka tego typu makra