明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1623|回复: 8

[提问] 动态块如何选择用块名去选择块呢?

[复制链接]
发表于 2023-8-9 15:26:19 | 显示全部楼层 |阅读模式
动态块回用一个类似`*U763的值替代块名,如何选择实际的块名呢?(setq ss (ssget "_X" '((0 . "INSERT")(2 . "*gps*"))))这种就没法把gps*的块加入变量。求大神解惑?
发表于 2023-8-9 18:22:41 | 显示全部楼层
(setq obj (vlax-ename->vla-object EntNam))
(setq b_name (vla-get-EffectiveName obj))
这个函数可以获取动态块的块名
 楼主| 发表于 2023-8-9 19:32:04 | 显示全部楼层
xiaocainiao 发表于 2023-8-9 18:22
(setq obj (vlax-ename->vla-object EntNam))
(setq b_name (vla-get-EffectiveName obj))
这个函数可以 ...

谢谢,非常感谢,获取到块名怎么筛选呢,比如说我要筛选带块名带gps的块,该怎么写呢?小白求教
发表于 2023-8-10 07:14:54 | 显示全部楼层
  1. 令: (fun:usage 'block:ssget)
  2. *** 函数名:  block:ssget
  3. ---------------
  4. 说明: 选择满足指定属性标记及对应值的块  参数: blknames 块名,或块名列表  参数: lst-attr 属性名与值的点对表
  5. 用法: (block:ssget blknames lst-attr)
  6. 参数: 1 blknames  : 块名称;2 lst-attr  : 列表;
  7. 返回值: 满足条件的选择集
  8. 示例: (block:ssget '("块1" "块2") '(("属性1" . "值1")("属性2" . "值2")))


  9. 命令: (fun:src 'block:ssget)
  10. (defun block:ssget (blknames lst-attr / ss ss-res)
  11.   "选择满足指定属性标记及对应值的块\n参数: blknames 块名,或块名列表\n参数: lst-attr 属性名与值的点对表"
  12.   "满足条件的选择集"
  13.   "(block:ssget '(\"块1\"
  14.       \"块2\")
  15.     '((\"属性1\"
  16.         . \"值1\")(\"属性2\"
  17.         . \"值2\")))"
  18.   (if (= (quote str)
  19.       (type blknames))
  20.     (setq blknames (list blknames)))
  21.   (setq ss-res (ssadd))
  22.   (if (setq lst-ent (pickset:to-list (ssget "x"
  23.           (quote ((0 . "insert"))))))
  24.     (foreach ent% lst-ent (if (and (member (block:get-effectivename ent%)
  25.             blknames)
  26.           (apply (quote and)
  27.             (mapcar (quote (lambda (x)
  28.                   (member x (block:get-attributes ent%))))
  29.               lst-attr)))
  30.         (ssadd ent% ss-res))))
  31.   (sssetfirst nil ss-res)
  32.   ss-res)
发表于 2023-8-10 09:45:26 | 显示全部楼层
没办法 根据dxf码直接筛选,只能选取很多动态块后,在程序内部进行筛选
发表于 2023-8-10 09:48:31 | 显示全部楼层
论坛有代码,提前预选过滤所有符合要求的*U,再作为DXF2来给SSGET过滤选择
发表于 2023-8-10 11:12:36 | 显示全部楼层
(DEFUN $ssget-km$ (KMS LST / ents filter km obj ss ss-n tmp)
                                        ;高速搜索块名
  (IF KMS
    (PROGN
      (setq ss-n "SSGET")
      (SETQ filter (list (cons 0 "INSERT") (cons 66 1)))
      (vl-Catch-All-Apply
        'vla-delete
        (LIST
          (vl-Catch-All-Apply
            'vla-item
            (list (vla-get-SelectionSets
                    (vla-get-ActiveDocument (vlax-get-acad-object))
                  )
                  ss-n
            )
          )
        )
      )
      (setq
        ss (vl-Catch-All-Apply
             'vla-add
             (list (vla-get-selectionsets
                     (vla-get-activedocument (vlax-get-acad-object))
                   )
                   ss-n
             )
           )
      )
      (setq
        tmp (mapcar
              (function
                (lambda        (x y)
                  (vl-catch-all-apply
                    'vlax-make-variant
                    (list (vl-catch-all-apply
                            'vlax-safearray-fill
                            (list (vl-Catch-All-Apply
                                    'vlax-make-safearray
                                    (list y (cons 0 (1- (length x))))
                                  )
                                  x
                            )
                          )
                    )
                  )
                )
              )
              (list (mapcar 'car filter) (mapcar 'cdr filter))
              (list vlax-vbInteger vlax-vbVariant)
            )
      )
      (vl-catch-all-apply
        'vla-select
        (list
          ss
          acSelectionSetAll
          nil
          nil
          (car TMP)
          (cadr TMP)
        )
      )
      (if ss
        (vlax-for obj ss
          (setq km nil)
          (setq        km (vl-catch-all-apply
                     'vla-get-effectivename
                     (list obj)
                   )
          )
          (AND (vl-catch-all-error-p KM)
               (setq KM (vl-catch-all-apply 'vla-get-name (list obj)))
          )
          (and km (setq km (strcase km)))
          (if (and km (member km KMS))
            (SETQ ENTS (CONS (VLAX-VLA-OBJECT->ENAME OBJ) ENTS))
          )
        )
      )
      (vl-Catch-All-Apply
        'vla-delete
        (LIST
          (vl-Catch-All-Apply
            'vla-item
            (list (vla-get-SelectionSets
                    (vla-get-ActiveDocument (vlax-get-acad-object))
                  )
                  ss-n
            )
          )
        )
      )
    )
  )
  ENTS
)
 楼主| 发表于 2023-8-10 17:12:04 | 显示全部楼层
感谢各位大佬的回复,结合这篇文章大概弄出来了https://www.cnblogs.com/edata/p/6797362.html。感谢
发表于 2023-8-10 17:44:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 02:45 , Processed in 0.218781 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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