| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Listen löschen (1651 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 18. Apr. 2012 14:35 <-- editieren / zitieren --> Unities abgeben:
Hallo ! Ich würde gern aus den Elementdaten einer Polylinie alle dotted pairs rauslöschen als die Koordinatenpunkte. Das müsste doch auch mit vl-remove gehen, als wie mit foreach ------------------ Gruss Dirk 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: 18. Apr. 2012 15:00 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 12. Jul. 2012 13:40 <-- editieren / zitieren --> Unities abgeben:
Ein andere Frage ist es wenn ich bei dieser Liste nur die 10´er listen haben will Code:
(((10 -93.4218 75.2781) (40 . 0.0) (41 . 0.0) (42 . 0.0)) ((10 -89.9888 79.245) (40 . 0.0) (41 . 0.0) (42 . 0.0)) ((10 -85.0538 81.425) (40 . 0.0) (41 . 0.0)(42 . 0.0)) ((10 -77.7229 81.425) (40 . 0.0) (41 . 0.0) (42 . 0.0)) ((10 -70.1775 77.065) (40 . 0.0) (41 . 0.0) (42 . 0.0)))
Wie gehe ich da vor ? ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 12. Jul. 2012 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
(setq L'(((10 -93.4218 75.2781) (40 . 0.0) (41 . 0.0) (42 . 0.0)) ((10 -89.9888 79.245) (40 . 0.0) (41 . 0.0) (42 . 0.0)) ((10 -85.0538 81.425) (40 . 0.0) (41 . 0.0)(42 . 0.0)) ((10 -77.7229 81.425) (40 . 0.0) (41 . 0.0) (42 . 0.0)) ((10 -70.1775 77.065) (40 . 0.0) (41 . 0.0) (42 . 0.0)))) (defun DT:LIST->SUBLIST(LISTE / RETURNLISTE) (defun LISTS->SUBLIST (LISTE) (setq LISTE (reverse LISTE)) (repeat (length LISTE) (if(and(listp(car LISTE)) (vl-every '(lambda(X)(listp X))(car LISTE))) (LISTS->SUBLIST (car LISTE)) (setq RETURNLISTE(cons (car LISTE) RETURNLISTE)) ) (setq LISTE (cdr LISTE)) ) ) (LISTS->SUBLIST LISTE) RETURNLISTE ) (vl-remove-if-not '(lambda(X)(=(car X)10))(DT:LIST->SUBLIST L)) ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."
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: 12. Jul. 2012 14:07 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 13. Jul. 2012 06:57 <-- editieren / zitieren --> Unities abgeben:
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 17. Jul. 2012 07:54 <-- editieren / zitieren --> Unities abgeben:
Wiedermal ein kleines Problemchen, wo ich einfach nicht dahinter steige Ich habe 2 Listen einmal var plist mit: Code: (setq plist '(list ("NB" (157456.0 6.42687e+006 13.9352)) ("DB" (157447.0 6.42686e+006 13.9153)) ("VK" (157445.0 6.42686e+006 13.8937))))
zum zeiten var cplist: Code: (setq cplist '(list ("NB" "NEDBRUNN" "M-BEF-BRUNNAR-INMÄTT") ("DB" "DAGBRUNN" "M-BEF-BRUNNAR-INMÄTT") ("AV" "AVENTIL" "M-BEF-VA-V-INMÄTT") ("DB" "DB" "M-BEF-BRUNNAR-INMÄTT")))
Jetzt möchte ich gern prüfen ob der erste String in plist mit dem ersten string in cplist übereinstimmt das hatte ich vor mit lambda zu tun: (lambda (v) (= (caar x) (caar y))) und dann die listen aus plist rauslöschen, die nicht in cplist definiert sind (vl-remove-if-not '(lambda (v) (= (caar x) (caar y)))) Als Ergebnis möchte ich dann eine neue Liste haben, die so aussieht (("NEDBRUNN" "M-BEF-BRUNNAR-INMÄTT" (157456.0 6.42687e+006 13.9352)) ("DAGBRUNN" "M-BEF-BRUNNAR-INMÄTT" (157447.0 6.42686e+006 13.9153))) ... Zur Erklärung der Listen plist : ("PUNKTCODE" (KOORDINATE)).... cplist ("PUNKTCODE" "BLOCKNAME" "LAYER")... erglist ("BLOCKNAME" "LAYER" (KOORDINATE))... ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1111 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 17. Jul. 2012 11:10 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, ich würde an die Sache etwas anders rangehen, aber wie immer führen viele Wege zum Ziel. Ausgangspunkt: Du hast zwei Listen plist: (("NB" (x1 y1 z1)) ("DB" (x2 y2 z2)) (...)) cplist: (("NB" "Block1" "Layer1") ("DB" "Block2" "Layer2") (...)) wobei in cplist jeder Punktcode auch nur einmal vorkommen darf (in Deinem Beispiel tritt z. B. "DB" zweimal auf, das ist dann nicht mehr eindeutig). Nun würde ich mich durch alle Unterlisten der plist hangeln. Mit (setq punktcode (car unterliste)) bekommst Du Deinen Punktcode, mit (cdr unterliste) die Punktkoordinaten. (assoc punktcode cplist) liefert Dir nun die zugehörige Subliste von cplist, aus der Du nun mit (cadr ...) bzw. (caddr ...) den Blocknamen und den Layer erhälst. Hier hast Du auch gleich noch eine Kontrolle ob der Punktcode in cplist enthalten ist, sonst liefert (assoc ...) nämlich NIL. Nun hast Du alle Zutaten zusammen, um die neue Liste gemäß erglist zusammen zu setzen. HTH Gruß Thomas ps. m. E. ist Dein Listenaufbau im Beispiel auch nocht nicht richtig, das ' steht glaube ich falsch. Es müsste heissen (setq plist (list '("NB" (...)) '("DB" (...)) '(...))). dito bei cplist. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 19. Jul. 2012 09:12 <-- editieren / zitieren --> Unities abgeben:
Stimmt in cplist war ein Punktcode doppelt vergeben Ich komme leider nicht auf einen "grünen Zweig". Mein Versuch mit foreach sollte an dem Beispiel hier eine Gleichheit feststellen
Code: _$ cplist (("DB" "DB" "M-BEF-BRUNNAR-INMÄTT") ("TR" "TR" "M-BEF-BRUNNAR-INMÄTT") ("T" "LÖVTRÄD" "M-BEF-TRÄD") ("SKY" "SKY" "M-BEF-SKYLTAR") ("BS" "BEL-STOLPE" "M-BEF-STOLPAR-INMÄTT") ("FS" "FS" "M-BEF-STOLPAR-INMÄTT")) _$ plist (("K" (157532.0 6.42687e+006 15.259)) ("K" (157534.0 6.42687e+006 15.2861)) ("DB" (157537.0 6.42687e+006 15.3359))) _$ kein Erfolg, kein Erfolg, kein Erfolg,
Code: (foreach n plist (cond ((/= (caar plist) (caar cplist)) (setq cplist (cdr cplist)) (princ "kein Erfolg, ") ) ((= (caar plist) (caar cplist)) (setq elist (cons (cons (cdar cplist) (cdr n)) elist)) (setq plist (cdr plist)) (princ "eine übereinstimmung") ) ) )
Vielleicht stelle ich es auch zu kompliziert an. Mein Gedanke ist vergleiche cplist und plist solange bis, cond ((wenn du keine übereinstimmung findest (princ "Kein Erfolg" reduziere cplist um die 1.stehende liste ((wenn du eine übereinstimmung findest dann setze es in die elist und reduziere plist um die erststehende Liste. ------------------ Gruss Dirk 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: 19. Jul. 2012 09:56 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Dein Code läuft einwandfrei. Dein Fehler ist, dass Du immer nur die ERSTEN Einträge vergleichst und im Falle des Misserfolgs gleich das erste Element aus cplist löschst(!). (diese stimmt aber im aktuellen Fall mit dem LETZTEN überein). Durch das Löschen vergleicht Dein foreach ab dem 2. Plist-Element mit einer leeren Liste. Besser so: Code: (foreach n plist (foreach m cplist (if (=(car n) (car m)) (princ "Erfolg, ") ) ) )
oder mit assoc:Code: (foreach n plist (if (assoc (car n) cplist) (princ "Erfolg, ") ) )
Grüsse, Henning
------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 19. Jul. 2012 11:41 <-- editieren / zitieren --> Unities abgeben:
Intressant Henning deine Lösung, wobei mir 2 Dinge nicht klar sind: wie weiss die foreach m schleife was in der foreach n schleife drinn steht. Wird nicht zuerst m evaluiert und anschliessen n... Irgendwie verstehe ich nicht ganz wie foreach arbeitet. Meiner Meinung sagt foreach gibt den Ausdruck einer Liste aus, das passiert einmal mit m, wird der Inhalt von cplist ausgedruckt und zum zweiten mit n wird der Inhalt von plist ausgedruckt und dann wie weiter, wie kann ich das Ergebnis der Ausdrucke verwenden. Sprich meine elist, die die Listenpaare aus plist und cplist zusammenstellt erstellen ? Wenn ich (setq elist (cons (cdr m) (cdr n))) nach (= (car n) (car m)) einbaue erhalte ich das letzte Listenpaar was so aussieht (("TB" "M-BEF-BRUNNAR-INMÄTT") (157534.0 6.42687e+006 15.3089)) Wo stehen die restlichen Listenpaare ? ------------------ Gruss Dirk 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: 19. Jul. 2012 11:56 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
die gefundenen Paare mußt Du natürlich auch als Liste speichern, sonst wird elist bei jedem Durchlauf überschrieben: (setq elist (cons (cons (cdr m) (cdr n)) elist)) Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de [Diese Nachricht wurde von wronzky am 19. Jul. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1111 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 19. Jul. 2012 12:01 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, (foreach ... pack nacheinander jedes Element einer Liste (also Deine einzelnen Unterlisten) in n rein und führt dann die nachfolgenden Befehle der Schleife aus. Also im ersten Durchlauf ist n = ("K" (157532.0 6.42687e+006 15.259)) (assoc (car n) cplist) sucht also nach "K" als ersten Eintrag in den Unterlisten Deiner cplist und findet dann ... nichts, weil es eine Unterliste mit "K" nicht gibt. Im dritten Durchlauf ist n = ("DB" (157537.0 6.42687e+006 15.3359)), (assoc (car n) cplist) liefert ("DB" "DB" "M-BEF-BRUNNAR-INMÄTT") was man mit (setq gefunden (assoc (car n) cplist)) gleich noch in eine Variable legen kann. mit (if gefunden (progn (setq neue_erglist_unterliste (list (cadr gefunden) (caddr gefunden) (cdr n))))) - ungetestet - solltest Du nun Deine gewünschte Unterliste für erglist erhalten Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 20. Jul. 2012 08:25 <-- editieren / zitieren --> Unities abgeben:
Hallo Henning und Thomas! Danke Euch beiden - ihr habt mir echt super weitergeholfen, wenn auch ich ganz schöne Würmer in meinen Angaben reingehauen habe. Was würde ich nur ohne die Experten hier machen. Vielleicht ist aber der Thread auch hilfreich für andere. ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |