Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  API - Punktverschiebung berechnen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von Thisoft an!   Senden Sie eine Private Message an Thisoft  Schreiben Sie einen Gästebucheintrag für Thisoft

Beiträge: 178
Registriert: 10.04.2010

erstellt am: 04. Nov. 2014 07:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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)



Sehen Sie sich das Profil von StefanBerlitz an!   Senden Sie eine Private Message an StefanBerlitz  Schreiben Sie einen Gästebucheintrag für StefanBerlitz

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Thisoft 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Thisoft an!   Senden Sie eine Private Message an Thisoft  Schreiben Sie einen Gästebucheintrag für Thisoft

Beiträge: 178
Registriert: 10.04.2010

erstellt am: 04. Nov. 2014 14:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von kl3tte an!   Senden Sie eine Private Message an kl3tte  Schreiben Sie einen Gästebucheintrag für kl3tte

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Thisoft 10 Unities + Antwort hilfreich

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)



Sehen Sie sich das Profil von StefanBerlitz an!   Senden Sie eine Private Message an StefanBerlitz  Schreiben Sie einen Gästebucheintrag für StefanBerlitz

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Thisoft 10 Unities + Antwort hilfreich

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)


Sehen Sie sich das Profil von Christian_W an!   Senden Sie eine Private Message an Christian_W  Schreiben Sie einen Gästebucheintrag für Christian_W

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Thisoft 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Thisoft an!   Senden Sie eine Private Message an Thisoft  Schreiben Sie einen Gästebucheintrag für Thisoft

Beiträge: 178
Registriert: 10.04.2010

erstellt am: 07. Nov. 2014 01:17    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von bk.sc an!   Senden Sie eine Private Message an bk.sc  Schreiben Sie einen Gästebucheintrag für bk.sc

Beiträge: 2776
Registriert: 18.07.2012

-Solid Works 2019 SP5
-Pro Engineer WF 3

erstellt am: 07. Nov. 2014 06:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Thisoft 10 Unities + Antwort hilfreich

[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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz