| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Herausfinden ob Objekt parallel zum BKS ist (1516 mal gelesen)
|
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 28. Mrz. 2010 13:18 <-- editieren / zitieren --> Unities abgeben:
Hallo. Ob ein Objekt (Curve) planar ist, kann ich bei vb.net mit IsPlanar prüfen. Aber wie finde ich heraus, ob das Objekt parallel zum aktuellen BKS (nicht WKS)ist? Hintergrund: Ich möchte an ein vorhandenes Objekt einen Bogen in tangentialer Richtung ansetzen. Wenn das Objekt aber nicht parallel zum BKS liegt, führt die Punktauswahl zum falschen Ergebnis.
------------------ Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Mrz. 2010 13:27 <-- editieren / zitieren -->
Hi, das hängt aber sehr stark von dem Typ Deines Objekts ab. Ist es eine Linie (mehrere mögliche Koordinatensysteme), eine Polylinie (ein oder mehrere mögliche Koordinatensysteme), ein Volumenkörper (je Fläche des Körpers ein mögliches Koordinatensystem), ... So eindeutig ist das leider gar nicht. Viele Objekte haben eine Eigenschaft 'Normal', das wäre ein Ansatz, dieses Vektor zu vergleichen, aber wie schon gesagt, da ist nichts eindeutig solange die Ebene des Bogens nicht klar ist. Das wohl schwierigste Objekt wird die Linie (oder eine 2D-Poly, LW-Poly, 3D-Poly mit jeweils -) mit nur einem Segment sein, denn da steht für die Tangentialrichtung nichts fest, um die Ebene des Bogens zu definieren. - alfred - ------------------ www.hollaus.at |
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 28. Mrz. 2010 14:04 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, wie bereits gesagt möchte ich gerne einen Bogen tangential an ein vorhandenes Curve-Objekt (Linie, Polylinie, Bogen, Spline...) ansetzen. Dazu wählt man das gewünschte Objekt aus, wählt den Ansetzpunkt (z.B. den Start- oder Endpunkt) und dann muss nur noch der Endpunkt des Bogens ausgewählt werden (Darstellung mittels Jig). Wenn das Curve-Objekt auf dem WKS liegt, funktioniert alles wunderbar. Nur wenn das BKS nicht gleich dem WKS ist, bekomme ich einen Bogen, der frei im Raum liegt (weil dann der Endpunkt eine andere Z-Höhe hat). Wie gehe ich da am Besten vor? Schön wäre es, wenn sich dieser Bogen auch im BKS an ein Objekt ansetzen ließe. Alternativ dürfte der Befehl nur funktionieren, wenn BKS=WKS ist. Wie kann ich das überprüfen? ------------------ Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Mrz. 2010 17:05 <-- editieren / zitieren -->
Hi Markus, da musst Du die Punkte zuerst von BKS auf WKS umrechnen und die Normale mitsetzen. Es hängt jetzt davon ab, mit welcher Funktion die auf die Punkte des Objekts hingreifst oder diese ermittelst, manche Funktionen geben Dir Koordinaten in BKS, manche in WKS, wenn Du einen Bogen erstellst, must Du immer WKS-Koordinaten einstellen. Zeig mal die Code-Teile a) mit denen Du auf ein Objekt hingreifst, um dessen Endpunkt zu bestimmen b) mit dem Du den neuen Bogen erstellst. ...es gibt da halt zu viel Varianten. - alfred - ------------------ www.hollaus.at |
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 28. Mrz. 2010 20:47 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, hier sind mal die wichtigsten Codeteile. Wesentliches Problem ist meiner Meinung nach auch, dass die Funktion "GetMittelpunkt" nur die X- und Y-Koordinaten für den Bogenmittelpunkt berechnet. Aber da ein Bogen ja auch immer Planar ist, kann man das vielleicht auch mit einer gedrehten Ebene (BKS) lösen (Ebene aus Startpunkt, Endpunkt und Startvektor) Zum besseren Verständnis der Funktion "GetMittelpunkt" hab ich eine Grafik angehängt auf der erkennbar ist, wie ich an den Bogenmittelpunkt kommen möchte (die Sache hatte ich auch schon mal hier gepostet). Code:
Ansetzpunkt = SelCurve.StartPoint oder Ansetzpunkt = SelCurve.EndPoint Startrichtung = SelCurve.GetFirstDerivative(Ansetzpunkt) Dim neuerBogen As Arc = TBogen.GetTanBogen(Ansetzpunkt, Startrichtung, SelCurve)
Code:
Dim MP As Point3d = GetMittelpunkt(locStartpunkt, locStartrichtung, EPRes.Value) '>>> Hier wird der CircularArc3d in einen Arc umgewandelt: '>>>EPRes.Value ist der Endpunkt (Auswahl mit Jig-Darstellung) Return convertArc2Arc(New CircularArc3d(locStartpunkt, MP, EPRes.Value))
Code:
''' <summary> Berechnet aus Startpunkt, Endpunkt und Startrichtung den Bogenmittelpunkt </summary> Public Function GetMittelpunkt(ByVal Startpunkt As Point3d, ByVal Startrichtung As Vector3d, ByVal Endpunkt As Point3d) As Point3d Dim vecSP As Vector3d = Startpunkt.GetAsVector Dim vecSehne As Vector3d = Startpunkt.GetVectorTo(Endpunkt) Dim vecSehnenMitte As Vector3d = Startpunkt.Add(vecSehne * 0.5).GetAsVector Dim vecSPZentrum As Vector3d = Startrichtung.GetPerpendicularVector Dim vecWinkelhalb As Vector3d = vecSehne.GetPerpendicularVector Dim D As Double = vecSPZentrum.Y * vecWinkelhalb.X - vecSPZentrum.X * vecWinkelhalb.Y '>>>Wenn D=0 ist, sind die beiden Vektoren Parallel und es gibt keinen Bogenmittelpunkt If D = 0 Then Return Nothing Dim Ds As Double = (vecSehnenMitte.Y - vecSP.Y) * vecWinkelhalb.X - (vecSehnenMitte.X - vecSP.X) * vecWinkelhalb.Y Dim s As Double = Ds / D Dim Zentrum As Point3d = Startpunkt.Add(s * vecSPZentrum) Dim Radius As Double = Startpunkt.DistanceTo(Zentrum) '>>>Wechsel von rechts- auf linksläufigen Bogen: If s < 0 Then Return Zentrum.Add(vecWinkelhalb * Radius) Else Return Zentrum.Add(vecWinkelhalb * -Radius) End If End Function
Code:
''' <summary> Wandelt einen CircularArc3d in einen Arc um </summary> Function convertArc2Arc(ByVal Bogen As CircularArc3d) As Arc Dim refVec As Vector3d = Bogen.ReferenceVector Dim Ebene As New Plane(Bogen.Center, Bogen.Normal) Dim Winkel As Double = refVec.AngleOnPlane(Ebene) Return New Arc(Bogen.Center, Bogen.Normal, Bogen.Radius, Bogen.StartAngle + Winkel, Bogen.EndAngle + Winkel) End Function
Hoffentlich wirst du schlau hieraus. ------------------ Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Mrz. 2010 21:04 <-- editieren / zitieren -->
Hi, nur um's zu verifizieren (Code hab ich jetzt nicht angesehen, denn bei Deiner Skizze hat's bei mir KLICK gemacht) und daher die Frage: wieso hat >>>dieses<<< nicht funktioniert, war doch die gleiche Aufgabe oder hat sich was geändert? - alfred - ------------------ www.hollaus.at |
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 28. Mrz. 2010 22:00 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, das Problem von damals habe ich gelöst. Mein Code funktioniert, solange BKS=WKS ist. Bei deinem Code bekomme ich, wenn ich ein vom WKS unterschiedliches BKS einstelle und die Testkoordinaten entsprechend auf dieses BKS ändere, die Meldung: "Bogenmittelpunkt ist nicht zu errechnen" Der Code hilft mir also auch nicht weiter. Oder habe ich etwas übersehen? Bleibt mir als Lösung nur noch zu überprüfen, ob BKS=WKS ist und mein Programm ansonsten abzubrechen? ------------------ Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Mrz. 2010 22:09 <-- editieren / zitieren -->
Hi, ok, jetzt versteh ich. Und damit auch Dein Problem mit dem Code ==> Du nimmst nur einen Winkel an, aber dem Zeitpunkt, wo Du 3D unterwegs bist, hast Du aber zumindest 2 Winkel für die Startrichtung zu berechnen und davon alle abhängigen Winkel/Vektoren. Beginnen wirst Du damit müssen, dass Du bei der Startrichtung sowohl den XY-Winkel wie auch den XZ- (oder YZ-)-Winkel mitbrauchst. Und ab hier wird alles eben dreidimensional zu rechnen sein. - alfred - ------------------ www.hollaus.at |
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 28. Mrz. 2010 22:23 <-- editieren / zitieren --> Unities abgeben:
Eine Frage habe ich aber noch, bevor ich alles 3-dimensonal ausrechne: Angenommen das gewählte Objekt, von dem aus der Bogen starten will, liegt genau auf dem BKS. Kann ich dann nicht alle berechneten Punkte mit einer Matrix vom WKS auf das BKS umrechnen lassen? Mit soetwas kenne ich mich leider noch zuwenig aus...
------------------ Gruß Markus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Mrz. 2010 22:29 <-- editieren / zitieren -->
Hi. ja, es gibt eine Menge 'transform' Functions, die auch dazu verwendet werden, von BKS zu WKS und umgekehrt zu rechnen. Damit kannst Du gut mit Punkten rechnen, trotz allem sind da dreidimensionale Winkel und diese brauchst Du zuvor. Wenn ich mich recht erinnere, ist in den CHM-Files (Hilfe-Dateien) von ObjektARX der Aufbau der Transformationsmatrizen detailliert erklärt. - alfred - ------------------ www.hollaus.at |
Jonapap Mitglied
Beiträge: 206 Registriert: 18.08.2006
|
erstellt am: 28. Mrz. 2010 22:35 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|