Campa150 发表于 2022-7-6 00:02:37

按属性v进行块选择

我对Autolisp很陌生,所以我真的不知道是否可以用lisp来实现这一点,但现在它来了。
我需要一个lisp,可以根据属性值选择一个块,例如,我有一个图形,其中有十几个块都具有相同的名称“DFUBLANK1”,这些块有几个属性,但我只需要选择属性标记为“PART”且值为“10”的块。有什么想法吗?

BIGAL 发表于 2022-7-6 00:17:37

这是接近未测试
 
; simple find block
; by Alan H nov 2013

(setq ans (getstring "\nEnter attribute value"))
(setq oldtag1 "yourattibute") ;attribute tag name
(setq ss1 (ssget "x"'((0 . "INSERT") (2 . "yourblockname")(410 . "Model"))) ; change block name
(setq inc (sslength ss1))
(repeat inc      
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 (setq inc (1- inc))) )'getattributes)
(if (= oldtag1 (strcase (vla-get-tagstring att)))
(progn
(if (= ans (vla-get-textstring att ))
(progn
(setq pt1 (vla-get-insertionpoint att))
(command "zoom" "c" pt1 100) ; zooms in on block
) ; end progn
) ; end if ans
)); end if oldtag1
) ; foreach att
) ; end repeat
(princ)

Tharwat 发表于 2022-7-6 00:42:41

欢迎来到CADTutor
 
试试这个。
 

(defun c:Test (/ ss in sn en it ad ok)
(if (setq ad (ssadd)
         ss (ssget "_X"
                     (list '(0 . "INSERT")
                           '(2 . "DFUBLANK1")
                           '(66 . 1)
                           (cons 410 (getvar 'CTAB))
                     )
            )
   )
   (repeat (setq in (sslength ss))
   (setq sn (ssname ss (setq in (1- in)))
         it sn
         ok nil
   )
   (while
       (and
         (not ok)
         (/= (cdr (assoc 0 (setq en (entget (setq sn (entnext sn))))))
             "SEQEND"
         )
       )
      (if (and (eq (strcase (cdr (assoc 2 en))) "PART")
               (eq (cdr (assoc 1 en)) "10")
            )
          (setq ok t
                ad
                   (ssadd it ad)
          )
      )
   )
   )
)
(sssetfirst nil ad)
(princ)
)

Campa150 发表于 2022-7-6 00:57:41

谢谢你们的帮助,两人都做得很好,但我会和塔尔瓦特一起去,这更是我想要的。

Tharwat 发表于 2022-7-6 01:06:22

 
不客气
页: [1]
查看完整版本: 按属性v进行块选择