Wyszukiwanie punktów informacyjnych makro

Witam

 

Mam szybkie pytanie dotyczące makr VBA Sldw.

W zespole chcę poszukać komponentu "X" w drzewie i jeśli jest obecny, modyfikuję mój zespół.

 

Komponent może znajdować się na pierwszym poziomie lub w podzespole.

 

Zacząłbym od tego kodu , http://help.solidworks.com/2016/english/api/sldworksapi/get_dependencies_for_open_and_unopened_documents_example_vb.htm , który pozwala znaleźć odwołania zewnętrzne i dostosować go tak, aby wyświetlały alert, jeśli wspomniana część znajduje się na liście

Więc jeśli dobrze zrozumiałem, da


to Explicit Option
Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim vDepend As Variant
    Dim bRet As Boolean
    Dim i As Long
    Ustaw swApp = Application.SldWorks
    Ustaw swModel = swApp.Plik ActiveDoc
    vDepend = swApp. GetDocumentDependencies2("PartSearch-1", Prawda, Prawda, Fałsz)

    If IsEmpty(vDepend) Then
        Debug.Print "    Brak zależności."
        Exit Sub
    else
        boolstatus = "co chcę zrobić z moim Assembly
    End If
    Dla i = 0 TB (UBound(vDepend) - 1) / 2
        Debug.Print "    " + vDepend(2 * i) + " --> " + vDepend(2 * i + 1)
    Następny i
Koniec subwoofera

Jaki jest cel bRet? Wyobrażam sobie, że ostatnie trzy linijki (Dla i...) mają schodzić w dół do różnych poziomów drzewa.

W każdym razie dziękuję za odpowiedź

Na przykład tak, ważne jest to, co dzieje się na poziomie obszaru

    Dla i = 0 TB (UBound(vDepend) - 1) / 2
    If vDepend(2 * i) = "wał ostrza" Then MsgBox "wał ostrza obecny w zespole"
    Dalej i

lub możesz przesunąć jak tam kontrolkę na nazwę pokoju

Opcja jawna
Sub main()
    ' Nazwa nieotwartego dokumentu
    Const sDefaultName As String = "c:\program files\solidworks corp\solidworks\samples\tutorial\advdrawings\98food processor.sldasm"
    Dim swApp jako SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim sDocName As Ciąg
    Dim vDepend jako wariant
    Dim bRet As Boolean
    Słońce i tak długo
    Ustaw swApp = Application.SldWorks
    Ustaw swModel = swApp.ActiveDoc
    jezeli nie swmodel to nic to nic
        sDocName = swModel.GetPathName
    Inaczej
        sDocName = sNazwaDomyślna
    Zakończ jeżeli:
    vDepend = swApp.GetDocumentDependencies2(sDocName, Prawda, Prawda, Fałsz)
    'Debug.Print sDocName
    Jeśli IsEmpty(vDepend) to
        Wyjdź z subwoofera
    Zakończ jeżeli:
    Dla i = 0 TB (UBound(vDepend) - 1) / 2
    If vDepend(2 * i) = "wał ostrza" Then MsgBox "wał ostrza obecny w zespole"
    Dalej i
Koniec subwoofera

W wersji uproszczonej i z obsługą kilku poszukiwanych części

Opcja jawna
Sub main()
    Dim swApp jako SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim vDepend jako wariant
    Dim bRet As Boolean
    Słońce i tak długo
    Ustaw swApp = Application.SldWorks
    Ustaw swModel = swApp.ActiveDoc
    Jeśli swModel jest niczym, wyjdź z sub
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Prawda, Prawda, Fałsz)
    Jeśli IsEmpty(vDepend) to Wyjdź z Sub
    Dim Ref As Variant (Przyćmić ref jako wariant)
    Dla i = 0 TB (UBound(vDepend) - 1) / 2
        Dla każdego ref w tablicy("wał napędowy", "sworzeń wału napędowego")
            Jeśli vDepend(2 * i) = Ref Then MsgBox Ref & " jest obecny w zestawie.
        Następny odnośnik
    Dalej i
Koniec subwoofera

Linia, która ma zostać zmodyfikowana, jest następująca 

Dla każdego ref w tablicy("wał napędowy", "sworzeń wału napędowego")

lub wał napędowy i sworzeń wału napędowego dźwięk nazwy wyszukiwanych części, możesz umieścić tyle, ile chcesz, o ile wymienisz wysyłkę ("X", "Y", "Z", "itp.")

2 polubienia

Idealnie, udało mi się zrobić to, co chciałem, uogólniłem funkcję zgodnie z tym, co chcę zrobić:

 

Dim swApp As Object

Przyciemnij część jako obiekt
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Ustaw swApp = Application.SldWorks

Ustaw część = swApp.ActiveDoc
        Jeśli GetCompInAss("Część2") = Prawda, to

                             Jeśli dokument przedstawia następnie:
        boolstatus = Part.Extension.SelectByID2("Część2-1@Zespół", "KOMPONENT", 0, 0, 0, Fałsz, 0, Nic, 0)
        Part.EditDelete   'Usuń
    Zakończ jeżeli:
Koniec subwoofera


Funkcja GetCompInAss(DocCible jako wariant)
    Dim vDepend jako wariant
    Dim bRet As Boolean
    Słońce i tak długo
    Dim swModel As SldWorks.ModelDoc2
   
    Ustaw swModel = swApp.ActiveDoc
   
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Prawda, Prawda, Fałsz)
    Jeśli IsEmpty(vDepend) to Zakończ funkcję
       
     Dla i = 0 TB (UBound(vDepend) - 1) / 2
        Jeśli vDepend(2 * i) = DocTarget, to
            GetCompInAss = Prawda
        Zakończ jeżeli:
    Debug.Print "    " + vDepend(2 * i) + " --> " + vDepend(2 * i + 1)
    Dalej i
    
Zakończ funkcję

 

Ostatnie pytania, do czego służy bRet ?  Jestem zmuszony do przekierowania dokumentu w funkcji, której nie da się uniknąć tego rodzaju redundancji ?

Jeśli masz jakieś inne poddaństwo, aby uprościć kod, jestem zainteresowany.

 

W każdym razie dziękuję za pomoc.

bRet jest bezużyteczny w makrze

Można to uprościć w następujący sposób

Dim swApp As Object
Przyciemnij część jako obiekt
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()
    Ustaw swApp = Application.SldWorks
    Ustaw część = swApp.ActiveDoc
    Jeśli GetCompInAss("Część2") = Prawda, to
        Jeśli dokument przedstawia następnie:
        boolstatus = Part.Extension.SelectByID2("Part2-1@Assemblage", "KOMPONENT", 0, 0, 0, Fałsz, 0, Nic, 0)
        Part.EditDelete   'Usuń
    Zakończ jeżeli:
Koniec subwoofera

Funkcja GetCompInAss(DocCible As Variant) Jako wartość logiczna
    Dim vDepend jako wariant
    Słońce i tak długo
    Dim swModel As SldWorks.ModelDoc2
    Ustaw swModel = swApp.ActiveDoc
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Prawda, Prawda, Fałsz)
    Jeśli IsEmpty(vDepend) to Zakończ funkcję
    Dla i = 0 TB (UBound(vDepend) - 1) / 2
        Jeśli vDepend(2 * i) = DocCible, to GetCompInAss = True
    Dalej i
Zakończ funkcję

witaj MaD,

Odzyskałem  twoje makro, które działa dobrze.

Chciałbym ukryć znaleziony komponent => jak to zrobić?

Dziękuję

Spróbuj tego:

Part.EditDelete   'Usuń - Aby zastąpić poniższym
Part.HideComponent2() ' Ukryj komponent