如何使用ObjectDBX使用AutoLISP从所有块中删除所有属性
我想使用AutoLISP ObjectDBX方法删除图形中块的所有属性 下面的程序工作得很好:它删除图形中所有块的属性,但是当我在块编辑器中编辑此块时,我看到所有属性仍然存在 我想我需要从块的定义中删除这个属性如何使用ObjectDBX使用AutoLISP从所有块中删除所有属性,lisp,autocad,autocad-plugin,autolisp,autocad-scripts,Lisp,Autocad,Autocad Plugin,Autolisp,Autocad Scripts,我想使用AutoLISP ObjectDBX方法删除图形中块的所有属性 下面的程序工作得很好:它删除图形中所有块的属性,但是当我在块编辑器中编辑此块时,我看到所有属性仍然存在 我想我需要从块的定义中删除这个属性 ;[dwgin]--input drawing file ;[dwgout]-- Output drawing fath with name ;function 'LM:GetDocumentObject' lee mac function to open drawing in Obje
;[dwgin]--input drawing file
;[dwgout]-- Output drawing fath with name
;function 'LM:GetDocumentObject' lee mac function to open drawing in ObjectDBX method
(defun DBXAttDelete ( dwgin dwgout / doc flg val )
(if (setq doc (LM:GetDocumentObject dwgin))
(progn
(vlax-for lyt (vla-get-layouts doc)
(vlax-for obj (vla-get-block lyt)
(if (and (= "AcDbBlockReference" (vla-get-objectname obj))
(= :vlax-true (vla-get-hasattributes obj))
)
(foreach att (vlax-invoke obj 'getattributes)
(if (vl-catch-all-error-p (setq err (vl-catch-all-apply 'vla-delete (list att))))
(princ (strcat "\nERROR: " (vl-catch-all-error-message err)))
)
)
)
)
)
(vla-saveas doc dwgout)
(vlax-release-object doc)
flg
)
(prompt (strcat "\nThe drawing \"" dwgin "\" was not found or could not be accessed."))
)
)
你能帮我找到我需要改进/纠正这个程序的地方吗。考虑到块定义本质上是块的“蓝图”,每个块参照都是一个实例,在图形中的特定位置、比例、旋转和方向显示块定义中的对象 属性在块定义中也有相应的属性,并且相应的属性附加到每个块引用。这样,对于插入到图形中的每个块参照,这些属性参照可能会包含不同的文字内容 此外,有趣的是,属性参照也可以独立于块定义以编程方式附着到块参照,但是,在使用标准开箱即用前端操作AutoCAD时,这是不允许的 因此,要从图形中删除所有属性,需要删除与所有块参照关联的属性参照,以及相应块定义中的属性定义 您可能还希望在执行删除操作之前解锁锁定的图层,并在此操作之后重新锁定先前锁定的图层 由于布局只是块的一种类型,因此在“块”集合上迭代就足以处理所有布局、块和嵌套块(不包括外部参照):
您需要从BlockTableRecord而不是BlockReference中删除属性定义。谢谢您。它像我预料的那样工作。我也喜欢你们的建议,在删除块属性之前解锁图层。
(defun DBXAttDelete ( dwgin dwgout / doc lck )
(if (setq doc (LM:GetDocumentObject dwgin))
(progn
(vlax-for lay (vla-get-layers doc)
(if (= :vlax-true (vla-get-lock lay))
(progn
(setq lck (cons lay lck))
(vla-put-lock lay :vlax-false)
)
)
)
(vlax-for blk (vla-get-blocks doc)
(if (= :vlax-false (vla-get-isxref blk))
(vlax-for obj blk
(cond
( (= "AcDbBlockReference" (vla-get-objectname obj))
(if (= :vlax-true (vla-get-hasattributes obj))
(foreach att (vlax-invoke obj 'getattributes)
(vla-delete att)
)
)
)
( (= "AcDbAttributeDefinition" (vla-get-objectname obj))
(vla-delete obj)
)
)
)
)
)
(foreach lay lck
(vla-put-lock lay :vlax-true)
)
(vla-saveas doc dwgout)
(vlax-release-object doc)
t
)
(prompt (strcat "\nThe drawing \"" dwgin "\" was not found or could not be accessed."))
)
)