ObjectARX_选择集

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);
相关文章
相关标签/搜索