Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Layernamen ausgewählter Objekte auslesen

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:  Layernamen ausgewählter Objekte auslesen (807 mal gelesen)
VonLayer
Mitglied



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

Beiträge: 19
Registriert: 23.01.2019

erstellt am: 03. Feb. 2020 08:36    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

Guten morgen Lisp Experten

ich habe gerade ein Wochenende voller suchen suchen suchen und noch viel mehr try and error hinter mir. Ich versuche folgendes, das nicht so richtig will wie ich es möchte.

Momentane Situation:

In der Zeichnung befinden ca. 1000 Leitungen die alle als Block mit Attributen hinterlegt sind. Alle Blöcke liegen auf einem eigenen Layer. Diese Layer beinhalten die Namen der Leitungen. An vielen Stellen liegen viele Leitungen übereinander.

Was ich versuche:

Mit Lisp die Namen der Layer auslesen und die ausgelesen Layer gleich formatiert (unter einander aufgelistet) in einen Mtext einfügen und von Hand an eine bestimmte Stelle ablegen.

Was bisher geschah:

- Layernamen auslesen mit Hilfe von "Selection Set Layer List" hier gefunden: [URL=https://forums.autodesk.com/t5/autocad-forum/getting-a-layer-list-from-selected-objects/td-p/6018974][/URL]

(defun C:SSLL (/ ss n lay); = Selection Set Layer List
  (setq laylist nil); to clear from any previous use
  (if (ssget "_I")
    (setq ss (ssget "_I")); then
    (progn ; else
      (prompt "\nFor a List of their Layers,")
      (setq ss (ssget))
    ); progn
  ); if
  (if ss
    (repeat (setq n (sslength ss))
      (setq lay (cdr (assoc 8 (entget (ssname ss (setq n (1- n)))))))
      (if (not (member lay laylist)) (setq laylist (cons lay laylist)))
    ); and
  ); if
  laylist
); defun

Das geht schon in die richtige Richtung. Nur die Formatierung der Ausgabe stört. diese bringt nämlich im Fenster oberhalb der Komandozeile: "Layer1" "Layer2" Layer3" "Layer4". Ich bekomme die Formatierung zu:

Layer1
Layer2
Layer3
Layer4

nicht hin. Ich habe mir die .lsp von bcount genommen und an der experimentiert, aber das Ergebnis war ... nicht so toll.

Als nächstes habe ich versucht die ausgelesene Variable über einen Befehl mit Hilfe von Lisp direkt in einen Mtext einzufügen. Jedoch dachte ich nicht daran, dass sich die Variable mit jedem auslesen ändert. Es ist ja auch eine Variable! Und hier hänge ich fest. Ist es nun besser den "SSLL"-Befehl zu bearbeiten bis das richtige Format herauskommt, oder ist es doch sinnvoller mit "SSLL" die Variable "Laylist" zu erstellen und einen zweiten Befehl für den Mtext zu verwenden, der die Variable "auflöst" (nur noch Text) und dazu auch formatiert?

Ein zweiter Ansatz, den ich bisher nicht verfolgt habe:
Wenn man die Attribute der Blöcke nimmt und zusammensetzt "Att1"Leer"Att2"Leer"Att3" erhält man genauso den Layernamen. Aber hier habe ich überhaupt keine Vorstellung wie man das hinbekommen soll. Der Inhalt des Mtextes Würde ja dann so aussehen müssen:

"Att1"Leer"Att2"Leer"Att3"
"Att1"Leer"Att2"Leer"Att3"
"Att1"Leer"Att2"Leer"Att3"

Nun meine Frage: hat jemand eine Idee, wie ich eine "schöne" Formatierung hinbekomme?


(Die eierlegende Wollmilchsau wäre natürlich alles mit einem Befehl zu erledigen.)

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: 03. Feb. 2020 08:59    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 VonLayer 10 Unities + Antwort hilfreich

Tipp ... erstell mal einen MTEXT, so wie du es gerne hättest und guck dir mit  (cdr(assoc 1(entget(car(entsel "\nMTEXT wählen: ")))))  .. die Textformatierung an .. mit der Funktion(strcat "TEXT1" "\P" "TEXT2") kann man dann Textbausteine zusammenführen ....

------------------
Also ich finde Unities gut ... und andere sicher auch
---------------------------------------
  - 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

spider_dd
Mitglied



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

Beiträge: 1111
Registriert: 27.11.2003

Win 10Pro
Intel(R) Core(TM) i7-7700
NVIDIA Quadro P1000
ACAD, Civil-3D 2018

erstellt am: 03. Feb. 2020 09:55    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 VonLayer 10 Unities + Antwort hilfreich

Hallo VonLayer,

ersetze mal das laylist in der vorletzten Zeile der Lisp-Datei mit

  (foreach lay laylist (print lay))
  (print)

HTH
Gruß
Thomas

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

VonLayer
Mitglied



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

Beiträge: 19
Registriert: 23.01.2019

erstellt am: 04. Feb. 2020 07:29    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

Guten morgen CADmium und spider_dd

@CADmium

Vielen Dank für deine Antwort!  (cdr(assoc 1(entget(car(entsel "\nMTEXT wählen: "))))) ist für mich Gold wert! Ich kenne die Vorgänge im Hintergrund nicht und das ist eine tolle Möglichkeit mal hinter die Kulisse zu blicken!
Bei (strcat "TEXT1" "\P" "TEXT2")  bin ich leider raus. Ich hätte gleich zu beginn schreiben müssen, dass ich im Grunde keine Ahnung von Lisp habe.

@spider_dd

Mit
(foreach lay laylist (print lay))
  (print)
hast du mir unglaublich viel Zeit gespart! Ich kann nun die Layernamen aus der Komandozeile herauskopieren und direkt in den Text einfügen. Zum Schluss nur noch mit suchen / ersetzen alle "" durch nichts austauschen und fertig!

Da meine Eingangsfrage zur sauberen Formatierung beantwortet ist, kann dieser Thread geschlossen werden. Vielen Dank für eure Mühe!

[Diese Nachricht wurde von VonLayer am 04. Feb. 2020 editiert.]

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

spider_dd
Mitglied



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

Beiträge: 1111
Registriert: 27.11.2003

Win 10Pro
Intel(R) Core(TM) i7-7700
NVIDIA Quadro P1000
ACAD, Civil-3D 2018

erstellt am: 04. Feb. 2020 09:31    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 VonLayer 10 Unities + Antwort hilfreich

Hallo VonLayer,

schön dass wir Dir helfen konnten.
Du kannst den Thread als erledigt markieren, indem Du über den hilfreichen Antworten rechts auf den grünen Haken klickst :-)

Gruß
Thomas

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. Feb. 2020 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 VonLayer 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von VonLayer:

(defun C:SSLL (/ ss n lay); = Selection Set Layer List
  (setq laylist nil); to clear from any previous use
  (if (ssget "_I")
    (setq ss (ssget "_I")); then
    (progn ; else
      (prompt "\nFor a List of their Layers,")
      (setq ss (ssget))
    ); progn
  ); if
  (if ss
    (repeat (setq n (sslength ss))
      (setq lay (cdr (assoc 8 (entget (ssname ss (setq n (1- n)))))))
      (if (not (member lay laylist)) (setq laylist (cons lay laylist)))
    ); and
  ); if
  laylist
); defun

Tipps für mehr Eleganz im Code:

Anstelle von

Code:

(if (ssget "_I")
    (setq ss (ssget "_I")); then
    (progn ; else
      (prompt "\nFor a List of their Layers,")
      (setq ss (ssget))
    ); progn
  ); if


Schreibst Du eleganter und effizienter:
Code:

(or
  (setq ss (ssget "_I"))
  (setq ss (ssget))
)


Oder mit Meldung:
Code:

(or
  (setq ss (ssget "_I"))
  (and (prompt "\nFor a List of their Layers,")
      (setq ss (ssget))
  )
)

Und noch eleganter geht das, wenn Du Auswahlsätze grundsätzlich in Listen (also einer Funktion (ss-list ss) umwandelst, und dann mit
(mapcar '(lambda (en) (cdr (assoc 8 (entget en)))) (ss->list ss))
die Liste der Layernamen für die Liste der Entities ausgibst.

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