找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8935|回复: 35

[每日一码] ssget得到的选择集,转为vla集合,谁有好办法?---总结

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-6-15 14:05:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 /db_自贡黄明儒_ 于 2013-6-21 14:16 编辑

根据各位高手的帮忙,总结如下:
  1. ;;161.1 [功能] 选择集->VlaSS集合
  2. ;;(vlax-map-Collection (ss->vlass ss) 'vla-delete)
  3. (defun ss->vlass (ss)
  4.   (command "_.select" ss "")
  5.   (vla-get-activeselectionset
  6.     (vla-get-ActiveDocument (vlax-get-acad-object))
  7.   )
  8. )
  9. ;;161.2 [功能] lisp选择集或图元转为vla选择集 By namezg
  10. ;;(vlax-map-Collection (SS->vlaSS ss) 'vla-delete)
  11. (defun SS->vlaSS1 (ss / *DOC* I OBJLST SARRAY SSET VLA)
  12.   (setq *DOC* (vla-get-ActiveDocument (vlax-get-acad-object)))
  13.   (setq SSet (vla-get-ActiveSelectionSet *DOC*))
  14.   (vla-Clear SSet)      ;清空选择集
  15.   ;;得到VLA物体列表
  16.   (repeat (setq i (sslength ss))
  17.     (setq vla (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
  18.     (setq objlst (cons vla objlst))
  19.   )
  20.   (setq  sArray (vlax-make-safearray
  21.      vlax-vbobject
  22.      (cons 0 (1- (length objlst)))
  23.          )
  24.   )          ;在数组 SArray 的元素中存储数据
  25.   (vlax-safearray-fill sArray objlst)
  26.   (vla-AddItems SSet sArray)  
  27.   SSet
  28. )

  29. ;;161.3 [功能] 将一个选择集转化为VLA选择集 By 裸奔的花猫
  30. (defun ss->vlass2 (ss / *DOC* I OBJLST SSET VLA)
  31.   (setq  *DOC*  (vla-get-activedocument (vlax-get-acad-object))
  32.   sset (vla-get-SelectionSets *DOC*)
  33.   )
  34.   ;;有选择集$Set,则先删除,或者(vla-Clear $Set)
  35.   (if (vl-catch-all-error-p
  36.   (vl-catch-all-apply 'vla-item (list sset "$Set"))
  37.       )
  38.     nil
  39.     (vla-delete (vla-item sset "$Set"))
  40.   )
  41.   (setq SSet (vla-add sset "$Set"))  ;新建一个VLA选择集
  42.   ;;得到VLA物体列表
  43.   (repeat (setq i (sslength ss))
  44.     (setq vla (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
  45.     (setq objlst (cons vla objlst))
  46.   )
  47.   (vlax-invoke SSet 'additems objlst)
  48.   SSet
  49. )



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-15 14:28:43 | 显示全部楼层
论坛上有把SS先变成ENT实体名表,然后再用MAPCAR等操作提高效率等帖子,你可以把那些实体名表变成VLA对象,然后保存起来。其实,对选择集的操作还是纯LISP方便些。

点评

感谢老大回复 Vla集合转成ss选择集或者列表容易 我仅是想了解vla集合多些,如何将选择集转成集合  详情 回复 发表于 2013-6-15 14:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-15 14:36:33 | 显示全部楼层
本帖最后由 wowan1314 于 2013-6-15 14:38 编辑

功能
    取得图形激活的选择集。
语法及参数
(vla-get-ActiveSelectionSet Object)
Object  Document
  这个属性适用的对象。
ActiveSelectionSet SelectionSet 对象;只读
  图形激活的的选择集


今天刚看了这个函数!  我想是不是可以 (sssetfirst nil ss)然后(vla-get-ActiveSelectionSet Object)。

点评

不只是对你这个,主要是对 (SSGET "P") 这个选择集。  详情 回复 发表于 2013-6-15 15:28
我试了(sssetfirst nil ss),好象不行呢  详情 回复 发表于 2013-6-15 14:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-15 14:37:54 | 显示全部楼层
是啦! 你直接COMMAND  删除     比转后转去的快!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-6-15 14:41:36 | 显示全部楼层
XDSoft 发表于 2013-6-15 14:28
论坛上有把SS先变成ENT实体名表,然后再用MAPCAR等操作提高效率等帖子,你可以把那些实体名表变成VLA对象, ...

感谢老大回复
Vla集合转成ss选择集或者列表容易
我仅是想了解vla集合多些,如何将选择集转成集合
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-6-15 14:51:19 | 显示全部楼层
wowan1314 发表于 2013-6-15 14:36
功能
    取得图形激活的选择集。
语法及参数

我试了(sssetfirst nil ss),好象不行呢

点评

怎么会不可以呢!? 我测试的还是可以的撒  详情 回复 发表于 2013-6-15 14:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-15 14:59:57 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-6-15 14:51
我试了(sssetfirst nil ss),好象不行呢

怎么会不可以呢!?

我测试的还是可以的撒
  1. (DEFUN c:T1 NIL
  2. (SETQ SS (SSGET))
  3. (sssetfirst nil ss)
  4. (SETQ NSS (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
  5. (vlax-map-Collection NSS 'vla-delete)
  6. )

点评

你这种情况,不用(sssetfirst nil ss)是一样的  发表于 2013-6-15 15:24
(DEFUN NSS (ss) (sssetfirst nil ss) (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)) ) ) ;;测试 (setq ss (ssget)) (setq ss1 (ssget)) (vlax-map-Collection  详情 回复 发表于 2013-6-15 15:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-6-15 15:23:13 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2013-6-15 15:27 编辑
wowan1314 发表于 2013-6-15 14:59
怎么会不可以呢!?

我测试的还是可以的撒


(DEFUN NSS (ss)
  (sssetfirst nil ss)
  (vla-get-activeselectionset
    (vla-get-activedocument (vlax-get-acad-object))
  )
)
;;测试
(setq ss (ssget))
(setq ss1 (ssget))
(vlax-map-Collection (NSS ss) 'vla-delete)
失败了!!!

点评

我是这样测试的。好像还可以呀?  详情 回复 发表于 2013-6-15 21:41
我按你的测试,怎么就可以呢?!  发表于 2013-6-15 17:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-6-15 15:28:54 | 显示全部楼层
wowan1314 发表于 2013-6-15 14:36
功能
    取得图形激活的选择集。
语法及参数

不只是对你这个,主要是对 (SSGET "P") 这个选择集。

点评

(sssetfirst nil ss)之后(ssget "p")得到的就是ss选择集呀?  详情 回复 发表于 2013-6-15 18:48
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-15 15:51:27 | 显示全部楼层
自宫你看这个行不

  1. ;;;将一个选择集转化为VLA选择集
  2. (defun ss->vlass (ss / doc sset i kj)
  3.   (setq doc (vla-get-activedocument (vlax-get-acad-object))
  4.         sset (vla-get-selectionsets doc)
  5.   )
  6.   (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list sset "$Set")))
  7.     (setq nset (vla-add sset "$Set"))  ; 新建一个vla选择集
  8.     (progn
  9.       (vla-delete (vla-item sset "$Set")) ; 否则先删后建
  10.       (setq nset (vla-add sset "$Set"))        ; 新建一个vla选择集
  11.     )                                       ; progn end
  12.   )                                       ; if end
  13.   (setq i 0
  14.         kj nil
  15.   )                                       ; 得到vla物体列表
  16.   (repeat (sslength ss)
  17.     (setq kj (cons (vlax-ename->vla-object (ssname ss i)) kj))
  18.     (setq i (1+ i))
  19.   )
  20.   (vlax-invoke nset 'additems (reverse kj))
  21.   nset
  22. )

点评

正是我需要的结果  详情 回复 发表于 2013-6-15 16:21

评分

参与人数 2D豆 +13 收起 理由
XDSoft + 10 很给力!经验;技术要点;资料分享奖!
/db_自贡黄明儒_ + 3 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-6-15 16:21:26 | 显示全部楼层

正是我需要的结果
  1. ;;将一个选择集转化为VLA选择集
  2. (defun ss->vlass (ss / DOC I KJ SSET NSET VLA)
  3.   (setq        doc  (vla-get-activedocument (vlax-get-acad-object))
  4.         sset (vla-get-selectionsets doc)
  5.   )
  6.   ;;有选择集$Set,则先删除,或者(vla-Clear $Set);清空$Set
  7.   (if (vl-catch-all-error-p
  8.         (vl-catch-all-apply 'vla-item (list sset "$Set"))
  9.       )
  10.     nil
  11.     (vla-delete (vla-item sset "$Set"))
  12.   )
  13.   (setq nset (vla-add sset "$Set"))                  ;新建一个VLA选择集  
  14.   ;;得到VLA物体列表
  15.   (repeat (setq i (sslength ss))
  16.     (setq vla (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
  17.     (setq kj (cons vla kj))
  18.   )
  19.   (vlax-invoke nset 'additems kj)
  20.   nset
  21. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-15 18:48:40 | 显示全部楼层
newer 发表于 2013-6-15 15:28
不只是对你这个,主要是对 (SSGET "P") 这个选择集。

(sssetfirst nil ss)之后(ssget "p")得到的就是ss选择集呀?

点评

是的,所以,准确的说VLA获得当前激活的选择集,对ALISP就是那个(SSGET "P"),(sssetfirst nil ss) 这个只是设置了P而已。设置P这个选择集还有很多别的方法,SSSETFIRST只是其中之一。  详情 回复 发表于 2013-6-15 19:12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-6-15 19:04:24 来自手机 | 显示全部楼层
activeselectionset有时会有bug使用前清理下就可以直接用vlax-for遍历了

点评

还请讲明,activeselectionset有何BUG? 清理下就可以了吗? 怎么清理的?  发表于 2013-6-15 21:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-6-15 19:12:21 | 显示全部楼层
wowan1314 发表于 2013-6-15 18:48
(sssetfirst nil ss)之后(ssget "p")得到的就是ss选择集呀?

是的,所以,准确的说VLA获得当前激活的选择集,对ALISP就是那个(SSGET "P"),(sssetfirst nil ss) 这个只是设置了P而已。设置P这个选择集还有很多别的方法,SSSETFIRST只是其中之一。

点评

像楼主这个要求! 就不可以用(sssetfirst nil ss)这种方式实现吗? 另外EA说activeselectionset有BUG是什么? 先清理下就可以了吗? 怎么清理? 我正在看VL函数。 还是有些不习惯! 所以问题多了点。 还请不  详情 回复 发表于 2013-6-15 20:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-15 20:49:56 | 显示全部楼层
newer 发表于 2013-6-15 19:12
是的,所以,准确的说VLA获得当前激活的选择集,对ALISP就是那个(SSGET "P"),(sssetfirst nil ss) 这个只 ...

像楼主这个要求! 就不可以用(sssetfirst nil ss)这种方式实现吗?

另外EA说activeselectionset有BUG是什么? 先清理下就可以了吗? 怎么清理?

我正在看VL函数。 还是有些不习惯! 所以问题多了点。 还请不吝赐教。

点评

关于 sssetfirst 的BUG问题,见“应用sssetfirst后,可能导致程序死循环”一例 http://bbs.mjtd.com/thread-101019-1-1.html  详情 回复 发表于 2013-6-16 08:30
是可以实现,我看到你第一次说这个地时候,感觉好像说只是SSSETFIRST这个才是那个激活的,所以跟进了下。你没错。  详情 回复 发表于 2013-6-15 21:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-17 06:43 , Processed in 0.328893 second(s), 70 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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