ksperopoulos 发表于 2022-7-6 11:30:40

在外部参照中搜索属性

我这里有一个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))

ksperopoulos 发表于 2022-7-6 11:42:44

没人想试试这个?有人知道这是否可能吗?

MarcoW 发表于 2022-7-6 11:53:25

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

Lee Mac 发表于 2022-7-6 12:01:46

我开始搜索块定义,不确定它是否有用。
 

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



ksperopoulos 发表于 2022-7-6 12:19:44

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

Lee Mac 发表于 2022-7-6 12:26:22

ksperopoulos,
 
发布的代码只会打印一个块名列表和它出现在其中的属性的实体名-这只是一个开始,需要很多改进。

ksperopoulos 发表于 2022-7-6 12:33:31

对不起,我以前一定误会了。我不知道如何编写lisp例程,也不知道如何操作它们。我想也许有人以前已经遇到过这种情况,并且有一些他们愿意分享的东西。
页: [1]
查看完整版本: 在外部参照中搜索属性