找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8418|回复: 2

[老徐讲堂] ObjectARX中使用选择集(一)

[复制链接]

已领礼包: 12个

财富等级: 恭喜发财

发表于 2014-2-26 11:13:48 | 显示全部楼层 |阅读模式

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

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

×
选择集,实体,和符号表函数
这一章节讲述的是对选择集、实体和符号表函数操作的全局函数.
本节中主要包含
·        选择集和实体名
·        选择集的处理
·        符号表的访问
选择集和实体名
许多 ObjectARX ®函数在处理选择集和实体时,都用名字来识别选择集或实体.该名字是用一个长整型对来表示的,并由AutoCAD来维护.在ObjectARX中,该名字的类型为 ads_name.
在对选择集或实体进行操作之前,ObjectARX应用程序必须通过调用一个能返回其名字的库函数来得到选择集或实体名.
注意
选择集和实体名是不稳定的,它们仅仅在AutoCAD当前图形工作时有效.如果从AutoCAD退出或切换到另一个图形时其值就会丢失.
d对于选择集来说,它也是与当前图形有关联的,所以其名字的不稳定性不会影响选择集.但是对于实体就不是这样了,因为它是被存放在图形数据库中的,名字的不稳定性要影响到对实体的操作.应用程序必须在下一次对同一图形文件中的同一实体进行操作时,可以使用实体句柄,重新过获取其实体名.请参见 实体句柄及其使用方法.
选择集的处理
ObjectARX 函数对选择集的处理类似于AutoLISP.acedSSGet()函数提供了大多数创建选择集的方法.它一般通过以下三种方法之一创建选择集:
·        提示让用户选择对象.
·        像交互式应用AutoCAD一样,利用PICKFIRST定义,窗交,窗选,栏选,单选或者窗口内选择等匹配条件的方式来选择实体对象,也可以通过指定一个单点或Fence点来选择.
·        使用一系列属性和选定条件筛选当前图形数据库来选择实体对象,我们可以使用前面提到的任何匹配条件.
int
acedSSGet (
    constchar *str,
    constvoid *pt1,
    constvoid *pt2,
    conststruct resbuf *entmask,
    ads_namess);
acedSSGet() 的第一个参数str,说明所使用的选择条件,参见下表.
    
acedSSGet 函数的选择条件
      
  
  
    
选择集条件参数
      
定义
  
    
NULL
      
单点选择 (如果指定了pt1)
  
或用户选择 (如果pt1为NULL)
  
    
#
      
非几何选择 (all, last,  previous)
  
    
:$
      
提供提示文字
  
    
.
      
用户拾取方式
  
    
:?
      
其他回调函数
  
    
A
      
All选择方式
  
    
B
      
Box选择方式
  
    
C
      
Crossing选择方式
  
    
CP
      
Crossing Polygon 选择方式
  
    
:D
      
可以重复,即可以重复选择一个实体,并都加入选择集中
  
    
:E
      
在aperture中的所有实体
  
    
F
      
栏选
  
    
G
      
编组选择
  
    
I
      
如果存在PICKFIRST选择集,则用这个集
  
    
:K
      
关键字回调函数
  
    
L
      
将最后一个实体添加进选择集
  
    
M
      
多重选择方式
  
    
P
      
选择上一个选择集
  
    
:S
      
强制单个实体对象被选择
  
    
W
      
Window选择方式
  
    
WP
      
Window Polygon选择方式
  
    
X
      
用于对整个图形数据库选择
  
接下来的两个参数用于指定与某些选择方式有关的可选择的点.当不实用它们时,应该取NULL值.如果第四个参数entmask不是NULL,则指向一个结果缓冲区表,用于存放用筛选选择方式的结果.最后的参数ss是选择集的识别名
x.
下列是调用acedSSGet()的一段例子,对于多边形选项"CP"和"WP"(不包括"F"),像函数acutBuildList()说明的那样,函数acedSSGet()自动封闭点的列表,所以我们不必建立一个终点与起点相同的表.
ads_point pt1, pt2,pt3, pt4;  
pt1[X] = pt1[Y] =pt1[Z] = 0.0;
pt2[X] = pt2[Y] =5.0; pt2[Z] = 0.0;
// Get pt2[X] =pt2[Y] = 5.0; pt2[Z] = 0.0;
// 如果存在,获取当前PICKFIRST选择集,没有则提示用户选择一个;
acedSSGet(NULL, NULL,NULL, NULL, ssname);
// 如果存在,获取当前PICKFIRST选择集.
acedSSGet("I",NULL, NULL, NULL, ssname);
// 选择最近使用过的对象.
acedSSGet("P",NULL, NULL, NULL, ssname);
// 选择最后加入到数据库中的对象.
acedSSGet("L",NULL, NULL, NULL, ssname);
// 选择通过点 (5,5)的实体.
acedSSGet(NULL, pt2,NULL, NULL, ssname);
// 选择在从点 (0,0) 到(5,5)的窗口中的实体.
acedSSGet("W",pt1, pt2, NULL, ssname);
// 选择指定多边形包围的实体.
pt3[X] = 10.0; pt3[Y]= 5.0; pt3[Z] = 0.0; tlist = acutBuildList(RTPOINT, pt1, RTPOINT, pt2,
        RTPOINT, pt3, RTPOINT, pt4, 0);
acedSSGet("WP",pointlist, NULL, NULL, ssnameacedSSGet("WP", pointlist, NULL, NULL,ssname);
// 选择从点(0,0) 到(5,5)的窗口内交的实体.
acedSSGet("C",pt1, pt2, NULL, ssname);
// 选择指定多边形内交的实体.
acedSSGet("CP",pointlist, NULL, NULL, ssname); tiacutRelRb(pointlist);
// 选择与指定的栅栏交叉的实体.
pt4[Y] = 15.0; pt4[Z]= 0.0; OINT, pt2,
        RTPOINT, pt3, RTPOINT, pt4, 0);
acedSSGet("F",pointlist, NULL, NULL, ssname);
acutRelRb(pointlist);
<="" acutrelrb(pointlist);="">
</prex<>
对acedSSGet() 的补充函数是 acedSSFree(),它能在应用程序用完选择集后释放选择集.选择集是按名称来被使用的.对上面程序中定义的 ads_name,在这里这样使用:
acedSSFree(ssname);
注意 AutoCAD 不能同时打开多于128个选择集,这包括运行中的ObjectARX和AutoLISP应用程序所打开的选择集的总和.该限制在不同的系统中可能有所不同.如果这一限制被突破.AutoCAD会拒绝创建更多的选择集.我们不推荐同时管理的大量选择集.相反,应该在任何时刻仅仅打开并保持适当的最小数量的选择集.并且在不用选择集时应尽快的用acedSSFree()释放.与AutoLISP不一样,ObjectARX环境不能对使用过的选择集所形成的那些零碎的无用的信息单元进行自动收集,以释放这些选择集.应用程序应该记着在收到kUnloadDwgMsg、kEndMsg或kQuitMsg消息时,释放它所打开的选择集.
本节包含的内容
·        选择集过滤表
·        选择集的管理
·        选择集的变换

选择集的用法(一).doc

66.5 KB, 下载次数: 168, 下载积分: D豆 -1 , 活跃度 1

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

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2014-2-26 11:14:54 | 显示全部楼层
详细的参见附件的Word文档
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 14:33 , Processed in 0.628701 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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