Macro mise à jour de cartouche sur multi planche

Bonjour à tous et toutes,

j’ai conçu une macro permettant la mise à jour de mon cartouche via un userform que voici.

il récupère les informations existantes dans le cartouche et permet les mise à jour de celui-ci sans devoir faire tous à la main. Cela fonctionne très bien mais si il n’y a qu’un seule planche.

Mon problème réside dans la duplication de ces informations sur une éventuelle 2éme, 3éme etc… planche éventuelle. Sachant que du coup les notes du fond de plan qui sont mise à jour sur la planche 1, n’auront pas le même nom sur les planche ajoutées.

Si quelqu’un à une idée de comment faire je suis preneur. :wink:

Merci

Bonjour,

C’est une volonté de ne pas avoir les mêmes noms d’une page à l’autre?
Si ce n’est pas le cas, le plus simple est d’avoir des propriétés liées à ces notes et ainsi on ne met à jour que les propriétés et ça se déploi tout seul sur les autres folios

Bonjour,

non du tous c’est un constat. En ajoutant une nouvelle planche dans la MEP, les nouvelles notes n’ont pas le même nom. elle se nomme « Objet de détail1137@Fond de plan1 » mais sur la nouvelle planche c’est « Objet de détail1137@Fond de plan3 » le nom de la feuille change. et je n’ai pas réussi à gérer ce paramètres.

Effectivement lié à une propriété serait effectivement plus simple.

Sais tu comment faire cela?

Alors déjà dans un premier temps il faut créer des templates de fond de plan et de mise en plan.
Une fois que c’est fait, les notes du fond de plan qui doivent être liées à la mise en plan en elle-même doivent être écrite de cette façon : §PRP:xxxx (xxxx étant le nom de la propriété)
Avoir exactement les mêmes fond de plan et notes dans tous les formats de page (du A4 au A0 par exemple) ainsi ça simplifie grandement la macro.
Vous auriez également pu faire ça dans l’éditeur de formulaire de propriété plutôt que par une macro je pense.

1 « J'aime »

Ok merci.
le template de fond de plan/MEP j’en ai fait que un pour le moment, mais je ferai les autres ensuite (qu’en ça fonctionnera :wink: ).

Je passe par ici pour « nommer » les notes?
image

J’y ai pensé à l’éditeur de formulaires pour je trouve ça moins « intuitif »

Oui faut passer par « Editer le texte dans la fenêtre » ou tout simplement en faisant un double clique dans la note pour l’éditer (comme une note basique).

ok merci. Cest fait.

image

Comment puis je faire référence à ces propriétés dans mon code?

Re, faut jouer avec les propriétés personnalisées, voir l’exemple à ce lien Get Custom Properties for Configuration Example (VBA) - 2022 - SOLIDWORKS API Help

1 « J'aime »

ok, merci de ton aide je vais creuser ça.

Bonjour,

je suis coincé. :frowning: Dans l’exemple il y a

Set cusPropMgr = config.CustomPropertyManager

ligne qui ne fonctionne que si on lance le code avec une part … moi je suis sur une MEP, du coup la suite code ne peux pas se faire.

Que faire?

Bonjour,
C’est le même principe.
Il faut avoir ces deux déclarations:

    Set swModelDocExt = swModel.Extension
    Set swCustProp = swModelDocExt.CustomPropertyManager("")

2 « J'aime »

Ok, merci, il doit me manquer un truc…

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.DrawingDoc
Dim config As SldWorks.Configuration
Dim swCustProp As SldWorks.CustomPropertyManager
Dim lRetVal As Long
Dim vPropNames As Variant
Dim vPropTypes As Variant
Dim vPropValues As Variant
Dim ValOut As String
Dim ResolvedValOut As String
Dim wasResolved As Boolean
Dim linkToProp As Boolean
Dim resolved As Variant
Dim linkProp As Variant
Dim nNbrProps As Long
Dim j As Long
Dim custPropType As Long
Dim bRet As Boolean

Sub mainTest()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set config = swModel.GetActiveConfiguration

’ Set cusPropMgr = config.CustomPropertyManager

Set swModelDocExt = swModel.Extension
Set swCustProp = swModelDocExt.CustomPropertyManager("")

Bonjour,

Il n’y a pas de configuration dans les mises en plans.
En gros le code serait celui-ci (j’ai prémâché le job en mettant une boucle de traitement pour l’application des modifications)

Dim swApp           As SldWorks.SldWorks
Dim swModel         As SldWorks.ModelDoc2
Dim swModelDocExt   As ModelDocExtension
Dim swCustProp      As CustomPropertyManager
Dim swDraw          As SldWorks.DrawingDoc
Dim bRet            As Boolean
Dim iAddProp        As Integer
Dim lretVal         As Long
Dim sProp(11)       As String
Sub Tableprop()
sProp(0) = "REV1": sProp(1) = "DATE1": sProp(2) = "NOM1": sProp(3) = "MODIF1"
sProp(4) = "REV2": sProp(5) = "DATE2": sProp(6) = "NOM2": sProp(7) = "MODIF2"
sProp(8) = "REV3": sProp(9) = "DATE3": sProp(10) = "NOM3": sProp(11) = "MODIF3"

End Sub
Sub mainTest()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swModelDocExt = swModel.Extension
Set swCustProp = swModelDocExt.CustomPropertyManager("")

Call Tableprop

For i = 0 To UBound(sProp)
    If sProp(i) <> "" Then
        lretVal = swCustProp.Set2(sProp(i), "yyy")
    End If
Next i
End Sub

Faut ajouter du traitement pour récupérer les données du formulaire dans une variable tableau et gérer tous les cas possibles (champs vide, vérification d’un champ déjà mis à jour avec la même valeur…)
Le « yyy » serait par conséquent à remplacer par la variable tableau qui récupère les résultats.

2 « J'aime »

Merci @Cyril.f pour ton aide précieuse, après un peu de recherche et d’obstination j’ai réussit à faire fonctionner le code complet.

je met ci-dessous la partie le code qui met à jour la MEP et récupérer les informations existante dans la MEP.

Dim swApp           As SldWorks.SldWorks
Dim swModel         As SldWorks.ModelDoc2
Dim swModelDocExt   As ModelDocExtension
Dim swCustProp      As CustomPropertyManager
Dim swDraw          As SldWorks.DrawingDoc
Dim bRet            As Boolean
Dim iAddProp        As Integer
Dim lretVal         As Long
Dim sProp(11)       As String
Dim ValeursUsF(11) As String

Sub Tableprop()

sProp(0) = "REV1": sProp(1) = "DATE1": sProp(2) = "NOM1": sProp(3) = "MODIF1"
sProp(4) = "REV2": sProp(5) = "DATE2": sProp(6) = "NOM2": sProp(7) = "MODIF2"
sProp(8) = "REV3": sProp(9) = "DATE3": sProp(10) = "NOM3": sProp(11) = "MODIF3"

End Sub

Sub MajMEP()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swModelDocExt = swModel.Extension
Set swCustProp = swModelDocExt.CustomPropertyManager("")

Call Tableprop
Call TableValeurTableau

For i = 0 To UBound(sProp)
    If sProp(i) <> "" Then
        lretVal = swCustProp.Set2(sProp(i), ValeursUsF(i))
    End If
Next i

End Sub

Sub TableValeurTableau()

'Chaque champs du userform
ValeursUsF(0) = TabRev.Bx0.Value: ValeursUsF(1) = TabRev.Bx1.Value: ValeursUsF(2) = TabRev.Bx2.Value: ValeursUsF(3) = TabRev.Bx3.Value
ValeursUsF(4) = TabRev.Bx4.Value: ValeursUsF(5) = TabRev.Bx5.Value: ValeursUsF(6) = TabRev.Bx6.Value: ValeursUsF(7) = TabRev.Bx7.Value
ValeursUsF(8) = TabRev.Bx8.Value: ValeursUsF(9) = TabRev.Bx9.Value: ValeursUsF(10) = TabRev.Bx10.Value: ValeursUsF(11) = TabRev.Bx11.Value

End Sub

Sub RecupValMEP()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swModelDocExt = swModel.Extension
Set swCustProp = swModelDocExt.CustomPropertyManager("")

Call Tableprop
Call TableValeurTableau

Dim Val As String
Dim resolved As Boolean
Dim Title As String

For i = 0 To UBound(sProp)
    If sProp(i) <> "" Then
        lretVal = swCustProp.Get5(sProp(i), False, ValeursUsF(i), Title, resolved)
    End If
    
Next i

For i = 0 To UBound(ValeursUsF)

TabRev("Bx" & i).Value = ValeursUsF(i)

Next

End Sub
2 « J'aime »

Jolie travail collaboratif.
Et merci pour avoir pensé à joindre la Macro terminée.
Ne reste plus qu’a valider la meilleure réponse, pour clore se sujet. :grinning:
image

2 « J'aime »

Bonjour,

Pas de soucis pour l’aide.
Par contre je pense qu’il faudrait simplifier le code ou tout du moins l’optimiser.
Le fait d’initialiser dans deux procédures différentes la variable swApp pourrait générer un bug.
S’il n’y a pas de sortie de la procédure principale entre la récupération des valeurs et la mise à jour, toute cette partie de code peut être mise dans la procédure principale:

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swDraw = swModel
Set swModelDocExt = swModel.Extension
Set swCustProp = swModelDocExt.CustomPropertyManager("")

Call Tableprop
Call TableValeurTableau

J’ai un peu de mal également à comprendre à quoi sert cette partie du code :

For i = 0 To UBound(sProp)
    If sProp(i) <> "" Then
        lretVal = swCustProp.Get5(sProp(i), False, ValeursUsF(i), Title, resolved)
    End If
    
Next i

Je ne comprend pas bien ce que vous cherchez à faire dans ce bout de code vu que ce n’est pas utilisé par la suite.

Bonjour,

effectivement c’est tout à fait optimisable. Je vais essayer de faire ça. merci

La seconde partie me permet de récupérer les valeurs des propriétés, dans le cas d’un plan déjà renseigner, pour les afficher dans mon userform avec la ligne du code qui suit.

For i = 0 To UBound(ValeursUsF)

TabRev("Bx" & i).Value = ValeursUsF(i)

Next

Ce n’est peux être pas la meilleure méthode mais elle a le mérite de fonctionner. :wink: