2019独角兽企业重金招聘Python工程师标准>>>
acedEntSel 函数只能选择一个实体,有时候不能满足用户的需求,而选择集允许用户同时选择多个图形对象,也提供了丰富的手段用来选择符合特定条件的实体。
头文件
(1)创建选择集
acedSSGet 函数的定义形式为:
int acedSSGet (const char *str,const void *pt1,const void *pt2,const struct resbuf *entmask,ads_name ss);
第一个参数:str:创建选择集的方法; 第二个参数:pt1:第三个参数:pt2:为相关的创建方式提供了点参数,如果不需要指定可以输入 NULL 作为参数值;第四个参数:entmask:选择实体的过滤条件;第五个参数:ss:选择集的图元名。
头文件:
具体用法如例:
//图形中所有的圆
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:数据类型码
联合体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);