查找块中的属性
我想问一下cad专家是否有关于查找属性的代码。我不熟悉lisp,所以我不知道从哪里开始。我想在一个或多个块中搜索2个属性。像这样的事情:
“输入要搜索的第一个属性:”。。。。
“输入要搜索的第二个属性:”。。。
在执行lisp之前,例程将搜索图形中具有这两个属性的所有块,并放大到具有相同viewsize(变量)的块,并在每个具有这些字符串的块上停止,直到列表结束或用户按escape。 查找存在两个特定标记的块?
或者块不一定只有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) 我会尝试这样的方式:
(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))
希望块和插入在单个定义中没有重复的标记名。
-大卫 很好,大卫,
在我的帖子里。我想我放大得太大了,以至于你看不到这个街区周围的实体
你的方法更好
顺便说一句:
(strcat "\nTag " (itoa i) " To Serach ( Enter To Exit ):")
接得好谢谢!
我不太擅长阅读VL代码。看起来你正在做一个要缩放的边界框。我本以为这会奏效-大卫 谢谢你的代码,但由于某种原因,我不知道如何在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)) 这应该搜索所有插入并放大包含“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。在前面的例程中,您可以简单地对选择查询说“全部”。它应该相应地过滤掉插入。
-大卫 我试了几次不同的画,但都没用。知道吗?
VAV ans M2是标记名还是块名? 它们是属性。我正在寻找类似post#6的内容,但会在一个块中找到2个属性。
具体来说,我有一个具有2、4或6个属性的块。它们是我的设备标签。
你在6号帖子中编码的那个很好,但每次我都需要按enter键,直到找到一个带有“VAV”属性的块。所以现在我正在寻找一个可以在一个块中同时找到两个属性的块,这样它就会自动缩放到它,或者如果有多个块具有相同的属性,它就会自动缩放到下一个块。试试张贴在帖子#6上的代码,以便更好地理解我的请求。对不起,我的英语很差,这不是我的母语。谢谢大卫抽出时间,我真的很感激。
页:
[1]
2