Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Alles auswählen ausser... mit Lisp

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Alles auswählen ausser... mit Lisp (2787 mal gelesen)
Hänk
Mitglied



Sehen Sie sich das Profil von Hänk an!   Senden Sie eine Private Message an Hänk  Schreiben Sie einen Gästebucheintrag für Hänk

Beiträge: 126
Registriert: 10.05.2004

ADT 2004 / AutoCAD 2004

erstellt am: 11. Jan. 2006 14:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von tunnelbauer an!   Senden Sie eine Private Message an tunnelbauer  Schreiben Sie einen Gästebucheintrag für tunnelbauer

Beiträge: 7085
Registriert: 13.01.2004

ich hab eh keine Probleme damit...

erstellt am: 11. Jan. 2006 14:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Hänk an!   Senden Sie eine Private Message an Hänk  Schreiben Sie einen Gästebucheintrag für Hänk

Beiträge: 126
Registriert: 10.05.2004

ADT 2004 / AutoCAD 2004

erstellt am: 11. Jan. 2006 14:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 11. Jan. 2006 14:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 11. Jan. 2006 14:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Hänk an!   Senden Sie eine Private Message an Hänk  Schreiben Sie einen Gästebucheintrag für Hänk

Beiträge: 126
Registriert: 10.05.2004

ADT 2004 / AutoCAD 2004

erstellt am: 11. Jan. 2006 14:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 11. Jan. 2006 14:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Hänk an!   Senden Sie eine Private Message an Hänk  Schreiben Sie einen Gästebucheintrag für Hänk

Beiträge: 126
Registriert: 10.05.2004

ADT 2004 / AutoCAD 2004

erstellt am: 11. Jan. 2006 15:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Die gute alte Hilfe, dort habe ich was entdeckt. jetzt liegts mal an mir euer Feedback und die Hilfe zu koppeln und so einen Schritt weiterzukommen. Thx an euch.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

marc.scherer
Ehrenmitglied V.I.P. h.c.
CAD-Administrator



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

Beiträge: 2490
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 11. Jan. 2006 22:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von marc.scherer an!   Senden Sie eine Private Message an marc.scherer  Schreiben Sie einen Gästebucheintrag für marc.scherer

Beiträge: 2490
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 12. Jan. 2006 12:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von benwisch an!   Senden Sie eine Private Message an benwisch  Schreiben Sie einen Gästebucheintrag für benwisch

Beiträge: 375
Registriert: 01.02.2001

erstellt am: 13. Jan. 2006 09:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 13. Jan. 2006 11:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Hänk 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz