Zobrazit plnou verzi příspěvku: atributy bloků

pepan33
26.01.2006, 23:49
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))