Zobrazit plnou verzi příspěvku: atributy bloků
Dobrý den. Nevíte prosím jak v Lispu získat hodnoty atributů bloku pro další zpracování? Pro běžné entity používám příkaz (entget) a dále mohu pracovat s daty entity. U bloků získám pouze základní data, ale hodnoty atributu jsem nenašel ani v rozšířených datech. Kde jsou ve výkresu uloženy?
Kubeczka
27.01.2006, 05:46
Když zísláte data bloku, tak tam najdete kód 66, který říká, že následují další entity bloku, mj. také atributy. Přikládám výpis kódu, který umožňuje procházet atributy bloku a vypisuje je.
(setq e1 (car (entsel))) (textscr) (setq ed (entget e1)) (print ed) (if (= (cdr (assoc 66 ed)) 1) ;navesti "entity nasleduji" (progn (initget (+ 2 4 8) "") (getkword "\nPress RETURN to continue ...") (setq e1 (entnext e1)) (setq ed (entget e1)) (while (= (cdr (assoc 0 ed)) "ATTRIB") (print ed) (initget (+ 2 4 8) "") (getkword "\nPress RETURN to continue ...") (setq e1 (entnext e1)) (setq ed (entget e1)) ) (print ed) (princ) ) )
pavlacka
27.01.2006, 08:01
Dostal jsem tyti dve funkce a s uspechem je pouzivam. Predavam dal.
Roman Pavlacka
;---Vrati hodnotu atributu(defun RetValAtt (EName AttTag / EData rr) (setq EData (entget EName)) ;Get initial info ;loop through all attributes in block (while (= "ATTRIB" (cdr (assoc '0 (setq EData (entget (entnext (cdr (assoc '-1 EData))))) ) ) ) (if (WCMatch (cdr (assoc '2 EData)) AttTag) (setq rr (cdr (assoc '1 EData))) ) ) (eval rr))
;---Routine to replace a attribute in a block with a new value(defun RepAtt (EName AttTag AttVal / EData return) (setq EData (entget EName)) ;Get initial info (setq return nil) ;loop through all attributes in block (while (= "ATTRIB" (cdr (assoc '0 (setq EData (entget (entnext (cdr (assoc '-1 EData))))) ) ) ) (if (WCMatch (cdr (assoc '2 EData)) AttTag) (progn (entmod (subst (cons '1 AttVal) (assoc '1 EData) Edata)) (setq return 1) ) ) ) ;return nil (eval return))