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