| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Technikerschüler der staatlichen Feintechnikschule Schwenningen zu Besuch bei SolidCAM GmbH in Schramberg |
Autor
|
Thema: API - Punktverschiebung berechnen (1850 mal gelesen)
|
Thisoft Mitglied Konstrukteur
Beiträge: 178 Registriert: 10.04.2010
|
erstellt am: 04. Nov. 2014 07:16 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen allerseits, folgende Aufgabestellung möchte ich per Makro lösen: Ich habe die Koordinaten eines Punktes und möchte diesen Punkt um einen bestimmten (gegebenen) Betrag in eine Richtung die durch die Drehwinkel um die Achsen definiert ist verschieben. Und zwar möchte ich diesen Punkt eigentlich nur berechnen - nicht konstruieren lassen. Das müsste doch mit Math.Transform o.ä. Methoden machbar sein - oder? Ich hab's bisher nur noch nicht herausgefunden - denke ich. Oder gibt es da wirklich keinen einfacheren und eleganteren Weg als ellenlange Berechnungen über diverse Winkelfunktionen etc. Gruß Thilo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 04. Nov. 2014 09:11 <-- editieren / zitieren --> Unities abgeben: Nur für Thisoft
Hallo Thilo, ich bin mir nicht ganz sicher ob ich dir folgen: du hast einen Punkt, den möchtest du um Achsen rotieren lassen (von denen hast du die Rotationswinkel) und möchtest die sich daraus ergebene Verschiebung als Differenz(Vektor) zum ursprünglichen Punkt haben. So weit richtig? Ich fürchte, da kommst du um eine Menge Rechnerei nicht Drumherum. Wenn ich mich noch ganz dunkel an meine Mathezeit erinnere war das Drehen eines Vektors im Raum R^3 die Multiplikation von Vektor und Drehmatrix (siehe z.B. http://mathebibel.de/drehmatrix oder deutlich komplexer https://de.wikipedia.org/wiki/Eulersche_Winkel ). Um die Funktionen der MathUtil zu benutzen würde ich versuchen es so anzugehen: ich erstell mir einen Vektor für den Punkt mittels MathUtility::CreateVector, dann die Drehmatrix mittels MathUtility::CreateTransformRotateAxis und multipliziere diese mittels MathVector::MultiplyTransform - ohne es jetzt probiert zu haben sollte dabei dann der neue Punkt rauskommen. Ich hoffe dir hilft der Ansatz ein wenig weiter, in diesem Fall aber alles ohne Gewähr Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thisoft Mitglied Konstrukteur
Beiträge: 178 Registriert: 10.04.2010
|
erstellt am: 04. Nov. 2014 14:32 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, Du hast mich nicht ganz richtig verstanden. Ich versuchs nochmal zu erklären, da ich gerade aus unerfindlichen Gründen keine Anhänge hochladen kann... Ich möchte den fraglichen Punkt nicht rotieren lassen, sondern nur verschieben! Und zwar um einen bestimmten Betrag entlang eines Vektors der durch den Rotationswinkel um die Koordinatenachsen bestimmt ist. Ich befürchte zwar, dass das an der Rechnerei nicht soo viel ändert. Obwohl Dein Vorschlag mit MathUtility.CreateVector vielleicht der richtige Weg sein könnte. Allerdings fehlt mir momentan noch etwas Phantasie mit welchen Argumenten ich das "CreateVector" füttern könnte um aus den gegebenen Daten (3 Winkel und ein Betrag) einen Vektor zu erstellen Kannst Du mich da vielleicht noch etwas auf den Trichter schubsen ? Gruß Thilo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kl3tte Mitglied Student
Beiträge: 12 Registriert: 22.10.2014 Autodesk Inventor 2014 Professional 64Bit Solidworks 2014 Premium 64Bit Windows 7 Professional N 64Bit Intel Core i5 M460 @2.53Ghz 8 GB RAM ATI Mobility Radeon HD5470
|
erstellt am: 04. Nov. 2014 15:10 <-- editieren / zitieren --> Unities abgeben: Nur für Thisoft
Ich kann nur etwas Mathematisches zu beitragen: Aber pass auf, dass du bei der Drehmatrix eben nur drehst. Wenn deine Drehachse nicht im Ursprung des KOS liegt, musst du den gedrehten Vektor wieder entsprechend verschieben! Danach kannst du den neuen Vektor (der vom Ursprung zu dem theoretisch gedrehten Punkt geht) nehmen und davon den alten subtrahieren. Damit hast du die Gesamtverschiebung. Wenn du die jetzt normierst, dann musst du nur mit deinem gewuenschten Betrag/Abstand multiplizieren. Wie die Implementation in Solidworks aussieht: Keine Ahnung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 05. Nov. 2014 10:32 <-- editieren / zitieren --> Unities abgeben: Nur für Thisoft
Hallo Thilo, ohne Bildchen ist das manchmal wirklich schwierig zu erklären Zitat: Original erstellt von Thisoft: Ich möchte den fraglichen Punkt nicht rotieren lassen, sondern nur verschieben! Und zwar um einen bestimmten Betrag entlang eines Vektors der durch den Rotationswinkel um die Koordinatenachsen bestimmt ist.
Ah, hm, okay. Was du also brauchst ist ein Richtungsvektor, der durch die Rotation um zwei Achsen (vermutlich Hauptachse) erzeugt wird. Den willst du skalieren (um einen "bestimmten Betrag" zu erhalten) und das dann zu den Koordinaten deines Punktes dazu addieren. Weil mich das mathematisch einfach interessiert (und damit ich meiner Tochter sagen kann: Siehst du, selbst Matrizenrechnung braucht man hinterher im Alltag :D ) hab ich ein Beispielmakro gemacht, dass diesen Richtungsvektor ermittelt. Code:
' *********************************************************************** ' * Makro zeigt die Möglichkeit die Verschiebekoordinaten zu ermitteln, ' * die sich durch Drehung um zwei Achsen ergibt. ' * ' * Beispiel: wir möchten erst 20 Grad um Z und dann um 40 Grad um Y drehen ' * ' * 05.11.2014 Stefan Berlitz ' * http://solidworks.cad.de ' * http://swtools.cad.de ' ********************************************************************** Sub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swMathUtil As SldWorks.MathUtility Dim swOriginPt As SldWorks.MathPoint Dim swMathPoint As SldWorks.MathPoint Dim swAxis As SldWorks.MathVector Dim swTransform As SldWorks.MathTransform Dim nPts(2) As Double Dim vData As Variant Dim A_angle As Double Dim B_angle As Double Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc
Set swMathUtil = swApp.GetMathUtility ' Beispiel: wir möchten erst 20 Grad um Z und dann um 40 Grad um Y drehen, also ' setzen wir uns einen "Dummypunkt" als Einheitsvektor auf die X-Achse und wenden ' dann darauf jeweils eine Drehmatrix an (per Multiplizieren) ' zunächst erstellen wir uns unseren virtuellen Einheitspunkt, ' eine Einheit auf der X-Achse entlang nPts(0) = 1# nPts(1) = 0# nPts(2) = 0# vData = nPts Set swMathPoint = swMathUtil.CreatePoint(vData) ' dann bereiten wir die Drehmatrix vor. Dazu brauchen wir einen Ursprung im Raum, um ' den gedreht wird, dafür nehmen wir den Ursprung, damit keine relativen Verschiebungen ' mit eingebracht werden nPts(0) = 0# nPts(1) = 0# nPts(2) = 0# vData = nPts Set swOriginPt = swMathUtil.CreatePoint(vData) ' im ersten Schritt wollen wir um die Z-Achse rotieren, also erstellen wir als ' Richtungsvektor einen Einheitsvektor Richtung Z nPts(0) = 0# nPts(1) = 0# nPts(2) = 1# vData = nPts Set swAxis = swMathUtil.CreateVector(vData) ' den Winkel wollen wir der Bequemlichkeit in Winkelgrad eingeben, deswegen muss ' für das Rechnen vorher alles in RAD umgerechnet werden A_angle = 20 * 3.141592 / 180 ' daraus erzeugen wir jetzt eine Transformationsmatrix um die Achse, die durch ' den Vektor definiert wird, der im Punkt starten und um X Grad gedreht wird Set swTransform = swMathUtil.CreateTransformRotateAxis(swOriginPt, swAxis, A_angle) ' um eine aktive Drehung zu bekommen die Matrix invertieren Set swTransform = swTransform.Inverse ' nun können wir die Drehmatrix anwenden auf unseren Ausgangspunkt Set swMathPoint = swMathPoint.MultiplyTransform(swTransform) ' nur zum Debuggen 'vData = swMathPoint.ArrayData 'Debug.Print vData(0), vData(1), vData(2) ' und dasselbe Spielchen noch mal mit einer Drehung um die Y-Achse ' Richtungsvektor einen Einheitsvektor Richtung Y nPts(0) = 0# nPts(1) = 1# nPts(2) = 0# vData = nPts Set swAxis = swMathUtil.CreateVector(vData) ' den 40 Grad Winkel wieder in RAD umgerechnen B_angle = 40 * 3.141592 / 180 ' und wieder die Drehmatrix generieren, diesmal B Grad um die Y-Achse Set swTransform = swMathUtil.CreateTransformRotateAxis(swOriginPt, swAxis, B_angle) ' wie gehabt, Matrix inverteiren damit die Vorzeichen dieselben sind, wie man ' es interaktiv in SolidWorks mit "Element drehen" machen würde Set swTransform = swTransform.Inverse ' nun können wir die Drehmatrix anwenden, logischerweise auf den bereits im ' ersten Schritt bereits verdreht Punkt Set swMathPoint = swMathPoint.MultiplyTransform(swTransform) ' jetzt haben wir in den Koordinaten praktisch den Verschiebeweg des Einheitsvektors ' bei einer Drehung um A Grad um Z und B Grad um Y. ' Diesen ggf. mit der entsprechenden Skalierung (MathPoint::Scale) versehen und zu ' dem zu "verschiebenden Punkt" dazuaddieren (von Hand oder per MathPoint::AddVector) vData = swMathPoint.ArrayData Debug.Print vData(0), vData(1), vData(2) ' nur zur Anschauung wird dort ein Skizzenpunkt erzeugt, auf Millimeter runterskaliert Set skPt1 = swModel.SketchManager.CreatePoint(vData(0) / 1000, vData(1) / 1000, vData(2) / 1000) End Sub
Vielleicht geht das auch eleganter, ist aber im Prinzip das, was ich oben schon grob beschrieben hatte. Jetzt nur in echtem Code. Was hier zum Schluss rauskommt sind natürlich nur die auf den Einheitsvektor bezogenen Werte der Rotation, damit musst du für dich noch weiter machen, aber damit ist in meinen Augen die größte Hürde schon mal genommen. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian_W Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl-Ing)
Beiträge: 3189 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 05. Nov. 2014 14:41 <-- editieren / zitieren --> Unities abgeben: Nur für Thisoft
Zitat: ... selbst Matrizenrechnung braucht man hinterher im Alltag :D ...
Hallo Stefan, das ist super, ich werde dein Beispiel meinen Kindern auch vorlegen ... aber wenn wir jetzt die Lösung (Verschiebevektor) haben, können wir ja nur den auf alle Punkte anwenden, und brauchen die komplizierte Rechnung nur einmal ... *scnr* Gruß, Christian
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thisoft Mitglied Konstrukteur
Beiträge: 178 Registriert: 10.04.2010
|
erstellt am: 07. Nov. 2014 01:17 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, Du machst mir Angst! Woher weißt Du Du die Drehwinkel die ich in meinem konkreten Beispiel habe? Erst mal vielen Dank für Dein Beispiel. Da hast Du Dir ja richtig Arbeit gemacht und das so gut ausgearbeitet und kommentiert dass vielleicht sogar ich das begreifen könnte Ich habe nur im Moment wenig Zeit, mich mit solchen "Spielereien" zu beschäftigen. Aber ich hoffe dass ich am WE mich mal wieder etwas damit beschäftigen kann. Und - die Kinder anhand dieses Beispiels darauf hinzuweisen dass man den ganzen "Mist" den man büffeln muss doch irgend wann einmal braucht ist eine hervorragende Idee! Auch wenn meiner noch etwas zu kleen für dieses Beispiel ist... Erstmal Vielen Dank - bis später. Thilo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2776 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 07. Nov. 2014 06:16 <-- editieren / zitieren --> Unities abgeben: Nur für Thisoft
[OT]Hallo Thilo, Zitat: Du machst mir Angst! Woher weißt Du Du die Drehwinkel die ich in meinem konkreten Beispiel habe?
Das liegt bestimmt daran das Stefan hier eine der größeren Glaskugeln hat und sie auch noch ziemlich gut bedienen kann. Gruß Bernd[/OT] ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|