Exécuter une macro lors d'un enregistrement

Bonjour j’utilise cette macro pour mettre afficher le titre d’un document Solidworks dans windows explorer. je voulais savoir s’il était possible d’actionner la macro lors de chaque enregistrement (sans intervention de l’utilisateur) ? d’après ce que j’ai compris, un add-in serait la meilleure solution, mais vu que je galère avec VS Studio, je cherche une alternative. Merci

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim propMgr As CustomPropertyManager
Dim titleValue As String
Dim resolved As String
Dim wasResolved As Boolean

Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    If swModel Is Nothing Then
        MsgBox "No document is open!"
        Exit Sub
    End If

    ' Access the custom property manager
    Set propMgr = swModel.Extension.CustomPropertyManager("")

    ' Read current value of custom property "Title"
    wasResolved = propMgr.Get4("Title", False, resolved, titleValue)
    
    If titleValue = "" Then
        MsgBox "Custom property 'Title' is empty!"
        Exit Sub
    End If

    ' Copy to Summary Info Title
    swModel.SummaryInfo(swSumInfoTitle) = titleValue

    ' Optional: read back to verify
    MsgBox "Summary Info Title set to: " & swModel.SummaryInfo(swSumInfoTitle)
End Sub

Bonjour et bienvenue;

Qu’entend-tu exactement par:

Ce n’est pas très clair…

Et il manques quelques information essentielles :
La Version de Solidworks
L’étendue de la macro (tous les documents Solidworks, que les pièces, les pièces et les assemblages, les mises en plan …?)

Ce que je comprend:
Dans ta macro tu extrait la valeur de la propriété personnalisée « Title » d’un document SolidWorks ouvert, puis place cette valeur dans le champ Title des informations sommaires du document, vérifiant les erreurs d’absence de document ou propriété vide.

(Nota : je te conseil de ne pas utiliser plusieurs fois la même propriété (le Nom de la propriété) pour des variables différentes … (ici « Title » pour les Propriétés Personnalisés et « Title » pour les propriété du Sommaire Windows (onglet : Récapitulatif dans le résumé information du document Solidworks)

Je te propose d’adapter ta macro pour qu’elle travaille sur tous les fichiers d’un repertoire donné:

A toi de modifier la valeur dans:
folderPath = "C:\Chemin\Vers\Le\Dossier"

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim propMgr As CustomPropertyManager
Dim titleValue As String
Dim resolved As String
Dim wasResolved As Boolean
Dim filePath As String
Dim folderPath As String

Sub main()
    Set swApp = Application.SldWorks

    ' Modifier ici pour mettre le chemin du dossier
    folderPath = "C:\Chemin\Vers\Le\Dossier\"
    
    filePath = Dir(folderPath & "*.sld*") ' Trouve les fichiers .sldprt, .sldasm, .slddrw

    Do While filePath <> ""
        ' Ouvre le document
        Set swModel = swApp.OpenDoc6(folderPath & filePath, _
                                     GetDocType(folderPath & filePath), _
                                     0, "", 0, 0)

        If Not swModel Is Nothing Then

            Set propMgr = swModel.Extension.CustomPropertyManager("")
            wasResolved = propMgr.Get4("Title", False, resolved, titleValue)

            If titleValue <> "" Then
                swModel.SummaryInfo(swSumInfoTitle) = titleValue
                swModel.Save
            End If

            swApp.CloseDoc swModel.GetTitle
        Else
            MsgBox "Impossible d'ouvrir : " & filePath
        End If

        filePath = Dir() ' Passe au fichier suivant
    Loop

    MsgBox "Traitement terminé."
End Sub

' Fonction utilitaire pour déterminer le type de document selon l'extension
Function GetDocType(fileName As String) As Long
    Dim ext As String
    ext = LCase$(Mid$(fileName, InStrRev(fileName, ".") + 1))
    Select Case ext
        Case "sldprt"
            GetDocType = 1 ' pièce
        Case "sldasm"
            GetDocType = 2 ' assemblage
        Case "slddrw"
            GetDocType = 3 ' mise en plan
        Case Else
            GetDocType = 0 ' inconnu
    End Select
End Function

Sinon le sujet a déjà été abordé ici:

Mais c’est s’embêter pour pas grand chose:
=> Il est possible d’utiliser le gestionnaire de propriété de Solidworks pour dupliquer une variable vers les info Résumé.
https://help.solidworks.com/2022/french/SolidWorks/sldworks/HelpViewerDS.aspx?version=2022&prod=SolidWorks&lang=french&path=sldworks%2Fc_file_properties.htm&id=5fb9c079433c46d7961143b30be81132

=> c’est plus simple avec les outils MyCadTools de Type Smartproperties ou en poste traitement avec l’outils Integration ou batchProperties.

1 « J'aime »

Bonjour, merci pour la réponse et les liens (très utiles).

Mon objectif c’est n’est pas d’executer la macro à chaque enregistrement de pièce (assemblage, part ou drawing) mais plutôt de récupérer la valeur de la propriété nommée Title et l’afficher sur windows explorer comme sur cette capture à chaque enregistrement d’où la remarque sur le fait que la macro ne soit pas la meilleure solution dans ce cas puisqu’il faut l’éxecuter à chaque fois.

sur Windows Explorer

et sur SolidWorks

J’utilise SW 23 et SW24, j’espère bientôt investir sur une version SW25

Est ce possible par exemple de lancer automatiquement la macro, lors d’un enregistrement (assemblage, drawing ou pièce) sans intervention de l’utilisateur ? Il me semble que cela soit possible avec les add-ins mais pas sûr pour les macros VBA.

Bonjour,
C’est possible avec vba mais faut modifier le raccourcis lançant SW pour que la macro s’exécute une fois SW ouvert.
On peut ainsi intercepter les actions dans SW mais faut bien bétonner le code et ses portes de sorties pour pas se retrouver avec des comportement bloquant l’utilisation.
Autre solution, créer une macro d’enregistrement qui se substitue à l’icône d’enregistrement de SW et lui mettre le raccourcis Ctrl+S comme ça totalement transparent pour l’utilisateur.

2 « J'aime »

Bonjour merci pour la réponse.

J’ai essayé les deux méthodes et elles marchent toutes super bien.

Juste une dernière question, j’aimerai bien essayer de créer l’add-in en utilisant VS. J’ai le code, créer le dll mais l’add-in n’est pas affiché sur SolidWorks.

Bonjour ;
Il faut probablement charger l’add-in via les compléments Solidworks.
Utiliser la méthode ISldWorks ::LoadAddIn en passant le nom de l’add-in
puis
Après avoir chargé l’add-in, utilisez ISldWorks ::GetAddInObject

pour une documentation plus globale sur la création d’add-in :

il devrait maintenant être accessible depuis :
image

Si le code est bien réalisé, il devrait être accessible ici :
image

Serait-il possible de nous fournir le code réalisé ?

Merci pour les documents.

J’ai essayé de refaire Creating VB.NET add-in for SOLIDWORKS using API mais j’ai juste SolidWorks qui est ouvert lorsque je lance le code sans le Hello World et l’add-in n’est pas présent dans le menu compléments.

Bonjour ;

Extrait de l’aide Solidworks :

Que doit faire le complément ?

La DLL de complément doit être créée en tant que serveur COM et doit :

  1. Implémentez un objet co-créable qui prend en charge SwAddin.
  2. Lors de l’appel d’installation :

Enregistrez le CLSID du complément dans HKEY_LOCAL_MACHINE\SOFTWARE\SOLIDWORKS\AddIns et définissez les clés de registre suivantes :

  • La valeur par défaut est 1 ou 0, où 1 active le complément dans le gestionnaire de compléments afin qu’il se charge lorsque l’utilisateur démarre le logiciel SOLIDWORKS.
  • Description à une description textuelle du complément qui s’affiche dans le gestionnaire de compléments.
  • Titre d’un titre textuel de la description affichée dans le gestionnaire de compléments.
  1. Définissez des gestionnaires d’événements selon vos besoins.

Dans son implémentation de ISwAddin ::ConnectToSW, le complément peut :

  1. Appelez ISldWorks ::SetAddinCallbackInfo et transmettez le handle d’instance du complément et l’objet qui prend en charge les méthodes de rappel. Le logiciel SOLIDWORKS conserve cet objet et effectue des rappels.
  2. Appelez ISldWorks ::AddMenuItem3 et passez la méthode de rappel associée à l’élément de menu.
  3. Appelez ISldWorks ::AddToolbar4 et passez la méthode de rappel associée au bouton de la barre d’outils.

On en parle ici aussi :

et un autre exemple de code ici :

Dans cet exemple, la ligne qui t’intéresse est la création de la clef dans le base de registre pour l’identification de l’add-in dans le menu Solidworks :
dim keyname As String = « SOFTWARE\SolidWorks\Addins{ » + t.GUID. ToString() + « } »

Mais sans ton code, je suis en train de te fournir des documents en vrac sans contexte.

Faut surtout avoir le droit de modifier la base de registre.

2 « J'aime »

En effet, si on a les droits pour modifier le registre alors l’add-in créé avec le tuto de SW s’affiche sans rien toucher d’autre

Bonjour merci pour vos réponses.

En démarrant le code, j’ai reçu cette erreur : Une erreur s’est produite lors de l’écriture des informations d’inscription dans le Registre. Les droits d’administrateur sont requis pour utiliser les options sélectionnées. Utilisez une invite de commandes administrateur pour effectuer ces tâches. Là j’ouvre VS en mode administrateur mais ça marche toujours pas