Równanie makro

Witam

 

Chcę mieć możliwość zmiany wartości zmiennych globalnych w równaniach. (Jak pokazano w załączniku)

Wiem, jak dodać tą metodą:

Dim swEquationMgr Jako obiekt

Ustaw swEquationMgr = swModel.GetEquationMgr

swEquationMgr.Dodaj -1, """Masa [kg]""= ""SW-Masa""/100"

Jak mogę zmodyfikować ten, który został już utworzony?

 

Dziękuję


capture_equation.png

Witam

 

Oto przykład z pomocy SolidWorks VBA:

 

    'Zmodyfikuj równanie wymiarowe o indeksie 1 we wszystkich konfiguracjach
    longEquation = swRównanieMgr. SetEquationAndConfigurationOption(1, """D1@Boss-Extrude1"" = 0.07", swAllConfiguration, Empty)
    Jeśli longEquation <> 1, to ErrorMsg SwApp, "Nie udało się zmodyfikować równania wymiaru"

 

 

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

1 polubienie

I pytanie na ten temat o SolidWorks formum mówi o tym, używa podziału do rozdzielenia równania na 2 :

 

  Dla i = 0 Do swEqnMgr.GetCount - 1

        vSplit = Split(swEqnMgr.Równanie(i), " = ")

        vSplit(0) = Zamień(vSplit(0), Chr(34), Pusty)

        Jeśli vSplit(0) = VARIABLE_NAME Then _

            swEqnMgr.Równanie(i) = Zamień(swEqnMgr.Równanie(i), vSplit(1), NEW_VALUE)

    Dalej i

 

 

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

1 polubienie

 

+1 @Lucas Prieur

Zobacz interfejs EquationMgr, aby zapoznać się z metodami interfejsu

 

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

 

6 polubień

Tylko ze względu na moją osobistą kulturę...

 

Nie bardzo rozumiem, co Jean bapt ma na myśli, mówiąc o modyfikowaniu wartości?

 

Jeśli kliknę na jedną z wartości, mogę ją zmienić według własnych upodobań...

 

Chciałbym tylko zrozumieć to pytanie i jego cel =) (dlaczego vba itp...)

 

Ponieważ nie mam podstaw w API, myślę, że moje nieporozumienie bierze się stamtąd. ^^

 

Dziękuję!

1 polubienie

@Bart: albo musi zmodyfikować kilka plików jednocześnie, albo jego ogólna wartość zmienia się zgodnie z innymi parametrami wewnętrznymi części lub zespołu lub zgodnie z listą zewnętrzną (na przykład plik Excel).

Moim celem jest złożenie części w zespole i ustawienie wysokości, szerokości, długości i grubości podczas importu.

To najlepsze rozwiązanie, jakie znalazłem.

 

Oznacza to, że w formularzu użytkownika wprowadzam wszystkie te dane i modyfikuję je w równaniach.

Tak, to jest pytanie, które zadałem kilka miesięcy temu, tyle że nie dostałem jasnej odpowiedzi^^

 

Rozumiem siebie.

 

Zrobiłem asumpcję, w której umieściłem wszystkie moje równania, które oddziałują na siebie w pokojach.

 

Jedyną rzeczą jest to, że muszę kliknąć po bokach, aby je zmienić... A reszta następuje, ale dalej, myślę, że formularz użycia byłby + odpowiedni.

Jestem w 2012 roku i są funkcje, których SW nie zna.

 

Na przykład SetEquationAndConfigurationOption

 

W:

'Zmodyfikuj równanie wymiarowe o indeksie 1 we wszystkich konfiguracjach
longEquation = swEquationMgr.SetEquationAndConfigurationOption(1, """Wysokość"" = 50", swAllConfiguration, Pusta)
Jeśli longEquation <> 1, to ErrorMsg SwApp, "Nie udało się zmodyfikować równania wymiaru"

 

Ten związek naprawdę nie jest jasny...

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

 

Docieram do tego kodu, który nie działa.

 

Test podrzędny()

Dim swApp           jako SldWorks.SldWorks

Przyciemnij część            jako SldWorks.ModelDoc2

Dim swModel As SldWorks.ModelDoc2

Dim swEquationMgr   As SldWorks.EquationMgr

Dim i As Liczba całkowita

Dim vSplit jako wariant

Const VARIABLE_NAME As String = "Wysokość"

Zachowaj NEW_VALUE Jako ciąg = "50"

 

Ustaw swApp = Application.SldWorks

Ustaw swModel = swApp.ActiveDoc

Ustaw swEquationMgr = swModel.GetEquationMgr

 

 Dla i = 0 Do swEquationMgr.GetCount - 1

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

        vSplit(0) = Zamień(vSplit(0), Chr(34), Pusty)

        Jeśli vSplit(0) = VARIABLE_NAME To _

            swEquationMgr.Equation(i) = Zamień(swRównanieMgr.Równanie(i), vSplit(1), NEW_VALUE)

    Dalej i

Koniec subwoofera

 

dziękuję za pomoc

 

JB

Witam

Nie znam Sw, pracuję pod wynalezieniem

 

Dlaczego nie przejrzeć arkusza Excela, który obliczy wymiary, a SW będzie musiał go tylko zaktualizować.

 

Nie widzę sensu przechodzenia przez makra (chyba że nie masz Excela).

 

Ustawiam kompletne schody w arkuszach Excela, a każdy element wynalazcy aktualizuje je za pomocą tego arkusza.

 

Dziękuję

1 polubienie

W którym wierszu występuje błąd?

Franck:

Dodanie wpisu do arkusza Excela sprawiłoby, że system byłby bardziej złożony i nie chcę, aby był cięższy.

Wszystko to odbywa się z poziomu formularza użytkownika, aby uczynić go bardziej interaktywnym.

 

Chodzi o to, że nie ma żadnych błędów, makro jest zrealizowane i nic się nie zmienia...

Spróbuj usunąć _ z wiersza:

Jeśli vSplit(0) = VARIABLE_NAME Then _

 

i stawia 

 

swEqnMgr.Równanie(i) = Zamień(swEqnMgr.Równanie(i), vSplit(1), NEW_VALUE)

 

w następnym wierszu, po którym następuje "End if"

 

Następnie zatrzymaj tę linię

swEqnMgr.Równanie(i) = Zamień(swEqnMgr.Równanie(i), vSplit(1), NEW_VALUE)

 

Czy twoje makro się zatrzymuje?

 

W przeciwnym razie, musisz przejrzeć wszystkie wartości swojego vSplit(0), na przykład za pomocą debug.print lub więcej za pomocą msgbox!

Więc to działa przypadkowo...

 

Zauważyłem, że kiedy przechodzę do zarządzania równaniami, jeśli aktywowana komórka to na przykład: =90 wysokości. Włożyłem OK, aby zamknąć pudełko.

 

Uruchamiam makro i pojawia się w moim msgbox:

Wysokość  (tj. to, czego szukamy)

i Długość = 70

Szerokość = 95

...

(przykład na załączonym obrazie)

Jeśli jest to =70 długości, otrzymuję wysokość = 90 i  długość

 

 

Aktualny kod:

Const ZMIENNA NAZWA Jako ciąg = "Wysokość"
Const NEW_VALUE As String = "70"

 

    Dla i = 0 Do swEquationMgr.GetCount - 1
        vSplit = Split(swEquationMgr.Equation(i), " = ")
        vSplit(0) = Zamień(vSplit(0), Chr(34), Pusty)
        
        MsgBox vSplit(0) (Skrzynka msgBox vSplit(0)
        Jeśli vSplit(0) = NAZWAZMIENNEJ, to
            swEquationMgr.Equation(i) = Zamień(swRównanieMgr.Równanie(i), vSplit(1), NEW_VALUE)
        Zakończ jeżeli:
    Dalej i


capture.png

Może problem ze składnią?

 

Wypróbuj lcase (małe litery = małe litery) lub ucase (wielkie litery = wielkie litery) dla swoich dwóch zmiennych, albo

 

NAZWA_ZMIENNEJ oraz vSplit(1).

 

I możesz umieścić else do swojego cisu, aby umieścić tam punkt przerwania i zobaczyć, w którym przypadku to nie zadziała.

Nie do końca rozumiałem, jak napisać kod...

Jak to?

NAZWA_ZMIENNEJ = LCase(małe litery = małe litery)

 

Posortowałem nazwę vSplit(0) na Nom_eq tak, że miałem Wysokość, a nie Wysokość = 90

Oto mój kod

NB = Len(NAZWAZMIENNEJ)

 

Dla i = 0 Do swEquationMgr.GetCount - 1

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

    MsgBox vSplit(0) (Skrzynka msgBox vSplit(0)

    vSplit(0) = Zamień(vSplit(0), Chr(34), Pusty)

    Nom_eq = Lewo(vSplit(0), NB)

 

    Jeśli Nom_eq = NAZWA_ZMIENNEJ Wtedy

        swRównanieMgr.Równanie(i) = Zamień(swRównanieMgr.Równanie(i), vSplit(1), NEW_VALUE)

        'MsgBox vSplit(1)

    Inaczej

    Zakończ jeżeli:

Dalej i

 

Ale mam błąd, który jest wyświetlany w wierszu

swRównanieMgr.Równanie(i) = Zamień(swRównanieMgr.Równanie(i), vSplit(1), NEW_VALUE)

(załącznik)

 

JB


capture2.png

Cze wszystkim.

 

Wiadomość 1/2:

Trochę w makrze może sprawić, że stanie się bezużyteczny! JB, spojrzałem na twoje makro i ziarno piasku znajduje się we fragmencie kodu [vSplit=Split(swEqua.equation(i), " = ")], a dokładniej w [" = "].

Wyjaśnienie: Równania modelu oprogramowania są ciągami alfanumerycznymi i, podobnie jak wszystkie ciągi, mogą być manipulowane przez funkcje VBA obecne w programach Word, Excel, Access, .... i SW.

W twoim kodzie funkcja Split weźmie zawartość i-tego równania [swEqua.equation(i)], podzieli je na dwie części na poziomie [" = "], a następnie, ponieważ vSplit jest wariantem, vSplit(0) zostanie automatycznie przypisany po lewej stronie [" = "], a vSplit(1) zostanie automatycznie przypisany po prawej stronie [" = "].

To właśnie dla [" = "] boli dno, ponieważ równanie SW może mieć wartość ""D1@Ext"=50+20" jak również ""D1@Ext" = 50 + 20" lub ""D1@Ext"    =    50    +    20". Piszę to słowo za pomocą edytora tekstu i kiedy go używam, zawsze proszę o wyświetlenie znaków niedrukowalnych. To pozwala mi nie tylko zobaczyć, ale także policzyć cztery spacje po obu stronach znaku równości zapisu ostatniego równania (tego powyżej). SW, nie dba o to, a raczej zarządza tymi zbędnymi lub nieobecnymi przestrzeniami. Wniosek, manipulator może dodać równanie, zostawiając odchody (podwójne, potrójne spacje), ale będziesz musiał sobie z tym poradzić, a przede wszystkim wziąć pod uwagę ten drażliwy problem w swoim programowaniu (swoim kodzie). W innej wiadomości mój kod przejrzał, rozwinął i skomentował w postaci Sub (funkcji) o nazwie 'ChangeVariableValueInQuaAndRebuildPart', którą wywołujesz tutaj z innym Sub o nazwie 'try01'. Funkcja "ChangeVariableValueInQuaAndRebuildPart" wymaga dwóch argumentów, które nazwałem "VarName" i "ValVar".

Uwaga: Załączam w innej wiadomości próbkę do otwarcia (zawiera ona wymiary "D1@Ext" i "D1@Esq".

 

Klasa A+

1 polubienie

Witam ponownie, oto mój kod i część testowa jako przykład

 

 

Sub esej01()

  ChangeVariableValueInQuaAnd RebuildPart "D1@Ext", "80"

  ChangeVariableValueInQuaAndRebuildPart "D1@Esq", "44.6"

Koniec subwoofera

 

Sub ChangeVariableValueInQuaAndRebuildPart(NomVar jako ciąg, ValVar jako ciąg)

 Uwaga: równanie jest ciągiem alfanumerycznym i jest traktowane jako takie ze zwykłymi funkcjami VBA.

 "Obiekty deklaracji *****************************

  Dim swApp jako SldWorks.SldWorks

  Dim swModel As SldWorks.ModelDoc2

  Dim swEquaMgr As SldWorks.EquationMgr

 

 "Przypisywanie przedmiotów*****************************

  Set swApp = Application.SldWorks    ' swApp jest teraz obiektem zawierającym aplikację SW.

  Set swModel = swApp.ActiveDoc       ' SwModel jest teraz obiektem zawierającym oprogramowanie aktywnego modelu (części lub złożenia).

  Set swEqua = swModel.GetEquationMgr ' swEquaMgr jest teraz obiektem zawierającym zestaw równań modelu obecnego w menedżerze funkcji.

 

 "Deklaracja zmiennych lokalnych******************

  Dim NumEqua As Integer 'NumEqua jest liczbą równania

  Dim NbEqua As liczba całkowita  'NbEqua to liczba równań. Jeśli NbEqua = 0 to jest równanie, jeśli NbEqua = 1 to są 2 równania, jeśli NbEqua = -1 to nie ma równania.

  Dim ChScind As Variant 'ChScind jest podzielonym łańcuchem.

  Const Title01 As Ciąg = "Constat   (MC)"

 Zmienna alokacja

  NbEqua = swEqua.GetCount - 1

 

 "Procedura 

    Dla NumEqua = 0 TB NbEqua' Dla NumEqua w zakresie od 0 do NbEqua (domyślnie w krokach co 1)

         ChScind = Split(swEqua.equation(NumEqua), "=") 'ChScind(0) zawiera teraz część równania na lewo od znaku "=". ChScind(1) zawiera teraz część równania znajdującą się po prawej stronie znaku "="

         ChScind(0) = Replace(ChScind(0), Chr(34), Empty) 'Systematyczne zastępowanie pierwszego i ostatniego znaku Scind(0) (z numerem ascii 34) przez nic (puste), innymi słowy usuwamy cały chr(34) ["] z Scind(0) (jest to formatowanie warunkujące następujący test).

         ChScind(0) = Replace(ChScind(0), Chr(32), Empty) 'Systematyczne zastępowanie znaków Scind(0) (liczbą ascii 32) przez nic (puste), innymi słowy usuwamy wszystkie spacje [" "] z Scind(0) (jest to formatowanie warunkujące następujący test).

         Jeśli ChScind(0) = NazwaZmiennej, to

             swEqua.równanie(NumEqua) = Zamień(swEqua.równanie(NumEqua), ChScind(1), ValVar)

             Jeśli swModel.EditRebuild3() Then' jeśli przebudowa części zwraca wartość true, to

                 MsgBox "Zrekonstruowana część z nową wartością w równaniu!", vbInformation, Title01

              W przeciwnym razie

                 MsgBox "Zmodyfikowane równanie, ale błąd rekonstrukcji części!", vbInformation, Title01

             End If 'koniec if

             Wyjdź z Sub ' opuść ten Sub

         Zakończ jeżeli:

    Następny NumEqua

   

    Jeśli NbEqua = -1, to

        MsgBox "Żadne równanie nie jest skojarzone z modelem!", vbExclamation, Title01

    Inaczej

        MsgBox "Nie można modyfikacji równania!" & Chr$(13) & Chr$(13) & "'" & VarName & "'" & " nie znaleziono w żadnym z nich.", vbExclamation, Title01

    Zakończ jeżeli:

   

End Sub 'koniec sub

 

Klasa A+


part_essai01.sldprt
1 polubienie

Witaj Maxime,

 

Twój program działa świetnie!

To, co chcę zrobić, to bardziej zmodyfikować zmienne, aby rozjaśnić zmiany (załącznik)

W międzyczasie udało mi się uruchomić mój kod:

 

Zarządzanie podrzędne ()

"Wysokość
Nom_cote = "Wysokość"
Val_cote = UserForm1.TextBox2.Value
Test połączenia

"Szerokość...

"Głębokość...

"Grubość...

Koniec subwoofera

 

Test podrzędny()

Dim swApp           jako SldWorks.SldWorks

Przyciemnij część            jako SldWorks.ModelDoc2

Dim swModel         As SldWorks.ModelDoc2

Dim swEquationMgr   As SldWorks.EquationMgr

Dim i               As Liczba całkowita

Dim vSplit          jako wariant

Dim NB              jako liczba całkowita

Dim Nom_eq          As String (Przyciemnij Jako ciąg

Dim OLD_VALUE       As liczba całkowita

 

Ustaw swApp = Application.SldWorks

Ustaw część = swApp.ActiveDoc

Ustaw swModel = swApp.ActiveDoc

Ustaw swEquationMgr = swModel.GetEquationMgr

NB = Len(Nom_cote)

 

Dla i = 0 Do swEquationMgr.GetCount - 1

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

    vSplit(0) = Zamień(vSplit(0), Chr(34), Pusty)

    Nom_eq = Lewo(vSplit(0), NB)

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

    Jeśli Nom_eq = Nom_cote to

        swEquationMgr.Equation(i) = Zamień(swRównanieMgr.Równanie(i), OLD_VALUE, Val_cote)

    Inaczej

    Zakończ jeżeli:

Dalej i

boolstatus = Part.EditRebuild3()
Koniec subwoofera

 

Jak wyjaśniłem, to działa, ale obawiam się, że to hakowanie będzie ograniczone.

 

i dziękuję za pomoc na różnych forach!


equations.zip

Cześć JB,

 

Po co to komplikować, skoro można to uprościć!

 

Zarządzanie podrzędne ()

Zarządzanie wysokością dna
jeśli test "Wysokość",UserForm1.TextBox2.Value to następnie

        boolstatus = Part.EditRebuild3() 'Jeśli test zwraca wartość True, odbuduj część

inaczej

        msgbox "Problem"

Zakończ się, jeśli

' Rq: kliknij za "t" w Test i wpisz spację, aby zobaczyć, że Test żąda w podpowiedzi dwóch argumentów oddzielonych przecinkiem (pomoc z progiem). W ten sposób Test może bez problemu znajdować się w innym module.

"Szerokość...

"Głębokość...

"Grubość...

Koniec subwoofera

 

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

Dim swApp jako SldWorks.SldWorks

Przyciemnij część jako SldWorks.ModelDoc2

Dim swModel As SldWorks.ModelDoc2

Dim swEquationMgr As SldWorks.EquationMgr

Dim i As Liczba całkowita

Dim vSplit jako wariant

 

Ustaw swApp = Application.SldWorks

 

Ustaw część = swApp.ActiveDoc

Ustaw swModel = swApp.ActiveDoc

Ustaw swEquationMgr = swModel.GetEquationMgr

 

Test=Fałsz

Dla i = 0 Do swEquationMgr.GetCount - 1'Wiedz, że przy każdej wymianie swEquationMgr.GetCount - 1 jest obliczane ponownie. Lepiej jest użyć zmiennej lokalnej, takiej jak w moim makrze

    vSplit = Split(swEquationMgr.Equation(i), "=") ' Usunąłem spacje po obu stronach znaku równości!!

    vSplit(0) = Replace(vSplit(0), Chr(34), Empty) 'Zastępuję znaki cudzysłowu zawarte w split(0) niczym.

    vSplit(0) = Replace(vSplit(0), Chr(32), Empty) 'Zastępuję spacje zawarte w split(0) niczym (mogę, ponieważ nazwa wymiaru to koniecznie ciąg znaków bez spacji!!)

    Jeśli Split(0) = NazwaZmiennej, to

        swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), Split(1), ValVar) 'Zamianuję Split(1) (wartość zmiennej NomVar wartością ValVar.

         Test=Prawda

         Wyjdź z rozumowania przez absurd, jeśli jest 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    Zakończ jeżeli:

Dalej i


Koniec subwoofera

 

Mogą wystąpić błędy, które właśnie wpisałem szybko bez testowania!!

 

Pozdrawiam MC