| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Attributeinhalte mit Vorgabe per entmod ändern (496 / mal gelesen)
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3834 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2023 BricsCAD 23
|
erstellt am: 13. Mrz. 2023 12:12 <-- editieren / zitieren --> Unities abgeben:
Ich habe mein altes Programm ausgegraben, mit dem ich Attributinhalte ändern kann. Hat immer schön geklappt .. - Block mit (Command-s "_insert ..") einfügen - (entlast) durchgehen - wenn gesuchte Attributdefinition gefunden, dann
Code: (setq neuwert (subst (cons 1 attribtext) (assoc 1 attf_elliste) attf_elliste)) (entmod neuwert)
Jetzt habe ich da aber Blöcke, deren Attribute diverse Defaultwerte haben (meist 0). Da funktioniert die Geschichte nicht - kein Fehler in Lisp, aber Default bleiben trotzdem. Testweise habe ich einen Block umdefiniert und alle Vorgaben in den ATTDEF gelöscht - da geht's wieder. Was ist da anders? Was muss ich da noch einbauen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1451 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 13. Mrz. 2023 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
|
spider_dd Mitglied
Beiträge: 1137 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 13. Mrz. 2023 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Da wir Dein Programm ober- und unterhalb des Schnipsels nicht kennen, ... müsste es nichr heißen Code:
(setq attf_elliste) (subst ..) (entmod attf_elliste)
Habe ich zumindest bei mir immer so. Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3834 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2023 BricsCAD 23
|
erstellt am: 13. Mrz. 2023 13:59 <-- editieren / zitieren --> Unities abgeben:
Hier die Subroutine: Code: (defun attrib_fill (attribname attribtext) ; gehe jedes Attribut durch (setq attf_unterelement (entnext (entlast))) (setq attf_elliste (entget attf_unterelement)) ; gehe im Block jedes Attribut durch (while (/= (cdr (assoc 0 attf_elliste)) "SEQEND") (setq attf_elliste (entget attf_unterelement)) (if (= (cdr (assoc 0 attf_elliste)) "ATTRIB") ; wenn es noch Attributbezeichnungen gibt (progn (setq attf_attbez (cdr (assoc 2 attf_elliste))) ; lese die Attributbezeichnung ; Wenn das gefundene Attribut der gesuchten Definition entspricht (if (= (strcase attf_attbez) (strcase attribname)) (progn ; schreibe die Werte ins Attribut (setq neuwert (subst (cons 1 attribtext) (assoc 1 attf_elliste) attf_elliste)) (entmod neuwert) (princ (strcat "\n Attribut " attf_attbez " wurde befüllt mit:\t" attribtext )) ) ) ) ;_ end of progn ) ;_ end of if ; ein Schritt weiter in der Elementliste des Blocks (setq attf_unterelement (entnext attf_unterelement)) ) (princ) )
Nutzung z.B. um das Attribut CODE zu füllen: (attrib_fill "CODE" "Test") Datei beiliegend. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1760 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: 13. Mrz. 2023 14:37 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Hallo Peter, bei Deinem Block hast Du mehrzeilige Attribute enthalten, dadurch ist in der Gruppencodeliste der GC 1 mehrfach vorhanden, und somit geht das SUBST auf den falschen Wert => siehe Bild Anbei eine VLA-Variante, damit sollte es funktionieren:
Code:
(defun attrib_fill_vla (AttName TextWert / ATTNAME TEXTWERT VLA-ATT VLA-OBJ) (setq vla-obj (vlax-ename->vla-object(entlast)));;;Objekt in VLA-Objekt ;;;wenn Objekt Attribute enthält (if (and(vlax-property-available-p vla-obj 'hasattributes) (=(vla-get-hasattributes vla-obj):vlax-true)) ;;;VLA-Attribute in Mapcar-Schleife durchgehen (mapcar '(lambda(vla-Att) (if (=(vla-get-TagString vla-Att)AttName) (progn (vla-put-TextString vla-Att TextWert) (princ (strcat "\n Attribut " AttName " wurde befüllt mit:\t" TextWert)) ) ) ) ;;;VLA-Attribute in Liste (vlax-safearray->list (vlax-variant-value (vla-getattributes vla-obj) ) ) ) (alert "Das Objekt hatte keine Attribte") ) (princ) )
Zu starten genau wie Deine Funktion, bloss der Funktionsname ist anders: (attrib_fill_vla "CODE" "TEST") ------------------ viele Grüße Jörn http://www.bosse-engineering.com das Flächenstempel_Tool Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3834 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2023 BricsCAD 23
|
erstellt am: 13. Mrz. 2023 14:52 <-- editieren / zitieren --> Unities abgeben:
|
spider_dd Mitglied
Beiträge: 1137 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 13. Mrz. 2023 15:12 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Hallo Peter, Dein beigefügter Block hat keine Attribute, da kann es nicht klappen. Wenn man aus den mitgelieferten Daten einen Block mit Attributen macht, passiert etwas, aber nicht das erwartete. Bei einem selbst erstellten Block mit einem "normalen" Attribut funktioniert es bei mir einwandfrei, egal ob das Attribut eine Vorgabe hat oder keine. Ich habe mir daraufhin mal den GC-Code der Atrribute angesehen und festgestellt, dass Deine irgendwie noch anders sind. Das macht sich auch schon beim Einfügen bemerkbar, die Abfrage ist irgendwie anders. Hier mal die GC-Codes: Code:
Attribut von mir: (einfach mit attdef erzeugt ohne "Schnickschnack" ((-1 . <Objektname: 2e4dddf4d90>) (0 . "ATTRIB") (330 . <Objektname: 2e4dddf4d80>) (5 . "15E1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbText") (10 53.1655 245.462 0.0) (40 . 0.25) (1 . "willi") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "ARI025_V_100") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (280 . 0) (2 . "TEXT_O") (70 . 0) (73 . 0) (74 . 0) (280 . 1))
Code:
Hier Dein Attribute CODE ((-1 . <Objektname: 2e5133d0a50>) (0 . "ATTRIB") (330 . <Objektname: 2e5133d0a10>) (5 . "1625") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "$P_INF_FL") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbText") (10 77.1504 257.315 0.0) (40 . 2.0) (1 . "Test") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 1) (11 77.1504 256.649 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (280 . 0) (2 . "CODE") (70 . 0) (73 . 0) (74 . 1) (280 . 0) (71 . 2) (72 . 0) (11 77.1504 256.649 0.0) (101 . "Embedded Object") (10 77.1504 256.649 0.0) (40 . 2.0) (41 . 0.0) (46 . 0.0) (71 . 8) (72 . 1) (1 . "aa") (7 . "Standard") (210 0.0 0.0 1.0) (11 1.0 0.0 0.0) (42 . 2.88813) (43 . 2.03274) (50 . 0.0) (73 . 1) (44 . 1.0) (90 . 3) (63 . 9) (421 . 13158600) (45 . 1.1) (441 . 0))
Unterschiede mal fett gemacht Wie erstellst Du die Attribute? Der angezeigte Text ist bei Dir im zweiten fett gedruckten Abschnitt bei (1 . "aa") HTH Gruß Thomas -edit- OK zu lange gebraucht, Hinweis auf mehrzeilige Attribute schon gekommen. -edit ende-
[Diese Nachricht wurde von spider_dd am 13. Mrz. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3834 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2023 BricsCAD 23
|
erstellt am: 13. Mrz. 2023 15:51 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von spider_dd: ..Wie erstellst Du die Attribute? ..
Gar nicht. Aus Bestand übernommen. Und ja - die zusätzlichen GC sind mir aufgefallen, aber ich kann sie - abgesehen von der Mehrzeiligkeit, die ich gern wegkriege würde - nicht erklären. [Diese Nachricht wurde von Peter2 am 13. Mrz. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3834 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2023 BricsCAD 23
|
erstellt am: 13. Mrz. 2023 19:33 <-- editieren / zitieren --> Unities abgeben:
|