Właściwość Makro if = "X"

Witam

Mam makro, które przypisuje losowe kolory do części zespołu.

Chciałbym, aby to makro miało zastosowanie tylko do komponentu z niestandardową właściwością "rodzina komponentów" = "1"

Poniżej mój kod:

Dim vMatProp As Variant

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
vMatProp = swModel.MaterialPropertyValues

'Get all elements
If swModel.GetType = swDocPART Then
   vElementArr = swModel.GetBodies2(swAllBodies, False)

       For Each vElement In vElementArr
           Set swElement = vElement
           Randomize
           vMatProp(0) = Rnd 'Red
           vMatProp(1) = Rnd - 255 'Green
           vMatProp(2) = Rnd 'Blue
           vMatProp(3) = Rnd / 2 + 0.5 'Ambient
           vMatProp(4) = Rnd / 2 + 0.5 'Diffuse
           vMatProp(5) = Rnd 'Specular
           vMatProp(6) = Rnd * 0.9 + 0.1 'Shininess
           swElement.MaterialPropertyValues2 = vMatProp
       Next

ElseIf swModel.GetType = swDocASSEMBLY Then
   vElementArr = swModel.GetComponents(True)

       For Each vElement In vElementArr
           Set swElement = vElement
           Randomize
           vMatProp(0) = Rnd * 0.05 + 0.95 'Red
           vMatProp(1) = 0.77 * Rnd + 0.05  'Green
           vMatProp(2) = (1 - 2 * Abs(0.45 - vMatProp(1))) * Rnd + 2 * Abs(0.45 - vMatProp(1))   'Blue
           vMatProp(3) = Rnd / 2 + 0.5 'Ambient
           vMatProp(4) = Rnd / 2 + 0.5 'Diffuse
           vMatProp(5) = Rnd 'Specular
           vMatProp(6) = Rnd * 0.9 + 0.1 'Shininess
           swElement.MaterialPropertyValues = vMatProp
       Next

ElseIf swModel.GetType = swDocDRAWING Then
   MsgBox ("You can only apply random colors to part bodies or assembly components.")
   Exit Sub

End If

'Redraw to see new color
swModel.GraphicsRedraw2

End Sub

 

Spójrz na ten link:

http://help.solidworks.com/2020/English/api/sldworksapi/Get_Custom_Properties_of_Referenced_Part_Example_VB.htm

Powinieneś być w stanie pobrać potrzebne informacje i dodać dodatkowy warunek do swojej usługi

Dziękuję sbadenis

Przede wszystkim wykorzystałem całą pierwszą sekcję "If swModel.GetType = swDocPART Then", której nie używam (pracuję na poziomie montażu)

następnie na liście "Dim" wiersz

Dim swCustProp As CustomPropertyManager


następnie zamiast "Pobierz wszystkie elementy" wklejam

' Pobieranie danych właściwości niestandardowej
Ustaw swCustProp = swModelDocExt.CustomPropertyManager("")
bool = swCustProp.Get4("Property_Name", False, val, valout)

Zamieniam "Property_Name" na "Rodzina komponentów"

Ale gdzie mam określić wartość "1", której szukam dla tej właściwości?

 

Witam

W drugim rodzaju leczenia:

If Valout = "1" then
 xxx
End if

 

Witam

Spróbuj z tym kodem:

Dim swApp As Object

Sub main()

Dim swModel As ModelDoc2
Dim swModel2 As ModelDoc2
Dim vMatProp As Variant
Dim swCustProp As CustomPropertyManager
Dim val As String
Dim valout As String
Dim bool As Boolean

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
vMatProp = swModel.MaterialPropertyValues

If swModel.GetType = swDocPART Then
    MsgBox ("Cette macro n'est à utiliser que sur les assemblages.")
    Exit Sub

ElseIf swModel.GetType = swDocASSEMBLY Then
    vElementArr = swModel.GetComponents(True)
    For Each vElement In vElementArr
        Set swElement = vElement
        Set swModel2 = swElement.GetModelDoc2
        Set swCustProp = swModel2.Extension.CustomPropertyManager("")
        bool = swCustProp.Get4("famille de composant", False, val, valout)
        If valout = "1" Then
            Randomize
            vMatProp(0) = Rnd * 0.05 + 0.95 'Red
            vMatProp(1) = 0.77 * Rnd + 0.05  'Green
            vMatProp(2) = (1 - 2 * Abs(0.45 - vMatProp(1))) * Rnd + 2 * Abs(0.45 - vMatProp(1))   'Blue
            vMatProp(3) = Rnd / 2 + 0.5 'Ambient
            vMatProp(4) = Rnd / 2 + 0.5 'Diffuse
            vMatProp(5) = Rnd 'Specular
            vMatProp(6) = Rnd * 0.9 + 0.1 'Shininess
            swElement.MaterialPropertyValues = vMatProp
        End If
    Next

ElseIf swModel.GetType = swDocDRAWING Then
    MsgBox ("Cette macro n'est à utiliser que sur les assemblages.")
    Exit Sub

End If

swModel.GraphicsRedraw2

End Sub

Pozdrowienia

3 polubienia

  @ Cyril.f:

zamiast "ElseIf swModel.GetType = swDocASSEMBLY Then"

Wklejam "Jeśli Valout = "1" to"

Wynik: Błąd kompilacji w trybie online

bool = swCustProp.Get4("Rodzina komponentów", False, Val, Valout) 

Val jest "argumentem nieopcjonalnym"

 

@D.Roger:

To nie pomyłka, ale na moim montażu nic się nie dzieje...

Szkoda, bo tym razem kod jest zrozumiały na moim poziomie początkującym i mogę go zmodyfikować, aby makro ewoluowało

Nawiasem mówiąc, co powinienem zmienić, jeśli chcę zastosować kolor na poziomie części, a nie na poziomie komponentu zespołu?

Aby pobrać wartość zmiennej na części, musi ona być traktowana jako załadowana w Solidworks, a więc w trybie rozwiązanym, czy tak jest w Twoim złożeniu?

Pozdrowienia

I myślę, że mogę odpowiedzieć zamiast @Cyril.f , nigdy nie powiedział ci, abyś zamienił "ElseIf swModel.GetType = swDocASSEMBLY Then" na "Jeśli Valout = "1" to", ale odpowiedział na twoje pytanie "Ale gdzie mam określić wartość "1" szukając tej właściwości?". Rozwiązanie, które podaje, jest dokładnie takie samo jak moje, ale bez konkretnego przykładu...

Dla uwagi "Val jest "nieopcjonalnym argumentem ", oznacza to, że nie "wpisujesz" swojej zmiennej, więc umieść wiersz "Dim Val as String" przed ... To samo dotyczy oczywiście zmiennej "valout". 

Kolejny punkt, z liniami:

Ustaw swCustProp = swModel2.Extension.CustomPropertyManager("")

bool = swCustProp.Get4("rodzina komponentów", False, val, valout)

Jeśli wartość = "1", to

Oznacza to, że właściwość niestandardowa musi nazywać się Rodzina komponentów , jej obliczana wartość musi wynosić 1 i musi znajdować się na karcie Dostosuj . Jeśli znajduje się we właściwościach niestandardowych specyficznych dla konfiguracji , nie jest to ten sam kod, który jest potrzebny, ponieważ należy określić nazwę konfiguracji, w której ma być szukana wartość, na przykład konfiguracja o nazwie Default w następującym wierszu:

Ustaw swCustProp = swModel2.Extension.CustomPropertyManager("Default").

Pozdrowienia

1 polubienie

@d.roger , dobrze zrobiłeś, odpowiadając za mnie. Co do reszty, całkowicie zgadzam się z twoją analizą.          

1 polubienie

Dziękuję za szczegółowe i dydaktyczne odpowiedzi ;)

Właśnie spróbowałem z proponowanym kodem, nie dodając niczego i, o radości, działa... Nie wiem, gdzie schrzaniłem za pierwszym razem. Przepraszam za kwestionowanie Twojej wiedzy.

Postaram się dodać linię, aby zmienić części na rozwiązane.

Wreszcie, czy masz pomysł, aby zastosować kolor na poziomie części, a nie komponentu zespołu?

 

Witam

Moje makro wydawało się działać dobrze na moim zestawie testowym, ale na innych zestawach zacina się na linii        

Ustaw swCustProp = swModel2.Extension.CustomPropertyManager("")

"Błąd 91: Zmienna obiektu lub Z niezdefiniowaną zmienną blokową"

Witam

Jak już wspomniano wcześniej:

"Aby pobrać wartość zmiennej na części, musi ona być traktowana jako załadowana w Solidworks, a więc w trybie rozwiązanym, czy tak jest w Twoim złożeniu?"

Pozdrowienia

Tak tak, wszystko jest rozwiązane.

Możliwe, że pochodzi z części, która jest w stanie usuniętym...

Ale tak czy inaczej, pochodzi to z linii:

"Ustaw swModel2 = swElement.GetModelDoc2"

który ulega awarii, ponieważ makro nie znajduje ModelDoc2 komponentu z tego czy innego powodu (tryb lite, stan usunięty, ...), co powoduje zwrócenie błędu tego typu. Widzę, że obsługa błędów nie została wykonana :-) ... Przypominamy, że podane tutaj makra są tylko przykładowe i muszą zostać przerobione, aby przynajmniej dodać obsługę błędów...

Pozdrowienia

Rzeczywiście, są...

Dodaj co najmniej linijkę:

"W przypadku błędu wznów następny"

Tuż pod linią:

"Dla każdego elementu vElement w vElementArr"

Spowoduje to kontynuację pętli, nawet jeśli makro wyląduje na błędzie.

Zobacz TUTAJ.

Pozdrowienia

1 polubienie

Doskonale, działa idealnie!

Aby to poprawić, postaram się wstawić linię, aby przełączyć wszystko w tryb rozwiązany. Znalazłem tę funkcję: "LightweightAllResolved". Postaram się go wstawić, najlepiej z oknem dialogowym do potwierdzenia.

I powracające pytanie: jeśli chcę zastosować kolor do części, a nie komponentów, mam przeczucie, że muszę wymienić tę linię
vElementArr = swModel.GetComponents

przez jakiegoś chode'a w swoim rodzaju
Ustaw swCompModel = swApp.ActivateDoc (lub ActivateDoc2 lub ActivateDoc3...?)
Czy jestem na dobrej drodze?