| |
| 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: Attribute abfragen (1431 / mal gelesen)
|
vision Mitglied
Beiträge: 113 Registriert: 27.10.2003 AutoCAD 2015 Expresstools Windows 10
|
erstellt am: 06. Nov. 2018 12:37 <-- editieren / zitieren --> Unities abgeben:
Hallo, in dem Lisp möchte ich noch den Wert vom Attribut BEZEICHNUNG2 im Block abfragen. Für ein Beispiel hierzu währe ich sehr dankbar. (if(and(SETQ ent (car(ENTSEL "\nText-Block anklicken: "))) (setq gg (assoc 10 (entget ent))) (=(cdr(assoc 66 (entget ENT)))1) ) (WHILE (AND (SETQ ent (ENTNEXT ent)) (/= (CDR (ASSOC 0 (ENTGET ent))) "SEQEND") ) (IF(AND (=(CDR (ASSOC 0 (ENTGET ent))) "ATTRIB") (=(strcase(CDR (ASSOC 2 (ENTGET ent)))) "BEZEICHNUNG1") ;Attributname 1! ) (progn (SETQ BLATTNR (CDR (ASSOC 1 (ENTGET ent)))) (Ausgabe) ;Unterprogramm ) ) ) ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 06. Nov. 2018 12:46 <-- editieren / zitieren --> Unities abgeben: Nur für vision
|
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: 06. Nov. 2018 12:58 <-- editieren / zitieren --> Unities abgeben: Nur für vision
Hallo Vision, CADmium war schneller, aber hier auch nochmal ein Beispiel, das kannst Du Dir bestimmt anpassen: Code:
(defun test:attwert (obj AttName / OBJLIST ATTWERT) (while (and(not AttWert) (setq obj (entnext obj)) (setq objList(entget obj)) (=(cdr(assoc 0 objList))"ATTRIB")) (if(=(strcase(cdr(assoc 2 objList)))(strcase AttName)) (setq AttWert (cdr(assoc 1 objList)))) ) AttWert) (defun c:test ( / ATTNAME ATTWERT OBJ) (setq AttName "BEZEICHNUNG2") (if (and (setq obj (car(entsel "\nBlock picken:"))) (= (cdr(assoc 0 (entget obj)))"INSERT")) (if (setq AttWert(test:attwert obj AttName)) (alert AttWert) (alert (strcat "Attribut mit dem Namen \""AttName"\" nicht gefunden."))) (if obj (alert "Das war kein Block.")) ) (princ))
------------------ viele Grüße Jörn http://www.bosse-engineering.com Foto-Manager Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
vision Mitglied
Beiträge: 113 Registriert: 27.10.2003 AutoCAD 2015 Expresstools Windows 10
|
erstellt am: 06. Nov. 2018 13:58 <-- editieren / zitieren --> Unities abgeben:
Hallo, vielleicht ist meine Anfrage nicht so eindeutig. Ich möchte die Werte von den zwei Attributen (BEZEICHNUNG1, BEZEICHNUNG2) zusammen haben. Ich hatte es schon mit einer zweiten IF-Abfrage mit dem Attribut BEZEICHNUNG2 innerhalb der WHILE Schleife versucht. Das wurde mir aber mit einem Fehler quittiert. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 06. Nov. 2018 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für vision
|
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 06. Nov. 2018 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für vision
oder sowas.... Code: (if(and(SETQ ent (car(ENTSEL "\nText-Block anklicken: "))) (setq gg (assoc 10 (entget ent))) (=(cdr(assoc 66 (entget ENT)))1) ) (WHILE (AND (SETQ ent (ENTNEXT ent)) (/= (CDR (ASSOC 0 (ENTGET ent))) "SEQEND") ) (if(=(CDR (ASSOC 0 (ENTGET ent))) "ATTRIB") (cond ((=(strcase(CDR (ASSOC 2 (ENTGET ent)))) "BEZEICHNUNG1") ;Attributname 1! (SETQ TEXT1 (CDR (ASSOC 1 (ENTGET ent)))) ) ((=(strcase(CDR (ASSOC 2 (ENTGET ent)))) "BEZEICHNUNG2") ;Attributname 1! (SETQ TEXT2 (CDR (ASSOC 1 (ENTGET ent)))) ) ) ) ) (if(and TEXT1 TEXT2) (progn (setq TEXTGES(strcat TEXT1 TEXT2)) (machsonstnochwas) ) ) )
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
vision Mitglied
Beiträge: 113 Registriert: 27.10.2003 AutoCAD 2015 Expresstools Windows 10
|
erstellt am: 06. Nov. 2018 15:35 <-- editieren / zitieren --> Unities abgeben:
|
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 06. Nov. 2018 15:47 <-- editieren / zitieren --> Unities abgeben: Nur für vision
|
vision Mitglied
Beiträge: 113 Registriert: 27.10.2003 AutoCAD 2015 Expresstools Windows 10
|
erstellt am: 06. Nov. 2018 15:53 <-- editieren / zitieren --> Unities abgeben:
|
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 06. Nov. 2018 16:10 <-- editieren / zitieren --> Unities abgeben: Nur für vision
ah, ein progn vergessen.. Das hättest du aber auch sehen können Code: (if (and (SETQ ent (car (ENTSEL "\nText-Block anklicken: "))) (setq gg (assoc 10 (entget ent))) (= (cdr (assoc 66 (entget ENT))) 1) ) (progn (WHILE (AND (SETQ ent (ENTNEXT ent)) (/= (CDR (ASSOC 0 (ENTGET ent))) "SEQEND") ) (if (= (CDR (ASSOC 0 (ENTGET ent))) "ATTRIB") (cond ((= (strcase (CDR (ASSOC 2 (ENTGET ent)))) "SFBCODE") ;Attributname 1! (SETQ TEXT1 (CDR (ASSOC 1 (ENTGET ent)))) ) ((= (strcase (CDR (ASSOC 2 (ENTGET ent)))) "FMATT07") ;Attributname 1! (SETQ TEXT2 (CDR (ASSOC 1 (ENTGET ent)))) ) ) ) ) (if (and TEXT1 TEXT2) (progn (setq TEXTGES (strcat TEXT1 TEXT2)) (machsonstnochwas) ) ) ) )
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
vision Mitglied
Beiträge: 113 Registriert: 27.10.2003 AutoCAD 2015 Expresstools Windows 10
|
erstellt am: 06. Nov. 2018 16:48 <-- editieren / zitieren --> Unities abgeben:
Hallo CADwiesel, es läuft. Vielen Dank! Es ergibt sich aber noch ein anderes Problem: Ein Attributwert benutze ich für einen Dateinamen. Jetzt kann es passieren, dass unerlaubte Zeichen im Text sind (z.B. /). Gibt es eine Routine die solche Zeichen ersetzt? Für Ihre Unterstützung bedanke ich mich im Voraus. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 07. Nov. 2018 09:53 <-- editieren / zitieren --> Unities abgeben: Nur für vision
sowas? Code: (defun ersetzeSTR (TEXT / Z ZL ct) (setq ct 1 ZL "" ) (repeat (strlen TEXT) (setq Z (substr TEXT ct 1)) (cond ( (eq Z "§") (setq Z "X") ) ( (eq Z "%") (setq Z "Y") ) (T Z) ) (setq ZL (strcat ZL Z)) (setq ct (1+ ct)) ) ZL )
(ersetzeSTR "asj%%kdghg23454$34kljg65§§234") => "asjYYkdghg23454$34kljg65XX234" ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernhard GSD Mitglied
Beiträge: 505 Registriert: 29.08.2002 AutoCAD 2020(Deu); Windows 10 PRO x64(Deu)
|
erstellt am: 07. Nov. 2018 11:21 <-- editieren / zitieren --> Unities abgeben: Nur für vision
Ich benutze für Attribute folgendes Programm: Code:
(DEFUN ATTGET (name / att elem a b brk) (WHILE (NOT brk) (SETQ elem (ENTGET (SETQ name (ENTNEXT name)))) (IF (= (CDR (ASSOC 0 elem)) "SEQEND")(SETQ brk T) (SETQ b (CONS (CONS (CDR (ASSOC 2 elem))(CDR (ASSOC 1 elem))) b)) ) ) b )
Aufruf mit (ATTGET elementname) Zurück kommt eine Dotted-Pair-Liste (("RBNR" . "") ("M1" . "") ("M2" . "44.87 m²") ("BODEN" . "Holz") ("ZIMMER" . "WOHNKÜCHE")) Mit (ASSOC "M2" liste) kann ich die einzelnen Werte abgreifen. Mit (STRCAT (ASSOC "RBNR" liste)(ASSOC "ZIMMER" liste)) .... ... usw ------------------ Gruß aus Wien Bernhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |