| |
| 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: Liste mit Linienstücken zusammensetzen (1363 mal gelesen)
|
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 15. Mrz. 2004 11:46 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Forum-Mitglieder, nun hänge ich seit einer Woche an folgendem Problem und komm nicht weiter. Ich habe eine Liste, die beinhaltet von mehreren Linien die Teilstücke. z.B.: (setq Liste '(((2 2 0)(6 1 0))((0 0 0)(1 0 0))((1 0 0)(2 0 0))((2 0 0)(3 1 0))((6 1 0)(8 3 0)))) Nun sollen einzelne Linienteile einanderzugeordnet werden, dass ich sie jeweils als eine Linie durchzeichnen kann (Polylinie). Ergebnis soll also sein: (setq Liste_1 '(((0 0 0)(1 0 0)(1 0 0)(2 0 0)(2 0 0)(3 1 0))((2 2 0)(6 1 0)(6 1 0)(8 3 0)))) bzw. (setq Liste_1 '(((0 0 0)(1 0 0)(2 0 0)(3 1 0))((2 2 0)(6 1 0)(8 3 0)))) => D.h. es muss geprüft werden, welche Teillinien den gleichen Punkt besitzen, um die Linie weiterzuzeichnen. Ich hoffe Ihr versteht, was ich meine. Viele Grüße Andrea
[Diese Nachricht wurde von AB am 15. Mrz. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 15. Mrz. 2004 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Hallo Andrea, ich habe zwar momentan keine fertige Lösung bereit, aber vielleicht einen Ansatz für den Lösungsalgorhythmus. Mit ein paar Schleifen und Vergleichen sollte dies programmierbar sein (komme bloß momentan nicht dazu, frühestens morgen abend). Hier der Ansatz: gegeben: Liste aller Linienabschnitte Liste gleicher Anzahl Elemente mit 0/1 Kennung, Anfangs alles auf 0 gesetzt, bei Nutzung des Linienabschnittes für Polylinie auf 1 setzen Ablauf: 1) ersten (noch nicht genutzten) Linienabschnitt nehmen 2) in (erste) Polylinienliste packen 3) ersten Punkt hernehmen 4) alle "zweiten" Punkte noch nicht genutzter Linienabschnitte auf Gleichheit prüfen wenn gefunden, wird dieses Linienelement neues ersten Linienelement (Kennung auf "genutzt" setzen) dann weiter mit 3) wenn nicht gefunden, aktuelles Linienelement ist erstes seiner Polylinie 5) zweiten Punkt des letzten Elementes der aktuellen Polylinie hernehmen 6) alle "ersten" Punkte noch nicht genutzter Linienelemente auf Gleichheit prüfen wenn gefunden, wird dieses Linienelement neues letztes Linienelement (Kennung auf "genutzt" setzen) dann weiter mit 5) wenn nicht gefunden, Polylinie beendet 7) ggf. weiter mit 1) falls noch nicht alle Elemente genutzt. Viele Grüße spider_dd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 15. Mrz. 2004 14:33 <-- editieren / zitieren --> Unities abgeben: Nur für AB
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 15. Mrz. 2004 14:37 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Hallo Andrea, ein Ansatz: Errechne die Entfernungen der einenzelnen Punkte (der nur die Start und Enpunkte der einzelnen Punkt/Liniengruppierungen) zueinander, dann kannst du anhand der geringsten Entfernung entscheiden, wo der Linienzug weiter geführt werden muss. Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 15. Mrz. 2004 14:40 <-- editieren / zitieren --> Unities abgeben:
Also, in dem Anhang kann man einen Ausschnitt meiner Linie sehen. Diese sollen nun automatisch (soweit sie aneinander liegen) miteinander verbunden werden, so dass ich dann nur noch 15 Linien (wenn ich mich nicht verzählt habe) erhalte. Spider_dd hat das Problem schon ganz richtig erkannt. Viele Grüße Andrea 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: 15. Mrz. 2004 14:47 <-- editieren / zitieren --> Unities abgeben: Nur für AB
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 15. Mrz. 2004 14:49 <-- editieren / zitieren --> Unities abgeben: Nur für AB
nehme doch (endlich) einfach pedit Befehl: pedit bei der Objektwahl Option O (für mehrere Objekte), dann Option Verbinden wählen.. Du hast zumindest noch keine Argument gegen diesen Befehl vorgebracht.. ------------------ - Sebastian - [Diese Nachricht wurde von cadffm am 15. Mrz. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 15. Mrz. 2004 14:54 <-- editieren / zitieren --> Unities abgeben: Nur für AB
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 15. Mrz. 2004 14:58 <-- editieren / zitieren --> Unities abgeben: Nur für AB
ich habe keine Ahnung was bei dir 3D-Linien sind, aber genau das meine ich ja: Andrea hat immernoch nicht erklärt warum nicht pedit genommen werden kann/soll. ------------------ - Sebastian - [Diese Nachricht wurde von cadffm am 15. Mrz. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 15. Mrz. 2004 14:59 <-- editieren / zitieren --> Unities abgeben:
Eben, das funtkioniert nämlich leider nicht. Ich versuche gerade die Idee von Spider_dd umzusetzen. (setq Liste '(((2 2 0)(6 1 0))((0 0 0)(1 0 0))((1 0 0)(2 0 0))((2 0 0)(3 1 0))((6 1 0)(8 3 0)))) (defun Linien () (setq Nr 0) (while (< Nr (length Liste)) (setq mode 0) (setq Beginn (car (nth Nr Liste)) Ende (cadr (nth Nr Liste))) ; Prüfen, ob nochmal vorhanden (setq a (cons Beginn a)) (setq a (cons Ende a)) (while (= mode 0) (setq mode 1) (mapcar (function (lambda (x) (if (equal (car x) Ende) (progn (setq a (cons(cadr x)a)) (setq Ende (cadr x)) (setq mode 0))) )) Liste) ); Ende while mode (setq Liste_aller_Linien (cons (reverse a) Liste_aller_Linien) a nil) (setq Nr (+ Nr 1)) ) ) Funktioniert nicht richtig. Z.B. komme ich aus der ersten Schleife nicht raus, bzw. zu spät, da nur alle Teillinien 1 Mal verwendet werden dürfen. Gruß Andrea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 15. Mrz. 2004 15:00 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Hi Sebastian, bei mir sind 3D Linien folgendes: Linien die nicht auf einer Ebene liegen, sondern eben kreuz und Quer im 3D-Raum verteilt. War auch mehr Umgangssprachlich gemeint als fachtechnisch richtig... ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 15. Mrz. 2004 15:02 <-- editieren / zitieren --> Unities abgeben: Nur für AB
in deiner Liste ist die 3. Koordinate (Z ?) immer 0, also liegen die Linien in einer Ebene - Also kann man eine Polylinie mit pedit erstellen lassen. das du eine 3D-Poly möchtest (warum auch immer) hast du nicht gesagt- im Gegenteil sogar, du hast gesagt POLYLINIE erstellen. ------------------ - Sebastian - Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 15. Mrz. 2004 15:08 <-- editieren / zitieren --> Unities abgeben:
Die Liste wollte ich nur als vereinfachtes Beispiel nehmen. Ich habe nicht gedacht, dass das zu solchen Verwirrungen führen kann und wollte das nicht. Es tut mir leid. Genauer gesagt sind meine Einzellinien also 3D-Polylinien, mit unterschiedlichen z-Koordinaten. Ich hoffe, ich habe nicht noch mehr unkläre Äußerungen verwendet. Viele Grüße Andrea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
scj Mitglied
Beiträge: 555 Registriert: 09.08.2001
|
erstellt am: 15. Mrz. 2004 15:09 <-- editieren / zitieren --> Unities abgeben: Nur für AB
|
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 15. Mrz. 2004 15:16 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 15. Mrz. 2004 15:21 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Dann wählst du keine 3DPolylinie ... sondern eine Linie oder Polylinie. EDIT: scj hat das nicht mit einer Schleife geschrieben, er macht dir nur einen Linienzug nach dem anderen... also nicht Alle wählen, sondern nur diejenigen welche hinterher 1 Objekt werden, also nicht so wie du möchtest (sorry) ------------------ - Sebastian - [Diese Nachricht wurde von cadffm am 15. Mrz. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 15. Mrz. 2004 15:24 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Warum nicht AutoCAD die Arbeit machen lassen? Code:
(defun mk-plines(segs / le lines) (setq le(entlast)) (foreach seg segs(command "_line"(car seg)(cadr seg)"")) (setq le(if le(entnext le)(entnext))) (while le(setq lines(cons le lines)le(entnext le))) (foreach line lines (if(="LINE"(cdr(assoc 0(entget line)))) (eval(append'(command"_pedit"line"_yes""_join")lines'(""""))) ) ) )(mk-plines liste1)
Ein paar Hinweise: a) Die Prüfung am Anfang ist nur dazu da, damit die Funktion auch in einer bisher LEEREN Zeichnung funktioniert b) Es wird nicht getestet, ob unter 2004 diese neu AUTO-POLYLINE-CONVERT...-Sysvar gesetzt ist (wie heisst die ? - fällt mit grad nicht ein). Prüfen oder das "_yes" rausnehmen. c) Das Verfahren ist sehr effektiv zu programmieren, hat aber ein fürchterliches Laufzeitverhalten. Bei *großen* Datenmengen (sagen wir: mehr als 1000 Linien) würde ich dann doch Gehirnschmalz in Algorithmen investieren. Allerdings kann dann eine unangebrachte Verwendung von append noch schlimmeres Laufzeitverhalten nach sich ziehen. d) Es mach nix, wenn der pedit-Befehl Enamen von nicht mehr existierend Linien kriegt - die werden ignoriert, wie man sieht. e) Das Ganze ist wie meistens ungetestet - hab nur einmal ausprobiert, ob es überhaupt läuft. Gruß, Axel ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 15. Mrz. 2004 15:26 <-- editieren / zitieren --> Unities abgeben: Nur für AB
|
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 15. Mrz. 2004 15:55 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Ätsch, auch reingefallen :-). Echt lästig, wenn die User immer erst am Ende sagen, was sie wirklich wollen... Marc-><-AB .. ------------------ Ciao, Marc [Diese Nachricht wurde von marc.scherer am 15. Mrz. 2004 editiert.] [Diese Nachricht wurde von marc.scherer am 15. Mrz. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 15. Mrz. 2004 17:51 <-- editieren / zitieren --> Unities abgeben: Nur für AB
|
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 16. Mrz. 2004 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Hallo Andrea, anbei mein Vorschlag, gemäß meinen Ansatz von gestern. ok, deutlich länger als der von Axel, aber funktioniert auch. Ergebnis sind Linieabschnittslisten namens poly1, poly2, ... damit müßte es dann weiter gehen. Gruß spider_dd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 16. Mrz. 2004 09:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Axel, hallo Spider_dd, vielen Dank für Eure Hilfe. Das Problem ist somit gelöst und ich bin sehr erleichtert. Es tut mir leid, dass ich für so viel Verwirrung gesorgt habe. Das wollte ich wirklich nicht. Beim nächsten Mal versuche ich mich von Anfang an genauer auszudrücken. Viele Grüße Andrea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 02. Jun. 2004 10:04 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich muss dieses Thema noch einmal kurz aufwärmen, das es zum Teil bis zu 1 Stunden dauert, bis alles miteinander verbunden wird. Wie kann ich das ändern? Ich bin auf keine gloreiche Idee gekommen. Womit sollte ich den Befehl vl-remove ersetzen. Viele Grüße Andrea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 12. Jul. 2004 07:55 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammn, ich wollte noch mal nachfragen, wie ich das Problem mit dem Laufzeitverhalten minimieren kann. Was kann ich verwenden, anstatt "vl-remove". Wie mache ich das Programm schneller? Mittlerweile braucht es teilweise halt doch sehr lange. Viele Grüße Andrea
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |