明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: caoyin

请教:如何把选择集设为激活的选择集

  [复制链接]
发表于 2011-6-11 16:18:31 | 显示全部楼层
(sssetfirst nil ss)
  (ssget)
遗憾的是,这两个函数做成透明命令,不能执行。
不知道有没有VLISP方法,实现“ vla-PUT-ActiveSelectionSet”?
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2011-6-11 17:53:48 | 显示全部楼层
思路
1.已知指定的选择集是 SSET
2.vla-get-ActiveSelectionSet获得当前选择集 Asset
3.用vla-RemoveItems清空 ASSET
4.将SSET中的对象转化为VLA对象并用vla-addItems添加到 ASSET
发表于 2011-6-11 22:30:05 | 显示全部楼层
测试不成功,程序如下 :(vl-load-com)
(defun lst2arr (obj_lst / obj_arr)
  (setq obj_arr (vlax-make-safearray vlax-vbObject (cons 0 (- (length obj_lst) 1)))
        obj_arr (vlax-safearray-fill obj_arr obj_lst)
        obj_arr (vlax-make-variant obj_arr))
)
(defun c:stest ( / obj_lst obj_arr ass len i )
  ;;测试之前首先: (setq ss (ssget)) 然后(ssget) 置当前选择集为与ss不同的另一选集
  ;;然后执行stest  ;再次(ssget),用"p"响应,看当前选择集是否变化
    (setq acadDocument (vla-get-activedocument (vlax-get-acad-object)))
    (setq ass (vla-get-ActiveSelectionSet acadDocument))
    (vlax-dump-object ass t)
    (vlax-for item ass (setq obj_lst (cons item obj_lst)))
    (setq obj_arr (lst2arr obj_lst))
    (vla-removeitems ass obj_arr)
    (vlax-dump-object ass t)
    (if ss  ;; ss 由外部传递
       (progn
             (setq len (sslength ss)
                   i 0
                   obj_lst '())
            (repeat len
                    (setq en (ssname ss i)
                          eo (vlax-ename->vla-object en))
                    (setq obj_lst (append obj_lst (list eo)))
                    (setq i (1+ i))
            );repeat
       (setq obj_arr (lst2arr obj_lst))
       (vla-additems ass obj_arr)
       (vlax-dump-object ass t);;这里可以看到选择集里的元素已经变化
   ));;if
  ;(vla-update ass)
  (setq ass (vla-get-ActiveSelectionSet acadDocument))
  (vlax-dump-object ass t) ;;这里看到的当前选择集却不是上面的ass
  (princ)
);defun


发表于 3 天前 | 显示全部楼层
小菜123 发表于 2011-6-11 22:30
测试不成功,程序如下 vl-load-com)
(defun lst2arr (obj_lst / obj_arr)
  (setq obj_arr (vlax-make- ...

最近,想用(setq blkss (ssget '((0 . "INSERT") (2 . "*U*,~*/*,~*\\*")))),框选筛选出,除外部参照块之外的所有块,用(entget (car (entsel))),对比了外部参照块和普通块的组码列表,发现无法区别,因此又想用vla方式解决。偶然发现此贴,不知道大师解决了吗?我将以前偶然发现的解决办法共享一下。
(vl-load-com)
(setq ss1 (ssget))
(setq ss2 (ssget))
(setq ss3 (ssget))
;以上建立3个选集
(sssetfirst nil ss2);此处可以是ss1  或ss2  或ss3,均可。亮显选集内对象并将选集作为当前活动选集。
(setq vlaSel (vla-get-ActiveSelectionSet(vla-get-ActiveDocument (vlax-get-acad-object))))
此处已将sssetfirst中ss2设置为当前选集,以后即可使用vlax-for item01  vlaSel
此外,发现vla-Select建立选集,仍需要用dxf组码作为过滤条件转成变体,作为vla-Select的参数,使用不如ssget方便。
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
最近,想用(setq blkss (ssget '((0 . "INSERT") (2 . "*U*,~*/*,~*\\*")))),框选筛选出,除外部参照块之外的所有块,用(entget (car (entsel))),对比了外部参照块和普通块的组码列表,发现无法区别,因此又想用vla方式解决。偶然发现此贴,不知道大师解决了吗?我将以前偶然发现的解决办法共享一下。
(vl-load-com)
(setq ss1 (ssget))
(setq ss2 (ssget))
(setq ss3 (ssget))
;以上建立3个选集
(sssetfirst nil ss2);此处可以是ss1  或ss2  或ss3,均可。亮显选集内对象并将选集作为当前活动选集。
(setq vlaSel (vla-get-ActiveSelectionSet(vla-get-ActiveDocument (vlax-get-acad-object))))
此处已将sssetfirst中ss2设置为当前选集,以后即可使用vlax-for item01  vlaSel
此外,发现vla-Select建立选集,仍需要用dxf组码作为过滤条件转成变体,作为vla-Select的参数,使用不如ssget方便。
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
sdh123321 发表于 2025-12-5 15:16
最近,想用(setq blkss (ssget '((0 . "INSERT") (2 . "*U*,~*/*,~*\\*")))),框选筛选出,除外部参照块之 ...

你都定义好ss1 ss2 ss3了,后面直接用需要的变量就是了,还非要多此一举将需要的弄进ActiveSel,赋值新变量,再遍历新变量,这不多此一举嘛。
回复 支持 反对

使用道具 举报

发表于 前天 16:13 | 显示全部楼层
kozmosovia 发表于 2025-12-5 15:55
你都定义好ss1 ss2 ss3了,后面直接用需要的变量就是了,还非要多此一举将需要的弄进ActiveSel,赋值新变 ...

是有点多次一举。
这样原因有2个,①是尽量不想用组码,纯组码的过滤条件让人瞬间看不懂,②是,最主要是想使用vla相关函数,更直观一些。
回复 支持 反对

使用道具 举报

发表于 前天 17:06 | 显示全部楼层
sdh123321 发表于 2025-12-6 16:13
是有点多次一举。
这样原因有2个,①是尽量不想用组码,纯组码的过滤条件让人瞬间看不懂,②是,最主要 ...

sset转vlo表的函数一搜就有,让AI也轻松写得出来,何必弄当前选择集中转。
回复 支持 反对

使用道具 举报

发表于 前天 19:08 | 显示全部楼层
kozmosovia 发表于 2025-12-6 17:06
sset转vlo表的函数一搜就有,让AI也轻松写得出来,何必弄当前选择集中转。

你说的对。谢谢你的想法,都可以实现。


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-8 20:20 , Processed in 0.135235 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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