| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Layerliste Auswahlkriterien (1616 mal gelesen)
|
otm Mitglied Bauingenieur
Beiträge: 188 Registriert: 26.08.2009
|
erstellt am: 20. Aug. 2010 12:52 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, Fuchsi hat mal ein super kleines Prog zum auflisten aller Layer eingestellt. Zitat:
(defun LayerListe (/ liste layer) (setq layer (tblnext "LAYER" t)) (while layer (setq liste (cons (cdr (assoc 2 layer)) liste)) (setq layer (tblnext "LAYER")) ) (acad_strlsort liste) )
Wo muss ich denn hier einfügen, wenn ich alle Layer haben möchte, die mit "ZE" anfangen und "-" aufhören? Ich dachte mir das so. Code:
(defun c:LayerListeWahl (/ liste layer) ;Eine Liste mit allen Layernamen beginnend mit "ZE" und endend mit "-" schreiben (setq layer (tblnext "LAYER" t)) (while layer (if (and (= (cdr (assoc 2 layer)) "ZE*") (= (cdr (assoc 2 layer)) "*-"));Wenn Layer dem Suchkriterium entspricht, den Layer der Liste hinzufügen (progn (setq liste (cons (cdr (assoc 2 layer)) liste)) (setq layer (tblnext "LAYER")) );end progn );endif ) (acad_strlsort liste) )
Leider funktioniert es so nicht. Wie könnte das gehen? Christian ------------------ Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 20. Aug. 2010 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für otm
|
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 20. Aug. 2010 13:16 <-- editieren / zitieren --> Unities abgeben: Nur für otm
und/oder VL-STRING-SEARCH (mit VL-STRING-SEARCH bekommst du noch die Position und kannst ggf weiter eingrenzen) ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." 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: 20. Aug. 2010 13:23 <-- editieren / zitieren --> Unities abgeben: Nur für otm
statt Code: (acad_strlsort liste)
einfach
Code: (vl-remove-if-not '(lambda (str)(wcmatch str "ZE*-"))(acad_strlsort liste))
schreiben geht auch, dann werden die Layer erst am Ende aus der sortierten Liste entfernt. oder erst entfernen, dann sortieren, geht einige Millisekunden schneller.
------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 188 Registriert: 26.08.2009
|
erstellt am: 20. Aug. 2010 21:14 <-- editieren / zitieren --> Unities abgeben:
|
otm Mitglied Bauingenieur
Beiträge: 188 Registriert: 26.08.2009 MS Win 10 AutoCAD Civil 3D 2023.2.1 Update VBA Enabler 2019 MS Access Database Enginge X64 MSO 365 (64bit)
|
erstellt am: 23. Aug. 2010 07:21 <-- editieren / zitieren --> Unities abgeben:
Ich hab's getestet und es funktionier perfekt. Vielen vielen Dank an Euch. Hier nochmal der ganze Code.
Code:
(defun c:LayerlisteWahlTest(/) ; Ruft das nächste Program mit einem Parameter auf (c:LayerListeWahl "ZE*-") )(defun c:LayerListeWahl (Kriterium / liste layer) ;Eine Liste mit allen Layernamen laut Variable 'Kriterium' schreiben (setq layer (tblnext "LAYER" t)) (while layer (setq liste (cons (cdr (assoc 2 layer)) liste)) (setq layer (tblnext "LAYER")) ) (vl-remove-if-not '(lambda (str)(wcmatch str Kriterium))(acad_strlsort liste)) )
------------------ Christian 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: 23. Aug. 2010 07:42 <-- editieren / zitieren --> Unities abgeben: Nur für otm
das C: am Anfang des Funktionsnamens würde ich weglassen, das wird typischerweise nur zur Definiton von AutoCAD Kommandos verwendet. Die Funktionen dürfen dann aber keine Parameter haben. Noch ein allgemeiner Programmiertipp: Verteile die Aufgabe in meherere Funktionen, die nur ihre Audgabe erfüllen, dann kann man diese Funktionen auch für andere Programme wiederverwenden. Code: ; Unterfunktionen ;; LayerListe unverändert von fuchsi (defun LayerListe (/ liste layer) (setq layer (tblnext "LAYER" t)) (while layer (setq liste (cons (cdr (assoc 2 layer)) liste)) (setq layer (tblnext "LAYER")) ) (acad_strlsort liste) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun entferneausliste (liste Kriterium) (vl-remove-if-not '(lambda (str)(and (= (type str) 'STR) ; Nur Strings vergleichen (wcmatch str Kriterium) ) ) Liste ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; AutoCAD Kommando definieren zur Ausgabe ;; aller Layer beginnend mit ZE und endent mit -.(Defun C:LLZE () (entferneausliste (Layerliste) "ZE*-") )
------------------ Mit freundlichem Gruß Udo Hübner www.CAD-Huebner.de [Diese Nachricht wurde von CAD-Huebner am 23. Aug. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
otm Mitglied Bauingenieur
Beiträge: 188 Registriert: 26.08.2009
|
erstellt am: 03. Sep. 2010 22:56 <-- editieren / zitieren --> Unities abgeben:
Hallo Udo, danke für den allgemeinen Tipp. Seh ich immer gerne. Das mit dem c: war für mich immer so ein Ratespiel. Und ich hatte mir gemerkt, dass ich Dinger mit c: aus der Befehlzeile starten kann. Durch den Hinweis mit den Parametern ist mir die Logik jetzt klarer.
------------------ Grüße aus München Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cmd Mitglied
Beiträge: 1 Registriert: 09.02.2011
|
erstellt am: 09. Feb. 2011 11:06 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Die Antwort ist einfach: Autolisp kennt keine Platzhalter. Ergo kann man nicht einfach mit "ZE*" oder "*-" arbeiten SUBSTR und STRLEN helfen weiter etwa so (setq lnam (cdr (assoc 2 layer) ) llen (strlen lnam) ) (if (and (= (substr lnam 1 2) "ZE") (= (substr lnam llen 1) "*-") ) usw. cmd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 09. Feb. 2011 12:16 <-- editieren / zitieren --> Unities abgeben: Nur für otm
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 09. Feb. 2011 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für otm
Zitat: Original erstellt von cmd: Die Antwort ist einfach: Autolisp kennt keine Platzhalter. Ergo kann man nicht einfach mit "ZE*" oder "*-" arbeiten SUBSTR und STRLEN helfen weiter etwa so (setq lnam (cdr (assoc 2 layer) ) llen (strlen lnam) ) (if (and (= (substr lnam 1 2) "ZE") (= (substr lnam llen 1) "*-") )usw. cmd
Aber natürlich kennt Auto/VisualLisp Platzhalter: (wcmatch str "ZE*-") Ich würde dem OP aber empfehlen, die Sache mehr Lisp-mäßig anzugehen und die Funktion zum Lesen aller Layer gar nicht zu ändern (bis auf den Namen, den würde ich zur Unterscheidung von einer Variablen, die eine Layerliste speichern soll, z.B. erzeuge-layerliste nennen). In einer weiteren Funktion kann er dann jeden Layer darauf prüfen, ob er bestimmte Kriterien erfüllt: (foreach layer (erzeuge-layerliste) (if (wcmatch layer "ZE*-") (setq result (cons layer result)) ) ) (reverse result)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |