Macro Equation

Bonjour,

 

Je souhaite pouvoir modifier la valeur de variables globales dans des équations. (Comme montré en pièce jointe)

Je sais en rajouté par cette méthode:

Dim swEquationMgr As Object

Set swEquationMgr = swModel.GetEquationMgr

swEquationMgr.Add -1, """Mass [kg]""= ""SW-Mass""/100"

Comment en modifier une déjà crée?

 

Merci


capture_equation.png

Bonjour,

 

Voici un exemple issu de l'aide VBA de SolidWorks :

 

    'Modify dimension equation at index, 1, in all configurations
    longEquation = swEquationMgr.SetEquationAndConfigurationOption(1, """D1@Boss-Extrude1"" = 0.07", swAllConfiguration, Empty)
    If longEquation <> 1 Then ErrorMsg SwApp, "Failed to modify a dimension equation"

 

 

http://help.solidworks.com/2014/english/api/sldworksapi/Add_Equations_Example_VB.htm

1 « J'aime »

Et une question sur ce sujet sur les formum SolidWorks en parle, il utilise un split pour séparer l'équation en 2 :

 

  For i = 0 To swEqnMgr.GetCount - 1

        vSplit = Split(swEqnMgr.Equation(i), " = ")

        vSplit(0) = Replace(vSplit(0), Chr(34), Empty)

        If vSplit(0) = VARIABLE_NAME Then _

            swEqnMgr.Equation(i) = Replace(swEqnMgr.Equation(i), vSplit(1), NEW_VALUE)

    Next i

 

 

https://forum.solidworks.com/thread/72501

1 « J'aime »

 

+1 @Lucas Prieur

Voir interface EquationMgr pour avoir les methodes de l'interface

 

http://help.solidworks.com/2014/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IEquationMgr_members.html?id=4ca69bcb18484952864592709e47c43e#Pg0

 

6 « J'aime »

Juste pour ma culture perso...

 

Je ne comprends pas trop ce que Jean bapt veut dire par modifier les valeurs?

 

Si je clique sur l'une des valeurs, je peux la changer à ma guise...

 

J'aimerai juste comprendre cette question et son but =) (pourquoi faire du vba etc...)

 

Comme je n'ai aucune base en API, je pense que mon incompréhension vient de là..^^

 

Merci à vous !

1 « J'aime »

@Bart : soit il a à modifier en masse plusieurs fichiers, soit sa valeur globale change en fonctions d'autres paramètres internes à la pièce ou l'assemblage ou en fonction d'une liste externe (fichier Excel par exemple).

Mon objectif est d'assembler des pièces dans un assemblage et d'en définir la hauteur la largeur, longueur et l'épaisseur lors de l'importation .

C'est la meilleur solution que j'ai trouvé.

 

C'est à dire que sur un Userform je fais saisir toutes ces données et je les modifie dans les équations.

Oui, c'est la question que j'avais posé il y à quelques mois, sauf que je n'ai pas eu de réponse claire^^

 

Je comprends mieu.

 

Moi j'ai fait un assmeblage, et dedans j'ai mis toutes mes équations qui intéragissent dans les pièces.

 

Le seul truc, c'est que je dois cliquer sur les côtes pour les modifier... Et le reste suit, mais on, un useform serait + approprié je pense.

Je suis sous 2012 et il y a des fonction que SW ne connais pas.

 

Comme SetEquationAndConfigurationOption par exemple

 

Dans :

'Modify dimension equation at index, 1, in all configurations
longEquation = swEquationMgr.SetEquationAndConfigurationOption(1, """Hauteur"" = 50", swAllConfiguration, Empty)
If longEquation <> 1 Then ErrorMsg SwApp, "Failed to modify a dimension equation"

 

Ce lien n'est vraiment pas claire...

http://help.solidworks.com/2012/English/api/sldworksapi/Add_Equation_And_Evaluate_All_Example_VB.htm

 

J'arrive à ce code qui ne fonctionne pas.

 

Sub Test()

Dim swApp           As SldWorks.SldWorks

Dim Part            As SldWorks.ModelDoc2

Dim swModel As SldWorks.ModelDoc2

Dim swEquationMgr   As SldWorks.EquationMgr

Dim i As Integer

Dim vSplit As Variant

Const VARIABLE_NAME As String = "Hauteur"

Const NEW_VALUE As String = "50"

 

Set swApp = Application.SldWorks

Set swModel = swApp.ActiveDoc

Set swEquationMgr = swModel.GetEquationMgr

 

 For i = 0 To swEquationMgr.GetCount - 1

        vSplit = Split(swEquationMgr.Equation(i), " = ")

        vSplit(0) = Replace(vSplit(0), Chr(34), Empty)

        If vSplit(0) = VARIABLE_NAME Then _

            swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), vSplit(1), NEW_VALUE)

    Next i

End Sub

 

merci de votre aide

 

JB

Bonjour

je ne connais pas Sw, je travaille sous inventr

 

Pourquoi ne pas passer par une feuille excel qui va calculer les dimensions et SW n'aura plus qu'à ce mettre à jour.

 

Je ne vois pas l'interet de passer par des macros ( sauf si on n'à pas excel).

 

Je parametre des escaliers complets dans des feuilles excel et chaque pièce d'inventor ce met à jour avec cette feuille.

 

Merci

1 « J'aime »

A quelle ligne rencontres-tu une erreur ?

Franck:

Rajouter la saisie d'une feuille excel rendrait plus complexe le système et je ne souhaite pas l'alourdir.

Tous ce fait à partir d'un Userform pour que se soit plus interactif.

 

Le truc c'est qu'il n'y a pas de bug, la macro se réalise et rien ne change...

Essaye d'enlever le _ de la ligne :

If vSplit(0) = VARIABLE_NAME Then _

 

et met 

 

swEqnMgr.Equation(i) = Replace(swEqnMgr.Equation(i), vSplit(1), NEW_VALUE)

 

à la ligne suivante, suivi d'un "End if"

 

Puis met un point d'arrêt à cette ligne

swEqnMgr.Equation(i) = Replace(swEqnMgr.Equation(i), vSplit(1), NEW_VALUE)

 

Est-ce que ta macro s'arrête ?

 

Sinon, il faut passer en revue toutes les valeurs de ton vSplit(0) par exemple avec un debug.print ou plus bourrin un msgbox !

Alors cela fonction au petit bonheur la chance...

 

J'ai remarqué que lors ce que je vais dans la gestion des équations, si la cellule activé est par exemple : =90 de la hauteur. Je met OK pour fermer la boite.

 

Je lance la macro et j'obtien dans ma msgbox:

Hauteur  (donc ce qui est recherché)

et Longueur = 70

Largeur = 95

...

(exemple sur l'image jointe)

Si c'est le =70 de Longueur j'obtiens Hauteur = 90 et  Longueur

 

 

Code actuelle:

Const VARIABLENAME As String = "Hauteur"
Const NEW_VALUE As String = "70"

 

    For i = 0 To swEquationMgr.GetCount - 1
        vSplit = Split(swEquationMgr.Equation(i), " = ")
        vSplit(0) = Replace(vSplit(0), Chr(34), Empty)
        
        MsgBox vSplit(0)
        If vSplit(0) = VARIABLENAME Then
            swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), vSplit(1), NEW_VALUE)
        End If
    Next i


capture.png

Peut-être un problème de syntaxe ?

 

Essaye un lcase (lowercaser = minuscule) ou ucase (uppercase = majuscule) pour tes deux variables, soit

 

VARIABLENAME et vSplit(1).

 

Et tu peux mettre un else à ton if pour y mettre un point d'arrêt et voir dans quel cas cela ne fonctionne pas.

Je n'ai pas bien compris comment écrire le code...

Comme ça?

VARIABLENAME = LCase(lowercaser = minuscule)

 

J'ai trié le nom de vSplit(0) en Nom_eq afin d'avoir Hauteur et non Hauteur = 90

Voici mon code

NB = Len(VARIABLENAME)

 

For i = 0 To swEquationMgr.GetCount - 1

    vSplit = Split(swEquationMgr.Equation(i), " = ")

    MsgBox vSplit(0)

    vSplit(0) = Replace(vSplit(0), Chr(34), Empty)

    Nom_eq = Left(vSplit(0), NB)

 

    If Nom_eq = VARIABLENAME Then

        swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), vSplit(1), NEW_VALUE)

        'MsgBox vSplit(1)

    Else

    End If

Next i

 

Mais j'ai un bug qui s'affiche à la ligne

swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), vSplit(1), NEW_VALUE)

(pièce jointe)

 

JB


capture2.png

Bonjour à tous.

 

message1/2 :

Un rien dans une macro peut la rendre inutilisable ! JB, j'ai regardé ta macro et le grain de sable est dans le bout de code [vSplit=Split(swEqua.equation(i), " = ")] et plus particulièrement dans [" = "].

Explication : Les équations d'un modèle SW sont des chaines de caractères alphanumériques, et, comme toutes chaines de caractères, elles peuvent être manipulées par des fonctions VBA présentent dans Word, Excel, Access, .... et SW.

Pour ton code la fonction Split ( scinder in english ) va prendre le contenu de la ième équation [swEqua.equation(i)], le scinder en deux au niveau de [" = "], puis comme vSplit est un Variant, vSplit(0) va être automatiquement affecté de ce qui se trouve à gauche de [" = "] et vSplit(1), lui, sera automatiquement affecté de ce qui se trouve à droite de [" = "].

C'est pour [" = "] que le bas blesse, car, une équation SW peut être ""D1@Ext"=50+20" aussi bien que ""D1@Ext" = 50 + 20" ou ""D1@Ext"    =    50    +    20". Je rédige ce mot avec un traitement de texte et lors de son utilisation, je demande toujours l'affichage des caractères non imprimables. Cela me permet non seulement de voir mais aussi de compter les quatre espaces de chaque coté du signe égal de l'écriture de la dernière équation (celle ci-avant). SW, lui se fiche ou plutôt gère ces espaces superflus ou non présent. Conclusion, le manipulateur peut ajouter une équation en y laissant des crottes ( double, triple espaces ) mais il faudra faire avec, et surtout, prendre en compte cet épineux problème dans ta programmation (ton code). Dans un autre message mon code revu, étoffé et commenté sous forme d'une Sub (fonction) de nom 'ChangerValeurDeVariableDansEquaEtReconstruirePièce' que tu appelle ici d'une autre Sub de nom 'essai01'. La fonction 'ChangerValeurDeVariableDansEquaEtReconstruirePièce' demande deux arguments que j'ai nommé 'NomVar' et 'ValVar'.

Nota : je joins dans un autre message une pièce d'essai à ouvrir (elle contient les dimensions "D1@Ext" et "D1@Esq".

 

A+

1 « J'aime »

Rebonjour, voici mon code et la pièce d'essai en exemple

 

 

Sub essai01()

  ChangerValeurDeVariableDansEquaEtReconstruirePièce "D1@Ext", "80"

  ChangerValeurDeVariableDansEquaEtReconstruirePièce "D1@Esq", "44.6"

End Sub

 

Sub ChangerValeurDeVariableDansEquaEtReconstruirePièce(NomVar As String, ValVar As String)

 'Remarque : une équation est une chaîne de caractère alphanumérique est se traite comme telle avec les fonctions usuelles du VBA.

 'Déclaration Objets *****************************

  Dim swApp As SldWorks.SldWorks

  Dim swModel As SldWorks.ModelDoc2

  Dim swEquaMgr As SldWorks.EquationMgr

 

 'Affectation Objets *****************************

  Set swApp = Application.SldWorks    ' swApp est maintenant un objet contenant l'application SW.

  Set swModel = swApp.ActiveDoc       ' SwModel est maintenant un objet contenant le modèle actif (pièce ou assemblage) SW.

  Set swEqua = swModel.GetEquationMgr ' swEquaMgr est maintenant un objet contenant l'ensemble des équations du modèle présent dans feature manager.

 

 'Déclaration Variables Locales ******************

  Dim NumEqua As Integer 'NumEqua est le Numéro del'équation

  Dim NbEqua As Integer  'NbEqua est le Nombre d'Equations. Si NbEqua=0 alors il existe une équation, si NbEqua=1 alors il existe 2 équation, si NbEqua= -1 alors il n'existe pas d'équation.

  Dim ChScind As Variant 'ChScind est une chaine Scindée.

  Const Titre01 As String = "Constat   (MC)"

 'Affectation Variables

  NbEqua = swEqua.GetCount - 1

 

 'Procédure  ************************************

    For NumEqua = 0 To NbEqua 'Pour NumEqua allant de 0 à NbEqua (par pas de 1 par défaut)

         ChScind = Split(swEqua.equation(NumEqua), "=") 'ChScind(0) contient maintenant la partie de l'équation située à gauche du signe "=". ChScind(1) contient maintenant la partie de l'équation située à droite du signe "="

         ChScind(0) = Replace(ChScind(0), Chr(34), Empty) 'Remplacement systématique du premier et dernier caractère de Scind(0) (ayant le numéro ascii 34) par rien (empty), autant dit on supprime tout les chr(34) ["] de Scind(0) (c'est un formatage conditionnant le test suivant).

         ChScind(0) = Replace(ChScind(0), Chr(32), Empty) 'Remplacement systématique des caractère de Scind(0) (ayant le numéro ascii 32) par rien (empty), autant dit on supprime tout les espaces [" "] de Scind(0) (c'est un formatage conditionnant le test suivant).

         If ChScind(0) = NomVar Then

             swEqua.equation(NumEqua) = Replace(swEqua.equation(NumEqua), ChScind(1), ValVar)

             If swModel.EditRebuild3() Then 'si la reconstruction de la pièce renvoit vrai alors

                 MsgBox "Pièce reconstruite avec nouvelle valeur dans équation !", vbInformation, Titre01

              Else 'sinon

                 MsgBox "Equation modifiée mais erreur de reconstruction pièce !", vbInformation, Titre01

             End If 'fin de si

             Exit Sub ' quitter cette Sub

         End If

    Next NumEqua 'prochain NumEqua

   

    If NbEqua = -1 Then

        MsgBox "Aucune équation n'est associée au modèle !", vbExclamation, Titre01

    Else

        MsgBox "Aucune modification d'équation possible !" & Chr$(13) & Chr$(13) & "'" & NomVar & "'" & " n'a était trouvé dans aucune d'elles.", vbExclamation, Titre01

    End If

   

End Sub 'fin de sub

 

A+


part_essai01.sldprt
1 « J'aime »

Bonjour Maxime,

 

Ton programme fonctionne très bien!

Ce que je souhaite faire est plus de modifier les variables pour alléger les modifications (pièce jointe)

Entre temps j'ai réussit à faire fonctionner mon code:

 

Sub gestion ()

'Hauteur
Nom_cote = "Hauteur"
Val_cote = UserForm1.TextBox2.Value
Call Test

'Largeur...

'Profondeur...

'Epaisseur...

End Sub

 

Sub Test()

Dim swApp           As SldWorks.SldWorks

Dim Part            As SldWorks.ModelDoc2

Dim swModel         As SldWorks.ModelDoc2

Dim swEquationMgr   As SldWorks.EquationMgr

Dim i               As Integer

Dim vSplit          As Variant

Dim NB              As Integer

Dim Nom_eq          As String

Dim OLD_VALUE       As Integer

 

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc

Set swModel = swApp.ActiveDoc

Set swEquationMgr = swModel.GetEquationMgr

NB = Len(Nom_cote)

 

For i = 0 To swEquationMgr.GetCount - 1

    vSplit = Split(swEquationMgr.Equation(i), " = ")

    vSplit(0) = Replace(vSplit(0), Chr(34), Empty)

    Nom_eq = Left(vSplit(0), NB)

    OLD_VALUE = Right(vSplit(0), Len(vSplit(0)) - InStrRev(vSplit(0), "="))

    If Nom_eq = Nom_cote Then

        swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), OLD_VALUE, Val_cote)

    Else

    End If

Next i

boolstatus = Part.EditRebuild3()
End Sub

 

Comme j'ai expliqué il fonctionne mais j'ai peur que ce bidouillage soit limité.

 

et merci pour ton aide sur les différents forums!


equations.zip

Salut JB,

 

pourquoi faire compliqué quand on peut faire simple !

 

Sub gestion ()

'Gestion de la Hauteur du fond
if Test "Hauteur",UserForm1.TextBox2.Value then

        boolstatus = Part.EditRebuild3() 'Si Test renvoi True alors Reconstruire la pièce

else

        msgbox " Problème"

end if

' Rq: cliques derrière le't' de Test et tapes un espace pour voir que Test demande, dans une info bulle, deux arguments séparés d'une virgule (aide à la prog.). De cette manière Test peut se trouver dans un autre module sans problème.

'Largeur...

'Profondeur...

'Epaisseur...

End Sub

 

Sub Test(NomVar As String, ValVar As String) As Bolean

Dim swApp As SldWorks.SldWorks

Dim Part As SldWorks.ModelDoc2

Dim swModel As SldWorks.ModelDoc2

Dim swEquationMgr As SldWorks.EquationMgr

Dim i As Integer

Dim vSplit As Variant

 

Set swApp = Application.SldWorks

 

Set Part = swApp.ActiveDoc

Set swModel = swApp.ActiveDoc

Set swEquationMgr = swModel.GetEquationMgr

 

Test=False

For i = 0 To swEquationMgr.GetCount - 1'Sache qu'a chaque intération swEquationMgr.GetCount - 1 est recalculé. Il vaut mieux utliser une variable locale comme dans ma macro

    vSplit = Split(swEquationMgr.Equation(i), "=") ' j'ai enlevé les espaces de chaque coté du signe égal !!

    vSplit(0) = Replace(vSplit(0), Chr(34), Empty) 'je substitue les guillemets contenus dans split(0) par rien

    vSplit(0) = Replace(vSplit(0), Chr(32), Empty) 'je substitue les espaces contenus dans split(0) par rien (je peux car le nom d'une cote est forcément une chaine de caractères sans espace !!)

    If Split(0) = NomVar Then

        swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), Split(1), ValVar) 'je remplace Split(1) (la valeur de la variable NomVar par la valeur ValVar.

         Test=True

         exit sub 'raisonnement par l'absurde, s'il y a 100000000000000 équations tu peux aller boire le café même avec un 64 bits avec coprocesseur arithmétique multi corps multi tête.

    End If

Next i


End Sub

 

Il se peut qu'il y est des erreurs je viens de taper rapidement sans tester !!

 

Cordialement MC