acedEntSel 函数只能选择一个实体,有时候不能知足用户的需求,而选择集容许用户同时选择多个图形对象,也提供了丰富的手段用来选择符合特定条件的实体。数组
头文件<acedads.h>缓存
(1)建立选择集函数
acedSSGet 函数的定义形式为:ui
int acedSSGet (const char *str,const void *pt1,const void *pt2,const struct resbuf *entmask,ads_name ss);
第一个参数:str:建立选择集的方法; 第二个参数:pt1:第三个参数:pt2:为相关的建立方式提供了点参数,若是不须要指定能够输入 NULL 做为参数值;第四个参数:entmask:选择实体的过滤条件;第五个参数:ss:选择集的图元名。指针
头文件:<acedads.h>rest
具体用法如例:code
//图形中全部的圆 struct resbuf rb; char sbuf[10]; // 存储字符串的缓冲区 ads_name ssname; rb.restype = 0; // 实体名 strcpy(sbuf, "CIRCLE"); rb.resval.rstring = sbuf; rb.rbnext = NULL; // 不须要设置其余的属性 acedSSGet("X", NULL, NULL, &rb, ssname); acedSSFree(ssname); // 选择0图层上的全部直线 struct resbuf *rb; // 结果缓冲区链表 ads_name ssname; rb = acutBuildList(RTDXF0, "LINE", 8, "0",RTNONE); acedSSGet("X", NULL, NULL, rb, ssname); acutRelRb(rb);//释放结果缓存区链表 acedSSFree(ssname);
结果缓冲区resbuf:对象
struct resbuf { struct resbuf * rbnext;//链表指针 short restype;//数据类型码或XDF组码 union ads_u_val resval;数据 };
第二个参数:restype:数据类型码blog
联合体ads_u_val:字符串
union ads_u_val { ads_real rreal; ads_real rpoint[3]; short rint; ACHAR * rstring; __int64 rlname[2]; __int64 mnLongPtr; long rlong; __int64 mnInt64; struct ads_binary rbinary; unsigned char ihandle[8]; };
acutBuildList(建立结果缓存区链表)的参数成对组成,第一个参数标识过滤器的类型(例如对象) ,第二个参数指定要过滤的值(例如圆) 。(0:对象类型(字符串) ,例如“Line” 、 “Arc”等(在标准的 DXF 组码中,0 用于表示实体类型,可是在 acutBuildList 函数中 0 也能够用于表示结束链表,所以用 RTDXF0 来代替 0。)。1:图元的主文字值(字符串) ,例如文字、属性的字符串内容。2:对象名(字符串) ,例如属性标记、块名等。8:图层名 。10:主要点(直线或文字图元的起点、圆的圆心等) ,用三个实数的数组来表示三维点。60:对象可见性(整数) ,0 表示可见,1 表示不可见。62: 颜色编号 (整数) , 可取 0~256 的整数值, 其中 0 表示 ByBlock, 256 表示 ByLayer。67:模型/图纸空间标识符(整数) ,0(默认)表示在模型空间,1 表示在图纸空间。1000:扩展数据中的 ASCII 字符串,最多能够包含 255 个字节。1001:扩展数据的注册应用程序名,最多能够包含 31 个字节的 ASCII 字符串。1003:扩展数据图层名。)
选择集的具体用法:
void ZffCHAP5SelectEnt() { 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; // 若是已经选择到了实体,就得到当前的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; 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", pt1, pt2, NULL, ssname); // 选择与指定多边形区域相交的全部实体 acedSSGet("CP", 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); acedSSFree(ssname); }
(2)添加到已经存在的选择集
acedSSAdd 函数的定义形式为:
int acedSSAdd(const ads_name ename, const ads_name sname, ads_name result);
第一个参数:ename:要添加到选择集的实体的图元名;第二个参数:sname:选择集的图元名;第三个参数:result:被建立或者更新的选择集。(1.若是 ename 和 sname 都是空指针,则建立一个未包含任何成员的选择集。2.若是 ename 指向一个有效的实体,但 sname 是空指针,则建立一个选择集,该选择集仅包含一个成员 ename。3.若是 ename 指向有效的实体,且 sname 指向有效的选择集,则将 ename 所指向的实体添加到 sname 所指向的选择集中。)
(3)删除选择集
acedSSDel 函数的定义形式为:
int acedSSDel(const ads_name ename, const ads_name ss);
第一个参数:ename:要从选择集中删除的实体;第二个参数:所操做的选择集。
(4)获取选择集中实体个数
acedSSLength函数的定义形式为:
int acedSSLength(const ads_name sname, long * len);
第一个参数:sname:选择集的图元名,第二个参数:len:选择集中含有的实体个数.
(5)获取选择集特定位置的实体
acedSSName函数的定义形式为:
int acedSSName(const ads_name ss, long i, ads_name entres);
第一个参数:ss:选择集的图元名,第二个参数:i:实体在选择集中的位置,第三个参数:entres:实体名
具体用法如例:
ads_name ssname; ads_name ent; long len = 0; //获取选择集 acedSSGet(NULL,NULL,NULL,NULL,ssname); //获取选择集的长度 if(RTNORM == acedSSLength(ssname,&len)) { //遍历选择集 for(int i = 0; i < len; i++) { //获取实体名 acedSSName(ssname,i,ent); //其余处理ent函数 } } //释放选择集 acedSSFree(ssname);