找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 453|回复: 4

[教学] Autocad 中的选集

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-8-3 16:44:00 | 显示全部楼层 |阅读模式

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

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

×
AutoCAD 可以保存的选择集总数是 256 个,其中一个是当前选择集,也就是 (ssget "P")  或者 (cdr (ssgetfirst)) 当前夹取状态的选择集,那么用户命名保存的选择集不可以超过255个。下面做个简单测试

  1. (setq i 1)
  2. (repeat 257
  3.    (set (read (strcat "ss" (itoa i))) (ssget "x"))
  4. )

执行后出现
; 错误: 超出选择集数量的最大范围
清理选集变量

  1. (setq i 0)
  2. (repeat 257 (set (read (strcat "ss" (itoa i))) nil) (setq i (1+ i)))

把循环改成 0 - 255 就 ok,当然程序中尽量不要这样使用不同变量保存选择集,autolisp 中 (setq ss nil) 就是释放选集。同一个变量指向的选集实际就是使用了自动管理的 P 选择集。


再说说ActiveX中的选集,选集是存在于文档中的,以当前文档(Activedocument),选集集合对象是 selectionsets

  1. (setq ssobjs (vla-get-selectionsets curdoc))

增加选集用 Add 方法
  1. (setq mysets (vla-add ssobjs "mysets"))

这时选集内对象数量(count) 为0,即空选集 (sslength = 0),使用  select selectatpoint selectbypolygon selectonscreen 方法往选集内增加索引

待续.....

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

已领礼包: 769个

财富等级: 财运亨通

发表于 2017-8-3 18:08:29 | 显示全部楼层
谢谢大师分享,持续关注...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2107个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-8-3 18:40:06 | 显示全部楼层
VLA 增加选集的方法

  1. (vl-load-com)
  2. (defun c:Example_Select()
  3.     ;; This example adds members to a selection set, first by crossing and
  4.     ;; then by filtering for circles.
  5.     (setq acadObj (vlax-get-acad-object))
  6.     (setq doc (vla-get-ActiveDocument acadObj))

  7.     ;; Create the selection set
  8.     (setq ssetObj (vla-Add (vla-get-SelectionSets doc) "SSET"))
  9.    
  10.     ;; Add all object to the selection set that lie within a crossing of (28,17,0) and
  11.     ;; (-3.3, -3.6,0)
  12.     (setq mode acSelectionSetCrossing
  13.           corner1 (vlax-3d-point 28 17 0)
  14.           corner2 (vlax-3d-point -3.3 -3.6 0))

  15.     (vla-Select ssetObj mode corner1 corner2)
  16.     (alert (strcat "Objects selected: " (itoa (vla-get-Count ssetObj))))
  17.     (vla-Clear ssetObj)
  18.   
  19.     ;; Add all the Circles to the selection set that lie within the crossing of (28,17,0) and
  20.     ;; (-3.3, -3.6,0) by filtering from the current drawing
  21.     (setq gpCode (vlax-make-safearray vlax-vbInteger '(0 . 0)))
  22.     (vlax-safearray-put-element gpCode 0 0)
  23.     (setq dataValue (vlax-make-safearray vlax-vbVariant '(0 . 0)))
  24.     (vlax-safearray-put-element dataValue 0 "Circle")
  25.    
  26.     (vla-Select ssetObj mode corner1 corner2 gpCode dataValue)
  27.     (alert (strcat "Objects selected: " (itoa (vla-get-Count ssetObj))))

  28.     (vla-Delete ssetObj)
  29. )


vla 选集的三个方法 clear erase delete 的区别

1 Clear 把选集中的索引对应的对象清除,选集对象保留,count 不变,Selectionsets 中仍保留 选集
2 Erase 选集对象的索引删除,选集对象保留,此时 count = 0,Selectionsets 中仍保留 选集
3 Delete 选集对象从Selectionsets 中删除,索引清除

Selectionsets 中的 CURRENT

在 ACAD 中只要进行了选择(ssget、select 、VBA、vla方法),ACAD 后台自动更新 CURRENT 选集内的索引,该选集在 VBA 中总可以正确遍历,但在 VLA 方法时存在一个 BUG,这个 BUG 只要清理一次,以后都可以正确使用。

一般autolisp中使用 ssget 构造选集比 vla 的选择更方便,但是如果对实体使用 vla 操作一般有两种方法
1 vlax-ename->vla-object 转化

  1. (if (setq ss (ssget))
  2. (progn
  3.   (setq i 0)
  4.   (while (setq e (ssname ss i))
  5.     (setq obj (vlax-ename->vla-object e))
  6.     ....
  7.     (setq i (1+ i))
  8.   )
  9. )
  10. )

2 使用 activeselectionset 即 CURRENT 选集

  1. (if (ssget)
  2.   (vlax-for obj (vla-get-activeselectionset curdoc)
  3.       ....
  4.   )
  5. )
复制代码



其中清理方法 见论坛以前帖子 clearcset


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

使用道具 举报

已领礼包: 2107个

财富等级: 金玉满堂

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 16:08 , Processed in 0.171333 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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