mccad 发表于 2014-2-28 15:41:04

选择集,实体,和符号表函数(二)选择集的处理

选择集的处理 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)
:$提供提示文字
.用户拾取方式
:?其他回调函数
AAll选择方式
BBox选择方式
CCrossing选择方式
CPCrossing Polygon 选择方式
:D可以重复,即可以重复选择一个实体,并都加入选择集中
:E在aperture中的所有实体
F栏选
G编组选择
I如果存在PICKFIRST选择集,则用这个集
:K关键字回调函数
L将最后一个实体添加进选择集
M多重选择方式
P选择上一个选择集
:S强制单个实体对象被选择
WWindow选择方式
WPWindow Polygon选择方式
X用于对整个图形数据库选择
接下来的两个参数用于指定与某些选择方式有关的可选择的点.当不实用它们时,应该取NULL值.如果第四个参数entmask不是NULL,则指向一个结果缓冲区表,用于存放用筛选选择方式的结果.最后的参数ss是选择集的识别名x.下列是调用acedSSGet()的一段例子,对于多边形选项"CP"和"WP"(不包括"F"),像函数acutBuildList()说明的那样,函数acedSSGet()自动封闭点的列表,所以我们不必建立一个终点与起点相同的表.ads_point pt1, pt2,pt3, pt4;pt1 = pt1 =pt1 = 0.0; pt2 = pt2 =5.0; pt2 = 0.0; // Get pt2 =pt2 = 5.0; pt2 = 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 = 10.0; pt3= 5.0; pt3 = 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 = 15.0; pt4= 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消息时,释放它所打开的选择集.本节包含的内容·      选择集过滤表·      选择集的管理·      选择集的变换


http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 mccad的微博
页: [1]
查看完整版本: 选择集,实体,和符号表函数(二)选择集的处理