VBA - forcer exécution des équations

Bonjour à tous,

Je recherche depuis un moment un bout de code VBA pour solidworks 2024 qui réalise l’opération suivante :
clique sur « outils » → « équations » → « ok » dans la fenêtre des équations, le but étant de forcer l’exécution de mes équations qui ne s’actualise pas correctement avec le rebuild mais bien avec cette méthode, c’est pour l’intégrer dans un code plus vaste déclenché depuis un assemblage de plus au niveau.

D’avance merci si vous avez l’info.
Guillaume.

J’ai ce code qui corespond à une reconstruction profonde (Shift + CTR + Q).
Reconstruction qui n’est pas identique si on lance une fonction VBA traditionnel (vu avec Visiativ).
Là sur SW 2023 cela fonctionnait très bien.

'Lance l'ID pour le racourcis CTRL+SHIFT+Q = reconstruction profonde
Sub ForceRebuildSD()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    If swModel Is Nothing Then
        MsgBox "Aucun document ouvert.", vbExclamation
        Exit Sub
    End If
    
    ' Ctrl+Shift+Q via ID de commande exact (SolidWorks 2023)
    swApp.RunCommand 3311, ""
    
End Sub

Si non fonctionnel possibilité de chercher l’ID de commande exact pour équation puis valider.

Bonjour ;

Les API de Solidworks proposent ceci :

'-----------------------------------------------------
' Preconditions:
' 1. Verify that the specified part to open exists.
' 2. Open the Immediate window.
'
' Postconditions:
' 1. Sets the equation's Automatic solve order option
'    to true, which results in the model's
'    independent equations executing before
'    dependent equations, if any.
' 2. Examine the Immediate window.
'
' NOTE: Because this model is used elsewhere,
' do save changes.
'-----------------------------------------------------
Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swEquationMgr As SldWorks.EquationMgr
Dim fileName As String
Dim errors As Long, warnings As Long

Sub main()

    Set swApp = Application.SldWorks
    fileName = "C:\Users\Public\Documents\SOLIDWORKS\SOLIDWORKS 2018\samples\tutorial\api\partEquations.sldprt"
    Set swModel = swApp.OpenDoc6(fileName, swDocumentTypes_e.swDocPART, swOpenDocOptions_e.swOpenDocOptions_Silent, "", errors, warnings)
    Set swEquationMgr = swModel.GetEquationMgr
    'Make sure that this model includes equations
    'by getting the number of equations
    Debug.Print "Number of equations: " & swEquationMgr.GetCount
        If swEquationMgr.GetCount >= 1 Then
            'Get whether equations are automatically
            'solved in sequence
            Debug.Print "  Are equations automatically solved in sequence? " & swEquationMgr.AutomaticSolveOrder
            If swEquationMgr.AutomaticSolveOrder Then
                Exit Sub
            Else
                'Automatically solve equations in sequence
                swEquationMgr.AutomaticSolveOrder = True
                Debug.Print "  Are equations automatically solved in sequence? " & swEquationMgr.AutomaticSolveOrder
            End If
        Else
            Debug.Print "No equations included with this model."
        End If

End Sub
1 « J'aime »

Merci ! Pour les rebuild j’ai tout tenté mais ça ne fonctionne pas comme je veux. Je reconstruit depuis un assemblage de tête et à un certain niveau d’arborescence ça ne se comporte pas comme je veux. Par contre dès que j’ouvre le module équation de l’élément concerné et valide tout devient correct. Et je cherche a ce que cette opération en soit pas réalisée comme ça mais par un opérateur qui doit utiliser mon configurateur sans ce poser ce genre de questions. Il ne saura même pas forcément identifier les pièces non recalculées. Et quand j’essaie avec l’enregistrement de macro il ne me sort aucun code de mes opérations…

Merci ! je suis en effet tombé sur cette page aussi. Ce n’est pas forcément ce que je recherche mais je réfléchis si je peux utiliser ça de manière détournée. Est-ce que en l’utilisant il va forcément faire exécuter les équations qu’il trouve ? Je n’arrive pas à être sûr.

Sinon voici ci-joint une macro pour connaitre l’ID d’une commande. (Merci CodeStack)
Capturing commands.swp (39,5 Ko)

Il suffit de lancer le main dans Capturing_commands1.
Puis appuyer sur ton menu équation pour découvrir l’ID caché de la fonction ici l’ID=51 pour ton menu (sw2023).
Ensuite tu lances le code pour lancer l’ID dans LancerCommande:

Sub LancerCommande()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    If swModel Is Nothing Then
        MsgBox "Aucun document ouvert.", vbExclamation
        Exit Sub
    End If
    
    ' Ctrl+Shift+Q via ID de commande exact (SolidWorks 2023)
    swApp.RunCommand 51, ""
    
End Sub

Testé sur SW2023, la fenêtre équation s’ouvre et se ferme.

Merci beaucoup pour ton outil. J’avoue ne pas être expert dans le domaine ni être sûr de comprendre ce que je dois faire.
J’ai exécuté ta macro dans ma pièce, ça ouvre bien la fenêtre équation mais cela ne la ferme pas. Et je n’arrive pas récupérer du coup l’ID de l’opération qui clique sur OK.

Effectivement je viens d’essayer de nouveau et la fenêtre n’est pas validé.
Et pas de commande existante pour faire ok…
Tu peux tester cela, en ajoutant:

swApp.RunCommand 961, "" 'A la suite de swApp.RunCommand 51...

Cela fait un ESC (peut-être suffisant pour ton cas car il suffit en général d’ouvrir cette fenêtre pour résoudre ce bug connu des équations (même en faisant annulé, comme ici)

Si c’est pas fonctionnel, teste avec :

DoEvents
SendKeys "~"   ' ENTER = OK

Ne pas tester depuis l’éditeur sinon le enter se fait dans l’éditeur et pas dans la fenêtre SW… Attention solution très moyenne pour la 2nde (mais probablement fonctionnel)

Attention, je ne sais pas si ça le fait chez-vous, mais, pour moi, la commande « SendKeys », en vba, à la fâcheuse habitude de me désactiver la touche Verr-Num (et donc plus de pavé numérique …