| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Objekte drehen, kopieren, verschieben (4079 mal gelesen)
|
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 09. Dez. 2008 17:19 <-- editieren / zitieren --> Unities abgeben:
Hi, verwendet VB.NET und möchte meine ausgewählten Linien drehen und verschieben. In VBA gabs da die Funktionen myLine.Move und myLine.Rotate. Sowas kann ich in .NET nicht finden. Wie kann ich trotzdem meine Objekte verschieben und drehen? Hab die Funktion TransformBy gesehen, kann mit der aber absolut nichts anfangen. ------------------ Grüsse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Dez. 2008 17:46 <-- editieren / zitieren -->
Hi Benny, und genau da hast Du schon das richtige gefunden. '<Entity>.TransformBy' ist die Lösung, damit lassen sich Verschiebungen, Skalierungen, Drehungen angeben, und diese neue Matrix (als Ergebnis) wird dann auf die Objekte angewendet. z.B. eine Verschiebung um 10|10|0 siehst so aus:
Code: Dim tMoveMat As Geometry.Matrix3d = Geometry.Matrix3d.Displacement(New Geometry.Vector3d(10, 10, 0)) call tNewObj.TransformBy(tMoveMat)
- alfred - |
Benny4 Mitglied Softwareentwickler
Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2008 WIN XP Pro SP2
|
erstellt am: 10. Dez. 2008 09:53 <-- editieren / zitieren --> Unities abgeben:
|
Silvan01 Mitglied
Beiträge: 128 Registriert: 28.04.2009 AutoCAD Civil 2009 AutoCAD Civil 2010 Visual Studio 2008
|
erstellt am: 25. Aug. 2009 14:52 <-- editieren / zitieren --> Unities abgeben: Nur für Benny4
Hallo Zusammen, habe diesen Beitrag mal ausgegraben um zu fragen wie man eine Curve (Bei mir Polylinie) z.B. 45° im Uhrzeigersinn drehen kann. Habs mal folgendermaßen probiert aber da tut sich nichts: Dim Angle as Double = 45 Dim tMoveMat As Matrix3d = Matrix3d.Rotation(Angle, New Vector3d(0, 0, 0), tCurve.StartPoint) tTrAct.GetObject(tCurve.Id, OpenMode.ForWrite, True, True) tCurve.TransformBy(tMoveMat) tAcadDoc.Editor.UpdateScreen() Kann mir jemand sagen was ich falsch mache? Grüße Silvan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 25. Aug. 2009 18:41 <-- editieren / zitieren -->
Hi, mit 'Grad' ist nix mit Winkel in der EDV. Du musst schon auf Radiant umrechnen, also <Winkel in Grad> / 180 * Math.PI und 'UpdateScreen' wirkt erst nach TransAction.Commit (glaub ich halt mal) - alfred- PS: diese beiden Dinge wären mir mal aufgefallen, ohne den Code zu probieren, ich hoffe nichts übersehen zu haben. ------------------ www.hollaus.at |
Silvan01 Mitglied
Beiträge: 128 Registriert: 28.04.2009 AutoCAD Civil 2009 AutoCAD Civil 2010 Visual Studio 2008
|
erstellt am: 26. Aug. 2009 08:51 <-- editieren / zitieren --> Unities abgeben: Nur für Benny4
Hallo Alfred, hab die beiden Sachen geändert es tut sich aber leider immer noch nichts. Bei meinem Programmablauf soll der Benutzer eine Polylinie (Das Objekt, dass gedreht werden soll) wählen und anschließend eine andere Polylinie (Mit nur 2 Punkten). Danach soll meine zuerst gewählte Polylinie sich anhand der 2. verdrehen. Am Ende meines Progamms soll die Polylinie mit allen Objekten innerhalb wieder zurückgedreht werden. Wie macht man das am besten? Folgenden Code hab ich zum verdrehen: tCurve = Get_Curve(tTrAct, tAcadDoc.Editor, False, "Bitte wählen Sie das Objekt: ") Dim Helpline As Curve = Get_Curve(tTrAct, tAcadDoc.Editor, False, "Bitte wählen Sie die Hilfslinie: ") Dim tAdjLeg As Double = Helpline.Bounds.Value.MaxPoint.X - Helpline.Bounds.Value.MinPoint.X Dim tOppLeg As Double = Helpline.Bounds.Value.MaxPoint.Y - Helpline.Bounds.Value.MinPoint.Y Dim tHyp As Double = Math.Sqrt(tOppLeg * tOppLeg + tAdjLeg * tAdjLeg) Angle = Get_Angle(Helpline, tOppLeg, tHyp) 'Hier bekomme ich den Radiant zurück Dim tMoveMat As Matrix3d = Matrix3d.Rotation(Angle, New Vector3d(0, 0, 0), tCurve.StartPoint) tTrAct.GetObject(tCurve.Id, OpenMode.ForWrite, True, True) tCurve.TransformBy(tMoveMat) tTrAct.Commit() tAcadDoc.Editor.UpdateScreen() Hab anbei mal einen Screenshot hochgeladen der zum Verständis dient Grüße Silvan [Diese Nachricht wurde von Silvan01 am 26. Aug. 2009 editiert.] [Diese Nachricht wurde von Silvan01 am 26. Aug. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Aug. 2009 18:11 <-- editieren / zitieren -->
Hi Silvan, nun das Statment: Dim tMoveMat As Matrix3d = Matrix3d.Rotation(Angle, New Vector3d(0, 0, 0), tCurve.StartPoint) birgt einen Auffassungsunterschied zwischen der Doku und dem eigenen Willen. Wenn Du eine Achse bestimmst, um welche gedreht werden soll, dann muß die Achse einen Vektor spezifizieren, aus dem zumindest eine Richtung abgeleitet werden kann, in Deinem Fall (0,0,0) gibt es keine Richtung, daher auch keine gültige Achse, daher ev. auch keine gültige Rotationsmatrix. Setze den Vektor auf (0,0,1), dann ist festgelegt, dass um die Z-Achse gedreht wird. Sollte es bei Dir mit obiger Änderung nicht wirken, dann hier der Code, mit dem ich getestet habe, da funktionierts und Du kannst vergleichen. Code: Dim tObj As Entity = Nothing Dim tSelRes As EditorInput.PromptEntityResult = tAcadDoc.Editor.GetEntity("Element wählen") If (tSelRes IsNot Nothing) AndAlso (tSelRes.ObjectId.IsValid) Then tObj = CType(tTrAct.GetObject(tSelRes.ObjectId, OpenMode.ForRead, True, True), Entity) Dim tCurve As DatabaseServices.Curve = CType(tObj, DatabaseServices.Curve)Dim tObj2 As Entity = Nothing Dim tSelRes2 As EditorInput.PromptEntityResult = tAcadDoc.Editor.GetEntity("Element wählen") If (tSelRes2 IsNot Nothing) AndAlso (tSelRes2.ObjectId.IsValid) Then tObj2 = CType(tTrAct.GetObject(tSelRes2.ObjectId, OpenMode.ForRead, True, True), Entity) Dim Helpline As DatabaseServices.Curve = CType(tObj2, DatabaseServices.Curve) Dim tAdjLeg As Double = Helpline.Bounds.Value.MaxPoint.X - Helpline.Bounds.Value.MinPoint.X Dim tOppLeg As Double = Helpline.Bounds.Value.MaxPoint.Y - Helpline.Bounds.Value.MinPoint.Y Dim tHyp As Double = Math.Sqrt(tOppLeg * tOppLeg + tAdjLeg * tAdjLeg) Dim tAngle As Double = Helpline.StartPoint.GetVectorTo(Helpline.EndPoint).AngleOnPlane(New Geometry.Plane()) Dim tMoveMat As Geometry.Matrix3d = Geometry.Matrix3d.Rotation(tAngle, New Geometry.Vector3d(0, 0, 1), tCurve.StartPoint) tTrAct.GetObject(tCurve.Id, OpenMode.ForWrite, True, True) tCurve.TransformBy(tMoveMat) tTrAct.Commit() tAcadDoc.Editor.UpdateScreen()
- alfred -
------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|