| |
| 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: Punkte auf einer Linie (Geraden) (1224 mal gelesen)
|
SilkeRS Mitglied Ingenieurin
Beiträge: 14 Registriert: 09.05.2006
|
erstellt am: 20. Mai. 2006 11:57 <-- editieren / zitieren --> Unities abgeben:
Ich suche ein Lisp, das mir aus einer Punktwolke, die Punkte aus der Wolke selektiert, die auf einer Linie (Geraden) liegen, die durch den Anfangs- und- Endpunkt begrenzt ist. Zudem sollten die Punkte sortiert werden, entlang des Linienverlaufs. Die Punkte können leicht selektiert werden (liegen alle auf einem Layer) ebenso die Geraden, die als Linien auf einem anderen Layer liegen. Falls jemand so ein Lisp hat, würde ich mich freuen, sonst muß ich mir eines ertippen. Vielen Dank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 20. Mai. 2006 12:44 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
Hallo Silke, die Aufgabe klingt sehr speziell, weshalb ich mir nicht vorstellen kann, dass jemand ein dafür passendes Lisp rumliegen hat. Hast du denn schon einen Ansatz für das Programm? Meiner wäre: (ssget ..) -mit der Option Zaun und Filterliste Punkte und Layer ich würde dann die Abstände zum Anfangspunkt der Linie berechnen und eine Assoziationsliste aus dem Abstand und dem Punktelement erzeugen (setq SelPoints (mapcar '(lambda (Point) (cons(distance ..) Point) ) ) Die so erzeugte Punktliste kannst du dann mit (vl-sort .. ) nach dem Abstand sortieren und deine Aufgabe ist erfüllt. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SilkeRS Mitglied Ingenieurin
Beiträge: 14 Registriert: 09.05.2006
|
erstellt am: 20. Mai. 2006 15:17 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger erst einmal danke für die Antwort. Ich weiß, daß das Ganze sehr speziell ist, habe aber noch eine kurze Frage. Was ist ssget mit der Option Zaun, diese Option kenne ich nicht! Noch eine kleine Anmerkung. Ganz so einfach ist es nicht, denn wenn ich den Abstand vom Anfangspunkt berechne habe ich noch nicht die Punkte, die wirklich auf der Linie liegen, aber auch das läßt sich mathematisch lösen. Herzlichen Dank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 20. Mai. 2006 17:17 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
|
SilkeRS Mitglied Ingenieurin
Beiträge: 14 Registriert: 09.05.2006
|
erstellt am: 20. Mai. 2006 17:47 <-- editieren / zitieren --> Unities abgeben:
|
SilkeRS Mitglied Ingenieurin
Beiträge: 14 Registriert: 09.05.2006
|
erstellt am: 20. Mai. 2006 19:09 <-- editieren / zitieren --> Unities abgeben:
|
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 20. Mai. 2006 23:32 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
Doch, allerdings muss zwischen Code und . (Punkt) mindestens ein Leerzeichen sein (sonst wird es nicht als "dottet pair" interpretiert).
Code:
Befehl: (setq aws (ssget "_F" L '((0 . "POINT")(8 . "Layername"))))
Hinweis: ssget _f arbeit grafisch. PDMODE auf 3 und PDSIZE auf einen passenden Wert setzen. Zu untersuchender Bereich sollte im Grafikfenster sichtbar sein. ------------------ Mit freundlichem Gruß Udo Hübner [Diese Nachricht wurde von CAD-Huebner am 20. Mai. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SilkeRS Mitglied Ingenieurin
Beiträge: 14 Registriert: 09.05.2006
|
erstellt am: 21. Mai. 2006 21:09 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 22. Mai. 2006 04:24 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
Zitat: Original erstellt von SilkeRS: Und was ist nun daran falsch? ... Geht das nicht?
Hallo Silke, ergänzend zu dem bereits geschriebenen: Du scheinst nicht in der AutoLisp-Entwicklungsumgebung zu arbeiten .. bzw nutzt diese nicht vollständig aus. Schau mal in die beiden Beiträge (1 - 2), da habe ich ein wenig das Debuggen und die Fehlersuche mit dem VL-Editor beschrieben. Du kannst auch zusätzlich die Forensuche bemühen, es gibt noch einige Beiträge mehr zu diesem Thema. Bei Fragen ... Grüße Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Schnitzler Mitglied
Beiträge: 9 Registriert: 12.09.2013 Prozessor : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz Speicher : 4096MB(Speed 1600) Hauptplatine : P8Z77-V LX Windows-Version : Microsoft Windows 7 Professional Service Pack 1 AutoCAD: 2014
|
erstellt am: 14. Jan. 2023 16:22 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
Code: ;;Überprüfung ob 3 Punkte kollinear sind (DEFUN PointOnLine (sp ep bp / winkel1 winkel2) ; Startpunkt, Endpunkt und (irgendein) Punkt (SETQ winkel1 (ANGLE sp ep) ; Winkel zw. Startpunkt Endpunkt winkel2 (ANGLE sp bp) ; Winkel zw. Startpunkt Punkt ) (IF (= winkel1 winkel2) ; Wenn beide Winkel gleich sind... bp ; ... wird der "Punkt" zurückgegeben, sonst ... nil ; Nix (nil)! ) )
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: 15. Jan. 2023 12:00 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
Zitat: Original erstellt von Thomas Schnitzler:
Code: ;;Überprüfung ob 3 Punkte kollinear sind (IF (= winkel1 winkel2) ; Wenn beide Winkel gleich
Vorsicht, das wird in den allermeisten Fällen schief gehen, weil dabei Realzahlen verglichen werden, die in solchen Fällen fast nie exakt gleich sind. Besser ist die Verwendung von EQUAL mit einem Fuzzy-Wert: Code:
(defun pointonline (sp ep bp) (if (equal (angle sp ep) (angle sp bp) 0.0001) bp ) )
Weil man den Punkt BP ja aber schon vor Aufruf der Funktion kennt, ist es sinnvoll, nur T oder NIL zurück geben zu lassen: Code:
(defun pointonline (sp ep bp) (equal (angle sp ep) (angle sp bp) 0.0001) )
Und: die unnötigen SETQ fressen Speicher und Perfomance, also besser weglassen.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 15. Jan. 2023 16:09 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
|
Thomas Schnitzler Mitglied
Beiträge: 9 Registriert: 12.09.2013 Prozessor : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz Speicher : 4096MB(Speed 1600) Hauptplatine : P8Z77-V LX Windows-Version : Microsoft Windows 7 Professional Service Pack 1 AutoCAD: 2014
|
erstellt am: 15. Jan. 2023 19:15 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
Danke für die Optimierungsvorschläge. Die Aufgabe lautet: Breche alle Linien auf den sich ein "Insert" (bzw. dessen Einfügepunkt) befindet. In so fern ist die Rückgabe eines Punktes anstatt T sinnvoll, da er ggf. als Bruchpunkt dient. Zum Thema Genauigkeit: Wie soll ich unterscheiden ob der Punkt zufällig (=unsauber gezeichnet) oder absichtlich daneben sitzt? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Schnitzler Mitglied
Beiträge: 9 Registriert: 12.09.2013 Prozessor : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz Speicher : 4096MB(Speed 1600) Hauptplatine : P8Z77-V LX Windows-Version : Microsoft Windows 7 Professional Service Pack 1 AutoCAD: 2014
|
erstellt am: 15. Jan. 2023 19:19 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 15. Jan. 2023 20:27 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
Bei der Ungenauigkeit kannst du das nicht wirklich festlegen, aber das Maximum darf man bei ruhig bei 14 Stellen annehmen und bei mehr als einer Vorstellen entsprechend weniger. Es kommt halt darauf an in welchem Koordinatenbereich man arbeitet. Für einige spezielle Aufgaben nutze ich ermittel ich dann auch die Rundung welche ich zum Vergleich nehme, abhängig in welchen Größen/Längen gearbeitet wird. Ein = oder equal ohne Fuzzi ist aber definitiv schlecht einzusetzen. Wenn du ein paar Beispiele(Problemsituationen) zum spielen möchtest, sag bescheid.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Schnitzler Mitglied
Beiträge: 9 Registriert: 12.09.2013 Prozessor : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz Speicher : 4096MB(Speed 1600) Hauptplatine : P8Z77-V LX Windows-Version : Microsoft Windows 7 Professional Service Pack 1 AutoCAD: 2014
|
erstellt am: 15. Jan. 2023 20:29 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 15. Jan. 2023 20:48 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
Zitat: Original erstellt von Thomas Schnitzler: Danke für die Optimierungsvorschläge. Die Aufgabe lautet: Breche alle Linien auf den sich ein "Insert" (bzw. dessen Einfügepunkt) befindet. In so fern ist die Rückgabe eines Punktes anstatt T sinnvoll, da er ggf. als Bruchpunkt dient. Zum Thema Genauigkeit: Wie soll ich unterscheiden ob der Punkt zufällig (=unsauber gezeichnet) oder absichtlich daneben sitzt?
Die Rückgabe eines Punktes, den man schon kennt, ist nie sinnvoll. Du musst die Funktion ja irgendwie aufrufen, und das machst Du dann eben so:
Code:
(if (pointonline sp ep bp) (dannmachwasmit bp) (andernfallsmachwasanderes) )
Und Du kannst bei Realzahlen niemals wissen, ob ein um ein Fuzzy anderer Punkt absichtlich anders liegt, oder ob das nur infolge der üblichen Rechenungenauigkeit anders ist. Dabei ist es dann völlig irrelevant, woher der andere Punkt kommt, oder wie er berechnet wurde. Realzahlen vergleicht man deshals niemals mit Gleichheitszeichen, weil der Vergleich nur bei absoluter Übereinstimmung T ergibt. Eben deshalb haben alle Programmiersprachen die Möglichkeit, Realzahlen mit EQUAL oder ähnlichen Operatoren zu vergleichen. Wegen so 'nem Fehler ist übrigens die erste Ariane 5 abgestürzt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Schnitzler Mitglied
Beiträge: 9 Registriert: 12.09.2013 Prozessor : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz Speicher : 4096MB(Speed 1600) Hauptplatine : P8Z77-V LX Windows-Version : Microsoft Windows 7 Professional Service Pack 1 AutoCAD: 2014
|
erstellt am: 15. Jan. 2023 20:51 <-- editieren / zitieren --> Unities abgeben: Nur für SilkeRS
|