| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
 | SIMULIA Regional User Meeting 2025 | 5.-7. Mai in Bamberg, eine Veranstaltung am 05.05.2025
|
Autor
|
Thema: Frage zur SolidWorks-API (put_Transform2) (3656 mal gelesen)
|
UncleJ Mitglied Werksstudent
 Beiträge: 9 Registriert: 16.12.2007 Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business
|
erstellt am: 04. Aug. 2008 11:35 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich versuche im Rahmen einer Studienarbeit eine Anwendung zu erstellen, die anhand vorgegebener oder per Benutzereingabe vorgegebene Bewegungen in Solidworks ausführt. Das Problem dabei ist, dass die API nicht die gewünschte Bewegung ausführt. Es soll eine Rotation um die y-Achse erfolgen, jedoch erfolgt die Rotation um irgendeine Achse in der x-z-Ebene - je nach Position (siehe Anhang). Ich verwende den folgenden Code: Code:
IMathUtility* pMathUtility = NULL; IMathPoint* pMathPoint; IMathVector* pMathVector; double dAngle; double dArrayDataPoint[3]; double dArrayDataVector[3]; HRESULT hr = S_OK; dArrayDataPoint[0] = -1250.0; dArrayDataPoint[1] = 0.0; dArrayDataPoint[2] = 5250.0; dArrayDataVector[0] = 0.0; dArrayDataVector[1] = 1.0; dArrayDataVector[2] = 0.0; dAngle = 30.0; hr = swApp->IGetMathUtility(&pMathUtility); hr = pMathUtility->ICreateVector(dArrayDataVector, &pMathVector); hr = pMathUtility->ICreatePoint(dArrayDataPoint, &pMathPoint); hr = pMathUtility->ICreateTransformRotateAxis( pMathPoint, pMathVector, dAngle, &pXform ); hr = pSldWorks->get_IActiveDoc2(&(pModelDoc)); if(hr == S_OK) { hr = pModelDoc->get_ISelectionManager(&pSelectionManager); hr = pSelectionManager->IGetSelectedObjectsComponent2(1, &pComponent); hr = pModelDoc->QueryInterface(IID_IAssemblyDoc, (LPVOID *)&(pAssemblyDoc)); if(hr == S_OK) { hr = pComponent->put_Transform2(pXform); hr = pModelDoc->Rebuild(3); hr = pAssemblyDoc->UpdateBox(); hr = pComponent->Select(FALSE, &retval); pAssemblyDoc->Release(); } pComponent->Release(); pSelectionManager->Release(); pModelDoc->Release(); }
Habe ich irgendeinen Grundlegenden Fehler gemacht oder einen Denkfehler? Vielen Dank schon einmal im Voraus für Eure Hilfe. Mit freundlichen Grüßen Jörg Eichhorn P.S.: Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business [Diese Nachricht wurde von UncleJ am 04. Aug. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 04. Aug. 2008 14:36 <-- editieren / zitieren --> Unities abgeben:          Nur für UncleJ
Hallo Jörg, wenn du ein Bauteil drehen (oder verschieben oder...) möchtest, dann benötigt man eine Transformationsmatrix. Ein Bauteil im Raum wird aber auch in seiner Position und Lage durch eine Transformationsmatrix definiert. Eine solche, ich nenne sie mal "Positionsmatrix" kannst du z.B. durch "Component2.GetTotalTransform" auslesen. Wenn Du die Komponente drehen möchtest musst du also auf die "Positionsmatrix" die Drehmatrix anwenden. Einfach die Matrizen multiplizieren (MathTransform.Multiply ( transformIn )). Achte aber auf die Reihenfolge. Das Ergebniss ist deine neue "Positionsmatrix" die du dann mit z.B. "put_Transform" setzen kannst. Gruß Oliver ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UncleJ Mitglied Werksstudent
 Beiträge: 9 Registriert: 16.12.2007 Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business
|
erstellt am: 04. Aug. 2008 22:24 <-- editieren / zitieren --> Unities abgeben:         
Hallo Oliver, ich habe es mal mit deinem Tipp probiert und den Code Code:
hr = pComponent->put_Transform2(pXform); hr = pModelDoc->Rebuild(3); hr = pAssemblyDoc->UpdateBox(); hr = pComponent->Select(FALSE, &retval); pAssemblyDoc->Release();
durch folgendes ersetzt: Code:
hr = pComponent->GetTotalTransform(TRUE, &pPosition); hr = pPosition->IMultiply(pXform, &pResult); hr = pComponent->put_Transform2(pResult); pPosition->Release(); pResult->Release(); hr = pModelDoc->Rebuild(3); hr = pAssemblyDoc->UpdateBox(); hr = pComponent->Select(FALSE, &retval); pAssemblyDoc->Release();
Leider trat danach auch nicht der gewünschte Erfolg ein. Die ersten paar Durchläufe passierte garnichts, dann irgendwann mal wieder eine Rotation und eine Achse in der x-z-Ebene und auf einmal war die Componente weg. CU Jörg! :-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SLDW-FEM Mitglied Simulations-Ingenieur
  
 Beiträge: 643 Registriert: 21.02.2005 Solidworks 2017+2019+20+22 SpaceClaim Windows 11 64bit HP-ZBook 32gbRAM NVIDIA
|
erstellt am: 05. Aug. 2008 09:35 <-- editieren / zitieren --> Unities abgeben:          Nur für UncleJ
Hallo, nur mit Textangaben können wir Dir wohl nicht helfen deshalb schlage ich vor : (A) Du stellst Deine assembly mal hier rein (oder an mich per private message) (B) kennst Du diese Referenzen? (API-Hilfe) : Use Presentation Transforms to Move Component Example (VB) Mathematische Grundlagen => transformation-matrix.png OpenGL-Pipeline und Überlagern(matrixzen-Multiplik.)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UncleJ Mitglied Werksstudent
 Beiträge: 9 Registriert: 16.12.2007 Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business
|
erstellt am: 05. Aug. 2008 17:48 <-- editieren / zitieren --> Unities abgeben:         
Hallo, im Anhang ist dann mal die Assembly (Ich hoffe Sie lässt sich öffnen, da sie ja mit einer Studenten Version erstellt wurde). Ich habe immer versucht das Teil "Drehgestell" rotieren zu lassen. Die Referenz "Use Presentation Transforms to Move Component Example (VB)" kenne ich und hatte ich auch schon versucht, jedoch mit ähnlichem Erfolg - leider kam noch hinzu, dass meine Menüleisten gesperrt blieben und nicht wieder freigegeben wurden nachdem der Präsentationsmodus verlassen wurde. Das mit den kompletten Grundlagen (siehe "transformation-matrix.png") war mir teilweise neu - dachte bzw. hatte die Hilfe so verstanden, dass man die Transformation direkt auf das Teil anwenden kann, da ja Fußpunkt der Rotation, Rotationsachse und Winkel übergeben wurden. [Diese Nachricht wurde von UncleJ am 05. Aug. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kalleB Mitglied
 Beiträge: 1 Registriert: 09.08.2008
|
erstellt am: 09. Aug. 2008 11:00 <-- editieren / zitieren --> Unities abgeben:          Nur für UncleJ
|
UncleJ Mitglied Werksstudent
 Beiträge: 9 Registriert: 16.12.2007 Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business
|
erstellt am: 11. Aug. 2008 17:23 <-- editieren / zitieren --> Unities abgeben:         
Danke für den Hinweis, hatte ich echt vergessen, aber das Resultat bleibt gleich - nicht die gewollte Rotation. Das ausgewählte Bauteil verschwindet bei dem ersten Durchlauf sofort und ist nicht mehr auffindbar. Habs jetzt auch nochmal genau wie in der Referenz "Use Presentation Transforms to Move Component Example (VB)" versucht - entsprechend mit meiner Rotationsmatrix. Sowohl bei der Multiplikation mit der von Oliver angesprochenen "Positionsmatrix" als auch ohne, erhalte ich das gleiche Ergebnis - Bauteil verschwunden. [Diese Nachricht wurde von UncleJ am 11. Aug. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 11. Aug. 2008 18:20 <-- editieren / zitieren --> Unities abgeben:          Nur für UncleJ
Hallo Jörg, manchmal sind diese matrizen etwas störrisch. ich würde erstmal alle verknüfungen an dem bauteil löschen, falls es denn welche hat. dannach würde ich mit GetTotalTransform(TRUE, &pPosition) und GetTotalTransform(FALSE, &pPosition) mir die matrizen mal anschauen und dann schritt für schritt diese mal ändern oder zuerst einfach mal die einheitsmatrix übergeben mit position auf (0,0,0). Dannach mal ein wenig verschieben und erst am ende die rotation mit reinbringen. oder am ende nochmal GetTotalTransform aufrufen und schauen wo dein bauteil den liegt und was passiert ist. Transformationsmatrix (Positionsmatrix): 1. Zeile Richtung der x-Achse 2. Zeile Richtung der y-achse 3. Zeile Richtung der z-Achse (alle drei sollten eigentlich die länge 1 haben) 4. Zeile Position Ursprung Gruß Oliver
------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UncleJ Mitglied Werksstudent
 Beiträge: 9 Registriert: 16.12.2007 Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business
|
erstellt am: 24. Aug. 2008 20:01 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich habe mal versucht die Matrix nach dem Erstellen auszulesen, aber irgendwie kommt - auch wenn ich die Einheitsmatrix erstelle - mit dem Befehl "get_IArrayData" immer nur eine Matrix mit lauter "0.0" außer bei dem ersten Feld (erste Zeile, erste Spalte -> "1.0") raus. Ich hatte zwischenzeitlich auch mal versucht die Matrix über "put_IArrayData" zu erstellen, aber die Matrix, die dabei entstand war gleich. Hätte ich nicht eigentlich wieder die übergebene Matrix - also die Diagonale mit den "1.0" - erhalten müssen? Der Versuch eine manuell über das CAD ausgeführte Transformation mit "get_Transform2" auszulesen, ergab auch eine Matrix bei der nur das erste Feld ausgefüllt und der Rest mit "0.0" belegt war. Nachdem ich die Verknüpfungen entfernt hatte und das ganze trotzdem mal durchlaufen lassen habe, gab es wieder das gleiche Resultat im Modell wie vorher. CU Jörg! :-) [Diese Nachricht wurde von UncleJ am 24. Aug. 2008 editiert.] [Diese Nachricht wurde von UncleJ am 24. Aug. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 25. Aug. 2008 09:54 <-- editieren / zitieren --> Unities abgeben:          Nur für UncleJ
hi, aus eigener erfahrung kann ich nur sagen, dass es fast immer ein fehler im code ist und nur ganz selten ein bug in SW ist. hier mal ein kleines makro als beispiel, welches ein bauteil verschiebt und um die y-achse dreht. Code: Dim swApp As SldWorks.SldWorks Dim swDoc As SldWorks.ModelDoc2 Dim swMathUtil As SldWorks.MathUtility Const PI As Double = 3.14159 Const RadPerDeg As Double = PI / 180#Sub main() Set swApp = CreateObject("SldWorks.Application") Set swMathUtil = swApp.GetMathUtility Set swModel = swApp.ActiveDoc Set swSelMgr = swModel.SelectionManager Dim comp As SldWorks.Component2 Dim trf As SldWorks.MathTransform Set comp = swSelMgr.GetSelectedObjectsComponent3(1, -1) Set trf = comp.Transform2 'so geht es auch Set trf = comp.GetTotalTransform(False) If Not trf Is Nothing Then MsgBox "x=" + Str(trf.ArrayData(0)) + "," + Str(trf.ArrayData(1)) + "," + Str(trf.ArrayData(2)) MsgBox "y=" + Str(trf.ArrayData(3)) + "," + Str(trf.ArrayData(4)) + "," + Str(trf.ArrayData(5)) MsgBox "z=" + Str(trf.ArrayData(6)) + "," + Str(trf.ArrayData(7)) + "," + Str(trf.ArrayData(8)) MsgBox "pos=" + Str(trf.ArrayData(9)) + "," + Str(trf.ArrayData(10)) + "," + Str(trf.ArrayData(11)) Else MsgBox " comp.Transform2=nothing" End If 'Verschiebe bauteil nach 0,0,0 '!!!!!!!!!!!!!!!!!!!! trf.ArrayData (9)=0# ... funktioniet nicht, geht nur mit trf.SetData !!!!!!!!!!!!!!! Dim vxVector As Variant Dim xVector(2) As Double xVector(0) = trf.ArrayData(0) xVector(1) = trf.ArrayData(1) xVector(2) = trf.ArrayData(2) vxVector = xVector Dim swX As SldWorks.MathVector Set swX = swMathUtil.CreateVector((vxVector)) Dim vyVector As Variant Dim yVector(2) As Double yVector(0) = trf.ArrayData(3) yVector(1) = trf.ArrayData(4) yVector(2) = trf.ArrayData(5) vyVector = yVector Dim swY As SldWorks.MathVector Set swY = swMathUtil.CreateVector((vyVector)) Dim vzVector As Variant Dim zVector(2) As Double zVector(0) = trf.ArrayData(6) zVector(1) = trf.ArrayData(7) zVector(2) = trf.ArrayData(8) vzVector = zVector Dim swZ As SldWorks.MathVector Set swZ = swMathUtil.CreateVector((vzVector)) Dim vpVector As Variant Dim pVector(2) As Double pVector(0) = 0# pVector(1) = 0# pVector(2) = 0# vpVector = pVector Dim swP As SldWorks.MathVector Set swP = swMathUtil.CreateVector((vpVector)) trf.SetData swX, swY, swZ, swP, 1# ret = comp.SetTransformAndSolve2(trf) Set trf = comp.Transform2 MsgBox "new pos=" + Str(trf.ArrayData(9)) + "," + Str(trf.ArrayData(10)) + "," + Str(trf.ArrayData(11)) 'Drehung um y-achse Dim nPts(2) As Double nPts(0) = 0# nPts(1) = 0# nPts(2) = 0# vData = nPts Set swOriginPt = swMathUtil.CreatePoint(vData) nPts(0) = 0# nPts(1) = 1# nPts(2) = 0# vData = nPts Set swY_Axis = swMathUtil.CreateVector(vData) Set swXForm = swMathUtil.CreateTransformRotateAxis(swOriginPt, swY_Axis, 30# * RadPerDeg) Set newTrf = trf.Multiply(swXForm) 'ret = comp.SetTransformAndSolve2(swXForm) geht, aber bringt nicht das gewünschte ergbnis!!! ret = comp.SetTransformAndSolve2(newTrf) End Sub
Gruß Oliver ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Torsten Niemeier Ehrenmitglied V.I.P. h.c. Maschinenbau Ingenieur

 Beiträge: 3743 Registriert: 21.06.2001 "ZUSE I.36", 8 BIT, 32 Lämpchen, Service-Ölkännchen "ESSO-Super", Software: AO auf Kuhlmann-Parallelogramm-Plattform ** CSWP 04/2011 ** ** CSWE 08/2011 **
|
erstellt am: 26. Aug. 2008 18:30 <-- editieren / zitieren --> Unities abgeben:          Nur für UncleJ
Hallo, meine Vermutung: Du hast die Koordinaten in mm angegeben, aber SWX verlangt an dieser Stelle die Angabe in m. Das Teil rotiert damit um einen Punkt, der ein paar Kilometer weit weg ist. Gruß, Torsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UncleJ Mitglied Werksstudent
 Beiträge: 9 Registriert: 16.12.2007 Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business
|
erstellt am: 26. Aug. 2008 21:49 <-- editieren / zitieren --> Unities abgeben:         
Hallo Torsten, danke für den Tipp - das ist auf jeden Fall schonmal ein guter Ansatz, da ich wirklich dachte, dass der Wert in mm angegeben werden muss und ich somit statt 5250mm wohl 5250m als Abstand vom Ursprung angegeben hab. Das erklärt dann auch, dass er meint das Teil wäre nach der Rotation beim neu auflösen mehrere Hunderttausend oder mehr mm weg. Werd das Donnerstag mal checken, wenn ich wieder Zeit hab. Danke schonmal. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |