Arx二次开发“选择集”

一、本节课程
Arx二次开发“选择集”

二、本节要讲解的知识点

1、选择集的创建和删除

2、选择集中对象的增加和删除。

3、对象选择的方法。

4、选择集过滤器的使用。

三、具体内容

1、选择集的创建和删除

选择集是AUTOCAD中当前图形中的一组实体,通过图元名进行引用,就是一个ads_name变量。创建选择集可以使用acedSSAddacedSSGet函数。

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、选择集中元素的增加和删除

AcedSSAddacedSSDel用户已经获得了对象引用的情况下,来添加或者删除选择集中的元素。

int acedSSAdd(

    const ads_name ename, //将要添加到选择集中的实体的图元名

    const ads_name sname, //指定选择集的图元名

    ads_name result//返回了被创建的选择集或者是被更新的选择集

);

(1)ename sname 都是NULL ,创建了一个选择集 没有包含任何成员。

(2)ename 是一个有效实体,sname 是空指针,则创建了包含一个成员ename

的选择集。

(3)Enamesname 都是有效的实体、选择集,那么返回的结果实际上就是在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、使用选择集过滤器

四、总结

1int acedSSGet(

    const ACHAR * str,

    const void * pt1,

    const void * pt2,

    const struct resbuf * filter,

    ads_name ss

);

2acedSSGet函数的选择模式选项

3int 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函数来释放内存空间。

 

猜你喜欢

转载自blog.csdn.net/yunyouxy/article/details/81036234