| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Punkt aus Auswahlsatz filtern (1459 mal gelesen)
|
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 08. Okt. 2002 09:30 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe zwei Auswahlsätze erstellt, die ein paar Punkte enthalten. (defun c:fgh () (setq as_Punkte_gelb (ssget"X" '((8 . "PUNKTE_1")(0 . "POINT")))) (setq as_Punkte_rot (ssget"X" '((8 . "STARTFADEN")(0 . "POINT")))) ) Nun möchte ich, auf den ersten Punkt der Liste as_Punkte_gelb zugreifen. Wie filtere ich den noch mal raus? Viele Grüße Andrea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UJJ Mitglied
Beiträge: 190 Registriert: 05.03.2002
|
erstellt am: 08. Okt. 2002 09:34 <-- editieren / zitieren --> Unities abgeben: Nur für AB
|
AB Mitglied
Beiträge: 255 Registriert: 24.05.2002 Mechanical Desktop 6 AutoCAD 2002
|
erstellt am: 08. Okt. 2002 09:38 <-- editieren / zitieren --> Unities abgeben:
Nee, das komische ist ja, dass ich so folgende Fehlermeldung erhalte: "Fehler Fehlerhafter Argumenttyp: consp <Selection set: d7a>"Dies macht alles rückgängig. OK? <J> Was ist demnach falsch? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UJJ Mitglied
Beiträge: 190 Registriert: 05.03.2002
|
erstellt am: 08. Okt. 2002 10:34 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Sorry, ich habelänger nichts mehr in LISP gemacht. Auf Auswahlsätze kann man mit den Listenfunktionen nicht zugreifen, sondern man muss die SS* Funktionen verwenden. Das erste Element aus deinem Auswahlsatz bekommt man mit (ssname setq as_Punkte_gelb 0) Gruss Uwe 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: 08. Okt. 2002 11:11 <-- editieren / zitieren --> Unities abgeben:
Das funktioniert aber immer noch nicht. Jetzt habe ich in einem Buch diesen Befehl gefunden: (ssname (ssget as_Punkte_gelb) 0) Aber auch das funtioniert nicht. Hast Du vielleicht noch eine Idee?
Gruß 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: 08. Okt. 2002 11:24 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Hallo Andrea, versuche doch mal in der vlisp-Hilfe nach 'vl-sort' zu suchen. Wenn mich nichts täuscht, ist dort das Sortieren von Punkten nach einer Koordinate sogar als Beispiel enthalten. Wenn du nicht klar kommst, dann melde dich und ich suche mal in meinen Routinen. Grüße Holger ------------------ Holger Brischke CADlon Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UJJ Mitglied
Beiträge: 190 Registriert: 05.03.2002
|
erstellt am: 08. Okt. 2002 11:32 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Neuer Versuch (das kommt davon wenn mal faul ist, kopiert und nicht aufpasst): (ssname as_Punkte_gelb 0) Du bekommst dann den Objektnamen. Mit (entget(ssname as_punkte_gelb 0)) bekommst du dann eine Liste, in der das Objekt dann beschrieben ist. gruss Uwe 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: 08. Okt. 2002 13:34 <-- editieren / zitieren --> Unities abgeben:
Also die Idee mit dem vl-sort Befehl wäre schon super. Allerdings weiß ich trotzdem nicht, wie ich an die x,y und z-Werte der einzelnen Punkte kommen. Der Befehl vl-sort benötigt ja die einzelnen Puntkepaare, aber wie erhalte ich sie in dem entsprechenden Format. (defun c:sorti () (setq as_Punkte_gelb (ssget"X" '((8 . "PUNKTE_1")(0 . "POINT"))) Punkte_gelb_Liste_1 (ssname as_Punkte_gelb 0) ; hiermit erhalte ich immer nur eine Koordinate und nicht die aller Punkte Punkte_gelb_Liste (entget as_Punkte_gelb) Punkte_gelb (cdr (assoc 10 Punkte_gelb_Liste)) ) (vl-sort '(as_Punkte_gelb) (function (lambda (e1 e2) (< (car e1) (car e2))))) ) Könnte ihr mir vielleicht noch mal weiterhelfen. Ich habe es nämlich auch schon mit dem BEfehl "_list" probiert, dass hat mich aber auch nicht weitergebracht. (command "_list" (ssget"X" '((8 . "PUNKTE_1")(0 . "POINT")))"") 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: 08. Okt. 2002 13:46 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Hallo Andrea, ff die Lösung:
Code:
(defun c:sorti () (setq as_Punkte_gelb (ssget "X" '((8 . "PUNKTE_1")(0 . "POINT"))) Punkte_gelb_Liste_1 (mapcar '(lambda (EL) (cdr(assoc 10 EL)) ) (mapcar 'entget (bau_elemli as_Punkte_gelb))) ) (vl-sort Punkte_gelb_Liste_1 (function (lambda (e1 e2) (< (car e1) (car e2))))) ) (defun bau_elemli (asatz / n elemli) (setq n 0) (repeat (sslength asatz) (setq elemli(cons (ssname asatz n) elemli) n (1+ n)) ) elemli )
Grüße Holger ------------------ Holger Brischke CADlon 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: 08. Okt. 2002 14:11 <-- 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: 08. Okt. 2002 14:39 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Hallo Andrea, ich denke du solltest dir ersteinmal im Klaren über die verschiedenen Lisp-Datentypen werden. Ein Auswahlsatz ist nun mal keine Liste. Die Auswahlsätze lassen sich auch nur mit den Funktionen (ss...) bearbeiten. Das ist zwar umständlich, aber es funktioniert. Was, so glaube ich, bei allen etwas länger dauert ist das Handling der Funktionen (mapcar...) (lambda...) (apply...) Deshalb mal ganz kurz umgangssprachlich: (mapcar funktion liste) heißt: mache für jedes Elementen der liste, das was in der Funktion vorgegeben ist und gib das Ergibnis als Liste zurück Bsp: (mapcar '1+ '(1 2 3 4))->(2 3 4 5) Das Ergebnis wird also immer genau so viele Elemente haben, wie zuvor übergeben wurden. In Kombination mit dem (lambda...) ist die (mapcar...)Funktion unschlagbar. Das ermöglicht dem Programmierer eigene Funktionen zu definieren, die von (mapcar...) genutzt werden. Die Einschränkung auf in LISP vorgegebene Funktionen entfällt somit. Das Gleiche Bsp wie oben nur als lambda-Konstrukt (mapcar '(lambda (E)(1+ E))'(1 2 3 4)) (apply...) gibt nicht das Ergebnis aller Elemente an sondern Ein ergebnis der Funktion, angewendet auf die übergebene Liste. (apply funktion liste) heißt: mache auf alle Elemente der liste, das was in der Funktion vorgegeben ist und gib das Ergebnis als Wert zurück Bsp: (apply '+ '(1 2 3 4))->10 Es wird also Die Summe aller Listenelemente zurück gegeben (apply 'strcat '("AN" "DR" "EA"))->ANDREA Versuch Dir dessen klar zu werden, dann verstehst du auch die geposteten Code-Schnipsel besser. Auf Axel's Tutorial möchte ich noch verweisen. Dort sind gerade diese Themen sehr ausführlich beschrieben. Noch 'ne Frage: Mit welchem Editor arbeitest Du? Mit Vlisp kann man hervorragend debuggen, es werden die Datentypen angezeigt, was Dir sicher geholfen hätte, das Problem selbst zu erkennen. Bei Fragen ... ------------------ Holger Brischke CADlon 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: 11. Okt. 2002 10:09 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, ich muss noch mal etwas zu dem Code nachfragen: (vl-sort Punkte_gelb_Liste_1 (function (lambda (e1 e2) (< (car e1) (car e2))))) ) => Sortiert nach x-Werten JETZT IST ES ABER SO, DASS TEILWEISE DER X-WERT GLEICH IST: FÜR DEN FALL MUSS DIE BEDINGUNG EINGEBAUT WERDEN, DASS DANN NOCH DER Y-WERT VERGLICHEN WERDEN MUSS. ICH HABE JETZT FOLGENDE BEDINGUNG ZUSÄTZLICH EINGEFÜGT, DIE ABER MAL WIEDER NICHT FUNKIONIERT. (vl-sort Punkte_gelb_Liste_1 (function (lambda (e1 e2) (if (= (car e1) (car e2)) (< (cadr e1) (cadr e2)) (< (car e1) (car e2)) ) )) Verwende ich die if-Syntax falsch? Gruß Andrea [Diese Nachricht wurde von AB am 11. Oktober 2002 editiert.] 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: 11. Okt. 2002 20:08 <-- editieren / zitieren --> Unities abgeben: Nur für AB
Hallo Andrea, was funktioniert denn nicht? Hast du schon einmal das Programm im Einzelschritt ablaufen lassen und dabei das Verhalten beobachtet? Ich vermute, dass der Verglich in dem (If (=...) nie erfüllt wird, weshalb das Programm nie in die Zeile (< (cadr e1) (cadr e2)) reinläuft. Ersetze den Vergleich durch ein (equal (car e1)(car e2) 0.00000005) Begründung: Zwei Zahlen, die augenscheinlich gleich sind, können jedoch in der 16. Nachkommastelle abweichen. Das sieht man nicht, aber die Zahlen sind nicht gleich! Die (equal A B C) gibt im Parameter C dem Programmierer die Möglichkeit beim Vergleich zu sagen, dass in der soundsovielten Nachkommastelle eine gewisse Abweichung toleriert wird. Probier es aus, und wenn's nicht funkt meldest du dich bestimmt wieder. ;-) Grüße Holger ------------------ Holger Brischke CADlon - Lisp over night 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: 14. Okt. 2002 09:19 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen Holger, jetzt funktioniert der Code, wo ich alles neu gestartet habe. Es lag wohl daran, dass vorher auf noch "alte", irgendwann im Laufe des Tages geladene Skripte zugegriffen wurde. Ich muss wohl öfter mal eine neue Zeichnung erstellen. Es wird viel zu viel mit protokolliert. Viele Grüße Andrea Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |