Hi Milizeus,
ich habe das Gefühl, dass da was nicht so ganz zu Ende gedacht wurde: Solange der Block nicht umbenannt wird oder anonym ist, würde doch eigentlich ein KONSTANTES Attribut genügen, das gleich bei der Blockdefinition den Blocknamen als Wert erhält. Das liesse sich auch ohne ATTREDEF usw. nachträglich realisieren - jeden Block einfach von Hand neu definieren und das konstante Attribut hinzufügen - schon steht an allen Inserts der Blockname dran. Alle anderen Attribute bleiben dabei erhalten!
Aber ich hab auch das Lisp-Programm für dich. In eine Datei kopieren, laden ... und du hast den neuen AutoCAD-Befehl 'blockname>attribut'. Es werden alle Inserts in der Zeichnung gesucht, die ein Attribut namens 'blockname' haben, in dieses wird der aktuelle Blockname eingetragen. Soll das Attribut anders heissen, musst du den Namen an zwei Stellen im Programm ändern.
Auf meiner Seite autolisp.mapcar.net kannst du im Kapitel 'Durch die Brust' Einzelheiten nachlesen - z.B. wie man die Funktion nur auf ganz bestimmte Blöcke anwenden kann. Hinweis: Die Funktion hat keinerlei Errorhandling, und das Ergebnis sieht man erst nach einem Regen.
***********************************
(defun ss-foreach(ss expr / i)
(if ss
(repeat(setq i(sslength ss))
((eval expr)(ssname ss(setq i(1- i))))
)
)
)
(defun insert-getattdata(ent / retl)
(setq ent(entget(entnext(cdr(assoc -1(entget ent))))))
(while(= "ATTRIB"(cdr(assoc 0 ent)))
(setq retl(cons ent retl))
(setq ent(entget(entnext(cdr(assoc -1 ent)))))
)
(reverse retl)
)
(defun test-attributes(insert namepat l-expr / atts result)
(setq atts(insert-getattdata insert))
(while atts
(if
(and
(wcmatch
(strcase(cdr(assoc 2(car atts))))
(strcase namepat)
)
(apply l-expr(list(cdr(assoc 1(car atts)))))
)
(progn
(setq result(car atts))
(setq atts nil)
)
(setq atts(cdr atts))
)
)
result
)
(defun sel-inserts
(blnamepat attnamepat lambda-expr / tmp retlist)
(ss-foreach
(ssget "X"
(list
'(0 . "insert")
(cons 2 blnamepat)
)
)
'(lambda(ins / )
(if(test-attributes ins attnamepat lambda-expr)
(setq retlist(append retlist(list ins)))
)
)
)
retlist
)
(defun where(liste expr / )
(while
(and liste
(not((eval expr)(car liste)))
)
(setq liste(cdr liste))
)
(car liste)
)
(defun c:blockname>attribut( / attrib)
(foreach insert (sel-inserts "*" "Blockname" '(lambda(ist-egal / )'T))
(setq attrib
(where
(insert-getattdata insert)
'(lambda(att / )
(= "BLOCKNAME"(strcase(cdr(assoc 2 att))))
)
)
)
(entmod
(subst
(cons 1(cdr(assoc 2(entget insert))))
(assoc 1 attrib)
attrib
)
)
)
)
***********************************
Auch wenn's ein nettes Programm ist, würde ich dir doch eher zu der Möglichkeit mit dem konstanten Attribut raten!
Gruss, Axel
------------------
http://www.autolisp.mapcar.net
http://www.autolisp-tutorial.mapcar.net
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP