| |
| 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: Auswahl aller Objekte auf bestimmten Layern (1564 mal gelesen)
|
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004
|
erstellt am: 29. Mrz. 2006 13:49 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, mit folgendem (aus diesem Forum stammenden; Danke!!) Code: (sssetfirst (setq A(ssget "_X" (list(cons 8 (cdr(assoc 8 (entget (car (entsel)))))))))A)
kann ich alle Objekte eines Layers auswählen. Wie muss ich den Code nun verändern, damit ich mehrere Layer angeben kann? Oder wird das zu aufwendig?mfg didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 29. Mrz. 2006 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
so z.B: (sssetfirst (setq A(ssget "_X" '((8 . "LAYER1,LAYER2,LAYER3"))))A) ------------------ - 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 |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004
|
erstellt am: 29. Mrz. 2006 14:37 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, danke für die rasche Antwort. Leider hab ich meine Frage nicht exakt genug formuliert. Ich möchte die Layer nicht anhand ihrer Namen definieren, sondern duch anklicken auswählen. Wobei die Anzahl vorher nicht bekannt ist, sondern durch beenden der Auswahl definiert werden soll. Ich hoffe ich bin mit meiner Bitte nicht zu unverschämt, aber ich verstehe zu wenig von Lisp um mir da eine Schleife bauen zu können. mfg Didi
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: 29. Mrz. 2006 14:48 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Hallo Didi, ok, dann wollen wir mal helfen, dass das Lisp-Wissen wächst. Du brauchst also eine Schleife die Beendet wird, wenn kein Objekt mehr gewählt wurde. Das ist dann eindeutig (while Du brauchst was zur Objektwahl: (entsel ..) Du brauchst was, um den Layer rauszubekommen: (cdr(assoc 8 (entget .. Und du brauchst was, um den String zu basteln, der die Layernamen entält. (setq laySTRING (strcat laySTRING "," LAYERNAME)) und im Ganzen müsste das so, oder so ähnlich aussehen: (while (setq obj(entsel "Qobjekt wählen: ")) (setq layername(cdr(assoc 8 (entget (car obj)))) laySTRING (if laySTRING layername (strcat laySTRING "," layername))) ) ungeprüft und gleich hier in den Beitrag greingetippt, daher mal scheuen, ob sich nicht doch kleine Fehler eingeschlichen haben. Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 29. Mrz. 2006 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Hallo Didi, vielleicht hilft Dir auch folgender Gedankenansatz weiter, es werden alle Layern der ausgewählten Elemente als Liste in den ssget-Filter eingebracht, beim Schnelltest hat es bei mir fuktioniert. Code:
(defun C:test (/) (sssetfirst (setq A (ssget "_X" (append (append (list (cons -4 "<OR")) (aws_list)) (list (cons -4 "OR>")) ))) A) ) (defun aws_list (/) (mapcar '(lambda (A) (cons 8 A)) (layer_auswahl)))
(defun layer_auswahl (/ aws n liste) (princ "\nWählen Sie Objekte aus:") (if (setq aws (ssget)) (progn (setq n 0) (repeat (sslength aws) (if (not (member (cdr (assoc 8 (entget (ssname aws n)))) liste)) (setq liste (cons (cdr (assoc 8 (entget (ssname aws n)))) liste))) (setq n (+ n 1))))) liste)
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004
|
erstellt am: 29. Mrz. 2006 16:06 <-- editieren / zitieren --> Unities abgeben:
Hallo, @ Jörn: Danke, aber Holger hat mein Problem schon gelöst. @ Holger, Danke, jetzt hab ich nicht nur eine neue (sehr hilfreiche) Funktion, sondern bin auch noch stolz drauf was gelernt zu haben. Ich hoffe es ist keine Anmaßung, aber ich musste deinen Code etwas abändern. Der Eintrag in meinem Menümacro sieht nun so aus:
Code: ^C^C_select ^C(setq laystring nil)(sssetfirst (setq A(ssget "_X" (list(cons 8 (while (setq obj(entsel "Objekt wählen: "))(setq layername(cdr(assoc 8 (entget (car obj)))))(setq laySTRING (if laySTRING (strcat laySTRING "," layername) layername)))))))A)
Das select^C brauche ich um die vorherige Auswahl aufzuheben. (setq laystring nil) habe ich einfgefügt um die Variable zu initialisieren. Vor der ersten laySTRING hab ich ein "(setq" eingefügt, und beim "if" habe ich die Werte umgedreht.(Wie du siehst habe ich deine verstecken Aufgaben gelöst ) Die vielen Klammern verwirren mich immer noch, aber das Macro macht was es soll. Deine Erklärungen waren super, eigenlich sind 10 Units zu wenig, aber mehr kann ich dir leider nicht überweisen!mfg Didi
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: 29. Mrz. 2006 16:14 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
hmm, das waren jetzt keine versteckten Aufgaben <grins> .. ich habe es wirklich nur schnell runtergetippt und da passieren eben solche Dinge, zumal man hier nicht so die rechte Unterstützung beim proggen hat, wie im VLIDE. (wäre ja mal ein Hinweis für Andreas <lach>Aber es freut mich zu lesen, dass es nicht nur stupide übernommen, sondern auch verstanden wurde - das ist ja das Ziel dieses Forums, Wissen austauschen. Und positiver Nebeneffekt ist: Jetzt ist noch ein Beitrag da, den du mit 10Us bewerten kannst ;-) Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 29. Mrz. 2006 16:17 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Zitat: Original erstellt von Brischke:
Und positiver Nebeneffekt ist: Jetzt ist noch ein Beitrag da, den du mit 10Us bewerten kannst ;-)
IMHO werden dir bloß einmal die 10 gutgeschrieben .. ------------------ - 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 |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004
|
erstellt am: 29. Mrz. 2006 16:49 <-- editieren / zitieren --> Unities abgeben:
Hallo nochmal, Da ich nun schon Spaß daran habe, hab ich noch etwas rumgebastelt. Um das Ganze lesbarer zu machen hab ich mein Macro geändert:
Code: ^C^C_select ^C(cond ((null C:LaySel) (load "LaySel"))) LaySel;
und mir eine Datei namens LaySel.lsp geschrieben, welche folgenden Code enthält:
Code: ; Selektieren aller Elemente auf den gepickten Layern ; (defun C:LaySel (/) (setq laystring nil) (setq layername nil) (while (setq obj(entsel "Objekt wählen: ")) (setq layername(cdr(assoc 8 (entget (car obj))))) (setq laySTRING (if laySTRING (strcat laySTRING "," layername) layername)) ) (sssetfirst (setq A(ssget "_X"(list(cons 8 laySTRING))))A) )(princ "\nStarten mit laysel")
Also nochmals Danke an alle, hat Spaß gemacht, und ist eine nützliche Erweiterung der CAD-Umgebung. mfg Didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 29. Mrz. 2006 18:00 <-- editieren / zitieren --> Unities abgeben: Nur für Goofy007
Die Lösung von Holger ist sicherlich die einfachere und verständlichere Lisp-Lösung. Trotzdem möchte ich hier auf die Vorzüge von Jörns Code hinweisen, um seine Leisutng zu würdigen. Deine (aus Holgers Tipps entstanden Version) muss (wegen entsel) jedes Objekt einzeln anwählen, ssget erreicht durch Auswahlfenster mit 2 Mausklicks unendlich viele Objekte/Layer. Außerdem wird in Jörns Code jeder Layer nur einmal im Suchstring angegeben, bei deinem Code wird durch Anpicken von 10 Objekten auf dem gleichen Layer, der Layername 10x im Suchstring aufgeführt (hat aber keine praktischen Nebenwirkungen - mehr des Prinzips wegen).
------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |