ketongin 发表于 2022-7-6 09:05:59

查找块中的属性

我想问一下cad专家是否有关于查找属性的代码。我不熟悉lisp,所以我不知道从哪里开始。
 
我想在一个或多个块中搜索2个属性。像这样的事情:
 
“输入要搜索的第一个属性:”。。。。
“输入要搜索的第二个属性:”。。。
 
在执行lisp之前,例程将搜索图形中具有这两个属性的所有块,并放大到具有相同viewsize(变量)的块,并在每个具有这些字符串的块上停止,直到列表结束或用户按escape。

pBe 发表于 2022-7-6 09:12:58

查找存在两个特定标记的块?
或者块不一定只有2个属性,只要两个标记都存在于该块上?
 
放大位置并提示编辑?
 
试试这个:
(defun FindTagEdit ( Tag1 Tag2 / dcledit TagVal a b c TagCheck blk str)
;;;       pBe 29July2011;;;
(vl-load-com)      
(defun dcledit (txt / attlist NewTxt ddatt_dcl)
   (and
   (setq oldtxt txt
         dcl    (load_dialog "ACAD")
   )
   (new_dialog "acad_txtedit" dcl)
   (set_tile "text_edit" txt)
   (action_tile "text_edit" "(setq txt $value)")
   (action_tile "cancel" "(setq txt oldtxt)")
   (start_dialog)
   (unload_dialog dcl)
   )
   txt
)
(defun TagVal(ent nme)
   (mapcar '(lambda (j)
                  (vl-list* (vla-get-tagstring j) j))
             (vlax-invoke (vlax-ename->vla-object ent) 'GetAttributes)
             )
   )      
(cond ((and
(while
   (setq a (tblnext "BLOCK" (null a)))
          (if (equal '(70 . 2) (assoc 70 a))
                (setq b (cons (cdr (assoc 2 a)) b)
                      )))
(foreach
      AtBlkb
   (if (setq c (ssget "_X"
                        (list (cons 2 AtBlk)
                              (cons 410 (getvar 'CTAB)))))
         (progn
               (setq TagCheck
                            (mapcar 'car
                                    (Tagval (ssname c 0) AtBlk)))
               (if (and (member Tag1 TagCheck)
                        (member Tag2 TagCheck))
                     (repeat (sslength c)
                           (vla-getboundingbox
                                 (
                                    vlax-ename->vla-object
                                       (setq blk
                                                    (ssname c 0)))
                                 'LL
                                 'UR)
                           (vla-ZoomWindow
                                 (vlax-get-acad-object)
                                 ll
                                 ur)
                           (foreach
                                    Tag(list Tag1 Tag2)
                                 (vla-put-textstring
                                       (setq str(cdr(assoc
                                                                tag
                                                                (Tagval blk AtBlk)
                                                                )))
                                       (dcledit
                                             (vla-get-textstring
                                                   str)))
                                 )
                           (setq c (ssdel blk c)))))
                                 )
                           )
                     )
               )
         )
   (princ)
   )
 
用法:
(FindTagEdit“Tagname1”Tagname2)

David Bethel 发表于 2022-7-6 09:14:26

我会尝试这样的方式:
 

(defun c:findmatt (/ i tn tl en ed an ad ss)

(setq i 1)
(while (or (not tn)
            (/= tn ""))
      (setq tn
          (strcase
            (getstring
            (strcat "\nTag " (itoa i) " To Serach ( Enter To Exit ):"))))
      (if (/= tn "")
            (setq tl (cons tn tl)
                   i (1+ i))))

(princ "\nSearching For Tagnames: ")
(prin1 tl)

(and (setq ss (ssget '((0 . "INSERT")(66 . 1))))
      (while (setq en (ssname ss 0))
             (setq ed (entget en)
                   an (entnext en)
                   ad (entget an)
                   i 0)
             (while (/= "SEQEND" (cdr (assoc 0 ad)))
                  (if (member (cdr (assoc 2 ad)) tl)
                        (setq i (1+ i)))
                  (setq an (entnext an)
                        ad (entget an)))
             (if (= i (length tl))
               (progn
                   (command "_.ZOOM" "_C" (trans (cdr (assoc 10 ed)) en 1) "")
                   (redraw en 3)
                   (getstring (strcat "\n" (cdr (assoc 2 ed))
                                    " Press Enter To Continue..."))))
             (ssdel en ss)))
(princ "\nSearch Complete   ")
(redraw)
(prin1))

 
 
希望块和插入在单个定义中没有重复的标记名。
 
-大卫

pBe 发表于 2022-7-6 09:19:53

很好,大卫,
 
在我的帖子里。我想我放大得太大了,以至于你看不到这个街区周围的实体
你的方法更好
 
 
顺便说一句:

(strcat "\nTag " (itoa i) " To Serach ( Enter To Exit ):")

David Bethel 发表于 2022-7-6 09:24:25

 
接得好谢谢!
 
我不太擅长阅读VL代码。看起来你正在做一个要缩放的边界框。我本以为这会奏效-大卫

ketongin 发表于 2022-7-6 09:27:45

谢谢你的代码,但由于某种原因,我不知道如何在PBE上调用该命令。我出错了。
 
我喜欢David的代码,但它能在不选择对象的情况下找到块吗?我的块有两个以上的属性,通常是4或6。下面是我用了很长一段时间,我喜欢它。唯一的问题是,当我寻找一个属性时,我必须一个接一个地处理所有的块,直到找到正确的块。我认为这段代码也是由David编写的。
 
如果我想找到“VAV”和“M2”。它将自动缩放该块。有了这个代码,我将不得不逐步通过所有的VAV,直到我找到VAV M2。
 
(defun c:find2 (/ ov ss i en ed an ad)
(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)
                  ad (entget an))
            (while (/= "SEQEND" (cdr (assoc 0 ad)))
                     (if (= (strcase ov)
                            (strcase (cdr (assoc 1 ad))))
                         (progn
                            (command "_.ZOOM" "_C" (cdr (assoc 10 ed)) "")
                            (getstring "\nPress Enter To Continue Searching...")))
                     (setq an (entnext an)
                           ad (entget an)))))
(prin1))

David Bethel 发表于 2022-7-6 09:30:39

这应该搜索所有插入并放大包含“VAV”和“M2”的插入:
 

(defun c:findkatt (/ i tl en ed an ad ss)

(setq tl '("VAV" "M2"))
(princ "\nSearching For Tagnames: ")
(prin1 tl)

(and (setq ss (ssget "X" '((0 . "INSERT")(66 . 1))))
      (while (setq en (ssname ss 0))
             (setq ed (entget en)
                   an (entnext en)
                   ad (entget an)
                   i 0)
             (while (/= "SEQEND" (cdr (assoc 0 ad)))
                  (if (member (cdr (assoc 2 ad)) tl)
                        (setq i (1+ i)))
                  (setq an (entnext an)
                        ad (entget an)))
             (if (= i (length tl))
               (progn
                   (command "_.ZOOM" "_C" (trans (cdr (assoc 10 ed)) en 1) "")
                   (redraw en 3)
                   (getstring (strcat "\n" (cdr (assoc 2 ed))
                                    " Press Enter To Continue..."))))
             (ssdel en ss)))
(princ "\nSearch Complete   ")
(redraw)
(prin1))

 
为不同的标记名操作列表的tl。在前面的例程中,您可以简单地对选择查询说“全部”。它应该相应地过滤掉插入。
 
-大卫

ketongin 发表于 2022-7-6 09:36:18

我试了几次不同的画,但都没用。知道吗?
 

David Bethel 发表于 2022-7-6 09:39:42

VAV ans M2是标记名还是块名?

ketongin 发表于 2022-7-6 09:43:49

它们是属性。我正在寻找类似post#6的内容,但会在一个块中找到2个属性。
 
具体来说,我有一个具有2、4或6个属性的块。它们是我的设备标签。
你在6号帖子中编码的那个很好,但每次我都需要按enter键,直到找到一个带有“VAV”属性的块。所以现在我正在寻找一个可以在一个块中同时找到两个属性的块,这样它就会自动缩放到它,或者如果有多个块具有相同的属性,它就会自动缩放到下一个块。试试张贴在帖子#6上的代码,以便更好地理解我的请求。对不起,我的英语很差,这不是我的母语。谢谢大卫抽出时间,我真的很感激。
 
页: [1] 2
查看完整版本: 查找块中的属性