在外部参照中搜索属性
我这里有一个lisp例程,如果属性在图形中,它非常适合搜索属性的特定值。有没有办法搜索主图形文件和主图形中覆盖的外部参照?(defun c:fatt (/ ov ss i en ed an ad ah)
(while (not ov)
(setq ov (getstring t "\nATTRIB Value To Search For: ")))
(and (setq ss (ssget "X" (list (cons 0 "INSERT")
(cons 66 1)
(if (getvar "CTAB")
(cons 410 (getvar "CTAB"))
(cons 67 (- 1 (getvar "TILEMODE")))))))
(setq i (sslength ss))
(while (not (minusp (setq i (1- i))))
(setq en (ssname ss i)
ed (entget en)
an (entnext en))
(while (/= "SEQEND" (cdr (assoc 0 (entget an))))
(setq ad (entget an)
ah (cdr (assoc 40 ad))
an (entnext an))
(if (= (strcase ov)
(strcase (cdr (assoc 1 ad))))
(progn
(command "_.ZOOM" "_C" (cdr (assoc 10 ed)) (* ah 66))
;(redraw en 3)
(getstring "\nPress Enter To Continue Searching..."))))))
;(redraw)
(prin1))
没人想试试这个?有人知道这是否可能吗? 你好
(ssget“X”(列表(cons 0“插入”)。。。
是在当前图形中搜索所有块的代码段。
如果块位于外部参照中,“ssget”功能不起作用。带有属性的块是嵌套的,因此必须使用“nentsel”函数。这只适用于选定的1个实体。
如何解决这个问题对我来说是个谜,因为我自己经常试图找到解决方法。
如果其他人有一个解决方案,或者如果我在这里完全错了,请发表评论。 我开始搜索块定义,不确定它是否有用。
(defun c:Find_Att (/ itemp getname getnestattribblocks BLKS BLOCK ENT I LST NLST SS TMP)
;; Lee Mac~23.03.10
(setq *str (strcase
(cond ((/= "" (setq tmp (getstring t "\nATTRIB Value to Search For: "))) tmp)
(*str))))
(defun itemp (collection item / result)
(if (not (vl-catch-all-error-p
(setq result
(vl-catch-all-apply (function vla-item)
(list collection item)))))
result))
(defun GetName (object)
(if (vlax-property-available-p object 'EffectiveName)
(vla-get-EffectiveName object)
(vla-get-name Object)))
(defun GetNestAttribBlocks (object / result sub)
(setq blks (cond (blks) ((vla-get-Blocks
(vla-get-ActiveDocument
(vlax-get-acad-object))))))
(vlax-for sub object
(if (and (eq "AcDbBlockReference" (vla-get-ObjectName sub))
(eq :vlax-true (vla-get-hasAttributes sub)))
(setq result (cons sub (GetNestAttribBlocks (itemp blks (GetName sub)))))))
result)
(if (setq i -1 ss (ssget "_X" (list (cons 0 "INSERT")
(cons 66 1)
(cons 410 (getvar 'CTAB)))))
(while (setq ent (ssname ss (setq i (1+ i))))
(setq bName (cdr (assoc 2 (entget ent))))
(while (/= "SEQEND" (cdr (assoc 0 (entget (setq ent (entnext ent))))))
(if (eq *str (strcase (cdr (assoc 1 (entget ent)))))
(setq Lst (cons (cons bName ent) Lst))))))
(vlax-for block (vla-get-Blocks
(vla-get-ActiveDocument (vlax-get-acad-object)))
(setq nLst
(cons
(apply (function append)
(mapcar
(function
(lambda (block)
(vl-remove 'nil
(mapcar
(function
(lambda (attrib)
(if (eq (strcase (vla-get-TextString attrib)) *str)
(cons (GetName block) (vlax-vla-object->ename attrib)))))
(vlax-invoke block 'GetAttributes)))))
(GetNestAttribBlocks block)))
nLst)))
(print (vl-remove 'nil (apply (function append) nLst)))
(princ))
谢谢大家的回复。Lee Mac,我无法将其用于图形或外部参照中的块。我在考虑AutoCad的“Find”命令。它有能力做我想做的事情,但再生过程对我处理的大小文件来说太长了。我发布的lisp重新生成速度快得多,只是没有在外部参照中搜索属性。 ksperopoulos,
发布的代码只会打印一个块名列表和它出现在其中的属性的实体名-这只是一个开始,需要很多改进。 对不起,我以前一定误会了。我不知道如何编写lisp例程,也不知道如何操作它们。我想也许有人以前已经遇到过这种情况,并且有一些他们愿意分享的东西。
页:
[1]