【问题标题】:How to delete all Attributes from all Blocks with AutoLISP using ObjectDBX如何使用 ObjectDBX 使用 AutoLISP 从所有块中删除所有属性
【发布时间】:2020-06-09 22:18:22
【问题描述】:

我想使用 AutoLISP ObjectDBX 方法删除块内图的所有属性。

下面的程序运行良好:它删除了图形中所有块的属性,但是当我在块编辑器中编辑这个块时,我看到所有属性仍然存在。

我想我需要从块的定义中删除这个属性。

;[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."))
    )
)

你能帮忙找出我需要改进/纠正这个程序的地方吗?

【问题讨论】:

  • 您需要从 BlockTableRecord 中删除属性定义,而不是 BlockReference。

标签: lisp autocad autocad-plugin autolisp autocad-scripts


【解决方案1】:

考虑到块定义本质上是块的“蓝图”,每个块参考都是一个实例,显示在块定义中找到的对象,在图形中的特定位置、比例、旋转和方向。

属性在块定义中也有Attribute Definitions,并且对应的Attribute References附加到每个块参考。然后,此类属性参考可以为插入到图形中的每个块参考保存不同的文本内容。

除此之外,有趣的是,属性参考也可以通过编程方式附加到块参考,而与块定义无关,但是,在使用标准的开箱即用前端操作 AutoCAD 时,这是不允许的。

因此,要从图形中删除所有属性,您需要删除与所有块参照关联的属性参照,以及相应块定义中的属性定义。

您可能还想在执行删除操作之前解锁锁定的图层,并在此操作之后重新锁定以前锁定的图层。

由于布局只是一种块,迭代块集合将足以处理所有布局、块和嵌套块(不包括外部参照):

(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."))
    )
)

【讨论】:

  • 谢谢李麦克。它按我的预期工作。我也喜欢你的建议,在删除块属性之前解锁图层。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多