+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
+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
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!
@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
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
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
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+
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+
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!
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
Hallo weer allemaal,
sorry dat ik publiceer zonder te testen, dus ik volg het op
Dim swApp als SldWorks.SldWorks
Dim swModel als SldWorks.ModelDoc2
Sub Beheer()
assignmentPrincipalObjects
Beheer van de bodemhoogte
Als de test ("D1@Esq1", "500") dan
boolstatus = swModel.EditRebuild3()
Anders
MsgBox "Probleem"
Einde als
'Breedte...
'Diepte...
'Dikte...
Einde Sub
Sub AssignmentPrincipalObjects() 'Kan in een andere module worden geplaatst zonder PB
Stel swApp = Toepassing.SldWorks in
Stel swModel = swApp.ActiveDoc in
'Set= .....
Einde Sub
Functietest (NomVar als string, ValVar als string) als boolean 'Kan zonder PB in een andere module worden geplaatst
Dim swEquationMgr als SldWorks.EquationMgr
Dim vSplit als variant
Stel swEquationMgr in = swModel.GetEquationMgr
Test = Onwaar
Voor i = 0 To swEquationMgr.GetCount - 1
vSplit = Splitsen(swEquationMgr.vergelijking(i), "=")
vSplit(0) = Vervangen(vSplit(0), Chr(34), leeg)
vSplit(0) = Vervangen(vSplit(0), Chr(32), leeg)
Als vSplit(0) = VarName, dan
swEquationMgr.equation(i) = Vervangen(swEquationMgr.equation(i), vSplit(1), ValVar)
Test = Waar
Exit-functie
Einde als
volgende i
Functie beëindigen
Ik heb deze code net getest en snel herwerkt, het is aan jou JB om 'het op je eigen manier te zetten'.
Door gebruik te maken van functies (hier Test) met doorgevende argumenten (hier NomVar en ValVar) kunt u uw dingen in verschillende modules ordenen. Wat betreft de sub met de titel Beheer, ik kan het zien in een module van uw UserForm, om gezien te worden.
Groeten MC
Goedenavond allemaal,
Ik kom terug op de zin "Wat betreft de sub met de titel Beheer, ik kan het zien in een module van uw UserForm, om te zien." van mijn laatste woord. U moet weten dat uw [UserForm1.TextBox2.Value] (de waarde van het naambeheer 'TextBox2' van uw aangepaste naamdialoogvenster 'Userform1') geen groot bereik heeft (zie het bereik van de API-help). Het is niet bekend of u het aanroept vanuit code die in een andere module is geplaatst dan degene die is gekoppeld aan uw [UserForm1]. Nou, nu is het het geval voor een macro in Word, maar ik heb niet gecontroleerd met SW. Ten slotte zijn [UserForm1] en [TextBox2] standaardnamen, het zou verstandig zijn wanneer u een dialoogvenster maakt om ze onmiddellijk te hernoemen, bijvoorbeeld [UserForm1] hernoemen naar [BDChoisirBackground] en [TextBox2] hernoemen naar [BottomHeight]. Ik weet dat het zinnenprikkelend is, maar je code zal alleen maar duidelijker zijn.
Blije Prog
A+
MC
Spreuk
Is het normaal dat deze macro alleen werkt in een onderdeelbestand en niet in een bewerkt deel van een assembly?
De lus wordt niet gedaan in een bewerkt stuk:
Voor i = 0 To swEquationMgr.GetCount - 1
vSplit = Splitsen(swEquationMgr.Vergelijking(i), "=")
vSplit(0) = Vervangen(vSplit(0), Chr(34), leeg)
vSplit(0) = Vervangen(vSplit(0), Chr(32), leeg)
Als vSplit(0) = VarName, dan
swEquationMgr.Equation(i) = Vervangen(swEquationMgr.Equation(i), vSplit(1), ValVar)
Modif_equation = Waar
Exit-functie
Einde als
volgende i
Bedankt