更改属性值错误
我编译了以下LISP。虽然目前只有一个区块列在顶部,但还有15个区块可以用于我们使用的其他边界。(defun c:AD (/ TodayDate str)
(vl-load-com) ;;; Do not forget to add
(setq blocks
'(
"BORDER (ABOVENET) -BRC"
)
)
(setq str
(cond
(
(eq ""
(setq str
(getstring t
(strcat "\nDate to be Placed <"
(setq today (menucmd "m=$(edtime,$(getvar,DATE),MO/DD/YY)")) ">: "
)
)
)
)
today
)
( str )
)
)
(AttribChng blocks "DATE" str)
(princ "\n ----------------------------------------------")
(princ (strcat "\n --------- Adjust Date - Version " ADTVerNum " ---------"))
(princ (strcat "\n ---------------- Date: " str " --------------"))
(princ "\n ----------------------------------------------")
(princ)
)
(defun AttribChng (blk tag val / ss)
(vl-load-com)
(mapcar (function set) '(blk tag)
(mapcar (function strcase) (list blk tag)))
(setq *doc (cond (*doc) ((vla-get-ActiveDocument
(vlax-get-acad-object)))))
(if (ssget "_X" (list '(0 . "INSERT") (cons 2 blocks) '(66 . 1)))
(progn
(vlax-for obj (setq ss (vla-get-ActiveSelectionSet *doc))
(foreach att (vlax-invoke obj 'GetAttributes)
(if (eq (strcase (vla-get-TagString att)) tag)
(vla-put-TextString att val))))
(vla-delete ss))
(princ "\n** No Blocks Found **"))
(princ))
然而,我得到一个错误:
错误的参数类型:stringp(“BORDER(overnet)-BRC”)
我不太确定如何修复它。
谢谢 试试这个:
(setq blocks (eval
'(
"BORDER (ABOVENET) -BRC"
)
)
)
AutoLisp解释器此时正在查找字符串,但它接收的是一个列表。你需要引用变量块吗?或者你可以写下来吗
(setq blocks "BORDER (ABOVENET) -BRC") 在第一个代码中,我得到了一个糟糕的函数错误。第二个可行,但我需要找到一种方法,使其适用于包含16个可能边界的列表。目前我们正在使用一个自定义字段,但如果有人进入块编辑器并在那里调整值(这已经是我们的过程一段时间了),它会否定LISP程序。 我认为问题在于你试图构建的虚线对。
(cons 2 blocks)
在这里,您必须传递一个块名。我不相信你能给出一个名单。在构造选择集时尝试集成OR过滤器。。我理解您试图完成的是从选择集中筛选出那些不在块列表中的块。
(-4 . "<or") (2 . "BLOCK_NAME_01") (2 . "BLOCK_NAME_02") (2 . "BLOCK_NAME_03") (2 . "BLOCK_NAME_15") (-4 . "or>")
问题是,您从这里获取的子函数仅用于单个块。
试试这个:
(defun c:AD ( / blocks str today ) (vl-load-com)
(setq blocks
'(
"BORDER (ABOVENET) -BRC"
)
)
(setq str
(cond
(
(eq ""
(setq str
(getstring t
(strcat "\nDate to be Placed <"
(setq today (menucmd "m=$(edtime,$(getvar,DATE),MO/DD/YY)")) ">: "
)
)
)
)
today
)
( str )
)
)
(ChangeAttribValue blocks "DATE" str)
(princ "\n ----------------------------------------------")
(princ (strcat "\n --------- Adjust Date - Version " ADTVerNum " ---------"))
(princ (strcat "\n ---------------- Date: " str " --------------"))
(princ "\n ----------------------------------------------")
(princ)
)
(defun ChangeAttribValue ( blocklist tag value / ss i e l )
;; Example By Lee Mac
(setq tag (strcase tag)
value (cons 1 value)
blocklist (mapcar 'strcase blocklist)
blocklist (apply 'strcat (cons (car blocklist) (mapcar '(lambda ( x ) (strcat "," x)) (cdr blocklist))))
)
(if (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 blocklist) '(66 . 1))))
(repeat (setq i (sslength ss))
(setq e (ssname ss (setq i (1- i))))
(while
(eq "ATTRIB"
(cdr (assoc 0 (setq l (entget (setq e (entnext e))))))
)
(if (eq tag (strcase (cdr (assoc 2 l))))
(entupd
(cdr
(assoc -1
(entmod (subst value (assoc 1 l) l))
)
)
)
)
)
)
)
(princ)
) 所以它可以工作,但这个区块嵌入到另一个区块中,因为我们的边界具有动态可视性,我们将该区块用于24x36和11x17尺寸。随着它的嵌入,它没有改变。仅当它位于图形中最外层的块上时才会更改。
如果这意味着什么的话,外部块的名称是“BORDER(overnet)”。 由于它是嵌套的,因此您必须深入了解块定义并更改属性值-这种更改将反映在所有插入中。 你到底是怎么做到的?我只是不知道你的意思。 使用vlax for函数循环块集合中相关块对象中的对象,并使用条件测试属性对象;或者,也可以使用entnext循环浏览块定义中的实体,这些实体可以使用tblobjname函数获取,再次使用条件测试属性实体并继续修改值。
页:
[1]