| | | 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 – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Liegt eine Lotpunkt auf einer Polylinien oder nicht ?? (1446 mal gelesen)
|
tappenbeck Mitglied Vermessungsingenieur
Beiträge: 1217 Registriert: 30.05.2002 AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net
|
erstellt am: 06. Nov. 2009 17:57 <-- editieren / zitieren --> Unities abgeben:
Moin! ich habe folgende Aufgabe die ich irgendwie nicht gelöst bekommen. Punkte sollten geprüft werden, ob der Lotpunkt auf der Achse (Polylinie) liegen würde. Wenn ich mit vlax-curve-getDistAtPoint die Strecke im zu prüfenden Punkt ermittel und dann in Vergleich zur Länge der Polyline setzen. Regulär würde ich sagen das, wenn die Länge des zu prüfenden Punktes > als die Länge der Polylinie ist, dann liegt dieser Punkt dahinter. Nun ist es aber so, das wenn der Punkt hinter dem Ende liegt dann ermittelt vlax-curve-getDistAtPoint die Länge zum Endpunkt. Hat einer von Euch eine Idee wie ich dieses dennoch in Griff bekommen kann ??? Ein Lösungsansätz läge im Vergleich der Richtung im Endpunkt und vom Endpunkt zum Testpunkt. Wenn die Richtung des Prüfpunktes um 1/2PI differiert zur Richtung im Endpunkt dann ist der Punkt noch auf der Achse - andernfalls dahinter. Vor dem Endpunkt auf der Achse geht nicht, da dann der Abstand Anfang-Lotpunkt sowieso < der Gesamtlänge ist. Hierfür fehlt mir aber die Möglichkeit zur Ermittlung der Richtung im Endpunkt. Wäre Euch sehr verbunden, wenn mir einer noch schnell zum Wochenende helfen kann. Gruß Jan :-) ------------------ jan :-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 06. Nov. 2009 18:35 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
|
tappenbeck Mitglied Vermessungsingenieur
Beiträge: 1217 Registriert: 30.05.2002 AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net
|
erstellt am: 06. Nov. 2009 18:47 <-- editieren / zitieren --> Unities abgeben:
hi ! hier die Skizze - 3 Punkte liegen mit dem Lotpunkt auf der Achse. Der Punkt, mit der roten Linie, nicht !! Den Punkt gilt es zu ermitteln - das Testkriterium im Grunde genommen. Das ganze wird eine Bemassung mit Achsbezug. Gruß Jan :-) ------------------ jan :-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 06. Nov. 2009 19:29 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
Hallo Jan Eine Krücke, keine saubere rechnerische Lösung, aber !? könnte ?! auch funktionieren: Pickbox auf Null und wenn (nentselp lotpkt) die Polylinie liefert liegt der Punkt drauf, sonst nicht. Wie g'sagt, könnte funktionieren - ausprobieren
------------------ Schöne Grüße Ernst www.geopaint.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tappenbeck Mitglied Vermessungsingenieur
Beiträge: 1217 Registriert: 30.05.2002 AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net
|
erstellt am: 06. Nov. 2009 20:21 <-- editieren / zitieren --> Unities abgeben:
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 07. Nov. 2009 06:56 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
Hallo Jan, wenn Du das über die Richtung prüfen willst, dann kannst Du einen Vergleich der Steigung des Lotfußpuntktes und dem Winkel von Lotfußpunkt - Punkt machen. Im Test hat es funktioniert, probier mal aus (Feinschliff musst Du machen) Code:
(defun c:test ( / ) (if(setq obj_line (car(entsel "\nLinienelement auswählen:"))) (while(setq pkt (getpoint "\nPunkt picken:")) (if(and (setq pkt_lot (vlax-curve-getClosestPointTo(vlax-ename->vla-object obj_line)pkt)) (setq stat(vlax-curve-getDistAtPoint (vlax-ename->vla-object obj_line)pkt_lot)) (or(=(rtos(test:angle:korrekt(test:steigung obj_line pkt_lot))2 6) (rtos(test:angle:korrekt(-(angle pkt_lot pkt)(* pi 0.5)))2 6)) (=(rtos(test:angle:korrekt(test:steigung obj_line pkt_lot))2 6) (rtos(test:angle:korrekt(+(angle pkt_lot pkt)(* pi 0.5)))2 6)) )) (princ "\nLotPunkt OK.") (princ "\nLotPunkt ausserhalb.")) ))) ;;;Winkelwert korrigieren (defun test:angle:korrekt (w / ) (if (< w 0.0)(setq w (+ w (* pi 2.0)))) (if (> w (* 2.0 pi))(setq w (- w (* 2.0 pi)))) w) ;;;Steigung an einem Punkt (defun test:steigung (obj koord / ) (angle(vlax-curve-getFirstDeriv (vlax-ename->vla-object obj) (vlax-curve-getParamAtPoint(vlax-ename->vla-object obj) (vlax-curve-getClosestPointTo(vlax-ename->vla-object obj)koord) ))'(0 0 0)))
------------------ viele Grüße Jörn http://www.bosse-engineering.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 07. Nov. 2009 12:02 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
Zitat: Original erstellt von tappenbeck: Moin!ich habe folgende Aufgabe die ich irgendwie nicht gelöst bekommen. Punkte sollten geprüft werden, ob der Lotpunkt auf der Achse (Polylinie) liegen würde. Wenn ich mit [i]vlax-curve-getDistAtPoint die Strecke im zu prüfenden Punkt ermittel und dann in Vergleich zur Länge der Polyline setzen.[/i]
Besteht die Polylinie wie in Deiner Skizze immer aus geraden Linienstücken? Dann ist die Sache doch viel einfacher und allgemeiner lösbar als mit den Vlax-* Funktionen. Du brauchst Dir dann doch bloß den Projektionspunkt des Punkts auf jede durch eine Teillinie definierte Gerade zu berechnen, und nimmst davon nur diese Punkte, bei denen der Projektionspunkt zwischen Anfangs- und Endpunkt des Linienstückchens liegt. Es kann nun je nach Situation sein, dass kein Projektionspunkt auf der Linie liegt, oder nur einer, oder beliebig viele. Du suchst die Fälle, in denen keiner da ist. Falls Du Probleme mit der Mathematik für den Projektionspunkt hast, dann könnte in GeomCAL eine Funktion vorliegen, die das schon löst. Falls da nix drin ist, dann nimm' meinen GeomCAL Klon CADCAL(download von www.archtools.de/cadcal.zip, Anleitung hier: http://www.archtools.de/cadcal.html). Du nimmst die Funktion PPL(pp,p1,p2), die den Projektionspunkt von PP auf die Gerade durch P1 und P2 berechnet. Du kannst das mit dem Befehl CCAL direkt auf der Befehlszeile und interaktiv machen: Befehl: CCAL CC ?=help >> expression: PPL(cur,cur,cur) >> enter point for CUR: >> enter point for CUR: >> enter point for CUR: Oder Du kannst das in Lisp machen, wenn Du die Punkte PP, P1 und P2 schon in den Variablen gespeichert hast: (ccal "ppl(pp,p1,p2)")
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 07. Nov. 2009 19:16 <-- editieren / zitieren --> Unities abgeben: Nur für tappenbeck
Hast ja jetzt schon bessere Lösungen ... aber der Vollständigkeit halber ... Zitat: ...unter list mit pickbox - verstehe die umsetzung nicht... !
Bin mir jetzt nicht hundertpro sicher, dass (nentselp) die Pickbox berücksichtigt - gehe aber davon aus; daher (setvar "pickbox" 0) damit nicht objekte "gefunden" werden, die nur in der Nähe liegen. Trotzdem könnte genau im Lotpkt ein weiteres Objekt deine PL kreuzen ... (fällt mir auch grad ein - ? (ssget "_C" pkt pkt)? - wenn da die PL dabei / nicht dabei ist ...) ------------------ Schöne Grüße Ernst www.geopaint.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|