| |
| 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: Geometrie von Polylinien vergleichen (1285 mal gelesen)
|
Maustreiber Mitglied Maustreiber
Beiträge: 9 Registriert: 05.04.2007
|
erstellt am: 26. Sep. 2007 13:55 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle Lisp-Fachleute, ich habe in einer Zeichnung mehrere Polylinien die von der Geometrie her gleich sind. Für die CNC-Bearbeitung müssen nun alle gleichen zu einer Reihenfolge zusammengefasst werden. Ganz genial wäre es wenn auch noch gedrehte Polylinien erkannt werden. (Grafisch dargestellt ist die Situation im Anhang!) Da das anpicken auf Dauer ganz schön nervt, suche ich ein Lisp-Programm (oder allgemeinen Algorithmus) um gleiche Polylinien zu erkennen. Für Hinweise, Lösungsansätze, Links, etc... wäre ich dankbar. Viele Grüße Maustreiber ------------------ Hier kommt die Maus... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 26. Sep. 2007 14:03 <-- editieren / zitieren --> Unities abgeben: Nur für Maustreiber
Hallo Maustreiber, als Ansatz würde ich evtl. über die Fläche der Polylinie gehen (es sieht so aus, als ob die einmalig ist), Polylinien mit gleicher Fläche zusmmenfassen und über die bounding-box in x- und y-Richtung sortieren. Grüsse, Henning (PS: Ah ja, Willkommen im Forum...) ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de [Diese Nachricht wurde von wronzky am 26. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theodor Schoenwald Ehrenmitglied
Beiträge: 1672 Registriert: 16.04.2002
|
erstellt am: 26. Sep. 2007 15:58 <-- editieren / zitieren --> Unities abgeben: Nur für Maustreiber
Hallo, das geht so: - Du wählst ein Objekt, und gibt Dir die Geometriedaten aus, - danach suchst Du z.B. mit Lisp nach gleichen Konturen. - Bevor Du die Geometrie zu CNC-Code machst, färbst Du die gefundenen Konturen. - Nun gibst Du die Wegdaten (CNC-Code) in eine Datei. Diesen Vorgang kannst Du so lange wiederholen bis keine ungefärbten Elemente mehr auf dem Bildschirm sind. Der Vorteile der ganzen Sache sind: a) Da CNC-Programm ist sehr schnell erstellt. b) Es wird nichts vergessen. Dieser Weg hat jedoch den Nachteil, dass durch die Auswahl mit ssget nicht bestimmt werden kann, welche Kontur aus der Gruppe "nach" der ersten Kontur an der Reihe ist. Deshalb kann (muss nicht) es sein, dass die Maschine ein Teil von oben links und das nächste von unten rechts bearbeitet. Die Maschine somit ein par längere Wege im Eilgang fährt. Das ist aber nur bei großen Platten nicht schön. Mit einem Satz: Die G0-Wege (Eilgang) sind nicht optimiert. Axel, hat in seinem Koch-Buch für AutoLisp beschrieben, wie man das nächste und das weiteste Teil bestimmen kann, wenn Du durch diese Anregung eine Lösung findest, ist auch der Nachteil "lange G0-Wege" aufgehoben. Nun wünsche ich Dir fröhliches Programmieren. Gruß Theodor Schönwald
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 27. Sep. 2007 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für Maustreiber
Hallo Maustreiber, wenn du auch gedrehte Polylinien vergleichen möchtest, schnappst du dir die Objektdaten und richtest alle Kontrollpunkte neu aus daß z.B. der erste Kontrollpunktauf 0,0 liegt und der zweite auf einer Linie im Winkel von 0°. Dann ein wenig mit "polar" rumgespielt um die anderen Kontrollpunkte um den Startpunkt zu drehen. Damit starten ALLE Polylinien ersmal in Richtung 0°. Das Ganze natürlich nur als Daten, blos nicht entmod verwenden. Diese Datenlisten kann man jetzt gut vergleichen. Schwierig wirds nur wenn optisch identische Polylinien unterschiedliche Startpunkte in der Geometrie haben. Gruß Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 27. Sep. 2007 22:19 <-- editieren / zitieren --> Unities abgeben: Nur für Maustreiber
Hallo ! Vielleicht hilft Dir folgender Code weiter: Code: (defun c:test (/ obj1 obj2) (setq obj1 (vlax-ename->vla-object (car (entsel "\nKontur 1 wählen:"))) obj2 (vlax-ename->vla-object (car (entsel "\nKontur 2 wählen:"))) ) (if (cmp lineobj obj1 obj2 1e-6) (alert "identisch") (alert "NICHT identisch") ) (princ) ) ;;; Vergleicht zwei PlineObj (Bulges werden NICHT berücksichtigt) ;;; gedrehte Konturen werden als identisch erkannt ;;; Laufrichtung und Startpunkt müssen übereinstimmen, damit identische Konturen erkannt werden. (defun cmp lineobj (obj1 obj2 fuzzy / pt1 pt-1 ang vek matrix matrixrot ptlist1 ptlist2 endpara1 endpara2 startpara) (and (= "AcDbPolyline" (vla-get-objectname obj1)) (= "AcDbPolyline" (vla-get-objectname obj2)) (= (setq endpara1 (vlax-curve-getendparam obj1)) (setq endpara2 (vlax-curve-getendparam obj2))) (equal (vlax-curve-getdistatparam obj1 endpara1) (vlax-curve-getdistatparam obj2 endpara2) 1e-6) (setq startpara (vlax-curve-getstartparam obj1) pt1 (vlax-curve-getpointatparam obj1 startpara) pt-1 (vlax-curve-getpointatparam obj2 startpara) ang (- (angle pt-1 (vlax-curve-getpointatparam obj2 (1+ startpara))) (angle pt1 (vlax-curve-getpointatparam obj1 (1+ startpara))) ) matrixrot (list (list (cos ang) (- (sin ang)) 0.0 0.0) (list (sin ang) (cos ang) 0.0 0.0) (list 0.0 0.0 1.0 0.0) (list 0.0 0.0 0.0 1.0) ) vek (mapcar '- pt-1 (cmp:trans pt1 matrixrot)) matrix (list (list (cos ang) (- (sin ang)) 0.0 (car vek)) (list (sin ang) (cos ang) 0.0 (cadr vek)) (list 0.0 0.0 1.0 (caddr vek)) (list 0.0 0.0 0.0 1.0) ) ) (apply 'and (mapcar '(lambda (p1 p2) (equal p2 (cmp:trans p1 matrix) fuzzy)) (cmp:get-pointlist obj1) (cmp:get-pointlist obj2) ) ) ) ) ;;; Punkte aus Pline auslesen (defun cmp:get-pointlist (obj / endpara para ptlist) (setq endpara (vlax-curve-getendparam obj) para 0 ) (while (< para endpara) (setq ptlist (cons (vlax-curve-getpointatparam obj para) ptlist)) (setq para (1+ para)) ) (reverse ptlist) ) ;;;--------------------------------------- ;;; Transformiert Punkt durch Matize ;;; Argumente: p - Punkt ;;; m - Transformationsmatrix 4x4 ;;; Rückgabe: Transformierter Punkt ;;;--------------------------------------- (defun cmp:trans (p m) (if (= (length p) 2) (setq p (append p '(0.0 1.0))) (setq p (append p '(1.0))) ) (mapcar '(lambda (x) (apply '+ x)) (list (mapcar '* p (car m)) (mapcar '* p (cadr m)) (mapcar '* p (caddr m))) ) )
Grüße Andi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ralf G Mitglied Unternehmer
Beiträge: 44 Registriert: 29.10.2004 IV8, SPI PIV 3000 GK Nvidia Qudro4 380XGL
|
erstellt am: 27. Sep. 2007 22:23 <-- editieren / zitieren --> Unities abgeben: Nur für Maustreiber
Hallo Maustreiber, also die Fläche ist ein guter Tipp denn es funktioniert auch bei Drehung und und mit Einschränkungen noch bei Spiegelungen - oder:
beim Erzeugen dieser Struktur Blöcke verwenden dann ist es ganz einfach gleiche herauszufinden auch wenn sie gedreht oder gespiegelt sind. Dann kann man sie sammeln, den nächsten ermitteln, einen kopieren um 0,0, diesen explodieren, CNC code erstellen und alle nicht Block entities löschen und die Zeichnung bleibt wie sie ist. Vielleicht hilfts, der ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Maustreiber Mitglied Maustreiber
Beiträge: 9 Registriert: 05.04.2007
|
erstellt am: 28. Sep. 2007 09:26 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle Helfer! erst mal vielen Dank dass sich alle die Köpfe heiß gedacht haben! Ich habe dadurch wertvolle Hinweise bekommen die mich in der Summe ein ganzes Stück weiter gebracht haben. @Andi - Den Quellcode habe ich natürlich gleich ausprobiert. Funktioniert mit meinen Polylinien leider nur bedingt. Die Einschränkung, nur wenn die Startpunkte der Polylinie identisch sind, behindert mich sehr. Gerade das ist bei meinen nicht immer gegeben. Ich werde hier ansetzten und versuchen den Code auszubauen und für mich passend zu bekommen. Jedenfalls vielen Dank !! Falls es weitere Einfälle gibt, ich bin weiterhin für alle Tipps und Anregungen dankbar. Viele Grüße Maustreiber ------------------ Hier kommt die Maus... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |