Propriété révision

Salut à tous,
Nous utilisons les tables de révisions dans les MEP pour incrémenter l’indice de révision et noter les changement effectués.
Ainsi la propriété révision est située dans le fichier MEP.

Est-il possible de lier cette propriété de l’indice de révision de la MEP à une propriété dans la pièce ou l’assemblage afin de notamment l’ajouter aux nomenclatures ?

Merci par avance.
Bonne journée

Bonjour @remrem, cela faisait un moment… :grinning:

Si tu as accés à la suite MyCadTools, l’outil Smartproperties permet de faire cette opération:

Mais je ne la conseil pas du tout, cette fonction n’a pas de notion de « Mise à jour automatique ».
=> Si la mise en plan est mise à jour avec un nouvel indice, il faudra relancer les Smartproperties sur cette mise en plan puis ouvrir le 3D associé et relancer à nouveau les Smartproperties…c’est un potentiel d’erreur énorme.

1 « J'aime »

Bonjour remrem,

Je pense qu’il ne serait pas conseillé d’indicer le 3D. Comme ont dit seul le 3D fait fois.

Ce que l’on fait pour envoyer un 3D au clients en passant par un STEP en le re-nome avec l’indice et la date de création du STEP.

Sinon utiliser une PLM pour gérer tous ça …
A vous de voir.
@+.
AR.

Oui. Effectivement. Je suis de retour. :wink:
Je n’ai pas la suite MyCadTools…

Effectivement, l’objectif est de limiter les erreurs.

Je ne comprends pas bien ta réponse.
Si le 3D fait fois, pourquoi ne pas indicer le 3D ?

Et bien il y aura des risques d’erreurs.
donc je te conseille de faire un STEP re-nomé avec l’indice et date de réalisation.
Voilà…
@+.
AR.

Bonjour,
Chez nous (même si nous avons Solidworks PDM), c’est le 3D qui porte l’indice dans ses propriétés.
L’information est dupliquée dans les propriétés de la mise en plan soit par macro soit via le coffre.
Ensuite nous avons également des macros qui récupèrent les informations de la propriété indice pour formater les noms d’export (STEP, IGES, STL…)

1 « J'aime »

Merci pour ta réponse, tu n’utilises pas les tables de révisions ?

Non, jamais mis en œuvre

C’est pour cela que ma révision est dans la MEP.
Lorsque l’on créé une nouvelle ligne dans la table, la propriété « Révision » s’incrémente automatiquement. Mais elle est dans la MEP.

1 « J'aime »

Bonjour

Mais si l’erreur viens du plan, mais pas de la 3D?

Chez nous s’est compliqués :sweat_smile:
On un indice de pièce et un indice de plan.
Nous indiquons sur les plans d’ensemble dans la nomenclature l’indice de la pièce. Et dans les plans de détail aussi.

Ces informations sont indépendantes l’une de l’autre.

SI la pièce 3D change la 3D évolue et le plan forcément monte d’indice aussi.
SI le plan évolue (exemple un nota ou autre) le plan monte d’indice mais pas la pièce ?

On peut lier l’indice du plan et de la pièce il faut recréer une chaine de propriété personnalisé portant un terme diffèrent de 'l’indice du plan. Cela dit l’indice du plan continuera d’exister. Il faut recréer texte lié a une propriété dans le cartouche et dans la barre de révision.

Bonjour,

Chez nous c’est tout pareil que @Cyril_f : c’est le 3D qui porte l’indice (qu’il est facile de récupérer dans le 2D du coup).

NB : en pratique les 2 ont un indice que l’on mont en parallèle, mais le principal reste celui du 3D.

Pour répondre à la question de @FRED78 , on monte un indice sur le 3D même si la modif ne se fait en pratique que sur le 2D (genre ajout d’un nota) car un petit nota peut avoir de grande incidence sur la pièce (même si sa géométrie 3D ne change pas).

Quelle est la chaine pour lier cette propriété ?

@remrem

Utilisé peut être à mauvaise escient, je pensais à une chaine de la 3D vers la MEP, pièce - assemblage, assemblage - plan. Et de faire suivre un liens (l’indice) de la 3D vers le 2D.
Mais je me suis surement mal exprimé :sweat_smile:

Voici une macro qui remplace la propriété « Révision » de la pièce ou de l’assemblage par celle de la MEP.

Option Explicit
    Dim PrtPath As String
    Dim AsmPath As String


Sub main()
    Dim swApp As SldWorks.SldWorks
    
    Dim swDrawModel As SldWorks.ModelDoc2
    Dim swDrawModelDocExt As ModelDocExtension
    Dim swDrawCustProp As CustomPropertyManager
    Dim swDrawDoc As SldWorks.DrawingDoc
    Dim swDrawView As SldWorks.View
    Dim DrawVal As String
    Dim DrawRevision As String
    Dim DrawBool As Boolean
    
    Dim swRefModel As SldWorks.ModelDoc2
    Dim swRefPath As String
    Dim swRefModelDocExt As ModelDocExtension
    Dim swRefCustProp As CustomPropertyManager
    Dim RefReturn As Integer
    Dim RefBool As Boolean
    Dim RefVal As String
    Dim RefRevision As String
    Dim RefDocType As swDocumentTypes_e
    
    Dim FileError As Long
    Dim FileWarning As Long

    Set swApp = Application.SldWorks
    Set swDrawModel = swApp.ActiveDoc

    If swDrawModel Is Nothing Then
        swApp.SendMsgToUser2 "Ouvrir un fichier mise en plan", swMbWarning, swMbOk
        Exit Sub
    End If

    If swDrawModel.GetType <> swDocDRAWING Then 'swDocASSEMBLY, swDocPART
        swApp.SendMsgToUser2 "Ouvrir un fichier mise en plan", swMbWarning, swMbOk
        Exit Sub
    Else
        RefDocType = RefDocTypeSearch(swDrawModel.GetPathName)
        Select Case RefDocType
            Case swDocPART
                Set swRefModel = swApp.OpenDoc6(PrtPath, swDocPART, swOpenDocOptions_Silent, "", FileError, FileWarning)
                Debug.Print "PrtPath = " & PrtPath
                Debug.Print "FileError = " & FileError
                Debug.Print "FileWarning = " & FileWarning
                
            Case swDocASSEMBLY
                Set swRefModel = swApp.OpenDoc6(AsmPath, swDocASSEMBLY, swOpenDocOptions_Silent, "", FileError, FileWarning)
                Debug.Print "AsmPath = " & AsmPath
                Debug.Print "FileError = " & FileError
                Debug.Print "FileWarning = " & FileWarning
                
        End Select
        
        If Not swRefModel Is Nothing Then
            swRefPath = swRefModel.GetPathName
            If IsFileExist(swRefModel.GetPathName) Then
                Set swDrawModelDocExt = swDrawModel.Extension
                Set swDrawCustProp = swDrawModelDocExt.CustomPropertyManager("")
                
                DrawBool = swDrawCustProp.Get4("Révision", False, DrawVal, DrawRevision)
                Debug.Print "DrawBool = " & DrawBool
                Debug.Print "DrawRevision = " & DrawRevision
                
                Set swRefModelDocExt = swRefModel.Extension
                Set swRefCustProp = swRefModelDocExt.CustomPropertyManager("")
                
                RefReturn = swRefCustProp.Set("Révision", DrawRevision)
                Debug.Print "RefReturn = " & RefReturn
                
                RefBool = swRefCustProp.Get4("Révision", False, RefVal, RefRevision)
                Debug.Print "RefModelPath = " & swRefModel.GetPathName
                Debug.Print "RefBool = " & RefBool
                Debug.Print "RefRevision = " & RefRevision
            End If
        End If
    End If
End Sub
Function RefDocTypeSearch(DrawPath As String) As swDocumentTypes_e
    Dim DrawPathLow As String
    
    DrawPathLow = LCase(DrawPath)
    Debug.Print "DrawPath = " & DrawPath
    Debug.Print "DrawPathLow = " & DrawPathLow
    
    PrtPath = Replace(DrawPathLow, "slddrw", "sldprt")
    AsmPath = Replace(DrawPathLow, "slddrw", "sldasm")
    
    If IsFileExist(PrtPath) Then
        RefDocTypeSearch = swDocPART
        Exit Function
    End If
    If IsFileExist(AsmPath) Then
        RefDocTypeSearch = swDocASSEMBLY
    End If
End Function


Function IsFileExist(FullName As String) As Boolean
  ' Vérifie l'existence d'un fichier
  IsFileExist = Dir(FullName) <> ""
End Function

Les fichiers assemblage, pièce et MEp doivent être dans le même dossier

3 « J'aime »

Joyeux Anniversaire de Forum @remrem :birthday: !

Merci pour le partage de macro. (Le tout sera de penser à la lancer régulièrement :sweat_smile:).

Attention à celles et ceux qui utilisent « Revision » (sans accent), il sera nécessaire de modifier légèrement le code…

2 « J'aime »

Merci. :wink:
Je me suis incrit en 2013 et j’avais déjà des cheveux blancs :joy:

2 « J'aime »

Bon anniversaire de forum un l’un des très rare, bien plus vieux que moi!
Et pour moi toujours très peu de cheveux blanc! :rofl:
image

2 « J'aime »

@remrem , je me suis permis de repartir de ta macro pour la rendre un peu plus « universelle » (ne m’en veux pas).
Les modifications sont principalement portées sur la double lecture
« Revision » Versus « Révision ».
J’ai aussi utilisé l’IA « Perplexity » pour l’ajout des commentaires textuels (les IA ne sont encore bonnes qu’à cela mais c’est quand même bien pratique).
En théorie aussi la compatibilité avec les version Solidworks > 2022 est augmentée. (mais je ne peux pas test !).

Astuce :
Pour celles et ceux qui possèdent la Suite « Mycad », cette version est censée être compatible avec sont utilisation dans les Smartproperties (et donc automatisable à la fermeture de la Fenêtre Smartproperties (dans l’hypothèse ou vos révision sont générées avec cet utilitaire).
Cela devrait grandement amoindrir les risques de mauvaises révision entre les 3D et les Mises en plan…

Exemple:

Option Explicit

' =====================================================
' DÉCLARATIONS GLOBALES
' =====================================================
' Ces variables globales stockent les chemins des fichiers pièce (.sldprt) et assemblage (.sldasm)
' détectés automatiquement à partir du chemin de la mise en plan (.slddrw).
' Pourquoi globales ? Pour qu'elles soient accessibles par toutes les fonctions de la macro.
Dim PrtPath As String     ' Chemin complet vers la pièce référencée
Dim AsmPath As String     ' Chemin complet vers l'assemblage référencé

' =====================================================
' PROCÉDURE PRINCIPALE : main()
' =====================================================
' BUT : Synchroniser la propriété "Révision/Revision" de la mise en plan vers son modèle référencé
'       (pièce ou assemblage). Fonctionne avec SolidWorks 2022 et ses spécificités API.
Sub main()
    On Error GoTo GestionErreur    ' Gestion centralisée des erreurs
    
    ' =====================================================
    ' DÉCLARATION DES OBJETS SOLIDWORKS
    ' =====================================================
    ' swApp : Instance principale de SolidWorks (toujours accessible via Application.SldWorks)
    Dim swApp As SldWorks.SldWorks
    ' swDrawModel : Document actif (la mise en plan)
    Dim swDrawModel As SldWorks.ModelDoc2
    ' Extensions et gestionnaires de propriétés personnalisées
    Dim swDrawModelDocExt As ModelDocExtension
    Dim swDrawCustProp As CustomPropertyManager
    ' Modèle référencé (pièce ou assemblage à synchroniser)
    Dim swRefModel As SldWorks.ModelDoc2
    Dim swRefModelDocExt As ModelDocExtension
    Dim swRefCustProp As CustomPropertyManager
    Dim RefDocType As swDocumentTypes_e    ' Type du document référencé
    
    ' =====================================================
    ' VARIABLES UTILITAIRES
    ' =====================================================
    Dim DrawRevision As String    ' Valeur de révision dans la mise en plan
    Dim RefRevision As String     ' Valeur de révision dans le modèle
    Dim PropName As String        ' Nom exact de la propriété (ex: "Revision" ou "Révision")
    Dim FileError As Long         ' Code d'erreur ouverture fichier
    Dim FileWarning As Long       ' Code d'avertissement ouverture fichier
    Dim Msg As String             ' Message informatif
    Dim addRes As Long            ' Résultat de l'ajout de propriété
    
    ' =====================================================
    ' ÉTAPE 1 : CONNEXION À SOLIDWORKS ET VÉRIFICATIONS
    ' =====================================================
    Set swApp = Application.SldWorks           ' Récupère l'instance SolidWorks courante
    Set swDrawModel = swApp.ActiveDoc          ' Document actif = mise en plan
    
    ' Vérification : un document doit être actif
    If swDrawModel Is Nothing Then
        swApp.SendMsgToUser2 "Aucun document actif. Ouvrez une mise en plan.", swMbWarning, swMbOk
        Exit Sub
    End If
    
    ' Vérification : le document actif DOIT être une mise en plan (.slddrw)
    If swDrawModel.GetType <> swDocDRAWING Then
        swApp.SendMsgToUser2 "Le document actif n'est pas une mise en plan.", swMbWarning, swMbOk
        Exit Sub
    End If
    
    ' =====================================================
    ' ÉTAPE 2 : DÉTECTION DU MODÈLE RÉFÉRENCÉ
    ' =====================================================
    ' Recherche automatique du fichier .sldprt ou .sldasm correspondant au .slddrw
    RefDocType = RefDocTypeSearch(swDrawModel.GetPathName)
    If RefDocType = 0 Then
        swApp.SendMsgToUser2 "Aucun modèle référencé trouvé (.sldprt ou .sldasm).", swMbWarning, swMbOk
        Exit Sub
    End If
    
    ' =====================================================
    ' ÉTAPE 3 : OUVERTURE SILENCIEUSE DU MODÈLE
    ' =====================================================
    ' Ouverture sans interface utilisateur (swOpenDocOptions_Silent)
    Select Case RefDocType
        Case swDocPART      ' Pièce
            Set swRefModel = swApp.OpenDoc6(PrtPath, swDocPART, swOpenDocOptions_Silent, "", FileError, FileWarning)
        Case swDocASSEMBLY  ' Assemblage
            Set swRefModel = swApp.OpenDoc6(AsmPath, swDocASSEMBLY, swOpenDocOptions_Silent, "", FileError, FileWarning)
    End Select
    
    ' Vérification ouverture réussie
    If swRefModel Is Nothing Or FileError <> 0 Then
        swApp.SendMsgToUser2 "Échec ouverture modèle.", swMbStop, swMbOk
        Exit Sub
    End If
    
    ' =====================================================
    ' ÉTAPE 4 : LECTURE PROPRIÉTÉS M ISE EN PLAN
    ' =====================================================
    Set swDrawModelDocExt = swDrawModel.Extension
    Set swDrawCustProp = swDrawModelDocExt.CustomPropertyManager("")    ' Propriétés document ("" = niveau document)
    
    ' DÉTECTION INTELLIGENTE du nom exact de la propriété révision
    PropName = DetectRevisionPropertyFixed(swDrawCustProp)
    Debug.Print "=== PROPNAME FINAL : '" & PropName & "' ==="    ' Debug pour développeur
    
    If PropName = "" Then
        swApp.SendMsgToUser2 "Aucune propriété Révision/Revision trouvée.", swMbStop, swMbOk
        GoTo NettoyageSimple
    End If
    
    ' Lecture de la valeur (avec fallback si vide)
    If Not GetCustomPropValue(swDrawCustProp, PropName, DrawRevision) Then
        DrawRevision = "NON_RENSEIGNÉ"    ' Valeur par défaut
        Debug.Print "Valeur mise en plan vide ? fallback"
    End If
    
    Debug.Print "Valeur À SYNCHRONISER : '" & DrawRevision & "'"
    
    ' =====================================================
    ' ÉTAPE 5 : ACCÈS PROPRIÉTÉS MODÈLE RÉFÉRENCÉ
    ' =====================================================
    Set swRefModelDocExt = swRefModel.Extension
    Set swRefCustProp = swRefModelDocExt.CustomPropertyManager("")    ' Propriétés du modèle
    
    ' =====================================================
    ' ÉTAPE 6 : SYNCHRONISATION (CRU DE LA MACRO)
    ' =====================================================
    Debug.Print "--- DÉBUT SYNCHRO ---"
    
    ' ? IMPORTANT SolidWorks 2022 : Force la reconstruction pour rafraîchir les propriétés
    swRefModel.ForceRebuild3 False    ' False = ne pas afficher les messages
    
    ' Test 1 : La propriété existe-t-elle déjà dans le modèle ?
    If GetCustomPropValue(swRefCustProp, PropName, RefRevision) Then
        Debug.Print "  ? Propriété existe : '" & RefRevision & "'"
        If RefRevision <> DrawRevision Then
            Debug.Print "  ? MISE À JOUR nécessaire"
            
            ' Mise à jour de la valeur existante
            Dim setRes As Long
            setRes = swRefCustProp.Set2(PropName, DrawRevision)    ' Set2 = mise à jour
            Debug.Print "  ? Set2 retour : " & setRes
            
            If setRes = 0 Then
                Msg = "? " & PropName & " mise à jour : " & DrawRevision
            Else
                Msg = "? Échec mise à jour " & PropName
            End If
        Else
            Msg = "? Déjà OK : " & PropName & " = " & DrawRevision
        End If
    Else
        Debug.Print "  ? CRÉATION propriété manquante"
        ' Création avec Add2 (stable sur SolidWorks 2022)
        addRes = swRefCustProp.Add2(PropName, swCustomInfoText, DrawRevision)
        Debug.Print "  ? Add2 retour : " & addRes
        
        If addRes = 0 Or addRes = 2 Then    ' 0=OK, 2=existe déjà
            Msg = "? " & PropName & " créée : " & DrawRevision
        Else
            ' Fallback Add3 si Add2 échoue
            addRes = swRefCustProp.Add3(PropName, swCustomInfoText, DrawRevision, 0)
            Debug.Print "  ? Add3 fallback retour : " & addRes
            If addRes = 0 Or addRes = 2 Then
                Msg = "? " & PropName & " créée (Add3) : " & DrawRevision
            Else
                Msg = "? ÉCHEC création " & PropName & " (Add2=" & addRes & ", Add3=" & addRes & ")"
            End If
        End If
    End If
    
    ' Debug.Print "--- SYNCHRO TERMINÉE : " & Msg & " ---"
    ' swApp.SendMsgToUser2 Msg, swMbInformation, swMbOk    ' Décommentez pour voir le résultat

    ' =====================================================
    ' NETTOYAGE : FERMETURE MODÈLE
    ' =====================================================
NettoyageSimple:
    If Not swRefModel Is Nothing Then
        On Error Resume Next      ' Ignore erreurs de fermeture
        swApp.CloseDoc swRefModel.GetPathName    ' Ferme sans sauvegarde
        On Error GoTo 0           ' Restaure gestion erreurs normale
    End If
    Exit Sub

    ' =====================================================
    ' GESTION D'ERREUR CENTRALE
    ' =====================================================
GestionErreur:
    swApp.SendMsgToUser2 "Erreur : " & Err.Description, swMbStop, swMbOk
    Debug.Print "ERREUR # " & Err.Number & " : " & Err.Description
    Resume NettoyageSimple    ' Nettoyage avant sortie
End Sub

' =====================================================
' FONCTION : DetectRevisionPropertyFixed()
' =====================================================
' BUT : Détecte intelligemment le nom exact de la propriété révision
'       Teste d'abord "Revision" ? "Révision" ? scan complet des propriétés
Function DetectRevisionPropertyFixed(CustMgr As CustomPropertyManager) As String
    Dim propNames As Variant
    Dim i As Long
    Dim PropName As String
    Dim propVal As String
    
    Debug.Print "=== SCAN COMPLET ==="
    
    ' 1?? PRIORITÉ 1 : Test direct "Revision" (standard anglais)
    If CustMgr.Get4("Revision", False, "", propVal) Then
        DetectRevisionPropertyFixed = "Revision"
        Debug.Print "? DIRECT : Revision"
        Exit Function
    End If
    
    ' 2?? PRIORITÉ 2 : Test "Révision" (standard français)
    If CustMgr.Get4("Révision", False, "", propVal) Then
        DetectRevisionPropertyFixed = "Révision"
        Debug.Print "? DIRECT : Révision"
        Exit Function
    End If
    
    ' 3?? PRIORITÉ 3 : Scan complet de TOUTES les propriétés
    propNames = CustMgr.GetNames    ' Tableau des noms de propriétés
    Debug.Print "Nb props: " & IIf(IsEmpty(propNames), 0, UBound(propNames) + 1)
    
    If Not IsEmpty(propNames) Then
        For i = 0 To UBound(propNames)
            PropName = CStr(propNames(i))
            Debug.Print "Prop " & i & ": '" & PropName & "'"
            ' Recherche insensible à la casse contenant "revision"
            If InStr(LCase(PropName), "revision") > 0 Then
                DetectRevisionPropertyFixed = PropName
                Debug.Print "? TROUVÉ : '" & PropName & "'"
                Exit Function
            End If
        Next i
    End If
    
    Debug.Print "? RIEN TROUVÉ"
    DetectRevisionPropertyFixed = ""    ' Aucune propriété trouvée
End Function

' =====================================================
' FONCTION : GetCustomPropValue()
' =====================================================
' BUT : Lit une propriété personnalisée avec gestion des valeurs vides
' RETOUR : True si propriété existe, False sinon
Function GetCustomPropValue(CustMgr As CustomPropertyManager, PropName As String, ByRef PropValue As String) As Boolean
    Dim res As Boolean
    Dim valOut As String, valEval As String    ' valEval = valeur évaluée (résolue)
    
    On Error Resume Next    ' Ignore erreurs Get4
    res = CustMgr.Get4(PropName, False, valOut, valEval)    ' Lecture propriété
    On Error GoTo 0         ' Restaure gestion erreurs
    
    Debug.Print "  Get4('" & PropName & "') ? res=" & res & " | val='" & valEval & "'"
    
    If res Then
        PropValue = IIf(valEval = "", "VIDE", valEval)    ' Gère les valeurs vides
        GetCustomPropValue = True
    Else
        PropValue = ""
        GetCustomPropValue = False
    End If
End Function

' =====================================================
' FONCTION : RefDocTypeSearch()
' =====================================================
' BUT : Détecte si le chemin .slddrw pointe vers .sldprt OU .sldasm
'       Remplit les variables globales PrtPath/AsmPath
Function RefDocTypeSearch(DrawPath As String) As swDocumentTypes_e
    Dim DrawPathLow As String
    DrawPathLow = LCase(DrawPath)    ' Minuscules pour comparaison
    
    ' Conversion automatique des noms de fichiers
    PrtPath = Replace(DrawPathLow, "slddrw", "sldprt")    ' Mise en plan ? Pièce
    AsmPath = Replace(DrawPathLow, "slddrw", "sldasm")    ' Mise en plan ? Assemblage
    
    Debug.Print "Test pièce : " & PrtPath & " ? " & IIf(IsFileExist(PrtPath), "OK", "KO")
    Debug.Print "Test assem : " & AsmPath & " ? " & IIf(IsFileExist(AsmPath), "OK", "KO")
    
    If IsFileExist(PrtPath) Then
        RefDocTypeSearch = swDocPART
        Exit Function
    End If
    If IsFileExist(AsmPath) Then
        RefDocTypeSearch = swDocASSEMBLY
    End If    ' Retourne 0 si aucun fichier trouvé
End Function

' =====================================================
' FONCTION UTILITAIRE : IsFileExist()
' =====================================================
' BUT : Teste l'existence d'un fichier sur disque
Function IsFileExist(FullName As String) As Boolean
    IsFileExist = (Dir(FullName) <> "")          ' VBA standard : Dir retourne "" si fichier inexistant
End Function

2 « J'aime »

Je ne t’en veux pas.
L’IA c’est bien mais comprends tu ce qu’elle fait ? :wink:
Les commentaires contiennent parfois des questions car elle ne comprend tout et certains élements me piquent les yeux comme les « On error » qui sont à proscire car il ne permettent pas de localiser les défauts.
Mon code n’est certainement pas exhaustif mais la gestion des erreurs en le gérant me permettra (c’est prévu) d’alerter l’utilisateur en fonction des erreurs.

1 « J'aime »