一、本节课程
Arx二次开发“选择集”
二、本节要讲解的知识点
1、选择集的创建和删除。
2、选择集中对象的增加和删除。
3、对象选择的方法。
4、选择集过滤器的使用。
三、具体内容
1、选择集的创建和删除
选择集是AUTOCAD中当前图形中的一组实体,通过图元名进行引用,就是一个ads_name变量。创建选择集可以使用acedSSAdd、acedSSGet函数。
acedSSGet函数提供了绝大多数创建选择集的方法。
(1)提示用户选择实体
(2)使用PICKFIRST选择集(在未执行命令时用户已经选择的图形集合,也就是AUTOCAD中的先选择,再输入命令)或者交叉Crossing、多边形交叉polygon crossing、栅栏fence、最后一个last、前一个previous、窗口window、多边形窗口window polygon等方式,也可以指定一个点或者一系列点来明确的限定所要选择的实体。
(3)指定选择实体所要满足的一系列属性和条件来过滤当前数据库,可以和前面的选择方式配合使用。
在程序结束之前需要使用acedSSFree函数释放选择集的内存空间。
static void YunyouMyGroupCreateSSet()//1、选择集的创建:全部选择 { ads_name sset; acedSSGet(TEXT("A"),NULL,NULL,NULL,sset); long length; acedSSLength(sset,&length); acutPrintf(TEXT("\n实体数:%d"),length); acedSSFree(sset); } |
命令: CREATESSET
实体数:7
2、选择集中元素的增加和删除
AcedSSAdd、acedSSDel用户已经获得了对象引用的情况下,来添加或者删除选择集中的元素。
int acedSSAdd(
const ads_name ename, //将要添加到选择集中的实体的图元名
const ads_name sname, //指定选择集的图元名
ads_name result//返回了被创建的选择集或者是被更新的选择集
);
(1)ename sname 都是NULL ,创建了一个选择集 没有包含任何成员。
(2)ename 是一个有效实体,sname 是空指针,则创建了包含一个成员ename
的选择集。
(3)Ename和sname 都是有效的实体、选择集,那么返回的结果实际上就是在sname的基础上去扩充成员。
int acedSSDel(
const ads_name ename,
const ads_name ss
);
就是表示从选择集ss中删除ename实体。
3、对象选择的方法
int acedSSGet(
const ACHAR * str,
const void * pt1,
const void * pt2,
const struct resbuf * filter,
ads_name ss
);
其中str描述了创建选择集的方法,可以是用的参数值见下表,pt1,pt2为相关创建方式提供了点参数,如果不需要指定可以输入NULL作为参数值;filter用于指定创建选择集的过滤条件;ss则指定了要操作的选择集的图元名。
acedSSGet函数的选择模式选项
值(选择模式)str |
说明 |
NULL |
单点选择(如果指定了pt1),提示用户选择( pt1: NULL) |
# |
非几何选择(ALL\LAST\Previous) |
:$ |
仅提供提示 |
. |
用户选择模式 |
:? |
其他回调选择模式 |
A |
全部选择 |
B |
框选模式 |
C |
窗交模式 |
CP |
圈交模式 |
:D |
允许复制选择模式 |
:E |
小孔中的所有实体 |
F |
栏选模式 |
G |
选择编组 |
I |
获取当前图形中已经选择的实体(就是PICKFIRST) |
:K |
键盘回调选择模式 |
L |
选择最后一次创建的可见的实体 |
M |
指定多次选择而不高亮显示对象,从而加宽复杂对象的选择过程 |
P |
选择最近创建的选择集 |
:S |
单一对象选择模式 |
W |
窗口选择模式 |
WP |
圈围选择模式 |
X |
过滤选择模式 |
实例:我们使用了多种不同的模式来创建选择集。
static void YunyouMyGroupSelectEnt()//各种方式选择实体 { 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;
//如果已经选择了实体就获得当前的PICKFIRST选择集 //否则提示用户选择实体 acedSSGet(NULL,NULL,NULL,NULL,ssname);
//如果存在就获得当前的PICKFIRST选择集 acedSSGet(TEXT("I"),NULL,NULL,NULL,ssname);
//选择最近创建的选择集 acedSSGet(TEXT("P"),NULL,NULL,NULL,ssname);
//选择最后一次创建的可见实体 acedSSGet(TEXT("L"),NULL,NULL,NULL,ssname);
//选择通过点PT2的所有实体 acedSSGet(NULL,pt2,NULL,NULL,ssname);
//选择通过点PT1 和PT2的组成的窗体内的所有的实体 acedSSGet(TEXT("W"),pt1,pt2,NULL,ssname);
//选择被指定的多边形包围的所有实体 pt3[X]=10.0;pt3[Y]=5.0;pt3[Z]=0; pt4[X]=5.0;pt4[Y]=pt4[Z]=0; pointlist=acutBuildList(RTPOINT,pt1,RTPOINT,pt2,RTPOINT,pt3,RTPOINT,pt4,RTNONE); acedSSGet(TEXT("WP"),pointlist,NULL,NULL,ssname);
//由角点PT1 PT2组成的区域相交的所有实体 acedSSGet(TEXT("C'"),pt1,pt2,NULL,ssname);
//选择与指定多边形区域相交的所有实体 acedSSGet(TEXT("CP"),pointlist,NULL,NULL,ssname); acutRelRb(pointlist);
//选择与选择栏相交的所有对象 pt4[Y]=15.0;pt4[Z]=0; pointlist=acutBuildList(RTPOINT,pt1,RTPOINT,pt2,RTPOINT,pt3,RTPOINT,pt4,RTNONE); acedSSGet(TEXT("F"),pointlist,NULL,NULL,ssname);
acutRelRb(pointlist); acedSSFree(ssname);
} |
4、使用选择集过滤器
四、总结
1、int acedSSGet(
const ACHAR * str,
const void * pt1,
const void * pt2,
const struct resbuf * filter,
ads_name ss
);
2、acedSSGet函数的选择模式选项
3、int acedSSAdd(
const ads_name ename, //将要添加到选择集中的实体的图元名
const ads_name sname, //指定选择集的图元名
ads_name result//返回了被创建的选择集或者是被更新的选择集
);
int acedSSDel(
const ads_name ename,
const ads_name ss
);
4、选择集过滤器
5、每次使用完acedSSAdd acedSSFree我们都要记得使用acedSSFree函数来释放内存空间。