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ł 406 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 :) |
|
|