Macro pour recharger automatiquement un certains nombre de matières sur les composants d'un assemblage

Bonjour,

Suite au passage en version 2020, Solidworks mouline énormément sur les hachures ayant beaucoup de traits et des motifs de hachures compliqués.

Notre matière utilisée pour les soudures était malheureusement en pied de poule facteur 32 (autant vous dire qu'il faut des minutes pour charger le moindre plan de détail).

Nous avons donc modifié nos matières pour revenir sur des types de hachures et des facteurs d'échelle plus léger.

Notre soucis actuel est que nous copions beaucoup de vieux plans (donc avec les vieilles matières enregistrées dans les pièces).

Y aurait il quelqu'un qui serait capable de faire une macro permettant de scanner toutes les pièces d'un assemblage et de recharger automatiquement les matières qui ont les noms suivants : "Soudure inox", "Stellite Grade 21 (RC)", "Stellite Grade 12 (RB)", "Stellite Grade 6 (RA)"

D'avance merci

 

 

 

 

 

Voici un exemple de règle que tu peux appliquer avec Intégration (utilitaire Mycadtools) afin de changer les matériaux suivant une règle (ici si la matière est a ou B ou C)

Pour cela tu récupère l'assemblage en cours que tu décompose puis tu filtre uniquement sur les pièces tu lance et ensuite tu laisse tourner.

Cela t'évitera de créer une macro et cela reste modifiable aisément sans connaissance en programmation.

 

Le lien vers l'aide d'Intégration:

https://help.visiativ.com/mycadtools/2020/fr/Integration.html


maj_inox_316.mcact
1 « J'aime »

Merci @sbadenis mais malheureusement je n'ai pas les utilitaires mycad.

De plus et pour corser les choses : nos pièces à éditer sont des pièces virtuelles qui sont enregistrées à l'intérieur de l'assemblage. Vu ce que tu décris je ne pense pas que ta méthode fonctionne du coup.

Pourtant dans ton profil je vois grâce à la médaille, que tu est abonné à Mycadservices donc normalement tu as accès aux utilitaires sans aucun surcoût.

Regarde dans le menu à gauche si tu a accès dans le menu Produire au menu Mycadtools (au pire il y a une période d'essai de 1mois il me semble mais au vue de la médaille pour moi tu du y avoir accès)

Pour les pièces virtuelle je viens de faire un essai cela ne pose pas de problème.

Il suffit d'ouvrir l'assemblage dans solidworks, dans intégration d'appuyer sur ajout du document actif, en ayant bien coché la case dépendences, puis dans filtre de filtrer les pièces, de lancer et pour finir d'enregistrer l'assemblage avec les changements de matériaux réalisé dans chaque pièces.

Au besoin je pourrait te guider.

 

 

1 « J'aime »

J'ai été abonné Mycad quelques temps mais je ne le suis plus (et on n'a pas envie de se payer 8 licences mycad à vie non plus (même si c'est plus raisonnable que le coût de la maintenance SW)....)

Il reste effectivement plus que la macro, mais je ne gère pas suffisamment sur le sujet pour le faire dans le peu de temps libre que je trouve en ce moment.

Dans ce cas voici un début pour la macro:

https://www.codestack.net/solidworks-api/document/materials/show-edit-material-dialog/

Il va falloir depuis ton assemblage boucles l'ensemble de pièces, puis les ouvrire une par une et changer le matériaux si celui est l'un des matériaux concerné.

.

Bonjour,

Pourquoi ne pas sélectionner toutes les pièces depuis l'assemblage et faire un clic droit, sélectionner matériau et changer la matière de toutes les pièces en 1 seules fois

Joël

Bonjour à tous,

si vous avez modifié vos matériaux, lorsqu'on met à jour, normalement les nouvelles hachures s'appliquent. si vous voulez le faire en masse sans ouvrir les fichiers vous pouvez mettre à jour à partir du planificateur de tâches.

@ joel.condevaux  : Parce que je n'ai le soucis que sur les soudures (qui doivent finir noire ce qui explique mon pied de poule + forte échelle initial) : soit une à deux pièces sur la dizaine ou 50aine que contient l'assemblage. Sinon en pratique c'est bien ce que l'on fait mais c'est un peu répétitif de faire cela sur tous les plans que l'on copie.

@ i will survive : on est sous EPDM donc ça complique un peu la chose : il faut avoir extrait le fichier assemblage avant de pourvoir le modifier afin que le fichier MEP soit utilisable. Et en plus les pièces dont il faut modifier la matière sont virtuelles et ont des noms différents à chaque fois : difficile à faire en batch.

J'ai quand même regardé l'outil 'planificateur de tâche' et je ne vois pas avec quelle commande on peut modifier la matière d'une pièce (et le cas de figure modifier la matière d'une pièce virtuelle à l'intérieur d'un assemblage me semble totalement ignoré). L'outil ne peut travailler que sur des outils en lecture / ecriture donc des fichiers extraits (ce qui semble assez logique).

Pour moi il s'agit de faire les modifs depuis l'assemblage:

  1.  Dans l'assemblage: filtrez les pièces suivant la matière et assignez en une nouvelle

@ joel.condevaux : on peut effectivement faire un filtre sur le nom de la matière pour identifier les pièces où il faut changer la matière. Mais comme j'ai 4 matières différentes possible, il faut faire 4 recherches différentes puis recharger la matière.

Donc cela reste quand même long fastidieux et répétitif.

D'où l'intérêt d'arriver à faire une macro pour que soit le PC qui se tape ce travail et pas le projeteur.

Bonjour,

Voici une macro qui devrait pouvoir te servir de base de départ, n'oublie pas de modifier la ligne "databaseName = ..." pour mettre le nom de ton fichier  sldmat.

Tous les fichiers doivent être en mode résolu dans ton assemblage.

Cordialement,

Option Explicit

Dim swApp As Object
Dim swModel As SldWorks.ModelDoc2
Dim myMatVisProps As SldWorks.MaterialVisualPropertiesData
Dim orgBlend As Boolean
Dim orgApply As Boolean
Dim orgAngle As Double
Dim orgScale As Double
Dim longstatus As Long
Dim bRet As Boolean
Dim i As Long
Dim Assembly As ModelDoc2
Dim myAssy As AssemblyDoc
Dim myCmps As Variant
Dim myCmp As Component2
Dim nInfo As Long

Sub main()
    Set swApp = Application.SldWorks
    Set Assembly = swApp.ActiveDoc
    Set myAssy = Assembly

    myCmps = myAssy.GetComponents(False)
    For i = 0 To UBound(myCmps)
        Set myCmp = myCmps(i)
        If (myCmp.GetSuppression = 3) Or (myCmp.GetSuppression = 2) Then
            bRet = myCmp.Select2(False, 0)
            bRet = myAssy.EditPart2(True, True, nInfo)
            Set swModel = myAssy.GetEditTarget

            If swModel.GetType = 1 Then
                Dim result As String
                Dim Mat As String
                Dim configName As String
                configName = "Défaut"
                Dim databaseName As String
                databaseName = "C:/Program Files/SOLIDWORKS Corp/SOLIDWORKS/lang/french/sldmaterials/solidworks materials.sldmat"

                Dim searchPropName1 As String
                Dim searchPropName2 As String
                Dim searchPropName3 As String
                Dim searchPropName4 As String
                searchPropName1 = "Soudure inox"
                searchPropName2 = "Stellite Grade 21 (RC)"
                searchPropName3 = "Stellite Grade 12 (RB)"
                searchPropName4 = "Stellite Grade 6 (RA)"

                Dim myPart As SldWorks.PartDoc
                Set myPart = swModel
                result = myPart.GetMaterialPropertyName2(configName, Mat)

                If result = searchPropName1 Then
                    myPart.SetMaterialPropertyName2 configName, databaseName, searchPropName1
                    Set myMatVisProps = myPart.GetMaterialVisualProperties()
                    Call apply_material_visual_properties(myMatVisProps, myPart)
                ElseIf result = searchPropName2 Then
                    myPart.SetMaterialPropertyName2 configName, databaseName, searchPropName2
                    Set myMatVisProps = myPart.GetMaterialVisualProperties()
                    Call apply_material_visual_properties(myMatVisProps, myPart)
                ElseIf result = searchPropName3 Then
                    myPart.SetMaterialPropertyName2 configName, databaseName, searchPropName3
                    Set myMatVisProps = myPart.GetMaterialVisualProperties()
                    Call apply_material_visual_properties(myMatVisProps, myPart)
                ElseIf result = searchPropName4 Then
                    myPart.SetMaterialPropertyName2 configName, databaseName, searchPropName4
                    Set myMatVisProps = myPart.GetMaterialVisualProperties()
                    Call apply_material_visual_properties(myMatVisProps, myPart)
                End If
            End If

            myAssy.EditAssembly
        End If
    Next i

    Assembly.ForceRebuild3 False

End Sub


Private Sub apply_material_visual_properties(myMatVisProps As SldWorks.MaterialVisualPropertiesData, myPart As SldWorks.PartDoc)
    If Not myMatVisProps Is Nothing Then
        orgAngle = myMatVisProps.Angle
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)

        orgScale = myMatVisProps.Scale2
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)

        If myMatVisProps.BlendColor = 0 Then
            orgBlend = False
        Else
            orgBlend = True
        End If
        myMatVisProps.BlendColor = Not orgBlend
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)
        myMatVisProps.BlendColor = orgBlend
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)

        If myMatVisProps.ApplyMaterialColorToPart = 0 Then
            orgApply = False
        Else
            orgApply = True
        End If
        myMatVisProps.ApplyMaterialColorToPart = Not orgApply
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)
        myMatVisProps.ApplyMaterialColorToPart = orgApply
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)

        If myMatVisProps.ApplyMaterialHatchToSection = 0 Then
            orgApply = False
        Else
            orgApply = True
        End If
        myMatVisProps.ApplyMaterialHatchToSection = Not orgApply
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)
        myMatVisProps.ApplyMaterialHatchToSection = orgApply
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)

        If myMatVisProps.ApplyAppearance = 0 Then
            orgApply = False
        Else
            orgApply = True
        End If
        myMatVisProps.ApplyAppearance = Not orgApply
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)
        myMatVisProps.ApplyAppearance = orgApply
        longstatus = myPart.SetMaterialVisualProperties(myMatVisProps, swThisConfiguration, Nothing)
    End If
End Sub

 

1 « J'aime »

@ d.roger :

C'est juste parfait.

Un grand merci tu vas nous faire gagner un temps précieux (et aussi à tous ceux qui ont fait l'erreur de mettre des facteurs d'échelle élevé sur leurs matières SW).

Il nous reste un soucis par contre (tant que SW n'as pas résolu le bug : SPR 476546 qui est quand même ouvert en High Impact depuis 2014...) : Sur nos MEP, les pièces ayant un motif de hachure uni (donc celles que je t'ai demandé de modifier...) apparaissent en transparent au lieu d'uniformément noir. Pour contourner le problème, il faut donc sélectionner une des zones hachurée blanche (au lieu de noire), faire un clic droit, et déselectioner la case à cocher "Hachures du matériau". Bizarrement cela permet de bien appliquer le motif noir uni sur la soudure. Et il faut faire cette manip sur toutes les vues et toutes les pièces hachurées en uni de la mise en plan.

Penses tu que ce serait capable de faire une macro permettant de faire cette déselection en automatique sur toutes les vues de la MEP (soit en allant chercher les matériaux de la liste que tu as déjà utilisé, soit en allant chercher tous les matériaux qui ont 'unie' comme type de hachure) ??

Cette macro servira aussi à tous ceux qui ont la bête idée d'utiliser des hachures unies pour leurs soudures (SW à quand même fait très fort car ils sont arrivé à crééer 2 bugs qui font qu'il est impossible de faire des soudures sur une MEP sans se prendre la tête : si c'est uni, tu ne vois pas la hachure, si c'est une hachure avec un fort facteur d'échelle ta mise en plan mouline et tu es au bord du suicide...).

 


capture_hachures.jpg

Bonjour,

De premier abord c'est un peu compliqué car la méthode "GetFaceHatchCount" retourne une valeur nulle pour les hachures unies issues de matériaux et qui apparaissent en transparent, je me pencherais sur le souci à l'occasion mais quand j'aurais un peu plus de temps.

Cordialement,

@ d.roger : Encore merci.

Je ferme ce topic.

J'en rouvrirait éventuellement un si vous arrivez à trouver une solution à ce problème de hachure unie transparente sur les mises en plan afin de partager cette nouvelle macro avec la communauté.

Il est effectivement possible que ce ne soit pas si simple (sinon SW aurait peut être résolu cette SPR avec impact client élevé en 6 ans... ).