| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Alles auswählen ausser... mit Lisp (2954 mal gelesen)
|
Hänk Mitglied
Beiträge: 126 Registriert: 10.05.2004 ADT 2004 / AutoCAD 2004
|
erstellt am: 11. Jan. 2006 14:07 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Nach welchen Begriffen/Befehlen soll ich googeln, wenn ich folgendes bewerkstelligen möchte mit Lisp: Alles markieren, ausser Objekte mit einer gewissen Farbe oder einer anderen bestimmten Eigenschaft (z.B. Linientyp oder so) und diese dann bearbeiten, z.B. Layerfarbe auf 6 umstellen). Mit der Schnellauswahl ist das einfach gemacht, aber mit Lisp? Ist ssget dazu der richtige Befehl um solche Auswahlsätze zu bilden? Bin Anfänger, möchte aber gleich an gewissen Beispielen den Einstieg finden deshalb die wahrscheinlich komische Frage. Viele Grüsse Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 11. Jan. 2006 14:15 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Wie wäre es, wenn du ganz simpel alles auswählst und dann einfach die Objekte die dem Kriterium entsprechen vom Auswahlsatz entfernst ? ------------------ Grüsse Thomas PS: Sonst schau dir mal die Operatoren zu ssget an Beispiel dazu wäre dann: (SSGET "X" '((0 . "CIRCLE") (-4 . "!=") (40 . 2.0))) Wählt alle Kreise aus deren Radius ungleich 2.0 ist... [Diese Nachricht wurde von tunnelbauer am 11. Jan. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hänk Mitglied
Beiträge: 126 Registriert: 10.05.2004 ADT 2004 / AutoCAD 2004
|
erstellt am: 11. Jan. 2006 14:21 <-- editieren / zitieren --> Unities abgeben:
Deine Argumentation das man alles auswählen soll und dann gewisse Objekte aus der Wahl entfernen kann ist genau das was ich will. Aber wie mache ich sowas in Lisp? Werde mal nach ssget googeln, vielleicht komm ich weiter. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Jan. 2006 14:28 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
nochmal als Ergänzung: (SSGET "X" '((0 . "CIRCLE") (-4 . "!=") (8 . "AM_0"))) wählt alle Kreise, die nicht auf dem Layer AM_0 gezeichnet wurden (SSGET "X" '((0 . "CIRCLE") (8 . "AM_0"))) wählt alle Kreise, die auf dem Layer AM_0 gezeichnet wurden .. somit kann man mit ssget fast alles Erschlagen. Für Elemente in Blöcken ect. funktioniert das allerdings nicht. ------------------ - 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 |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 11. Jan. 2006 14:51 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Zitat: Original erstellt von Hänk: Deine Argumentation das man alles auswählen soll und dann gewisse Objekte aus der Wahl entfernen kann ist genau das was ich will. Aber wie mache ich sowas in Lisp? Werde mal nach ssget googeln, vielleicht komm ich weiter.
Meine prinzipielle Empfehlung: in LISP arbeitet man mit Listen, und nicht mit Auswahlsätzen. Schreib' Dir also ein paar elementare Umwandlungsfunktionen (selset->entityliste usw) und ein paar passende Listenfunktionen (die hier nötige gibt's mWs schon als VL-XXX Funktion: REMOVE-IF), und dann geht's los: 1. Bilde den Auswahlsatz für "Alles": (ssget "X") wandle den in eine Liste L1 um. 2. Bilde den Auswahlsatz für das, was nicht im endgültigen Auswahlsatz sein soll: (ssget ... <Filter> ) wandle den in eine Liste L2 um 3. entferne alle Elemente aus L1, die in L2 vorkommen, das Ergebnis ist das, was Du willst. Tom Berger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hänk Mitglied
Beiträge: 126 Registriert: 10.05.2004 ADT 2004 / AutoCAD 2004
|
erstellt am: 11. Jan. 2006 14:51 <-- editieren / zitieren --> Unities abgeben:
Danke euch beiden, werde mir mit diesen SelectionSets mal die Zeit vertreiben. Woher nehmt ihr den die Infos was diese Zahlen zu bedeuten haben im Code? Habe was von DXF gruppencode gelesen, aber gibts da irgendwie eine Grundregel oder eine Übersicht? Wenn ich z.B. nach Farben suchen will? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Jan. 2006 14:57 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Zitat: Original erstellt von Hänk: Woher nehmt ihr den die Infos was diese Zahlen zu bedeuten haben im Code? Habe was von DXF gruppencode gelesen, aber gibts da irgendwie eine Grundregel oder eine Übersicht?
guckst du hier------------------ - 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 |
Hänk Mitglied
Beiträge: 126 Registriert: 10.05.2004 ADT 2004 / AutoCAD 2004
|
erstellt am: 11. Jan. 2006 15:02 <-- editieren / zitieren --> Unities abgeben:
|
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: 11. Jan. 2006 17:47 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Zitat: Tom Berger schrub: Schreib' Dir also ein paar elementare Umwandlungsfunktionen (selset->entityliste usw) und ein paar passende
Hallo Tom, mal 'ne grundsätzliche Frage: Ist das immer der richtige Weg? Geht bei wirklich großen Objektmengen nicht eine Menge Zeit für die Umwandlung von Selset nach Liste und später eventuell wieder zurück drauf? Ist bei großen Selsets ein ss-foreach (siehe Mapcars Seiten...) nicht deutlich effizienter? Ich weiß es nicht, bin nicht so der Laufzeit-Analytiker, aber vielleicht kannst Du ja mal was aus Deiner Praxis heraus was dazu sagen? Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 11. Jan. 2006 22:50 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Zitat: Original erstellt von marc.scherer: Hallo Tom, mal 'ne grundsätzliche Frage: Ist das immer der richtige Weg? Geht bei wirklich großen Objektmengen nicht eine Menge Zeit für die Umwandlung von Selset nach Liste und später eventuell wieder zurück drauf? Ist bei großen Selsets ein ss-foreach (siehe Mapcars Seiten...) nicht deutlich effizienter? Ich weiß es nicht, bin nicht so der Laufzeit-Analytiker, aber vielleicht kannst Du ja mal was aus Deiner Praxis heraus was dazu sagen?
Du kannst das ja einfach mal austesten. IMO ist der Zugriff auf die Elemente über Listen meist wesentlich effizienter als über die Picksets, so dass der minimale Overhead der Umwandlung nie ins Gewicht fällt. Ich jedenfalls bin dabei noch nie an relevante Grenzen gestoßen. Hier sind die Funktionen dafür: Code:
(defun ss_s2e (sset / eset counter) (setq counter 0) (repeat (sslength sset) (setq eset (cons (ssname sset counter) eset) counter (1+ counter) ) ) eset )(defun ss_e2s (eset / sset x) (setq sset (ssadd)) (mapcar '(lambda (x) (setq sset (ssadd x sset)) ) eset ) sset )
Tom Berger
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: 12. Jan. 2006 10:38 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Zitat: Tom Berger schrub: Ich jedenfalls bin dabei noch nie an relevante Grenzen gestoßen.
Hi Tom, danke für Deine Aussage. Aber was heißt "relevante Grenzen"? Ich bin hier im GIS unterwegs und eine Verarbeitung von 'ner Million Objekten oder mehr ist nicht selten. Mit welchen Mengen hattest Du es bisher zu tun? Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 12. Jan. 2006 12:07 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Zitat: Original erstellt von marc.scherer: Hi Tom, danke für Deine Aussage. Aber was heißt "relevante Grenzen"? Ich bin hier im GIS unterwegs und eine Verarbeitung von 'ner Million Objekten oder mehr ist nicht selten. Mit welchen Mengen hattest Du es bisher zu tun?
Meine Kunden haben sicher auch diese Größenordnungen - nicht wenige davon sind auch im GIS-Bereich tätig. Ich selber zeichne nicht. Nochmals: Du kannst das gerne mal testen: der Geschwindigkeitsverlust durch die Konversion ist marginal, und bei den meisten Funktionen wirst Du sogar enorme Geschwindigkeitsvorteile haben. Davon abgesehen entgehst Du mit den Listen auch all den bösartigen Seiteneffekten, die die Verwendung von Picksets so mit sich bringen, und Du bist nicht auf die kleine Zahl von Funktionen zur Bearbeitung von Picksets beschränkt, sondern kannst ganz und gar LISP-konform mit Listen arbeiten. Tom Berger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
benwisch Mitglied Bautechniker, CAD-Konstrukteur
Beiträge: 375 Registriert: 01.02.2001
|
erstellt am: 13. Jan. 2006 09:37 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Hallo Tom, ich habe das mit einem Selectionset von ~ 500000 Objekten und der Profiler Funktion von Achim Dabrunz geprüft. Ich habe verschiedene Szenarien ausprobiert und bin überrascht, daß der Zeitaufwand für die zus. Listenerstellung tatsächlich vernachlässigbar ist. Danke für diesen Tipp. Zitat: (defun ss_e2s (eset / sset x) (setq sset (ssadd)) (mapcar '(lambda (x) (setq sset (ssadd x sset)) ) eset ) sset )
Bei deiner Funktion ss_e2s ist ein setq innerhalb lambda nicht notwendig, da ssadd eine desktruktive Funktion ist. ;-) Greets Rolf
------------------ CADmaro.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 13. Jan. 2006 11:22 <-- editieren / zitieren --> Unities abgeben: Nur für Hänk
Zitat: Original erstellt von benwisch:
Bei deiner Funktion ss_e2s ist ein setq innerhalb lambda nicht notwendig, da ssadd eine desktruktive Funktion ist. ;-)
Wo Du Recht hast hast Du Recht. Dass ssadd "destruktiv" ist, ist einer der meist ungeliebten Seiteneffekte der Picksets. Diese sind ja nur Zeiger auf die tatsächliche Datenstruktur und sind damit eher so etwas wie Datei-Handles, auf jeden Fall aber eben keine "richtigen" LISP-Strukturen. Tom Berger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |