SolidWorks >> Makra >> Pętla w złożeniu SW
Autor Wypowiedź
2012-01-31, 12:47
Pomógł 0 raz(y).
Witam

Interesuje mnie funkcja albo proste makro do wybierania pokolei części po części w złożeniu. Funckcja/makro miałoby za zadanie wybrać pierwszy element złożenia sprawdzić czy to part czy assembly i jeśli part to podświetlić go i np zmienić jego kolor na czerwony a następnie przejść do kolejnego elementu.



Kombinuje z tym już od 5 godzin i nie mogę znaleźć nic :///
 
CSWP, CSWE, CSWI *** solid-blog.pl ***
2012-01-31, 13:40
Pomógł 405 raz(y).
Polecam do wybierania opcję zaawansowany wybór z menu narzędzia > wybór komponentu. Co do dalszej obróbki to można zastosować wizualizację złożenia.

Wiemy co chcesz uzyskać, ale nie wiadomo w jakim celu - może coś więcej napisz.
 
2012-02-01, 08:04
Pomógł 0 raz(y).
Programowałem trochę w C i C++ chcę napisać makro do obróbki wszystkich elementów w złożeniu np zmiany materiału, koloru, jednostek itp. Sporo straciłęm czasu żeby robić to ręcznie.

Szukalem funkcji jaka by w pętli wybierała pokolei części ze złożenia ale nie mogłem jej znaleźć udało mi się znaleźć jedynie funkcję jaka odnosi się do nazwy części. Gdybym dostał tego typu funkcję z reszta bym sobie poradził :) A makrem mogę się podzielić.

Paweł sprawdzam już ten wybór komponentu :)



Pozdro
 
2012-02-01, 08:50
Pomógł 2 raz(y).
Michal (ADK) na pewno pomoze. a nie ma takich makr w sieci? z kolorami to na pewno sa bo kiedys widzialem
 
2012-02-01, 09:12
Pomógł 0 raz(y).
Szukałem tego typu makr, udało mi się znaleźć chyba z jedno nie działające i jedno które zmienia materiał w części ale w częściach w złożeniu już nie działa.

Ten zaawansowany wybór fajna sprawa ale tu się nie sprawdzi, nie umozliwia wybierania pokolei elementów poza tym makro w SW2011 nie czyta tego że dokonałem zaawansowanego wyboru :/

Także pozostaje jedynie możliwość wykorzystania jakiejś funkcji z pętlą
 
Wykonam każde makro w SolidWorks
2012-02-01, 09:18
Pomógł 12 raz(y).
Public Sub main()
Dim swModel As ModelDoc2
Dim swConfMgr As ConfigurationManager
Dim swConf As Configuration
Dim swRootComp As Component2

swApp = CreateObject("SldWorks.Application")
swModel = swApp.ActiveDoc
swConfMgr = swModel.ConfigurationManager
swConf = swConfMgr.ActiveConfiguration
swRootComp = swConf.GetRootComponent3(True)

If swModel.GetType = swDocumentTypes_e.swDocASSEMBLY Then
TraverseComponent(swRootComp, 1)
End If

End Sub
Sub TraverseComponent(ByVal swComp As Component2, ByVal nLevel As Long)

Dim vChildComp As Object
Dim swChildComp As Component2
Dim i As Long

vChildComp = swComp.GetChildren

For i = 0 To UBound(vChildComp)

swChildComp = vChildComp(i)
TraverseComponent(swChildComp, nLevel + 1)

Next i

End Sub
 
Wykonam każde makro w SolidWorks
2012-02-01, 09:29
Pomógł 12 raz(y).
Zwracam uwagę od razu na funkcję GetRootComponent3 - zadziała tylko od wersji SolidWorks 2010 i wyżej. Jeżeli chcesz, aby makro działało na niższych wersjach użyj GetRootComponent
 
2012-02-01, 10:14
Pomógł 0 raz(y).
Czy dobrze rozumiem?

W funkcji głównej wywołujesz funkcję traversComponent zależną od dwóch parametrów która się odpala jeżeli mamy doczynienia ze złożeniem. Wywołujesz ją z parametrem pobranym z funckji GetRootComponent3 i ta funkcja pobiera informację o tym komponencie najwyżej w złożeniu?

Niżej opisujesz składnię tej funkcji. I rozumiem że funkcja po pobraniu informajci o najwyższym punkcie w złożeniu sama się w sobie zapętla przelatując poziom po poziomie niżej? I się wyłącza po przelecniu wszystkich poziomów?

Z tym że funkcja wywala mi błąd i nie mogę tego sprawdzić chyba chodiz o deklaracje tego traversComponent

 
Wykonam każde makro w SolidWorks
2012-02-01, 10:48
Pomógł 12 raz(y).
Dokładnie tak to działa.

Nie wiem dlaczego Ci się wywala, w kodzie masz dobrze. Równie dobrze możesz wyrzucić nLevel - to tylko przelicza Ci, na którym poziomie w drzewie jesteś. Zmień jeszcze na swRootComp = swConf.GetRootComponent

Będziesz miał:





Makro powinno działać. Oczwyiście na aktywnym dokumencie Złożenia o czym świadczą swModel = swApp.ActiveDoc i swModel.GetType = swDocumentTypes_e.swDocASSEMBLY.
 
2012-02-01, 11:09
Pomógł 0 raz(y).
Po usunięciu nLevel nie wyskakuje mi błąd ale po uruchomieniu w złożeniu wyskakuje błąd.







Oryginalny kod







(Po dodaniu linijki Dim swApp As Object)





 
Wykonam każde makro w SolidWorks
2012-02-01, 11:18
Pomógł 12 raz(y).
Nie, nie

swApp jest zmienną globalną.

Wpisz Public swApp As SldWorks między Partial Class SolidWorksMacro

a End Class

tzn.



Partial Class SolidWorksMacro



Public Sub main()

'tutaj kod procedury main

End Sub



Sub TraverseComponent(ByVal swComp As Component2)

'tutaj kod procedury TraverseComponent

End Sub



Public swApp As SldWorks


End Class
 
Wykonam każde makro w SolidWorks
2012-02-01, 11:23
Pomógł 12 raz(y).
Oczywiście to co podałem jest pod macro w VSTA. Jeżeli piszesz zwykłe makro, powinieneś zadeklarować tak:

Sub main()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swConfMgr As SldWorks.ConfigurationManager
Dim swConf As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
Dim bRet As Boolean

Set swApp = CreateObject("SldWorks.Application")
Set swModel = swApp.ActiveDoc
Set swConfMgr = swModel.ConfigurationManager
Set swConf = swConfMgr.ActiveConfiguration
Set swRootComp = swConf.GetRootComponent3(true)

TraverseModelFeatures swModel, 1

If swModel.GetType = SwConst.swDocASSEMBLY Then

TraverseComponent swRootComp, 1

End If

End Sub
 
2012-02-01, 12:39
Pomógł 0 raz(y).
Aj zakręciłem się :)

Piszę zwykłę makro w SW.

Czyli rozumiem że ten kod który podałes powiniennem zamienić z tym pierwotnym zaczynającym się od Public sub main ().

W tym kodzie nie rozumiem

TraverseModelFeatures(swModel,1)

tej funkcji nie ma w apihelp czyli rozumiem że też ją utworzyłeś ?

Ten kod mi się wywala po prostym skopiowaniu na tej wlasnie funkcji na zmiennej swModel
 
Wykonam każde makro w SolidWorks
2012-02-01, 13:14
Pomógł 12 raz(y).
Nie mieszając Ci powinieneś zamiast to co napisałeś w procedurze main()

Dim swApp as Object

napisać w tym samym miejscu

Dim swApp As SldWorks



TraverseModelFeatures(swModel,1) - to możesz wyrzucić. Niechcący mi się wrzuciło - pod nią możesz na przykład podpiąć analizę, ale już modelu części - np. z jakich operacji się składa, sketchy itp. Ją trzeba byłoby oczywiście tak samo stworzyć jak TraverseComponent(ByVal swComp As Component2).

Ps. Polecam mój tutorial na PSWUGu w dziale tutoriale. Może coś pomoże oraz na mojego bloga
 
2012-02-01, 13:30
Pomógł 0 raz(y).
Uderzam więc do tutorialu :)
 

PSWUG

Strefa Resellera

Publikuj

Społeczność

Ankieta

Linki

RSS

BOT