xotoo
发表于 2011-3-10 14:17:25
非常期待这个能完成
我有一些符号是动态块,查询是一个麻烦事,目前只能一个一个的手动查找
yjr111
发表于 2012-8-21 12:33:48
不知秋枫有没有发现更好的办法?
e2002
发表于 2012-8-21 14:20:54
目前没什么更好的好办法...
cheng5276
发表于 2012-12-4 13:15:08
本帖最后由 cheng5276 于 2012-12-4 18:32 编辑
今天我也碰到这个头痛的问题,将10楼的稍修改了下,在选择块时,ssget_block就几乎和SSGET一了,这可能是目前最快速的动态块过滤选择吧。
;MODE-同SSGET
;filter-二维过滤表
;blname-动态块名
(defun ssget_block (mode filter blname)
(setq namelst(cons 2(
(lambda ( s )
(foreach anon (LM:AnonymousInstancesof blname)
(setq s (strcat s ",`" anon))
)s)blname))
)
(setq filter (append (list (cons 0 "INSERT") namelst) filter))
(ssget mode filter)
)
(defun LM:AnonymousInstancesof ( block / def rec nme ref lst )
(while (setq def (tblnext "BLOCK" (null def)))
(if (= 1 (logand 1 (cdr (assoc 70 def))))
(progn
(setq rec
(entget
(cdr
(assoc 330
(entget
(tblobjname "BLOCK" (setq nme (cdr (assoc 2 def))))
)
)
)
)
)
(while (setq ref (assoc 331 rec))
(if
(and
(eq block (vla-get-effectivename (vlax-ename->vla-object (cdr ref))))
(not (member nme lst))
)
(setq lst (cons nme lst))
)
(setq rec (cdr (member (assoc 331 rec) rec)))
)
)
)
)
(reverse lst)
)
snddd2000
发表于 2012-12-27 17:06:43
本帖最后由 snddd2000 于 2013-1-17 11:46 编辑
(defun ssgetblock (blkname / ss0 n count ent0 str BlkName0)
(setq ss0 (ssget "X" '((0 . "INSERT"))))
(setq n 0
count (sslength ss0)
str ""
)
(repeat count
(setq ent0 (ssname ss0 n))
(setq BlkName0 (vla-get-effectivename
(vlax-ename->vla-object ent0)
)
)
(if (= blkname BlkName0)
(setq str (strcat str ",`" (cdr (assoc 2 (entget ent0)))))
)
(setq n (1+ n))
) ;end repeat
(ssget (list (cons 0 "INSERT") (cons 2 str)))
)
原理就是收集图中的所有此块名的dxf的2组码,作为ssget的过滤条件
(setq ss1 (ssgetblock "块名")) ;取块
shh_188
发表于 2013-1-17 11:17:14
非常感谢楼上啊,正好今天在找这方面的资料,居然直接就发现完全符合自己需求的东东了。
赞一个~~
zhqdh
发表于 2013-3-28 12:22:50
本帖最后由 zhqdh 于 2013-3-28 12:23 编辑
感谢二楼提供的方法,,还真不知道动态块名加上"`"就可以支持ssget了,,
查询资料里都没有讲这个方法..是否能详细解释下,"`"在lisp中是否有特殊功能.
该方法是否能应用在其他地方. 谢谢!
snddd2000
发表于 2013-12-21 13:48:19
snddd2000 发表于 2012-12-27 17:06 static/image/common/back.gif
原理就是收集图中的所有此块名的dxf的2组码,作为ssget的过滤条件
(defun ssgetblock-X (blknamelst / ss0 n count ent0 str BlkName0)
(setq ss0 (ssget "X" '((0 . "INSERT"))))
(setq n 0
count (sslength ss0)
str ""
)
(repeat count
(setq ent0 (ssname ss0 n))
(setq BlkName0 (vla-get-effectivename
(vlax-ename->vla-object ent0)
)
)
(if (member BlkName0 blknamelst)
(setq str (strcat str ",`" (cdr (assoc 2 (entget ent0)))))
)
(setq n (1+ n))
) ;end repeat
(ssget (list (cons 0 "INSERT") (cons 2 str)))
)
(setq ss1 (ssgetblock-X (list "块名1""块名2""块名3" ... ...))) ;取块
winerfjy
发表于 2015-11-4 09:33:34
找了很久谢谢分享
eii
发表于 2018-1-15 09:13:13
好东西,做个标记