乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 45|回复: 6

[编程交流] 在外部参照中搜索属性

[复制链接]

55

主题

325

帖子

274

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
280
发表于 2022-7-6 11:30:40 | 显示全部楼层 |阅读模式
我这里有一个lisp例程,如果属性在图形中,它非常适合搜索属性的特定值。有没有办法搜索主图形文件和主图形中覆盖的外部参照?
 
  1. (defun c:fatt (/ ov ss i en ed an ad ah)
  2. (while (not ov)
  3.         (setq ov (getstring t "\nATTRIB Value To Search For:   ")))
  4. (and (setq ss (ssget "X" (list (cons 0 "INSERT")
  5.                                 (cons 66 1)
  6.                                 (if (getvar "CTAB")
  7.                                     (cons 410 (getvar "CTAB"))
  8.                                     (cons 67 (- 1 (getvar "TILEMODE")))))))
  9.       (setq i (sslength ss))
  10.       (while (not (minusp (setq i (1- i))))
  11.              (setq en (ssname ss i)
  12.                    ed (entget en)
  13.                    an (entnext en))
  14.              (while (/= "SEQEND" (cdr (assoc 0 (entget an))))
  15.                     (setq ad (entget an)
  16.                           ah (cdr (assoc 40 ad))
  17.                           an (entnext an))
  18.                     (if (= (strcase ov)
  19.                            (strcase (cdr (assoc 1 ad))))
  20.                         (progn
  21.                            (command "_.ZOOM" "_C" (cdr (assoc 10 ed)) (* ah 66))
  22.                            ;(redraw en 3)
  23.                            (getstring "\nPress Enter To Continue Searching..."))))))
  24. ;(redraw)
  25. (prin1))
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
280
发表于 2022-7-6 11:42:44 | 显示全部楼层
没人想试试这个?有人知道这是否可能吗?
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
295
发表于 2022-7-6 11:53:25 | 显示全部楼层
你好
 
(ssget“X”(列表(cons 0“插入”)。。。
是在当前图形中搜索所有块的代码段。
 
如果块位于外部参照中,“ssget”功能不起作用。带有属性的块是嵌套的,因此必须使用“nentsel”函数。这只适用于选定的1个实体。
 
如何解决这个问题对我来说是个谜,因为我自己经常试图找到解决方法。
 
如果其他人有一个解决方案,或者如果我在这里完全错了,请发表评论。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:01:46 | 显示全部楼层
我开始搜索块定义,不确定它是否有用。
 
  1. (defun c:Find_Att (/ itemp getname getnestattribblocks BLKS BLOCK ENT I LST NLST SS TMP)
  2. ;; Lee Mac  ~  23.03.10
  3. (setq *str (strcase
  4.               (cond ((/= "" (setq tmp (getstring t "\nATTRIB Value to Search For: "))) tmp)
  5.                     (*str))))
  6. (defun itemp (collection item / result)
  7.    (if (not (vl-catch-all-error-p
  8.               (setq result
  9.                      (vl-catch-all-apply (function vla-item)
  10.                        (list collection item)))))
  11.      result))
  12. (defun GetName (object)
  13.    (if (vlax-property-available-p object 'EffectiveName)
  14.      (vla-get-EffectiveName object)
  15.      (vla-get-name Object)))
  16. (defun GetNestAttribBlocks (object / result sub)
  17.    
  18.    (setq blks (cond (blks) ((vla-get-Blocks
  19.                               (vla-get-ActiveDocument
  20.                                 (vlax-get-acad-object))))))
  21.    
  22.    (vlax-for sub object
  23.      (if (and (eq "AcDbBlockReference" (vla-get-ObjectName sub))
  24.               (eq :vlax-true (vla-get-hasAttributes sub)))
  25.        (setq result (cons sub (GetNestAttribBlocks (itemp blks (GetName sub)))))))
  26.    
  27.    result)
  28. (if (setq i -1 ss (ssget "_X" (list (cons 0 "INSERT")
  29.                                      (cons 66 1)
  30.                                      (cons 410 (getvar 'CTAB)))))
  31.    
  32.    (while (setq ent (ssname ss (setq i (1+ i))))
  33.      (setq bName (cdr (assoc 2 (entget ent))))                 
  34.      
  35.      (while (/= "SEQEND" (cdr (assoc 0 (entget (setq ent (entnext ent))))))
  36.       
  37.        (if (eq *str (strcase (cdr (assoc 1 (entget ent)))))
  38.          
  39.          (setq Lst (cons (cons bName ent) Lst))))))
  40. (vlax-for block (vla-get-Blocks
  41.                    (vla-get-ActiveDocument (vlax-get-acad-object)))
  42.    
  43.    (setq nLst
  44.      (cons
  45.        (apply (function append)
  46.               (mapcar
  47.                 (function
  48.                   (lambda (block)
  49.                     (vl-remove 'nil
  50.                       (mapcar
  51.                         (function
  52.                           (lambda (attrib)
  53.                             (if (eq (strcase (vla-get-TextString attrib)) *str)
  54.                               (cons (GetName block) (vlax-vla-object->ename attrib)))))
  55.                         
  56.                         (vlax-invoke block 'GetAttributes)))))
  57.                
  58.                 (GetNestAttribBlocks block)))
  59.          
  60.      nLst)))
  61. (print (vl-remove 'nil (apply (function append) nLst)))
  62. (princ))
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
280
发表于 2022-7-6 12:19:44 | 显示全部楼层
谢谢大家的回复。Lee Mac,我无法将其用于图形或外部参照中的块。我在考虑AutoCad的“Find”命令。它有能力做我想做的事情,但再生过程对我处理的大小文件来说太长了。我发布的lisp重新生成速度快得多,只是没有在外部参照中搜索属性。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:26:22 | 显示全部楼层
ksperopoulos,
 
发布的代码只会打印一个块名列表和它出现在其中的属性的实体名-这只是一个开始,需要很多改进。
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
280
发表于 2022-7-6 12:33:31 | 显示全部楼层
对不起,我以前一定误会了。我不知道如何编写lisp例程,也不知道如何操作它们。我想也许有人以前已经遇到过这种情况,并且有一些他们愿意分享的东西。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 02:22 , Processed in 0.483718 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表