tigcat 发表于 2024-5-30 19:28:53

[20240603有内容更新]外部参照状态查询和管理

本帖最后由 tigcat 于 2024-6-3 20:03 编辑

外部参照有四种状态,如下图:1-需要重载;2-已卸载;3-已加载;4-未参照


如何获取这四种状态呢?

首先,外部参照是一种特殊的块,所以我们可以查询组码,打开cad帮助,提示组码"70"对应的值.


有了上面的组码,那么我们可以获取外部参照的数据表验证一下.


首先,我们用vla函数可以获取所有的外部参照名称

;获取所有的外部参照名称
(defun getallxref ()
(setq blocklst '())
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vlax-for block (vla-get-Blocks doc)
    (if
      (eq (vla-get-IsXRef block) :vlax-true)
       (setq blocklst (cons (vla-get-Name block) blocklst))
    )
)
blocklst
)


;获取外部参照名称和组码70的数值的二元表
(defun xref-dxf70(lst)
(setq name-dxfs '())
(foreach x lst
    (setq name-dxfs (cons (cons x(cdr (assoc 70 (tblsearch "block" x))))name-dxfs))
    )
)


用上面2个程序就可以获得如下图的"参照名称" 70组码的点对表



从上图知只有"2"的组码值为4,其余"1" "3" "4"外部参照70组码值均为36,结合上面组码说明,4表示为外部参照,此时是未融入或者引用的状态,36=4+32,表示融入的外部参照.从上面实例可知,单从70组码能判断外部参照是否卸载,但是无法判断是否是需要重载/未参照的情况.

下面是配套的测试的dwg和lsp


下面分享网络找来的两段代码,一段可以清除已卸载的外部参照,另外一段可以清理未使用的外部参照和光栅引用.





经过本坛大佬bao_lai的探索,提供一个C#封装的函数命令:"(getxrefstatus)",利用这个函数可以读取参照管理器一样的参照状态,目前CAD2014还不支持,我测试2018可以用,bao_lai大佬用2020编写,所以2018/2020都可以使用.下面的动图也是大佬提供的.



补充2014版cad适用程序,由bao_lai大佬提供







你有种再说一遍 发表于 2024-5-30 19:39:04

数据库结构是一样的,要找到节点上面
https://www.cnblogs.com/JJBox/p/12407217.html

tigcat 发表于 2024-5-30 21:35:53

你有种再说一遍 发表于 2024-5-30 19:39
数据库结构是一样的,要找到节点上面
https://www.cnblogs.com/JJBox/p/12407217.html

感谢大佬回复,我还需慢慢学习了解

guosheyang 发表于 2024-5-31 07:40:24

感谢分享代码!

advksf 发表于 2024-5-31 09:22:17

好资料,谢谢分享

hzyhzjjzh 发表于 2024-5-31 13:08:35

谢谢分享{:1_1:}

z312144636 发表于 2024-6-1 14:14:13

好资料,谢谢分享
页: [1]
查看完整版本: [20240603有内容更新]外部参照状态查询和管理