| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: TransformBy für Point3D (1480 mal gelesen)
|
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 16:25 <-- editieren / zitieren --> Unities abgeben:
Hallo, habe folgende Frage: Ich muss nach wie vor einen Punkt vom WCS in ein benutzerdefiniertes Koordinatensystem umwandeln, da ich die Daten für meinen Export so brauche. Ich habe in der angehängten Zeichnung das beschrieben, wie ich es haben möchte. Ich habe in der Klasse Point3D die Funktion TransformBy gefunden, die eine Matrix von mir haben möchte. Meine Frage: Wie erzeuge ich eine solche Materix damit ich das gewünschte Ergbnis erhalte? ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Mrz. 2009 17:39 <-- editieren / zitieren -->
Hi Benny, hilft Dir das? Fragt nach einem Punkt und zeigt Dir dann die Koordianten lt. WCS und lt UCS Code: Dim tPntRes As EditorInput.PromptPointResult = tAcadDoc.Editor.GetPoint(vbNewLine & "Punkt zeigen: ") If tPntRes.Status = EditorInput.PromptStatus.OK Then Debug.Print("Im WCS: " & tPntRes.Value.ToString) Dim tPnt2 As Geometry.Point3d = tPntRes.Value.TransformBy(tAcadDoc.Editor.CurrentUserCoordinateSystem) Debug.Print("Im UCS: " & tPnt2.ToString) Else 'kein punkt gewaehlt oder abgerochen End If
- alfred - [EDIT]sorry, obiger code ist verkehrt, weil GetPoint die Koordinaten lt. UCS retourniert, im Grund kannst Du aber, wenn Du den Punkt im WCS von der Linie bekommst, dann einfach schreiben: .TransformBy(tAcadDoc.Editor.CurrentUserCoordinateSystem.Inverse) [/EDIT] ------------------ www.hollaus.at
[Diese Nachricht wurde von a.n. am 10. Mrz. 2009 editiert.] |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Mrz. 2009 17:51 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, ich glaube schon dass mir das hilft. Nur ist hier vorausgesetzt, dass der Benutzer das benutzerdefinierte UCS selbst schon erzeugt hat. Und genau das möchte icht nicht haben. Ich möchte automatisch evt. mittels 3 Punkten ein UCS erzeugen, nur habe ich das nocht nicht hingekriegt. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Mrz. 2009 18:22 <-- editieren / zitieren -->
Hi Benny, gehört noch gefeilt, dass gleich Punkte herangezogen werden, die rechte Winkel ergeben, aber das wäre mal ein Beispiel (meldet noch Fehler, wegen nicht-senkrecht zueinanderstehender Achsangaben, zeigt aber Vorgehensweise) Code: Public Shared Sub CADde_createUCS() Dim tAcadDoc As ApplicationServices.Document = Nothing Try tAcadDoc = ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim tCCSys As Geometry.CoordinateSystem3d = tAcadDoc.Editor.CurrentUserCoordinateSystem.CoordinateSystem3d 'current coordinate system Dim tPntOrig As Geometry.Point3d = New Geometry.Point3d(10, 20, 30) 'origin of ucs Dim tPntXDir As Geometry.Point3d = New Geometry.Point3d(25, 25, 45) 'punkt, der x-richtung zeigt Dim tPntYDir As Geometry.Point3d = New Geometry.Point3d(25, 40, 45) 'punkt, der x-richtung zeigt Dim tVecX As Geometry.Vector3d = (tPntXDir - tPntOrig).GetNormal Dim tVecY As Geometry.Vector3d = (tPntYDir - tPntOrig).GetNormal Dim tCoordSys As Geometry.CoordinateSystem3d = New Geometry.CoordinateSystem3d(New Geometry.Point3d(10, 20, 30), tVecX, tVecY) Dim tCoordMat As Geometry.Matrix3d = New Geometry.Matrix3d tCoordMat = Geometry.Matrix3d.AlignCoordinateSystem(tCCSys.Origin, tCCSys.Xaxis, tCCSys.Yaxis, tCCSys.Zaxis, tCoordSys.Origin, tCoordSys.Xaxis, tCoordSys.Yaxis, tCoordSys.Zaxis) tAcadDoc.Editor.CurrentUserCoordinateSystem = tCoordMat Catch ex As Exception Call MsgBox("Fehler aufgetreten" & vbNewLine & ex.Message) End Try End Sub
- alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 10. Mrz. 2009 editiert.] |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 11. Mrz. 2009 17:16 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, ich hätte da noch eine Frage: Eigentlich brauche ich dieses UCS nur um die Matrix herauszukriegen, damit ich meine Punkte umrechnen kann. Meine Frage: Kann ich anhand von meinen 3 Punkten (Ursprungspunkt, Punkt auf X - Achse, Punkt in Y - Richtung) eine Matrix definieren ohne den Umweg über das UCS zu machen? ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 11. Mrz. 2009 18:57 <-- editieren / zitieren -->
Hi Benny, Zitat: Eigentlich brauche ich dieses UCS nur um die Matrix herauszukriegen
...jetzt nähern wir uns;) Matrix-Definitionen sind fast eine eigene Wissenschaft, da wird's jetzt leider (von meiner Seite) wenig Source geben, da das einigermaßen intensiv (zeitaufwendig) ist und ich bisher nicht so gearbeitet habe (verwende Matrix-Funktionen lediglich um Objekte zu schieben, drehen oder skalieren, und da gibt's vorbereitete Funktionen dafür Geometry.Matrix3d.Displacement Geometry.Matrix3d.Rotation Geometry.Matrix3d.Scale und auf die schnelle bin ich (auch am gestrigen Beispiel zu ersehen) nicht zu dem Punkt gekommen, dass die Ausgangsvektoren senkrecht zueinander stehen, ist eine Menge Vektoren-Rechnung, das übersteigt die Zeit, die ich hier investieren kann, nicht böse sein. Solange Deine Geometrie-/Punktexportfunktion nicht auch noch skaliert wird, kannst Du mit einer leeren Matrix beginnen und dann in Einzelschritten mit obigen Funktionen 'hinbiegen', sprich mit Displacement schiebst Du's zu Deinem Ursprung, dann drehst Du's einmal um die X-Achse, einmal um die Y-Achse (wenn überhaupt noch notwendig, denn Dein BKS in der Musterzeichnung war doch senkrecht ausgerichtet) und dann sollte diese definiert sein. Beispiel:
Code: Dim tMatrix As Geometry.Matrix3d = New Geometry.Matrix3d tMatrix = Geometry.Matrix3d.Rotation(Math.PI / 2, New Geometry.Vector3d(0, 1, 0), Geometry.Point3d.Origin) tMatrix = tMatrix * Geometry.Matrix3d.Displacement(New Geometry.Vector3d(10, 10, 10))
Wichtig zu beachten sind die Reihenfolgen des Aufbaus, diese sind nicht tauschbar bzw. liefern unterschiedliche Ergebnisse!!- alfred - - alfred - ------------------ www.hollaus.at |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 12. Mrz. 2009 12:13 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, so langsam glaub ich verstehe ich ungefähr so vielleicht ein bisschen irgendwie wie die Matrix funktioniert. Jedenfalls besten Danke für deine Hilfe!! ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|