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 ?
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
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.
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?
Ils ne seraient pas contre, mais ils ne la lanceraient pas .
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
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 . 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 :
Et éventuellement coté variable cette case à cocher, mais ça ne fait pas de vérif sur la valeur, uniquement son existence :
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é.
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 .
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.
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
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 !
Je vais quand même voir si j’arrive à imbriquer une boucle en plus si nDocType = dwDocASSEMBLY.
Merci encore