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
Om de waarde van de variabele op het onderdeel op te halen, moet deze worden beschouwd als geladen in Solidworks, dus in opgeloste modus, is dit het geval in uw assemblage?
En ik denk dat ik kan antwoorden in plaats van @Cyril.f, hij heeft je nooit verteld om "ElseIf swModel.GetType = swDocASSEMBLY Then" te vervangen door "If Valout = "1" then", maar beantwoordde je vraag "Maar waar specificeer ik de waarde "1" op zoek naar deze eigenschap?". De oplossing die hij geeft is precies dezelfde als de mijne, maar dan zonder het concrete voorbeeld...
Voor de opmerking "Val is een "niet-optioneel argument", betekent dit dat je je variabele niet "typt", dus zet een regel "Dim Val als String" voor ... Hetzelfde geldt natuurlijk voor de variabele "valout ".
Dit betekent dat de aangepaste eigenschap Componentfamilie moet worden genoemd, dat de geëvalueerde waarde 1 moet zijn en dat deze op het tabblad Aanpassen moet staan. Als het wordt gevonden in de aangepaste eigenschappen die specifiek zijn voor de configuratie , is het niet helemaal dezelfde code die nodig is, omdat u de naam van de configuratie moet opgeven waarin u naar de waarde moet zoeken, zoals de configuratie met de naam Standaard in de volgende regel:
Bedankt voor de gedetailleerde en didactische antwoorden;)
Ik heb het net geprobeerd met de voorgestelde code, zonder iets toe te voegen, en, oh vreugde, het werkt... Ik weet niet waar ik het bij mijn eerste poging heb verpest. Sorry voor het in twijfel trekken van uw expertise.
Ik zal proberen een regel toe te voegen om de delen te veranderen in opgelost.
Tot slot, heb je een idee om kleur aan te brengen op het niveau van het onderdeel en niet op het assemblageonderdeel?
"Om de waarde van de variabele op het onderdeel op te halen, moet het worden beschouwd als geladen in Solidworks, dus in de opgeloste modus, is dit het geval in uw assemblage?"
die crasht omdat de macro om de een of andere reden (lite-modus, verwijderde status, ...) de ModelDoc2 van een component niet vindt, wat een fout van dit type retourneert. Ik zie dat de foutafhandeling niet is gedaan :-) ... Ter herinnering: de hier gegeven macro's zijn slechts bijvoorbeeld en moeten worden herwerkt om op zijn minst foutafhandeling toe te voegen...
Om het ding te verbeteren, ga ik proberen een regel in te voegen om alles in de opgeloste modus te zetten. Ik heb deze functie gevonden: "LightweightAllResolved". Ik zal proberen het in te voegen, idealiter met een dialoogvenster om te bevestigen.
En de terugkerende vraag: als ik kleur wil aanbrengen op onderdelen in plaats van componenten, heb ik een vermoeden dat ik deze lijn moet vervangen vElementArr = swModel.GetComponents
door een of andere chode van het soort Stel swCompModel = swApp.ActivateDoc in (of ActiveerDoc2 of ActiveerDoc3...?) Ben ik op de goede weg?