明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 秋枫

有没有好办法对动态图块块名用ssget选择过滤?

  [复制链接]
发表于 2011-3-10 14:17 | 显示全部楼层
非常期待这个能完成
我有一些符号是动态块,查询是一个麻烦事,目前只能一个一个的手动查找
发表于 2012-8-21 12:33 | 显示全部楼层
不知秋枫有没有发现更好的办法?
发表于 2012-8-21 14:20 | 显示全部楼层
目前没什么更好的好办法...
发表于 2012-12-4 13:15 | 显示全部楼层
本帖最后由 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)
)
发表于 2012-12-27 17:06 | 显示全部楼层
本帖最后由 snddd2000 于 2013-1-17 11:46 编辑

  1. (defun ssgetblock (blkname / ss0 n count ent0 str BlkName0)
  2.   (setq ss0 (ssget "X" '((0 . "INSERT"))))
  3.   (setq   n     0
  4.         count (sslength ss0)
  5.         str   ""
  6.   )
  7.   (repeat count
  8.     (setq ent0 (ssname ss0 n))
  9.     (setq BlkName0 (vla-get-effectivename
  10.                      (vlax-ename->vla-object ent0)
  11.                    )
  12.     )
  13.     (if        (= blkname BlkName0)
  14.       (setq str (strcat str ",`" (cdr (assoc 2 (entget ent0)))))
  15.     )
  16.     (setq n (1+ n))
  17.   )                                        ;end repeat
  18.   (ssget (list (cons 0 "INSERT") (cons 2 str)))
  19. )

原理就是收集图中的所有此块名的dxf的2组码,作为ssget的过滤条件
  1.   (setq ss1 (ssgetblock "块名"))        ;取块


点评

不知道怎么同时选两个  发表于 2013-12-20 20:40

评分

参与人数 1明经币 +1 收起 理由
菜卷鱼 + 1

查看全部评分

发表于 2013-1-17 11:17 | 显示全部楼层
非常感谢楼上啊,正好今天在找这方面的资料,居然直接就发现完全符合自己需求的东东了。
赞一个~~
发表于 2013-3-28 12:22 | 显示全部楼层
本帖最后由 zhqdh 于 2013-3-28 12:23 编辑

感谢二楼提供的方法,,还真不知道动态块名加上"`"就可以支持ssget了,,
查询资料里都没有讲这个方法..  是否能详细解释下,"`"在lisp中是否有特殊功能.
该方法是否能应用在其他地方.   谢谢!
发表于 2013-12-21 13:48 | 显示全部楼层
snddd2000 发表于 2012-12-27 17:06
原理就是收集图中的所有此块名的dxf的2组码,作为ssget的过滤条件

  1. (defun ssgetblock-X (blknamelst / ss0 n count ent0 str BlkName0)
  2.   (setq ss0 (ssget "X" '((0 . "INSERT"))))
  3.   (setq        n     0
  4.         count (sslength ss0)
  5.         str   ""
  6.   )
  7.   (repeat count
  8.     (setq ent0 (ssname ss0 n))
  9.     (setq BlkName0 (vla-get-effectivename
  10.                      (vlax-ename->vla-object ent0)
  11.                    )
  12.     )
  13.     (if        (member BlkName0 blknamelst)
  14.       (setq str (strcat str ",`" (cdr (assoc 2 (entget ent0)))))
  15.     )
  16.     (setq n (1+ n))
  17.   )                                        ;end repeat
  18.   (ssget (list (cons 0 "INSERT") (cons 2 str)))
  19. )


  1. (setq ss1 (ssgetblock-X (list "块名1""块名2""块名3" ... ...)))        ;取块
发表于 2015-11-4 09:33 | 显示全部楼层
找了很久谢谢分享
发表于 2018-1-15 09:13 | 显示全部楼层
好东西,做个标记
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 12:25 , Processed in 0.201347 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表