Makro if Eigenschaft = "X"

Hallo

Ich habe ein Makro, das Teilen einer Baugruppe zufällige Farben zuweist.

Ich möchte, dass dieses Makro nur auf die Komponente mit einer benutzerdefinierten Eigenschaft "Komponentenfamilie" = "1" angewendet wird.

Unten ist mein Code:

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

 

Schauen Sie sich diesen Link an:

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

Sie sollten in der Lage sein, die gewünschten Informationen abzurufen und eine zusätzliche Bedingung mit Ihrer Eigenschaft hinzuzufügen

Danke sbadenis

Zunächst einmal habe ich den gesamten ersten Abschnitt "If swModel.GetType = swDocPART Then" verwendet, den ich nicht verwende (ich arbeite auf Assembly-Ebene)

dann in der Liste von "Dim" die Zeile

Dim swCustProp As CustomPropertyManager


dann füge ich anstelle von "Alle Elemente abrufen" ein

' Abrufen der benutzerdefinierten Eigenschaftsdaten
Set swCustProp = swModelDocExt.CustomPropertyManager("")
bool = swCustProp.Get4("Property_Name", False, val, valout)

Ich ersetze "Property_Name" durch "Komponentenfamilie"

Aber wo gebe ich den Wert "1" an, den ich für diese Eigenschaft suche?

 

Hallo

In einer zweiten Art der Behandlung:

If Valout = "1" then
 xxx
End if

 

Hallo

Versuchen Sie es mit diesem Code:

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

Herzliche Grüße

3 „Gefällt mir“

  @ Cyril.f:

anstelle von "ElseIf swModel.GetType = swDocASSEMBLY Then"

Ich füge ein "Wenn Valout = "1" dann"

Ergebnis: Fehler bei der Online-Kompilierung

bool = swCustProp.Get4("Komponentenfamilie", False, Valout

Val ist ein "nicht-optionales Argument"

 

@ D.Roger:

Kein Fehler, aber auf meiner Baugruppe passiert nichts...

Das ist schade, denn ausnahmsweise ist der Code auf meinem Anfängerniveau verständlich und ich kann ihn so ändern, dass sich das Makro weiterentwickelt

Eine andere Frage übrigens, was sollte ich ändern, wenn ich die Farbe auf Teileebene und nicht auf der Ebene der Baugruppenkomponenten anwenden möchte?

Um den Wert der Variablen auf dem Teil abzurufen, muss es als in Solidworks geladen betrachtet werden, also ist dies im aufgelösten Modus in Ihrer Baugruppe der Fall?

Herzliche Grüße

Und ich denke, ich kann anstelle von @Cyril antworten , er hat Ihnen nie gesagt, dass Sie "ElseIf swModel.GetType = swDocASSEMBLY Then" durch "If Valout = "1" then" ersetzen sollen, sondern Ihre Frage beantwortet "Aber wo gebe ich den Wert "1" an, wenn ich nach dieser Eigenschaft suche?". Die Lösung, die er gibt, ist genau die gleiche wie meine, nur ohne das konkrete Beispiel...

Für die Bemerkung "Val ist ein "nicht-optionales Argument", bedeutet dies, dass Sie Ihre Variable nicht "typisieren", also setzen Sie eine Zeile "Dim Val as String" vor ... Das Gleiche gilt natürlich auch für die Variable "valout". 

Ein weiterer Punkt, mit den Zeilen:

Legen Sie swCustProp = swModel2.Extension.CustomPropertyManager("") fest

bool = swCustProp.Get4("Komponentenfamilie", False, val, valout)

Wenn valout = "1" Dann

Dies bedeutet, dass die benutzerdefinierte Eigenschaft Komponentenfamilie heißen muss, ihr ausgewerteter Wert 1 sein muss und sich auf der Registerkarte Anpassen befinden muss. Wenn es in den benutzerdefinierten Eigenschaften gefunden wird, die für die Konfiguration spezifisch sind, ist es nicht ganz derselbe Code, der benötigt wird, da Sie den Namen der Konfiguration angeben müssen, in der nach dem Wert gesucht werden soll, z. B. die Konfiguration mit dem Namen Default in der folgenden Zeile:

Legen Sie swCustProp = swModel2.Extension.CustomPropertyManager("Default") fest.

Herzliche Grüße

1 „Gefällt mir“

@d.roger , du hast gut daran getan, für mich zu antworten. Im Übrigen stimme ich deiner Analyse voll und ganz zu.          

1 „Gefällt mir“

Vielen Dank für die ausführlichen und didaktischen Antworten;)

Ich habe es gerade mit dem vorgeschlagenen Code versucht, ohne etwas hinzuzufügen, und, oh Freude, es funktioniert... Ich weiß nicht, was ich bei meinem ersten Versuch vermasselt habe. Entschuldigung, dass ich Ihre Expertise in Frage gestellt habe.

Ich werde versuchen, eine Zeile hinzuzufügen, um die Teile in gelöst zu ändern.

Haben Sie zum Schluss eine Idee, Farbe auf der Ebene des Teils und nicht der Baugruppenkomponente anzuwenden?

 

Hallo

Mein Makro schien bei meiner Testassembly gut zu funktionieren, aber bei anderen Assemblys bleibt es in der Zeile        hängen

Legen Sie swCustProp = swModel2.Extension.CustomPropertyManager("") fest

"Fehler 91: Objektvariable oder Mit Blockvariable nicht definiert"

Hallo

Wie bereits gesagt:

"Um den Wert der Variablen auf dem Teil abzurufen, muss es in Solidworks als geladen betrachtet werden, also ist dies im gelösten Modus in Ihrer Baugruppe der Fall?"

Herzliche Grüße

Ja Ja, alles ist gelöst.

Also möglich, dass es von einem Teil stammt, das sich in einem gelöschten Zustand befindet...

Aber wie auch immer, es kommt aus der Zeile:

"Setze swModel2 = swElement.GetModelDoc2"

Dies stürzt ab, weil das Makro aus dem einen oder anderen Grund (Lite-Modus, gelöschter Zustand, ...) das ModelDoc2 einer Komponente nicht findet, was einen Fehler dieses Typs zurückgibt. Ich sehe, dass die Fehlerbehandlung nicht durchgeführt wurde :-) ... Zur Erinnerung: Die hier angegebenen Makros dienen nur als Beispiel und müssen überarbeitet werden, um zumindest eine Fehlerbehandlung hinzuzufügen...

Herzliche Grüße

In der Tat, es gibt ...

Fügen Sie mindestens die Zeile hinzu:

"Bei Fehler als nächstes fortsetzen"

Direkt unter der Linie:

"Für jedes vElement in vElementArr"

Dies hat zur Folge, dass die Schleife auch dann fortgesetzt wird, wenn das Makro auf einen Fehler stößt.

Siehe HIER.

Herzliche Grüße

1 „Gefällt mir“

Perfekt, es funktioniert perfekt!

Um das Ding zu verbessern, werde ich versuchen, eine Zeile einzufügen, um alles in den gelösten Modus zu schalten. Ich habe diese Funktion gefunden: "LightweightAllResolved". Ich werde versuchen, es einzufügen, idealerweise mit einem Dialogfeld zur Bestätigung.

Und die immer wiederkehrende Frage: Wenn ich Farbe auf Teile statt auf Komponenten anwenden möchte, habe ich eine Ahnung, dass ich diese Linie ersetzen muss
vElementArr = swModel.GetComponents

durch irgendeinen Chode der Art
Set swCompModel = swApp.ActivateDoc (oder ActivateDoc2 oder ActivateDoc3...?)
Bin ich auf dem richtigen Weg?