| |
| 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: assoc?? (1350 mal gelesen)
|
Moony Mitglied Werkzeugmacher
Beiträge: 49 Registriert: 29.02.2004
|
erstellt am: 14. Mrz. 2004 12:52 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, mal wieder ein Anfängerproblem. Ich möchte folgende Klammern filtern! (defun C bj() (setq obj (entsel" Objekt wählen\n")) (setq ul (entget(car obj))) (princ ul) (princ "\n") (princ) (princ(setq p1 (cdr(assoc 10 ul)))) (princ "\n") (princ(setq Name (cdr(assoc 8 ul)))) (princ) ) **** das wird angezeigt ***** ((-1 . <Objektname: 7ef6d460> ) (0 . LWPOLYLINE) (330 . <Objektname: 7ef6bcc0> ) (5 . 1BC) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . Verguß) (6 . Continuous) (100 . AcDbPolyline) (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 67.8505 29.062) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 80.7359 29.062) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 80.7359 39.4718) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 67.8505 39.4718) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0)) (67.8505 29.062) Verguß ich möchte aber auch auf die anderen Eckpunkte zugreifen können die unter "assoc 10" stehen jedes weitere verschachteln mit c??r oder auch nth führt zu Fehlermeldungen
(10 67.8505 29.062) (10 80.7359 29.062) (10 80.7359 39.4718) (10 67.8505 39.4718) Gruß Moony Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 14. Mrz. 2004 13:54 <-- editieren / zitieren --> Unities abgeben: Nur für Moony
Schau die mal folgenden Code an : (defun C:GET_GC10_OBJ( / OBJEKT OBJEKTDATEN PKTLIST) (if(setq OBJEKT (entsel" Objekt wählen\n")) (progn (setq OBJEKTDATEN (entget(car OBJEKT))) (while OBJEKTDATEN (if (setq OBJEKTDATEN (member (assoc 10 OBJEKTDATEN)OBJEKTDATEN)) (progn (princ "\n")(prin1 (car(member(assoc 10 OBJEKTDATEN)OBJEKTDATEN))) (setq PKTLIST (cons (car(member(assoc 10 OBJEKTDATEN)OBJEKTDATEN))PKTLIST)) (setq OBJEKTDATEN (cdr OBJEKTDATEN)) ) ) ) (reverse PKTLIST) ) ) ) ..(member (assoc 10 OBJEKTDATEN)OBJEKTDATEN) gibt alle GC's ab ersten gefundenen GC10 zurück. (car(member (assoc 10 OBJEKTDATEN)OBJEKTDATEN)) dann den GC10 und (cdr(member (assoc 10 OBJEKTDATEN)OBJEKTDATEN)) speichert die Restliste für den nächsten Suchlauf usw... ------------------ - Thomas - [Diese Nachricht wurde von CADmium am 14. Mrz. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Moony Mitglied Werkzeugmacher
Beiträge: 49 Registriert: 29.02.2004
|
erstellt am: 14. Mrz. 2004 14:58 <-- editieren / zitieren --> Unities abgeben:
Danke Thomas, Du suchst mit "assoc 10" und mit "nember" wird vom zuletzt gefundenen Ojekt weiter gesucht und die Variable Objektdaten überschrieben. In der Zeile mit Pktlist wird gleich mit cons eine neue Liste erstellt. Ich hoffe ich habe es richtig verstanden? Warum kann ich aber nicht gleich mit z.B. "nth 11 Name" die Klammer ansprechen die ich in der Liste suche? Gruß Moony
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Moony Mitglied Werkzeugmacher
Beiträge: 49 Registriert: 29.02.2004
|
erstellt am: 14. Mrz. 2004 16:27 <-- 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: 14. Mrz. 2004 19:31 <-- editieren / zitieren --> Unities abgeben: Nur für Moony
Hallo Moony, folgend zwei weitere Lösungen, etwas schlanker als CADmiums Ansatz.
Code:
(setq pl (car (entsel));LWPolyline-Wählen, Elementname ermitteln ptds(vl-remove-if-not;Alle Werte, die keine Stützpunktdaten enthalten, aus der Elementdatenliste entfernen '(lambda (ED) (= (car ED) 10) ) (entget pl) ) pts (mapcar 'cdr ptds);den Key (10) entfernen ) ;oder (setq pts (apply 'append (mapcar '(lambda (ED) (if (=(car ED)10) (list (cdr ED)) ) ) (entget pl) ) ) )
Bei Fragen ... 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 |
Andi L Mitglied
Beiträge: 8 Registriert: 27.11.2003 ACAD 2002
|
erstellt am: 14. Mrz. 2004 19:46 <-- editieren / zitieren --> Unities abgeben: Nur für Moony
Hi Moony Auf die einzelnen Vertices einer PLINE mit (nth ...) zugreifen ist eine wacklige Sache, weil Du nicht sicher weißt, wieviele andere Gruppencodes zwischen den einzelnen GC10 liegen. Meistens sind es zwar 3GC's (40,41 und 42), aber 100%ig ist das nicht. Lieber erst alle GC10 ausfiltern, dann kannst Du auf die neue Liste mit nth zugreifen. Die GC10 bekommst Du mit folgender Funktion (nur ein Vorschlag): code: ;;;------------------------------------------------------------ ;;; filtert Vertices aus 'ele' (ele=Elementliste) ;;;------------------------------------------------------------ (defun get_vtx (ele / vtx_list) (foreach item ele (if (= 10 (car item)) (setq vtx (cons item vtx)) ) ) (reverse vtx) ) oder mit VL-Unterstützung: (defun get_vtx (ele) (vl-remove-if-not '(lambda (item) (= 10 (car item))) ele) ) Grüße Andi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Moony Mitglied Werkzeugmacher
Beiträge: 49 Registriert: 29.02.2004
|
erstellt am: 14. Mrz. 2004 20:58 <-- editieren / zitieren --> Unities abgeben:
Danke Holger, ich werde beides testen, aber trotzdem eine Frage noch zu der alten Version. Die Variable ecken hat diesen Inhalt: ((10 67.8505 29.062) (10 80.7359 29.062) (10 80.7359 39.4718) (10 67.8505 39.4718)) (setq m (cdar(nth 2 ecken))) Die Zeile verursacht immer eine Fehlermeldung Dabei möchte ich nur, mit "nth 2 ecken" die dritte Klammer ansprechen (10 80.7359 39.4718) dann mit "cdar" als erstes durch "d" die 10 abschneiden und mit dem "a" bleibt 80.7359 über. Gruß Moony 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 07:21 <-- editieren / zitieren --> Unities abgeben: Nur für Moony
Hallo Moony, mit (car..) sprichst du das erste Element einer Liste an. (cdr..) gibt dir die Liste ohne das erste Element als Ergebnis zurück. Mit (nth..) sprichst du ein Listenelement direkt an, und erhältst auch nur dieses als Ergebnis. Deine Liste sieht so aus: ((10 67.8505 29.062) (10 80.7359 29.062) (10 80.7359 39.4718) (10 67.8505 39.4718)) Du möchtest von jedem Element den Schlüssel, also die 10, entfernen. Für ein einzelnes Element macht man das dann mit (cdr..) - für alle auf einmal mit (mapcar 'cdr LISTE) -> ((67.8505 29.062) (80.7359 29.062) (80.7359 39.4718) (67.8505 39.4718)) Möchtest du nun die einzelnen Punkte in deinem weiteren Code verwenden, dann kannst du diese mit (nth 0 LISTE)->das erste Element (nth 1 LISTE)->das zweite Element (nth X LISTE)->das (X+1)te Element ansprechen. Möchtest du mit jedem Stützpunkt das selbe machen, dann lohnt es über ein (foreach ELEM LISTE (machwas ELEM) ) oder ein (mapcar '(lambda (ELEM) (machwas ELEM) ) LISTE) nachzudenken. Du möchtest also den 3ten Stützpunkt für irgendeine weitere Operation haben, dann geht das mit (cdr(nth 2 LISTE))->(80.7359 39.4718) Bei Fragen ... 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 |
Moony Mitglied Werkzeugmacher
Beiträge: 49 Registriert: 29.02.2004
|
erstellt am: 15. Mrz. 2004 08:23 <-- editieren / zitieren --> Unities abgeben:
|