- 积分
- 23696
- 明经币
- 个
- 注册时间
- 2003-7-8
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
大多数ObjectARX函数在处理选择集和实体时,都用名字来识别选择集或实体,该名字用一个长整型对来表示的,并对AutoCAD来维护。在ObjectARX中,该名字的类型为ads_name。
在对选择集或实体进行操作之前,ObjectARX应用程序必须通过调用一个返回其名字的库函数来得到选择集或实体名字。
注意:选择集和实体的名字是不稳定的,它们仅仅在AutoCAD当前图形工作时有效。如果从AutoCAD退出或切换到另一个图形时其值就会丢失。
对于选择集来说,它也是与当前图有关联的,所以其名字的不稳定性不会影响选择集。但是对于实体就不一样了,因为它是被存放在图形数据库中的,名字的不稳定性要影响到对实体的操作。应用程序必须在下一次对同一图文件中的同一实体进行操作,可以使用实体句柄,重新获取其实体名。
选择集的处理
ObjectARX函数对选择集的处理类似于AutoLISP。acedSSGet()函数提供大多数创建选择集方法。它一般通过以下三种方法之一创建选择集:
(1)、提供让用户选择对象。
(2)、象交互式应用AutoCAD一样,利用RICKFIRST定义、Crossing、Crossing Polygon、Fence、Last、Previous、Window、Window Polygon等匹配条件的方式来选择实体对象,也可以通过指定一个单独点或Fence点来选择。
(3)、使用一系列属性和条件筛选当前图数据库来选择实体对象。
该函数原型为:
int acedSSGet(const chat *str,const void *pt1,const void *pt2,const struct resbuf *entmask,ads_name ss);
acedSSGet()的第一个参数str,说明所使用的选择条件,如下:
表示码 意义
NULL 单点选择(如果指定了pt1)或用户选择(如果pt1也为NULL)
# 非几何选择(all、last、previous)
:$ 提供提示文字
. 用户拾取方式
:? 其他回调函数
A All选择方式
B Box选择方式
C Crossing选择方式
CP Crossing Polygon选择方式
:D 可以重复,即可以重复选择一个实体,并加入选择集中
:E 在aperture中的所有实体
F Fence选择方式
G Groups选择
I 如果存在RICKFIRST集、则用该集
:K 关键字回调函数
L Last选择方式
M 多重选择方式
P Previous选择方式
:S 强制单个实体对象被选择
W Window选择方式
WP Window Polygon选择方式
X 用于筛选程序搜索整个图形数据库
紧跟着的两个参数用于指定与某些选择方式有关的可选择的点。当不使用他们时,应该取NULL值。如果第四个参数entmask不是NULL,则它指向一个缓冲区表,用于存放用筛选选择方式的结果。第五个参数ss是选择集的识别名字。
下列是调用acedSSGet()的例子:
ads_point pt1,pt2,pt3,pt4;
struct resbuf *pointlist;
ads_name ssname;
pt1[x]=pt1[y]=pt1[z]=0.0;
pt2[x]=pt2[y]=5.0;pt2[z]=0.0;
//如果有的话,获取当前RICKFIRST选择集,没有则提供用户选择一个
acedSSGet(NULL,NULL,NULL,NULL,ssname);
//如果有的话,获取当前RICKFIRST选择集
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;
pt4[x]=5.0;pt4[y]=pt4[z]=0.0;
pointlist=acutBuildlist(RTPOINT,pt1, RTPOINT,pt2, RTPOINT,pt3, RTPOINT,pt4,0);
acedSSGet(“WP”,pointlist,NULL,NULL,ssname);
//选择选择从点(0,0)到点(5,5)的窗口内交叉的实体
acedSSGet(“C”,pointlist,NULL,NULL,ssname);
acutRelRb(pointlist);
//选择与指定栅栏交叉的实体
pt4[y]=15.0;pt4[z]=0.0;
pointlist=acutBuildlist(RTPOINT,pt1, RTPOINT,pt2, RTPOINT,pt3, RTPOINT,pt4,0);
acedSSGet(“F”,pointlist,NULL,NULL,ssname);
acutRelRb(pointlist);
对acedSSGet()的补充函数是acedSSFree(),它能在应用程序用完选择集后释放选择集。选择集是按名字来被使用的。对上面程序段中定义的ads_name,在这里使用为:
acedSSFree(ssname);
注意:AutoCAD不能同时打开多于128个选择集,包括运行中的ObjectARX和AutoLISP应用程序打开选择集的总和。在不同的系统有可能有所不同。如果超过上限,AutoCAD拒绝创建选择集。因此在不用选择集时,应尽快用acedSSFree()释放。
下一贴是《选择集筛选》 |
评分
-
查看全部评分
|