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

好东西,做个标记
页: 1 [2] 3
查看完整版本: 有没有好办法对动态图块块名用ssget选择过滤?