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