Changer couleur ASM avec une macro

Bonjour à tous et toutes,

J'ai besoin de changer la couleur d'un ASM avec une macro, sans toucher à la couleur des pièces, donc vraiment au niveau de l'ASM, visuellement dans l'arbre de construction c'est l'apparence juste à coté du nom de l'ASM.

Après plusieurs heures de recherches je suis finalement tombé sur une macro, que j'ai adapté à ma sauce, mais quand je l'exécute, il se passe juste...rien  :

Sub main()
Dim swApp As SldWorks.SldWorks
Dim Modeldoc2 As SldWorks.Modeldoc2
Dim swAss As SldWorks.AssemblyDoc
Dim vMatProp As Variant
Set swApp = Application.SldWorks
Set Modeldoc2 = swApp.ActiveDoc
vMatProp = Modeldoc2.MaterialPropertyValues

 

If Modeldoc2.GetType = swDocASSEMBLY Then

Set swAss = Modeldoc2
vMatProp = Modeldoc2.MaterialPropertyValues

vMatProp(0) = 2 'Red
vMatProp(1) = 0 'Green
vMatProp(2) = 0 'Blue
vMatProp(3) = 1 / 2 + 0.5 'Ambient
vMatProp(4) = 1 / 2 + 0.5 'Diffuse
vMatProp(5) = 1 'Specular
vMatProp(6) = 1 * 0.9 + 0.1 'Shininess

Modeldoc2.MaterialPropertyValues = vMatProp

Else
MsgBox ("Utiliser cette macro sur un assemblage")
Exit Sub

End If
'Redraw to see new color
Modeldoc2.GraphicsRedraw2
End Sub

Si je remplace Modeldoc2.GetType = swDocASSEMBLY par Modeldoc2.GetType = swDocPART ça fonctionne, mais que sur les PART (logique), j'en ai conclu que le problème pourrait venir de Modeldoc2.MaterialPropertyValues = vMatProp qui n'est peut être pas adapté à l'utilisation sur un ASM.

Quelqu'un aurait-il une solution svp?

 

Bonjour;

Vous cherchez à remplacer les matèriaux ou les apparences (couleurs) ?
Si vous souhaitez créer des groupes d'apparences, il est préférable de passer par l'outils Evaluer/visualisation de l'assemblage...

-> voir 3dexperience.3ds.com/ search visualisation assembly (Forum Solidworks- en z'anglais- mais compréhensible)
Cordialement.

1 « J'aime »

Bonjour,

Merci pour le lien mais hélas la visualisation d'assemblage ne me sera pas d'un grand secours dans ce cas-ci.

J'ai besoin de remplacer simplement l'apparence, comme suit :

Dans l'ASM actif et ce quel que soit son nom de fichier.

Cordialement.

Pour changer cette couleur le seule moyen que j'avais trouvé était de créer une apparence avec la couleur désiré puis de modifier l'apparence au niveau de l'assemblage:

        Debug.Print "Changement de couleur de l'assemblage"
        Dim swModelDocExt As SldWorks.ModelDocExtension
        Dim swAppearance As SldWorks.RenderMaterial
        Dim vMat(8) As Double
        Dim nDecalID As Long
        Set swModelDocExt = swModel.Extension
            swModel.ShowConfiguration2 (V(i))
            Set swAssembly = swModel
            vMat(0) = 0 * 255#
            vMat(1) = 128 * 255#
            vMat(2) = 0 * 255#
            vMat(3) = 1
            vMat(4) = 1
            vMat(5) = 0.5
            vMat(6) = 0.4
            vMat(7) = 0
            vMat(8) = 0
            Set swAppearance = swModelDocExt.CreateRenderMaterial("U:\Entreprise\Service BE\1-Commun service\Solidworks\Macros\Améliorations\Fichiers en lien avec macro\indice-abc.p2m")
            bRet = swAppearance.AddEntity(swModel)
            bRet = swModelDocExt.AddRenderMaterial(swAppearance, nDecalID)
            swModel.MaterialPropertyValues = vMat
            swModel.GraphicsRedraw2

Si tu trouve mieux, je suis éventuellement preneur!

Bonjour sbadenis,

Après plusieurs tentatives j'ai réussi à adapter ta solution et voilà ce que ça donne pour moi :


Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.Modeldoc2
    Dim swModelDocExt As SldWorks.ModelDocExtension
    Dim swAppearance As SldWorks.RenderMaterial
    Dim nDecalID As Long
    Dim vMatProp As Variant
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
        
vMatProp = swModel.MaterialPropertyValues

    If swModel.GetType = swDocASSEMBLY Then

            Set swModelDocExt = swModel.Extension
            Set swAssembly = swModel
            vMatProp = swModel.MaterialPropertyValues

            vMatProp(0) = 2 'Red
            vMatProp(1) = 0 'Green
            vMatProp(2) = 0 'Blue
            vMatProp(3) = 1 / 2 + 0.5 'Ambient
            vMatProp(4) = 1 / 2 + 0.5 'Diffuse
            vMatProp(5) = 1 'Specular
            vMatProp(6) = 1 * 0.9 + 0.1 'Shininess
            
            Set swAppearance = swModelDocExt.CreateRenderMaterial("")
            bRet = swAppearance.AddEntity(swModel)
            bRet = swModelDocExt.AddRenderMaterial(swAppearance, nDecalID)
            swModel.MaterialPropertyValues = vMatProp
            swModel.GraphicsRedraw2
            
    Else
        MsgBox ("Utiliser cette macro sur un assemblage")
    Exit Sub

    End If
'Redraw to see new color
swModel.GraphicsRedraw2
End Sub

 

Visiblement la commande Modeldoc2.MaterialPropertyValues = vMatProp (qui est maintenant swModel.MaterialPropertyValues = vMatProp), ne sert qu'à appliquer des paramètres à une apparence déjà existante, ce qui fonctionne sur n'importe quelle pièce qui, par défaut, a forcément déjà une apparence, mais ce n'est par contre pas le cas pour les ASM. C'est pour ça qu'avec un ASM, avant de lui attribuer une couleur, il faut d'abord créer l'apparence "vierge" à l'aide de ces lignes (et bien sur des variables qui leur sont liées (Dim As, Set...)) :

            Set swAppearance = swModelDocExt.CreateRenderMaterial("")
            bRet = swAppearance.AddEntity(swModel)
            bRet = swModelDocExt.AddRenderMaterial(swAppearance, nDecalID)


On notera aussi que Set swAppearance = swModelDocExt.CreateRenderMaterial("") ne pointe plus vers un fichier, visiblement ce n'est pas nécessaire dans mon cas.

En tout cas maintenant ça fonctionne, merci beaucoup pour votre aide.

1 « J'aime »

@acapulco24 merci pour ta réponse, si tu as une solution pour la supprimer je suis aussi preneur;-), mais merci pour ta solution, parfaitement fonctionnel effectivement.