Makro-Gleichung

Hallo

 

Ich möchte in der Lage sein, den Wert globaler Variablen in Gleichungen zu ändern. (Wie im Anhang gezeigt)

Ich weiß, wie man mit dieser Methode hinzufügt:

Dim swEquationMgr als Objekt

Legen Sie swEquationMgr = swModel.GetEquationMgr fest.

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

Wie kann ich eine bereits erstellte Version ändern?

 

Vielen Dank


capture_equation.png

Hallo

 

Hier ist ein Beispiel aus der SolidWorks VBA-Hilfe:

 

    'Dimensionsgleichung am Index 1 in allen Konfigurationen ändern
    longEquation = swEquationMgr. SetEquationAndConfigurationOption(1, """D1@Boss-Extrude1"" = 0.07", swAllConfiguration, leer)
    Wenn longEquation 1 <>, dann ErrorMsg SwApp, "Fehler beim Ändern einer Dimensionsgleichung"

 

 

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

1 „Gefällt mir“

Und eine Frage zu diesem Thema über SolidWorks Formum spricht darüber, es verwendet eine Teilung, um die Gleichung in 2 zu unterteilen:

 

  Für i = 0 Bis swEqnMgr.GetCount - 1

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

        vSplit(0) = Ersetzen(vSplit(0), Chr(34), Leer)

        if vSplit(0) = VARIABLE_NAME dann _

            swEqnMgr.Gleichung(i) = Ersetzen(swEqnMgr.Gleichung(i), vSplit(1), NEW_VALUE)

    Weiter i

 

 

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

1 „Gefällt mir“

 

+1 @Lucas Prieur

Siehe EquationMgr-Schnittstelle für Schnittstellenmethoden.

 

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

 

6 „Gefällt mir“

Nur für meine persönliche Kultur...

 

Ich verstehe nicht wirklich, was Jean bapt mit der Veränderung von Werten meint?

 

Wenn ich auf einen der Werte klicke, kann ich ihn nach meinen Wünschen ändern...

 

Ich möchte nur diese Frage und ihren Zweck verstehen =) (warum tun vba etc...)

 

Da ich keine Basis in APIs habe, denke ich, dass mein Missverständnis von dort herrührt. ^^

 

Vielen Dank!

1 „Gefällt mir“

@Bart: Entweder muss es mehrere Dateien in großen Mengen ändern, oder sein Gesamtwert ändert sich entsprechend anderer interner Parameter des Teils oder der Baugruppe oder gemäß einer externen Liste (z. B. Excel-Datei).

Mein Ziel ist es, Teile in einer Baugruppe einzubauen und die Höhe, Breite, Länge und Dicke beim Import festzulegen.

Dies ist die beste Lösung, die ich gefunden habe.

 

Das heißt, dass ich in einem Benutzerformular all diese Daten eingebe und sie in den Gleichungen ändere.

Ja, das ist die Frage, die ich mir vor ein paar Monaten gestellt habe, nur dass ich keine klare Antwort bekommen habe^^

 

Ich verstehe mich.

 

Ich habe eine Zusammenstellung gemacht, und darin habe ich alle meine Gleichungen eingefügt, die in den Räumen interagieren.

 

Das einzige ist, dass ich auf die Seiten klicken muss, um sie zu ändern... Und der Rest folgt, aber auf, eine Gebrauchsform wäre + angemessen, denke ich.

Ich bin im Jahr 2012 und es gibt Funktionen, die SW nicht kennt.

 

Wie zum Beispiel SetEquationAndConfigurationOption

 

In:

'Dimensionsgleichung am Index 1 in allen Konfigurationen ändern
longEquation = swEquationMgr.SetEquationAndConfigurationOption(1, ""Höhe"" = 50", swAllConfiguration, Leer)
Wenn longEquation 1 <> dann ErrorMsg SwApp, "Fehler beim Ändern einer Dimensionsgleichung"

 

Dieser Zusammenhang ist wirklich nicht klar...

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

 

Ich komme zu diesem Code, der nicht funktioniert.

 

Unter-Test()

Dim swApp           als SldWorks.SldWorks

Dimmen des Teils            als SldWorks.ModelDoc2

Dim swModel As SldWorks.ModelDoc2

Dim swEquationMgr   als SldWorks.EquationMgr

Dim i As Integer

Dim vSplit als Variante

const VARIABLE_NAME As String = "Höhe"

const NEW_VALUE als Zeichenfolge = "50"

 

Legen Sie swApp = Application.SldWorks fest

Festlegen von swModel = swApp.ActiveDoc

Legen Sie swEquationMgr = swModel.GetEquationMgr fest.

 

 Für i = 0 Bis swEquationMgr.GetCount - 1

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

        vSplit(0) = Ersetzen(vSplit(0), Chr(34), Leer)

        Wenn vSplit(0) = VARIABLE_NAME dann _

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

    Weiter i

Ende Sub

 

Danke für Ihre Hilfe

 

JB

Hallo

Ich kenne Sw nicht, ich arbeite unter invent

 

Warum gehen Sie nicht eine Excel-Tabelle durch, die die Abmessungen berechnet und SW muss sie nur aktualisieren?

 

Ich sehe keinen Sinn darin, Makros durchzugehen (es sei denn, Sie haben kein Excel).

 

Ich richte komplette Treppen in Excel-Tabellen ein und jedes Stück von Inventor aktualisiert sie mit diesem Blatt.

 

Vielen Dank

1 „Gefällt mir“

In welcher Zeile tritt ein Fehler auf?

Franck:

Das Hinzufügen des Eintrags einer Excel-Tabelle würde das System komplexer machen und ich möchte es nicht schwerer machen.

All dies geschieht über ein Benutzerformular, um es interaktiver zu gestalten.

 

Die Sache ist, dass es keine Fehler gibt, das Makro wird realisiert und es ändert sich nichts...

Versuchen Sie, das _ aus der Zeile zu entfernen:

Wenn vSplit(0) = VARIABLE_NAME dann _

 

und setzt 

 

swEqnMgr.Gleichung(i) = Ersetzen(swEqnMgr.Gleichung(i), vSplit(1), NEW_VALUE)

 

in der nächsten Zeile, gefolgt von einem "End if"

 

Dann machen Sie Schluss mit dieser Linie

swEqnMgr.Gleichung(i) = Ersetzen(swEqnMgr.Gleichung(i), vSplit(1), NEW_VALUE)

 

Stoppt Ihr Makro?

 

Andernfalls müssen Sie alle Werte Ihrer vSplit(0) durchgehen, z.B. mit einer debug.print oder mehr mit einer msgbox!

Es funktioniert also planlos...

 

Ich habe festgestellt, dass, wenn ich in die Verwaltung von Gleichungen gehe, wenn die aktivierte Zelle zum Beispiel = 90 der Höhe ist. Ich drückte OK, um die Box zu schließen.

 

Ich führe das Makro aus und bekomme in meiner msgbox:

Höhe  (d.h. was gesucht wird)

und Länge = 70

Breite = 95

...

(Beispiel auf dem beigefügten Bild)

Wenn es = 70 der Länge ist, erhalte ich Höhe = 90 und  Länge

 

 

Aktueller Code:

const VARIABLENAME als Zeichenfolge = "Höhe"
Const NEW_VALUE als Zeichenfolge = "70"

 

    Für i = 0 Bis swEquationMgr.GetCount - 1
        vSplit = Split(swEquationMgr.Equation(i), " = ")
        vSplit(0) = Ersetzen(vSplit(0), Chr(34), Leer)
        
        MsgBox vSplit(0)
        if vSplit(0) = VARIABLENAME Dann
            swEquationMgr.Equation(i) = Ersetzen(swEquationMgr.Equation(i), vSplit(1), NEW_VALUE)
        Ende, wenn
    Weiter i


capture.png

Vielleicht ein Syntaxproblem?

 

Versuchen Sie es mit einem lcase (Kleinbuchstaben = Kleinbuchstaben) oder ucase (Großbuchstaben = Großbuchstaben) für Ihre beiden Variablen, entweder

 

VARIABLENAME und vSplit(1).

 

Und Sie können Ihrer Eibe ein else hinzufügen, um dort einen Haltepunkt zu platzieren und zu sehen, in welchem Fall es nicht funktioniert.

Ich habe nicht ganz verstanden, wie man den Code schreibt...

So?

VARIABLENAME = LCase(Kleinbuchstaben = Kleinbuchstaben)

 

Ich habe den Namen von vSplit(0) in Nom_eq sortiert, so dass ich Height und nicht Height = 90 hatte

Hier ist mein Code

NB = Länge(VARIABLENNAME)

 

Für i = 0 Bis swEquationMgr.GetCount - 1

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

    MsgBox vSplit(0)

    vSplit(0) = Ersetzen(vSplit(0), Chr(34), Leer)

    Nom_eq = Links(vSplit(0), NB)

 

    Wenn Nom_eq = VARIABLENNAME Dann

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

        'MsgBox vSplit(1)

    Oder

    Ende, wenn

Weiter i

 

Aber ich habe einen Fehler, der in der Zeile angezeigt wird

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

(Anhang)

 

JB


capture2.png

Hallo ihr alle.

 

Nachricht1/2:

Ein wenig in einem Makro kann es unbrauchbar machen! JB, ich habe mir dein Makro angesehen und das Sandkorn befindet sich im Code-Schnipsel [vSplit=Split(swEqua.equation(i), " = ")] und genauer gesagt in [" = "].

Erklärung: Die Gleichungen eines SW-Modells sind alphanumerische Zeichenfolgen, und wie alle Zeichenketten können sie durch VBA-Funktionen manipuliert werden, die in Word, Excel, Access, .... vorhanden sind und SW.

Für Ihren Code nimmt die Split-Funktion den Inhalt der i-ten Gleichung [swEqua.equation(i)], teilt sie auf der Ebene von [" = "] in zwei Teile, und da vSplit eine Variante ist, wird vSplit(0) automatisch links von [" = "] und vSplit(1) automatisch rechts von [" = "] zugewiesen.

Bei [" = "] tut der Boden weh, denn eine SW-Gleichung kann sowohl ""D1@Ext" = 50 + 20" als auch "D1@Ext" = 50 + 20" oder "D1@Ext"    =    50    +    20 lauten. Ich schreibe dieses Wort mit einem Textverarbeitungsprogramm und wenn ich es verwende, bitte ich immer darum, dass nicht druckbare Zeichen angezeigt werden. Dies ermöglicht es mir, die vier Leerzeichen auf beiden Seiten des Gleichheitszeichens der letzten Gleichung (die obige) nicht nur zu sehen, sondern auch zu zählen. SW kümmert er sich nicht um diese überflüssigen oder nicht präsenten Räume bzw. verwaltet sie vielmehr. Fazit: Der Manipulator kann eine Gleichung hinzufügen, indem er Kot (doppelte, dreifache Leerzeichen) hinterlässt, aber Sie müssen sich damit auseinandersetzen und vor allem dieses heikle Problem in Ihrer Programmierung (Ihrem Code) berücksichtigen. In einer anderen Nachricht wurde mein Code in Form eines Sub (Funktion) mit dem Namen 'ChangeVariableValueInQuaAndRebuildPart' überprüft, erweitert und auskommentiert, den Sie hier mit einem anderen Sub mit dem Namen 'try01' aufrufen. Für die Funktion 'ChangeVariableValueInQuaAndRebuildPart' sind zwei Argumente erforderlich, die ich 'VarName' und 'ValVar' genannt habe.

Hinweis: Ich füge in einer anderen Nachricht ein Prüfstück bei, das geöffnet werden soll (es enthält die Maße "D1@Ext" und "D1@Esq".

 

A+

1 „Gefällt mir“

Hallo nochmal, hier ist mein Code und der Testteil als Beispiel

 

 

Unter-Aufsatz01()

  ChangeVariableValueInQuaAnd RebuildPart "D1@Ext", "80"

  ChangeVariableValueInQuaAndRebuildPart "D1@Esq", "44.6"

Ende Sub

 

Sub ChangeVariableValueInQuaAndRebuildPart(NomVar als Zeichenfolge, ValVar als Zeichenfolge)

 Hinweis: Eine Gleichung ist eine alphanumerische Zeichenkette und wird als solche mit den üblichen VBA-Funktionen behandelt.

 "Die Deklaration bezweckt *****************************

  Dim swApp als SldWorks.SldWorks

  Dim swModel As SldWorks.ModelDoc2

  Dim swEquaMgr As SldWorks.EquationMgr

 

 'Zuweisung von Objekten*****************************

  Set swApp = Application.SldWorks    ' swApp ist jetzt ein Objekt, das die SW-Anwendung enthält.

  Set swModel = swApp.ActiveDoc       ' SwModel ist jetzt ein Objekt, das die aktive SW-Datei des Modells (Teil oder Baugruppe) enthält.

  Set swEqua = swModel.GetEquationMgr ' swEquaMgr ist jetzt ein Objekt, das den Satz von Gleichungen des Modells enthält, der im Feature-Manager vorhanden ist.

 

 "Deklaration lokaler Variablen******************

  Dim NumEqua As Integer 'NumEqua ist die Zahl der Gleichung

  Dim NbEqua As Integer  'NbEqua ist die Anzahl der Gleichungen. Wenn NbEqua=0 dann gibt es eine Gleichung, wenn NbEqua=1 dann gibt es 2 Gleichungen, wenn NbEqua= -1 dann gibt es keine Gleichung.

  Dim ChScind als Variante 'ChScind ist eine Split Chain.

  const title01 As String = "Constat   (MC)"

 Variable Allokation

  NbEqua = swEqua.GetCount - 1

 

 "Verfahren 

    Für NumEqua = 0 TB NbEqua' Für NumEqua im Bereich von 0 bis NbEqua (standardmäßig in Schritten von 1)

         ChScind = Split(swEqua.equation(NumEqua), "=") 'ChScind(0) enthält nun den Teil der Gleichung links vom "="-Zeichen. ChScind(1) enthält nun den Teil der Gleichung rechts vom "="-Zeichen

         ChScind(0) = replace(ChScind(0), Chr(34), Empty) 'Systematisches Ersetzen des ersten und letzten Zeichens von Scind(0) (mit der ASCII-Nummer 34) durch nichts (leer), d.h. wir entfernen alle chr(34) ["] von Scind(0) (dies ist eine Formatierung, die den folgenden Test bedingt).

         ChScind(0) = replace(ChScind(0), Chr(32), Empty) 'Systematisches Ersetzen der Zeichen von Scind(0) (durch die ASCII-Zahl 32) durch nichts (leer), d.h. wir entfernen alle Leerzeichen [" "] von Scind(0) (dies ist eine Formatierung, die den folgenden Test bedingt).

         Wenn ChScind(0) = VarName, dann

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

             If swModel.EditRebuild3() Then' wenn der Neuaufbau des Teils true zurückgibt, dann

                 MsgBox "Rekonstruiertes Bauteil mit neuem Wert in der Gleichung!", vbInformation, Title01

              Sonst ist es nicht der Fall.

                 MsgBox "Geänderte Gleichung, aber teilweiser Rekonstruktionsfehler!", vbInformation, Title01

             End If 'Ende von if

             Exit Sub ' leave this Sub

         Ende, wenn

    Weiter NumEqua

   

    Wenn NbEqua = -1 ist, dann

        MsgBox "Dem Modell ist keine Gleichung zugeordnet!", vbExclamation, Title01

    Oder

        MsgBox "Keine Änderung der Gleichung möglich!" & Chr$(13) & Chr$(13) & "'" & VarName & "'" & " wurde in keinem von ihnen gefunden.", vbExclamation, Titel01

    Ende, wenn

   

End Sub 'Ende des Subs

 

A+


part_essai01.sldprt
1 „Gefällt mir“

Hallo Maxime,

 

Ihr Programm funktioniert hervorragend!

Was ich tun möchte, ist die Variablen mehr zu ändern, um die Änderungen zu erleichtern (Anhang)

In der Zwischenzeit habe ich es geschafft, meinen Code zum Laufen zu bringen:

 

Untergeordnete Geschäftsführung ()

"Höhe
Nom_cote = "Höhe"
Val_cote = UserForm1.TextBox2.Wert
Test aufrufen

"Breite...

"Tiefe...

"Die Dicke...

Ende Sub

 

Unter-Test()

Dim swApp           als SldWorks.SldWorks

Dimmen des Teils            als SldWorks.ModelDoc2

Dim swModel         As SldWorks.ModelDoc2

Dim swEquationMgr   als SldWorks.EquationMgr

Dim i               As Integer

Dim vSplit          als Variante

NB              als Ganzzahl dimmen

Nom_eq          als Zeichenfolge dimmen

OLD_VALUE       als Ganzzahl dimmen

 

Legen Sie swApp = Application.SldWorks fest

Set Part = swApp.ActiveDoc

Festlegen von swModel = swApp.ActiveDoc

Legen Sie swEquationMgr = swModel.GetEquationMgr fest.

NB = Len(Nom_cote)

 

Für i = 0 Bis swEquationMgr.GetCount - 1

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

    vSplit(0) = Ersetzen(vSplit(0), Chr(34), Leer)

    Nom_eq = Links(vSplit(0), NB)

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

    Wenn Nom_eq = Nom_cote Dann

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

    Oder

    Ende, wenn

Weiter i

boolstatus = Teil.EditRebuild3()
Ende Sub

 

Wie ich erklärt habe, funktioniert es, aber ich befürchte, dass dieses Hacking begrenzt sein wird.

 

und vielen Dank für Ihre Hilfe in den verschiedenen Foren!


equations.zip

Hallo JB,

 

Warum es kompliziert machen, wenn man es einfach machen kann!

 

Untergeordnete Geschäftsführung ()

Verwaltung der unteren Höhe
if Test "Höhe",UserForm1.TextBox2.Wert, dann

        boolstatus = Part.EditRebuild3() 'Wenn Test True zurückgibt, dann Teil neu erstellen

oder

        msgbox "Problem"

Ende, wenn

' Rq: Klicken Sie hinter das 't' in Test und geben Sie ein Leerzeichen ein, um zu sehen, dass Test in einem Tooltip zwei Argumente anfordert, die durch ein Komma getrennt sind (Hilfe beim Prog.). Auf diese Weise kann der Test problemlos in einem anderen Modul durchgeführt werden.

"Breite...

"Tiefe...

"Die Dicke...

Ende Sub

 

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

Dim swApp als SldWorks.SldWorks

Dimmen des Teils als SldWorks.ModelDoc2

Dim swModel As SldWorks.ModelDoc2

Dim swEquationMgr als SldWorks.EquationMgr

Dim i As Integer

Dim vSplit als Variante

 

Legen Sie swApp = Application.SldWorks fest

 

Set Part = swApp.ActiveDoc

Festlegen von swModel = swApp.ActiveDoc

Legen Sie swEquationMgr = swModel.GetEquationMgr fest.

 

Test=Falsch

For i = 0 To swEquationMgr.GetCount - 1'Beachten Sie, dass bei jedem Austausch swEquationMgr.GetCount - 1 neu berechnet wird. Es ist besser, eine lokale Variable wie in meinem Makro zu verwenden

    vSplit = Split(swEquationMgr.Equation(i), "=") ' Ich habe die Leerzeichen auf jeder Seite des Gleichheitszeichens entfernt!!

    vSplit(0) = Replace(vSplit(0), Chr(34), Empty) 'Ich ersetze die in split(0) enthaltenen Anführungszeichen durch nichts

    vSplit(0) = Replace(vSplit(0), Chr(32), Empty) 'Ich ersetze die in split(0) enthaltenen Leerzeichen durch nichts (ich kann, weil der Name einer Dimension notwendigerweise ein String ohne Leerzeichen ist!!)

    Wenn split(0) = varName, dann

        swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), Split(1), ValVar) 'Ich ersetze Split(1) (den Wert der Variablen NomVar) durch den Wert ValVar.

         Test=Wahr

         Beenden Sie das Argumentieren durch das Absurde, wenn es 1000000000000000000000 Gleichungen gibt, können Sie Kaffee trinken gehen, sogar mit einem 64-Bit mit Mehrkörper-Mehrkopf-Arithmetik-Coprozessor.

    Ende, wenn

Weiter i


Ende Sub

 

Es kann Fehler geben, die ich gerade schnell ohne Test eingegeben habe!!

 

Grüße MC