Vider les propriétés d'un virtuel (par macro?)

Bonjour,
Je suis à la recherche d’une solution automatique (comprendre invisible pour l’utilisateur lambda) permettant de nettoyer la carte de données d’une pièce/assemblage virtuel contenu dans un autre assemblage.
En effet, si je passe une pièce en virtuel dans un assemblage, celle-ci conserve ses propriétés Solidworks, notamment le numéro de pièce qui peut créer un conflit avec la pièce d’origine (car le numéro de pièce est une variable PDM qui doit être unique dans le coffre-fort).
J’ai pensé notamment à créer une macro vba sous SW qui se chargerait de la suppression de la propriété SW en question.
J’ai plusieurs interrogations :

  • quand et comment lancer cette macro automatiquement ? Sur une action d’archivage ? D’enregistrement ? Lors d’un changement d’état ?
  • quelle est la syntaxe pour extraire/archiver un fichier sous vba SW ?
  • y-a-t-il une solution plus simple ? (paramétrer sous SW comment est géré un virtuel ?

Merci d’avance pour vos idées !

Bonjour,
Pour le côté macro, on ne peut pas la lancer automatiquement, il faut plutôt passer par un add-in et travailler avec les évènements. Donc à programmer plutôt dans un langage .NET
Après je ne sais pas s’il existe une solution plus simple

Et le lancement lors d’un changement d’état PDM c’est faisable ?

Il faut que la macro soit déjà lancée pour réagir à un changement d’état PDM, il s’agit de la gestion des évènements. Une méthode s’abonne à un évènement et lorsque celui-ci est déclenché, la méthode s’exécute. Donc on en revient à la case add-in.

OK, il faut que je creuse le sujet add-in, je ne sais pas ce que c’est.

Bonjour,
Sans forcément passer par un add-in, on peut également modifier le lien qui pointe vers l’exe de SW pour lui ajouter le lancement d’une macro au démarrage.
Ca permettrait d’utiliser les évènements SW et PDM. Inconvénient de cette méthode faut intervenir sur tous les postes pour changer ce lien et penser à le faire à chaque changement de version de SW.
Sinon, vos utilisateurs seraient vraiment contre l’ajout d’une icône à cliquer pour lancer une action?

1 « J'aime »

Ils ne seraient pas contre, mais ils ne la lanceraient pas :slight_smile: .
Le problème est invisible pour eux, le blocage se fait plus tard lors d’un changement d’état qui se met en erreur car variable en doublon.

C’est bien le problème :slight_smile:
Donc reste l’add-in ou réussir à faire modifier le lien de lancement de l’exe pour pouvoir injecter une macro au lancement de SW.
J’aurai bien sinon proposé dispatch pour faire le contrôle lors de l’archivage mais il me semble que du côté de PDM les fichiers virtuels ne sont pas vraiment gérés donc dispatch ne pourrait pas les interpréter vu que ce ne sont pas des fichiers physiques.
Par contre avec la macro à lancer manuellement, suffit d’ajouter une propriété au fichier et de vérifier si elle est présente lors de l’archivage. Si non présente refuser l’archivage

Merci pour ton retour.
Un add-in ça correspond à quoi ? Coder un coplément un peu comme MyPDMTools ?
Le .exe c’est une bonne idée, sauf qu’il faudrait plutot lancer la macro après les modifs, pas à l’ouverture :slight_smile: . Mais je pourrais aussi le lancer uniquement sur l’automate qui génère nos fichiers neutres… Il faut que je creuse.
Dispatch aussi c’est une solution, quitte à le lancer sur tous les fichiers sans ciblage.

Dernière question : quand tu dis « refuser l’archivage » à la fin de ton message, c’est plutot refuser le changement d’état non ? Il me semblait pas qu’on pouvait bloquer un archivage.

On peut bloquer un archivage, je le fais sur un fichier Word qui n’utilise pas la bonne trame par exemple.
Pour la macro lancée à l’ouverture c’est juste une macro qui tournerait en tâche de fond et intercepterait les événements SW pour appliquer du traitement en fonction de l’événement ciblé.
Un add-in c’est un exécutable mais là encore faut-il qu’il soit lancé.

Alors pour le coup je veux bien savoir comment on bloque un archivage d’un fichier qui n’a pas la bonne trame (par exemple), parceque pour le moment je sais le faire uniquementen bloquant le changement d’état . Tu passes par une valorisation de variable quand la bonne trame est utilisée ?
A ma connaissance j’ai uniquement ces options pour bloquer un archivage :
2023-11-03 14_40_47-Window

Et éventuellement coté variable cette case à cocher, mais ça ne fait pas de vérif sur la valeur, uniquement son existence :
2023-11-03 14_45_36-Clipboard

Je le fais avec dispatch.

Pas testé sur SW, mais en tout cas fonctionne très bien sur Word (ça annule la demande d’archivage et réouvre le fichier)

2 « J'aime »

Bonjour,

Quelque chose qui peut aider à implémenter une macro : dans Solidworks, tous les fichiers virtuels contiennent le caractère ^ suivi du nom du fichier dans lequel est enregistré le fichier virtuel (NB : En cas de sous niveau on a aussi des caractères _ en plus du caractère ^ dans le nom du fichier virtuel, mais ça ne devrait pas avoir d’incidence).
C’est donc sur des fichiers contenant ce caractère ^ qu’il faut exécuter ta macro (ça devrait permettre d’éviter de mettre le brin dans les fichiers non virtuels).
Comme les fichiers virtuels sont temporaires, la macro doit être lancée sur un assemblage ouvert. en mode de travail normal ça devrait fonctionner mais si un petit malin s’amuse à archiver/transitionner un fichier contenant du virtuel via Windows c’est mort (à moins éventuellement de forcer l’ouverture du fichier dans Solidworks avant de travailler sur le nettoyage des propriétés).

Pour la partie macro c’est sûrement notre ami @Cyril.f qui sera le plus calé.

1 « J'aime »

Merci à tous les deux, il faut que je creuse vos propositions.
Pour le fait que le fichier doit être ouvert ça peut être faisable car c’est justement lors de l’ouverture des asm sur un automate pour générer des fichiers neutres que le problème d’archivage se pose (et bizarrement pas quand c’est le concepteur qui archive…). Du coup je pourrais lancer la macro sur l’automate avant la génération.

Salut à tous, et bonne année ! Je reviens sur mon sujet de nettoyage de propriétés dans les virtuels.
Avant de traiter la partie « lancer une macro en automatique », je voudrais essayer dans un premier temps de créer une macro que je serais capable de lancer manuellement sur un fichier bloqué, en tant qu’admin.
Est-ce que l’un de vous saurait m’aiguiller pour rédiger une macro qui ferait les actions suivantes :

  • sur un assemblage déjà ouvert, scanner tous les assemblage et pièces enfants
  • si le nom de l’enfant contient le caractère « ^ » , l’ouvrir
  • ouvrir la fenêtre de propriétés de ce fichier virtuel
  • supprimer la propriété « Référence » dans l’onglet « Personnaliser » et dans toutes les configurations présentes dans l’onglet « Spécifiques à la configuration »
  • fermer la fenêtre propriétés
  • si le fichier virtuel ouvert est lui-même un assemblage, boucler de la même manière sur ses enfants
  • enregistrer le fichier virtuel
  • passer à l’enfant suivant
  • boucler jusqu’au dernier enfant
  • afficher un pop-up quand c’est terminé.

Evidemment ce que je décris c’est la séquence d’actions via les fenêtres, il y a sûrement moyen de simplifier tout ça via des fonctions mais je suis un gros noob des macros SW. Par contre je suis prêt à apprendre si on me guide avec des exemples de macro exsitantes, je demande pas un boulot tout fait :slight_smile: .
J’ai essayé via la fonction « Enregistrer une macro » mais ça marche pas sur la fenêtre Propriétés.

En parallèle je vais essayer de voir si j’arrive à passer par l’outil BatchProperties de myCADTools.

Bonjour,

Code pas forcément optimisé mais répond en partie au besoin.
Pour le bouclage sur un ASM virtuel pas encore eu le temps de regarder (si ça inspire quelqu’un d’autre pour terminer le code car pas forcément plus de temps à passer dessus pour le moment).

Option Explicit
Dim swApp           As SldWorks.SldWorks
Dim doc             As SldWorks.ModelDoc2
Dim swModel         As SldWorks.ModelDoc2
Dim asm             As SldWorks.AssemblyDoc
Dim compDoc         As SldWorks.ModelDoc2
Dim swModelDocExt   As ModelDocExtension
Dim swCustProp      As CustomPropertyManager
Dim swConfig        As SldWorks.Configuration
Dim swConfMgr       As SldWorks.ConfigurationManager
Dim comp            As SldWorks.Component2

Dim components      As Variant
Dim vComp           As Variant
Dim pathChain       As Variant
Dim titleChain      As Variant
Dim vPath           As Variant
Dim vConfigNameArr  As Variant
Dim vConfigName     As Variant
Dim vPropNames      As Variant
Dim vPropTypes      As Variant
Dim vPropValues     As Variant
Dim resolved        As Variant
Dim linkProp        As Variant

Dim nDocType        As Long
Dim nErrors         As Long
Dim nWarnings       As Long
Dim nNbrProps       As Long
Dim lRetVal         As Long
Dim j               As Long
Dim i               As Long

Dim bResult3        As Boolean
Dim boolstatus      As Boolean
Dim wasResolved     As Boolean
Dim linkToProp      As Boolean

Dim ValOut          As String
Dim ResolvedValOut  As String
Dim sCustProp       As String
Dim sConfig         As String
Sub main()

    Set swApp = Application.SldWorks
    Set doc = swApp.ActiveDoc
    If doc Is Nothing Then Exit Sub
    If doc.GetType <> swDocASSEMBLY Then Exit Sub
    Set asm = doc
    components = asm.GetComponents(False)   ' Get all components
    
    If IsArray(components) Then
        For Each vComp In components
            Set comp = vComp
            Set compDoc = comp.GetModelDoc2
            If Not compDoc Is Nothing Then
                bResult3 = compDoc.Extension.IsVirtualComponent3(pathChain, titleChain)
                If bResult3 <> False Then
                    For Each vPath In pathChain
                        If vPath <> doc.GetPathName Then
                            If InStr(LCase(vPath), "sldprt") > 0 Then
                                nDocType = swDocPART
                            ElseIf InStr(LCase(vPath), "sldasm") > 0 Then
                                nDocType = swDocASSEMBLY
                            ElseIf InStr(LCase(vPath), "slddrw") > 0 Then
                                nDocType = swDocDRAWING
                            Else
                                ' Probably not a SOLIDWORKS file
                                nDocType = swDocNONE
                                ' So cannot open the file
                                Exit Sub
                            End If
                        Set swModel = swApp.OpenDoc6(vPath, nDocType, swOpenDocOptions_Silent, "", nErrors, nWarnings)
                        Set swModelDocExt = swModel.Extension
                        Set swCustProp = swModelDocExt.CustomPropertyManager("")
                        nNbrProps = swCustProp.Count
                        lRetVal = swCustProp.GetAll3(vPropNames, vPropTypes, vPropValues, resolved, linkProp)
                        For j = 0 To nNbrProps - 1
                            For i = 0 To UBound(vPropNames)
                                sCustProp = vPropNames(i)
                                boolstatus = swModel.DeleteCustomInfo2("", sCustProp)
                            Next i
                        Next j
                        Set swConfMgr = swModel.ConfigurationManager
                        Set swConfig = swConfMgr.ActiveConfiguration
                        vConfigNameArr = swModel.GetConfigurationNames
                        For Each vConfigName In vConfigNameArr
                            Set swCustProp = swModelDocExt.CustomPropertyManager(vConfigName)
                            nNbrProps = swCustProp.Count
                            lRetVal = swCustProp.GetAll3(vPropNames, vPropTypes, vPropValues, resolved, linkProp)
                            For j = 0 To nNbrProps - 1
                                sConfig = vConfigName
                                For i = 0 To UBound(vPropNames)
                                    sCustProp = vPropNames(i)
                                    boolstatus = swModel.DeleteCustomInfo2(sConfig, sCustProp)
                                Next i

                            Next j
                        Next
                    End If
                    Next
                End If
            End If
        Next
    End If
End Sub

Ouaouh mais c’est top ça ! Et ça fonctionne :slight_smile:
Merci infiniment !
Je me contenterai de ça pour le moment, ça ne boucle pas effectivement sur asm enfant mais je peux la relancer après avoir l’asm enfant en question, ça me va :stuck_out_tongue: !
Je vais quand même voir si j’arrive à imbriquer une boucle en plus si nDocType = dwDocASSEMBLY.
Merci encore

1 « J'aime »