Rafraichir le formulaire suite à macro de remplissage

Bonjour,

j’ai une petite macro qui récupère des éléments du nom du fichier .Prt pour compléter le formulaire histoire d’éviter les écarts entre ‹ nom du fichier › et ‹ infos nomenclature › pour une gestion automatisée qui vient ensuite…
Les propriétés se remplissent bien mais le formulaire parait vide. J’ai beau faire F5 ou un reconstruire, rien de se passe


Que puis-je ajouter à la fin de ma macro pour rafraichir le formulaire ?
En gros, il faut réouvir le 3D pour que le formulaire s’affiche correctement, alors qu’a ce moment là, en parallèle, le cartouche du plan de la pièce est complété…

Voici mon code

Dim swApp As Object
Dim swModel As ModelDoc2
Dim config As SldWorks.Configuration
Dim swCustProp As CustomPropertyManager
Dim lRetVal As Long
Dim maValeur0 As String
Dim maValeur1 As String
Dim maValeur2 As String
Dim maValeur3 As String
Dim maValeur4 As String
Dim maValeur5 As String
Dim maValeur6 As String
Dim maValeur7 As String

Sub main()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
maValeur0 = swModel.GetTitle 'On récupère le nom du fichier
maValeur1 = Left(maValeur0, 6) 'On récupère les 6 premiers caractères du nom du fichier'
maValeur2 = Left(maValeur0, 12) 'On récupère les 12 premiers caractères du nom du fichier'
maValeur3 = Right(maValeur2, Len(maValeur2) - Len(maValeur1)) '2 moins 1'
maValeur4 = Right(maValeur0, 7) 'On récupère l'extension'
maValeur5 = Left(maValeur0, 13) 'On récupère les 13 premiers caractères du nom du fichier'
maValeur6 = Right(maValeur0, Len(maValeur0) - Len(maValeur5)) 'On récupére tout au delà du 13éme caractére'
maValeur7 = Left(maValeur6, Len(maValeur6) - Len(maValeur4)) 'on enlève l'extention à 5'
Set config = swModel.GetActiveConfiguration
Set cusPropMgr = config.CustomPropertyManager
lRetVal = cusPropMgr.Add3("N° Plan / Réf / Dim", swCustomInfoType_e.swCustomInfoText, maValeur3, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)
lRetVal = cusPropMgr.Add3("Désignation", swCustomInfoType_e.swCustomInfoText, maValeur7, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)

MsgBox "Formulaire complété" & Path, vbInformation

End Sub`

Bonjour,

Je n’utilise pas le formulaire, mais un Ctrl+Q ne règle pas le problème? (par macro, forcerebuild)

2 « J'aime »

Bonjour.
'+1 pour la reconstruction.
j’ajouterai une ligne d’enregistrement.
swModel.Save3(swSaveAsOptions_Silent, lErrors, lWarnings)

2 « J'aime »

Ctrl+Q (C’est tellement « quitter » chez moi que je n’y pense jamais sur SW!)
ça marche à moitié, ça ne m’affiche que la réf ^^’

Pour le Save… rien de mieux :cry:

Par contre, par hasard, je vois que de passer de la bibliothèque de conception au formulaire, il se recharge complété. Pourquoi un simple reconstruire ne charge pas le formulaire complété par les propriétés ?

CTRL+Q versus F5 :grin: … le F5 sous Solidworks sert à montrer/cacher la barre outils de filtres de sélections… :rofl:
Ceci dit, je me mord les doigts lorsque je fait un CTRL+Q dans un autre logiciel…
Questions :
Votre formulaire est-il actif lorsque vous lancez la macro ?
Utilisez-vous des configurations ? (Si c’est le cas, et que la Reconstruction fait déjà une partie du Job, le pense qu’il faut étendre cette reconstruction à toutes les configs…)
modifiez ForceRebuilt par ForceRebuild3(False)
Correspond à CTRL+SHIFT+Q

Malheureusement même effet pour les 2 « ForceRebuild ». Seul ma réf s’affiche, pas la désignation. Et si ça me demande d’enregistrer le formulaire, ça supprime la désignation dans les propriétés comme si le formulaire devenait maître.

Alors oui le formulaire est toujours actif. Jusque là ça m’allait bien pour gérer les infos dans mes ensembles.
Le désactiver et l’activer fonctionne. Mais pourquoi pas dans ma macro ? grrr

Alors oui, peut être une mise à jour des configs. Mais dans cette pièce de test j’ai que la défaut.

La macro n’agit par sur le formulaire mais bien sur les propriété. Peut être est-il possible de l’ouvrir fermé via les API?

Surement,
mais là ! Dejà que je suis loin d’être un As en macro.

J’imagine que vous n’avez pas la suite Mycad avec Smartproperties…cela résoudrai pas mal de vos ennuis.

3 « J'aime »

a essayer dans votre macro:

swApp.ActivateTaskPane swDesignLibrary

[votre macro]

swApp.ActivateTaskPane swCustomProps

→ En gros on simule un changement dans le panneau des TaskPane (onglets à droite de Solidworks)

Dim swApp As Object
Dim swModel As ModelDoc2
Dim config As SldWorks.Configuration
Dim swCustProp As CustomPropertyManager
Dim lRetVal As Long
Dim maValeur0 As String
Dim maValeur1 As String
Dim maValeur2 As String
Dim maValeur3 As String
Dim maValeur4 As String
Dim maValeur5 As String
Dim maValeur6 As String
Dim maValeur7 As String

Sub main()

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

swApp.ActivateTaskPane swDesignLibrary

maValeur0 = swModel.GetTitle 'On récupère le nom du fichier
maValeur1 = Left(maValeur0, 6) 'On récupère les 6 premiers caractères du nom du fichier'
maValeur2 = Left(maValeur0, 12) 'On récupère les 12 premiers caractères du nom du fichier'
maValeur3 = Right(maValeur2, Len(maValeur2) - Len(maValeur1)) '2 moins 1'
maValeur4 = Right(maValeur0, 7) 'On récupère l'extension'
maValeur5 = Left(maValeur0, 13) 'On récupère les 13 premiers caractères du nom du fichier'
maValeur6 = Right(maValeur0, Len(maValeur0) - Len(maValeur5)) 'On récupére tout au delà du 13éme caractére'
maValeur7 = Left(maValeur6, Len(maValeur6) - Len(maValeur4)) 'on enlève l'extention à 5'
Set config = swModel.GetActiveConfiguration
Set cusPropMgr = config.CustomPropertyManager
lRetVal = cusPropMgr.Add3("N° Plan / Réf / Dim", swCustomInfoType_e.swCustomInfoText, maValeur3, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)
lRetVal = cusPropMgr.Add3("Désignation", swCustomInfoType_e.swCustomInfoText, maValeur7, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)

swApp.ActivateTaskPane swCustomProps

MsgBox "Formulaire complété" & Path, vbInformation

End Sub`
1 « J'aime »

Je pense que @Maclane tient la vérité ou tout au moins s’en approche à tester!
Sinon j’ai trouvé ça qui s’en approche également, sur un forum allemand:

Sub main()
    Dim swApp              As SldWorks.SldWorks
    Dim swModel            As SldWorks.ModelDoc2
   
    'Auf SW zugreifen
    Set swApp = Application.SldWorks
   
    'An aktives Dokument anklinken
    Set swModel = swApp.ActiveDoc
    swModel.CustomInfo("FTL-Besch") = "Hallo"
   
    'Wechsel auf "SOLIDWORKS Ressourcen "
    swApp.ActivateTaskPane (3) '(swTaskPaneTab_e.swResources)
    'Wechsel auf "Benutzerdefinierte Eigenschaften"
    swApp.ActivateTaskPane (5) '(swTaskPaneTab_e.swCustomProps)
End Sub

Source:
https://ww3.cad.de/foren/ubb/Forum2/HTML/033024.shtml
Edit l’aide SW:
https://help.solidworks.com/2024/English/api/swconst/SolidWorks.Interop.swconst~SolidWorks.Interop.swconst.swTaskPaneTab_e.html?id=2e29ce3

1 « J'aime »

Bonjour à tous,

La solution de @sbadenis marche au poil.
Un grand merci à vous tous pour votre aide.

Voici mon code final, si ça peu aider quelqu’un

Dim swApp As Object
Dim swModel As ModelDoc2
Dim config As SldWorks.Configuration
Dim swCustProp As CustomPropertyManager
Dim lRetVal As Long
Dim maValeur0 As String
Dim maValeur1 As String
Dim maValeur2 As String
Dim maValeur3 As String
Dim maValeur4 As String
Dim maValeur5 As String
Dim maValeur6 As String
Dim maValeur7 As String

Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    maValeur0 = swModel.GetTitle 'On récupère le nom du fichier
    maValeur1 = Left(maValeur0, 6) 'On récupère les 6 premiers caractères du nom du fichier'
    maValeur2 = Left(maValeur0, 12) 'On récupère les 12 premiers caractères du nom du fichier'
    maValeur3 = Right(maValeur2, Len(maValeur2) - Len(maValeur1)) '2 moins 1'
    maValeur4 = Right(maValeur0, 7) 'On récupère l'extension'
    maValeur5 = Left(maValeur0, 13) 'On récupère les 13 premiers caractères du nom du fichier'
    maValeur6 = Right(maValeur0, Len(maValeur0) - Len(maValeur5)) 'On récupére tout au delà du 13éme caractére'
    maValeur7 = Left(maValeur6, Len(maValeur6) - Len(maValeur4)) 'on enlève l'extention à 5'
    Set config = swModel.GetActiveConfiguration
    Set cusPropMgr = config.CustomPropertyManager
    lRetVal = cusPropMgr.Add3("N° Plan / Réf / Dim", swCustomInfoType_e.swCustomInfoText, maValeur3, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)
    lRetVal = cusPropMgr.Add3("Désignation", swCustomInfoType_e.swCustomInfoText, maValeur7, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)

swModel.CustomInfo("FTL-Besch") = "Hallo"
swApp.ActivateTaskPane (3)
swApp.ActivateTaskPane (5)
    
    MsgBox "Formulaire complété" & Path, vbInformation

End Sub

Pas sûr que cette ligne soit utile, elle doit te rajouter une propriété FTL-Bessh avec « Hallo » comme valeure:

swModel.CustomInfo("FTL-Besch") = "Hallo"

Tu peux remercier @Maclane sans qui je n’aurait jamais trouvé cette solution.

2 « J'aime »

Argg!, j’y étais presque ! :grin:
Bon boulot @sbadenis :stuck_out_tongue:

1 « J'aime »

Effectivement,
sans ```
swModel.CustomInfo(« FTL-Besch ») = « Hallo »

ça marche tout pareil.

Encore merci à tous !
1 « J'aime »

Et pour finir, une petite sauvegarde à la fin ça mange pas de pain.

Je combine souvent un peu au pif j’avoue. C’est peut être pas optimal, mais ça marche !

Dim swApp As Object
Dim part As Object
Dim swModel As ModelDoc2
Dim config As SldWorks.Configuration
Dim swCustProp As CustomPropertyManager
Dim lRetVal As Long
Dim maValeur0 As String
Dim maValeur1 As String
Dim maValeur2 As String
Dim maValeur3 As String
Dim maValeur4 As String
Dim maValeur5 As String
Dim maValeur6 As String
Dim maValeur7 As String




Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    maValeur0 = swModel.GetTitle 'On récupère le nom du fichier
    maValeur1 = Left(maValeur0, 6) 'On récupère les 6 premiers caractères du nom du fichier'
    maValeur2 = Left(maValeur0, 12) 'On récupère les 12 premiers caractères du nom du fichier'
    maValeur3 = Right(maValeur2, Len(maValeur2) - Len(maValeur1)) '2 moins 1'
    maValeur4 = Right(maValeur0, 7) 'On récupère l'extension'
    maValeur5 = Left(maValeur0, 13) 'On récupère les 13 premiers caractères du nom du fichier'
    maValeur6 = Right(maValeur0, Len(maValeur0) - Len(maValeur5)) 'On récupére tout au delà du 13éme caractére'
    maValeur7 = Left(maValeur6, Len(maValeur6) - Len(maValeur4)) 'on enlève l'extention à 5'
    Set config = swModel.GetActiveConfiguration
    Set cusPropMgr = config.CustomPropertyManager
    lRetVal = cusPropMgr.Add3("N° Plan / Réf / Dim", swCustomInfoType_e.swCustomInfoText, maValeur3, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)
    lRetVal = cusPropMgr.Add3("Désignation", swCustomInfoType_e.swCustomInfoText, maValeur7, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)

swApp.ActivateTaskPane (3)
swApp.ActivateTaskPane (5)

Set part = swApp.ActiveDoc
Dim swErrors As Long
Dim swWarnings As Long
boolstatus = part.Save3(1, swErrors, swWarnings)

    MsgBox "Formulaire complété" & Path, vbInformation

End Sub
1 « J'aime »

Bonjour à tous et particulièrement @Maclane qui m’avait bien débloqué.
j’étais arrivé à avoir quelque chose qui marche super bien, et depuis hier, ça ne marche plus.
J’avais bidouillé car finalement je ne gère plus de config qui me posaient problème par ailleurs.
j’ai codé ceci :
Maintenant ça m’efface le type de ma propriété « texte » et ne rempli plus la valeur.

Dim swApp As Object
Dim part As Object
Dim swModel As ModelDoc2
Dim swCustProp As CustomPropertyManager
Dim lRetVal As Long
Dim maValeur0 As String
Dim maValeur1 As String
Dim maValeur2 As String
Dim maValeur3 As String
Dim maValeur4 As String
Dim maValeur5 As String
Dim maValeur6 As String
Dim maValeur7 As String

Sub main()

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

maValeur0 = swModel.GetTitle 'On récupère le nom du fichier
maValeur1 = Left(maValeur0, 6) 'On récupère les 6 premiers caractères du nom du fichier'
maValeur2 = Left(maValeur0, 12) 'On récupère les 12 premiers caractères du nom du fichier'
maValeur3 = Right(maValeur2, Len(maValeur2) - Len(maValeur1)) '2 moins 1'
maValeur4 = Right(maValeur0, 7) 'On récupère l'extension'
maValeur5 = Left(maValeur0, 13) 'On récupère les 13 premiers caractères du nom du fichier'
maValeur6 = Right(maValeur0, Len(maValeur0) - Len(maValeur5)) 'On récupére tout au delà du 13éme caractére'
maValeur7 = Left(maValeur6, Len(maValeur6) - Len(maValeur4)) 'on enlève l'extention à 5'
    
   
lRetVal = swModel.DeleteCustomInfo("N° Plan / Réf / Dim")
lRetVal = swModel.AddCustomInfo3("", "N° Plan / Réf / Dim", PropertyManagerPage, maValeur3)
lRetVal = swModel.DeleteCustomInfo("Désignation")
lRetVal = swModel.AddCustomInfo3("", "Désignation", PropertyManagerPage, maValeur7)


'swApp.ActivateTaskPane (3)
'swApp.ActivateTaskPane (5)

Set part = swApp.ActiveDoc
Dim swErrors As Long
Dim swWarnings As Long
boolstatus = part.Save3(1, swErrors, swWarnings)

    MsgBox "NOM : " + maValeur7 + " - N° :" + maValeur3 + " - Enregistré" & Path, vbInformation

End Sub

Bonjour,

Je pense que c’est là que ça pêche : lRetVal = swModel.AddCustomInfo3("", "N° Plan / Réf / Dim", PropertyManagerPage, maValeur3)

AddCustomInfo3 doit être paramétré ainsi :

value = instance.AddCustomInfo3(Configuration, FieldName, FieldType, FieldValue)

Je pense donc que c’est FiledType qui est mal renseigné… A la place de PorpertyManagerPage, mettre swCustomInfoType_e.swCustomInfoText

2 « J'aime »

D’ailleurs toutes vos lignes AddCustominfo3 sont à reprendre…
=> Voir réponse de @Cyril.f mais aussi les versions précédentes de la macro…
https://help.solidworks.com/2022/english/api/sldworksapi/SOLIDWORKS.Interop.sldworks~SOLIDWORKS.Interop.sldworks.IModelDoc2~AddCustomInfo3.html

Pour aller plus loin :
AddCustominfo3 est considéré comme obsolete (version solidworks 2022 et +)
A remplacer par Add3
Ce qui donne:
value = instance.Add3(FieldName, FieldType, FieldValue, OverwriteExisting)
https://help.solidworks.com/2022/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.icustompropertymanager~add3.html

1 « J'aime »

Bon… en tout cas, dans un premier temps, juste en faisant le petit remplacement proposé par @Cyril.f, tout roule.

J’irais plus en profondeur à tête reposée. Je perds des neurones en grande quantité quand je me lance là dedans.

Vous êtes au top !
Merci.