Macro-vergelijking

Hallo

 

Ik wil in staat zijn om de waarde van globale variabelen in vergelijkingen te veranderen. (Zoals weergegeven in bijlage)

Ik weet hoe ik op deze manier moet toevoegen:

Dim swEquationMgr als object

Stel swEquationMgr in = swModel.GetEquationMgr

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

Hoe wijzig ik een die al is gemaakt?

 

Bedankt


capture_equation.png

Hallo

 

Hier is een voorbeeld uit de SolidWorks VBA-help:

 

    'Wijzig de dimensievergelijking bij index, 1, in alle configuraties
    longEquation = swEquationMgr. SetEquationAndConfigurationOption(1, """D1@Boss-Extrude1"" = 0.07", swAllConfiguration, leeg)
    Als longEquation <> 1 Dan ErrorMsg SwApp, "Kan een dimensievergelijking niet wijzigen"

 

 

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

1 like

En een vraag over dit onderwerp over SolidWorks formum spreekt erover, het gebruikt een splitsing om de vergelijking in 2 te scheiden:

 

  Voor i = 0 To swEqnMgr.GetCount - 1

        vSplit = Splitsing(swEqnMgr.Vergelijking(i), " = ")

        vSplit(0) = Vervangen(vSplit(0), Chr(34), leeg)

        Als vSplit(0) = VARIABLE_NAME dan _

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

    volgende i

 

 

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

1 like

 

+1 @Lucas Prieur

Zie de EquationMgr-interface voor interfacemethoden

 

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

 

6 likes

Even voor mijn persoonlijke cultuur...

 

Ik begrijp niet echt wat Jean bapt bedoelt met het wijzigen van waarden?

 

Als ik op een van de waarden klik, kan ik deze naar wens wijzigen...

 

Ik zou gewoon graag deze vraag en het doel ervan begrijpen =) (waarom vba etc...)

 

Omdat ik geen basis heb in API's, denk ik dat mijn misverstand daar vandaan komt. ^^

 

Bedankt!

1 like

@Bart: ofwel moet hij meerdere bestanden massaal wijzigen, ofwel verandert de totale waarde volgens andere parameters die intern zijn voor het onderdeel of de assemblage of volgens een externe lijst (bijvoorbeeld een Excel-bestand).

Mijn doel is om onderdelen in een assemblage te assembleren en de hoogte, breedte, lengte en dikte in te stellen bij het importeren.

Dit is de beste oplossing die ik heb gevonden.

 

Dat wil zeggen dat ik op een Userform al deze gegevens invoer, en dat ik deze wijzig in de vergelijkingen.

Ja, dat is de vraag die ik een paar maanden geleden stelde, behalve dat ik geen duidelijk antwoord kreeg^^

 

Ik begrijp me.

 

Ik heb een samenvoeging gemaakt en daarin heb ik al mijn vergelijkingen geplaatst die in de kamers op elkaar inwerken.

 

Het enige is dat ik op de zijkanten moet klikken om ze te veranderen... En de rest volgt, maar op, een useform zou + passend zijn denk ik.

Ik ben in 2012 en er zijn functies die SW niet kent.

 

Zoals SetEquationAndConfigurationOption bijvoorbeeld

 

In:

'Wijzig de dimensievergelijking bij index, 1, in alle configuraties
longEquation = swEquationMgr.SetEquationAndConfigurationOption(1, """Hoogte"" = 50", swAllConfiguration, leeg)
Als longEquation <> 1 Dan ErrorMsg SwApp, "Kan een dimensievergelijking niet wijzigen"

 

Deze link is echt niet duidelijk...

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

 

Ik kom bij een code die niet werkt.

 

Sub Test()

Dim swApp           als SldWorks.SldWorks

Dim deel            als SldWorks.ModelDoc2

Dim swModel als SldWorks.ModelDoc2

Dim swEquationMgr   als SldWorks.EquationMgr

Dim i als geheel getal

Dim vSplit als variant

Const VARIABLE_NAME As String = "Hoogte"

Const NEW_VALUE As String = "50"

 

Stel swApp = Toepassing.SldWorks in

Stel swModel = swApp.ActiveDoc in

Stel swEquationMgr in = swModel.GetEquationMgr

 

 Voor i = 0 To swEquationMgr.GetCount - 1

        vSplit = Splitsen(swEquationMgr.Vergelijking(i), " = ")

        vSplit(0) = Vervangen(vSplit(0), Chr(34), leeg)

        Als vSplit(0) = VARIABLE_NAME dan _

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

    volgende i

Einde Sub

 

Bedankt voor je hulp

 

JB

Hallo

Ik weet het niet Sw, ik werk onder uitvinden

 

Waarom ga je niet door een Excel-sheet die de afmetingen berekent en SW hoeft deze alleen maar bij te werken.

 

Ik zie het nut niet in van het doorlopen van macro's (tenzij je geen Excel hebt).

 

Ik heb complete trappen opgezet in Excel-sheets en elk stukje uitvinder werkt het bij met dit blad.

 

Bedankt

1 like

In welke regel kom je een fout tegen?

Franck:

Het toevoegen van de invoer van een Excel-sheet zou het systeem complexer maken en ik wil het niet zwaarder maken.

Dit alles wordt gedaan vanuit een gebruikersformulier om het interactiever te maken.

 

Het punt is dat er geen bugs zijn, de macro wordt gerealiseerd en er verandert niets...

Probeer de _ van de regel te verwijderen:

Als vSplit(0) = VARIABLE_NAME Dan _

 

en zet 

 

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

 

op de volgende regel, gevolgd door een "Einde als"

 

Zet dan een punt achter deze regel

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

 

Stopt je macro?

 

Anders moet je alle waarden van je vSplit(0) doorlopen, bijvoorbeeld met een debug.print of meer met een msgbox!

Het werkt dus lukraak...

 

Ik merkte dat wanneer ik ga in het beheer van vergelijkingen, als de geactiveerde cel bijvoorbeeld: =90 van de hoogte is. Ik zet OK om de doos te sluiten.

 

Ik voer de macro uit en ik krijg in mijn msgbox:

Hoogte  (d.w.z. wat wordt gezocht)

en Lengte = 70

Breedte = 95

...

(voorbeeld op bijgevoegde afbeelding)

Als het de = 70 van lengte is, krijg ik hoogte = 90 en  lengte

 

 

Huidige code:

const VARIABLENAME As String = "Hoogte"
Const NEW_VALUE As String = "70"

 

    Voor i = 0 To swEquationMgr.GetCount - 1
        vSplit = Splitsen(swEquationMgr.Vergelijking(i), " = ")
        vSplit(0) = Vervangen(vSplit(0), Chr(34), leeg)
        
        MsgBox vSplit(0)
        Als vSplit(0) = VARIABLENAME Dan
            swEquationMgr.Equation(i) = Vervangen(swEquationMgr.Equation(i), vSplit(1), NEW_VALUE)
        Einde als
    volgende i


capture.png

Misschien een syntaxisprobleem?

 

Probeer een lcase (kleine letter = kleine letters) of ucase (hoofdletter = hoofdletters) voor je twee variabelen

 

VARIABLENAME en vSplit(1).

 

En je kunt een andere op je taxus zetten om daar een breekpunt te plaatsen en kijken in welk geval het niet werkt.

Ik begreep niet helemaal hoe ik de code moest schrijven...

Aldus?

VARIABLENAME = LCase(kleine letters = kleine letters)

 

Ik heb de naam van vSplit(0) gesorteerd in Nom_eq zodat ik Hoogte had en niet Hoogte = 90

Hier is mijn code

NB = Len(VARIABELENAAM)

 

Voor i = 0 To swEquationMgr.GetCount - 1

    vSplit = Splitsen(swEquationMgr.Vergelijking(i), " = ")

    MsgBox vSplit(0)

    vSplit(0) = Vervangen(vSplit(0), Chr(34), leeg)

    Nom_eq = Links(vSplit(0), NB)

 

    Als Nom_eq = VARIABELENAAM Dan

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

        "MsgBox vSplit(1)

    Anders

    Einde als

volgende i

 

Maar ik heb een bug die op de lijn wordt weergegeven

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

(bijlage)

 

JB


capture2.png

Hoi allemaal.

 

bericht 1/2:

Een beetje in een macro kan het onbruikbaar maken! JB, ik heb naar je macro gekeken en de zandkorrel zit in het codefragment [vSplit=Split(swEqua.equation(i), " = ")] en meer specifiek in [" = "].

Uitleg: De vergelijkingen van een SW-model zijn alfanumerieke tekenreeksen en, zoals alle tekenreeksen, kunnen ze worden gemanipuleerd door VBA-functies die aanwezig zijn in Word, Excel, Access, .... en SW.

Voor uw code neemt de functie Splitsen de inhoud van de i-de vergelijking [swEqua.equation(i)], splitst deze in tweeën op het niveau van [" = "], en aangezien vSplit een variant is, wordt vSplit(0) automatisch toegewezen aan de linkerkant van [" = "] en vSplit(1) wordt automatisch toegewezen aan de rechterkant van [" = "].

Het is voor [" = "] dat de bodem pijn doet, omdat een SW-vergelijking zowel ""D1@Ext"=50+20" als ""D1@Ext" = 50 + 20" of ""D1@Ext"    =    50    +    20" kan zijn. Ik schrijf dit woord met een tekstverwerker en als ik het gebruik, vraag ik altijd om niet-afdrukbare tekens weer te geven. Dit stelt me in staat om niet alleen de vier spaties aan weerszijden van het gelijkteken van het schrijven van de laatste vergelijking (die hierboven) te zien, maar ook te tellen. SW, het kan hem niet schelen of beter gezegd beheert hij deze overbodige of niet-aanwezige ruimtes. Conclusie, de manipulator kan een vergelijking toevoegen door uitwerpselen achter te laten (dubbele, driedubbele spaties), maar je zult ermee moeten omgaan, en vooral rekening houden met dit netelige probleem in je programmering (je code). In een ander bericht werd mijn code herzien, uitgebreid en becommentarieerd in de vorm van een Sub (functie) met de naam 'ChangeVariableValueInQuaAndRebuildPart' die je hier aanroept met een andere Sub met de naam 'try01'. De functie 'ChangeVariableValueInQuaAndRebuildPart' vereist twee argumenten die ik 'VarName' en 'ValVar' heb genoemd.

Opmerking: Ik voeg in een ander bericht een proefstuk toe dat moet worden geopend (het bevat de afmetingen "D1@Ext" en "D1@Esq").

 

A+

1 like

Hallo weer, hier is mijn code en het testgedeelte als voorbeeld

 

 

Sub essay01()

  ChangeVariableValueInQuaAnd RebuildPart "D1@Ext", "80"

  ChangeVariableValueInQuaAndRebuildPart "D1@Esq", "44.6"

Einde Sub

 

Sub ChangeVariableValueInQuaAndRebuildPart(NomVar als string, ValVar als string)

 Opmerking: een vergelijking is een alfanumerieke tekenreeks en wordt als zodanig behandeld met de gebruikelijke VBA-functies.

 "Aangifte objecten *****************************

  Dim swApp als SldWorks.SldWorks

  Dim swModel als SldWorks.ModelDoc2

  Dim swEquaMgr Als SldWorks.EquationMgr

 

 'Toewijzing van objecten*****************************

  Stel swApp = Application.SldWorks    ' swApp is nu een object dat de SW-applicatie bevat.

  Stel swModel in = swApp.ActiveDoc       ' SwModel is nu een object dat het actieve model (onderdeel of assemblage) SW bevat.

  Set swEqua = swModel.GetEquationMgr ' swEquaMgr is nu een object dat de verzameling vergelijkingen van het model bevat die aanwezig is in feature manager.

 

 "Verklaring van lokale variabelen******************

  Dim NumEqua als geheel getal 'NumEqua is het getal van de vergelijking

  Dim NbEqua als geheel getal  'NbEqua is het aantal vergelijkingen. Als NbEqua=0 dan is er een vergelijking, als NbEqua=1 dan zijn er 2 vergelijkingen, als NbEqua= -1 dan is er geen vergelijking.

  Dim ChScind Als Variant 'ChScind is een Split Chain.

  Const Title01 As String = "Constat   (MC)"

 Variabele toewijzing

  NbEqua = swEqua.GetCount - 1

 

 "Werkwijze 

    Voor NumEqua = 0 TB NbEqua' Voor NumEqua variërend van 0 tot NbEqua (standaard in stappen van 1)

         ChScind = Split(swEqua.equation(NumEqua), "=") 'ChScind(0) bevat nu het deel van de vergelijking links van het "=" teken. ChScind(1) bevat nu het deel van de vergelijking rechts van het "=" teken

         ChScind(0) = Replace(ChScind(0), Chr(34), Empty) 'Systematische vervanging van het eerste en laatste teken van Scind(0) (met ascii nummer 34) door niets (leeg), met andere woorden we verwijderen alle chr(34) ["] van Scind(0) (dit is een opmaakconditionering van de volgende test).

         ChScind(0) = Replace(ChScind(0), Chr(32), Empty) 'Systematische vervanging van de tekens van Scind(0) (met het ascii-nummer 32) door niets (leeg), met andere woorden we verwijderen alle spaties [" "] van Scind(0) (dit is een opmaakconditionering van de volgende test).

         Als ChScind(0) = VarName, dan

             swEqua.vergelijking(NumEqua) = Vervangen(swEqua.vergelijking(NumEqua), ChScind(1), ValVar)

             Als swModel.EditRebuild3() Dan' als de herbouw van het onderdeel waar retourneert, dan

                 MsgBox "Gereconstrueerd onderdeel met nieuwe waarde in vergelijking!", vbInformation, Title01

              Anders' anders

                 MsgBox "Gewijzigde vergelijking maar gedeeltelijke reconstructiefout!", vbInformation, Title01

             Einde Als 'einde van als

             Exit Sub ' verlaat deze Sub

         Einde als

    Volgende NumEqua

   

    Als NbEqua = -1 dan

        MsgBox "Er is geen vergelijking geassocieerd met het model!", vbExclamation, Title01

    Anders

        MsgBox "Geen aanpassing van de vergelijking mogelijk!" & Chr$(13) & Chr$(13) & "'" & "'" & " werd in geen van hen gevonden.", vbExclamation, Title01

    Einde als

   

Einde Sub 'einde van sub

 

A+


part_essai01.sldprt
1 like

Hallo Maxime,

 

Je programma werkt geweldig!

Wat ik wil doen is meer de variabelen wijzigen om de veranderingen te verlichten (bijlage)

In de tussentijd is het me gelukt om mijn code aan de praat te krijgen:

 

Subbeheer ()

'Hoogte
Nom_cote = "Hoogte"
Val_cote = UserForm1.Tekstvak2.Waarde
Oproep Test

'Breedte...

'Diepte...

'Dikte...

Einde Sub

 

Sub Test()

Dim swApp           als SldWorks.SldWorks

Dim deel            als SldWorks.ModelDoc2

Dim swModel         als SldWorks.ModelDoc2

Dim swEquationMgr   als SldWorks.EquationMgr

Dim i               als geheel getal

Dim vSplit          als variant

Dim NB              als geheel getal

Dim Nom_eq          als snaar

Dim OLD_VALUE       als geheel getal

 

Stel swApp = Toepassing.SldWorks in

Deel instellen = swApp.ActiveDoc

Stel swModel = swApp.ActiveDoc in

Stel swEquationMgr in = swModel.GetEquationMgr

NB = Len(Nom_cote)

 

Voor i = 0 To swEquationMgr.GetCount - 1

    vSplit = Splitsen(swEquationMgr.Vergelijking(i), " = ")

    vSplit(0) = Vervangen(vSplit(0), Chr(34), leeg)

    Nom_eq = Links(vSplit(0), NB)

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

    Als Nom_eq = Nom_cote Dan

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

    Anders

    Einde als

volgende i

boolstatus = Deel.EditRebuild3()
Einde Sub

 

Zoals ik heb uitgelegd, werkt het, maar ik ben bang dat dit hacken beperkt zal zijn.

 

En bedankt voor je hulp op de verschillende forums!


equations.zip

Hoi JB,

 

Waarom zou je het ingewikkeld maken als je het ook simpel kunt maken!

 

Subbeheer ()

Beheer van de bodemhoogte
als Test "Hoogte",UserForm1.TextBox2.Value dan

        boolstatus = Part.EditRebuild3() 'Als de test True retourneert, dan wordt het deel opnieuw opgebouwd

anders

        msgbox "Probleem"

Eindigen als

' Rq: klik achter de 't' in Test en typ een spatie om te zien dat Test in een tooltip twee argumenten vraagt, gescheiden door een komma (hulp bij het prog.). Op deze manier kan de test zonder problemen in een andere module zitten.

'Breedte...

'Diepte...

'Dikte...

Einde Sub

 

Subtest (NomVar als snaar, ValVar als snaar) als Bolean

Dim swApp als SldWorks.SldWorks

Dim deel als SldWorks.ModelDoc2

Dim swModel als SldWorks.ModelDoc2

Dim swEquationMgr als SldWorks.EquationMgr

Dim i als geheel getal

Dim vSplit als variant

 

Stel swApp = Toepassing.SldWorks in

 

Deel instellen = swApp.ActiveDoc

Stel swModel = swApp.ActiveDoc in

Stel swEquationMgr in = swModel.GetEquationMgr

 

Test=Onwaar

Voor i = 0 To swEquationMgr.GetCount - 1'Weet dat bij elke uitwisseling swEquationMgr.GetCount - 1 opnieuw wordt berekend. Het is beter om een lokale variabele te gebruiken zoals in mijn macro

    vSplit = Split(swEquationMgr.Equation(i), "=") ' Ik heb de spaties aan elke kant van het gelijkteken verwijderd!!

    vSplit(0) = Replace(vSplit(0), Chr(34), Leeg) 'Ik vervang de aanhalingstekens in split(0) door niets

    vSplit(0) = Replace(vSplit(0), Chr(32), Empty) 'Ik vervang de spaties in split(0) door niets (dat kan ik, want de naam van een dimensie is noodzakelijkerwijs een string zonder spaties!!)

    Als Split(0) = VarName, dan

        swEquationMgr.Equation(i) = Replace(swEquationMgr.Equation(i), Split(1), ValVar) 'Ik vervang Split(1) (de waarde van de variabele NomVar door de waarde ValVar.

         Test=Waar

         Exit sub 'redeneren door het absurde, als er 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    Einde als

volgende i


Einde Sub

 

Er kunnen fouten zijn die ik net snel heb getypt zonder te testen!!

 

Groeten MC