|
acedSSGet函数用法详解
更新时间:2020-06-05 08:28:48
大多数objectarx函数在处理选择集和实体时,都用名字来识别选择集或实体,该名字用一个长整型对来表示的,并对autocad来维护。在objectarx中,该名字的类型为ads_name。
在对选择集或实体进行操作之前,objectarx应用程序必须通过调用一个返回其名字的库函数来得到选择集或实体名字。
注意:选择集和实体的名字是不稳定的,它们仅仅在autocad当前图形工作时有效。如果从autocad退出或切换到另一个图形时其值就会丢失。
对于选择集来说,它也是与当前图有关联的,所以其名字的不稳定性不会影响选择集。但是对于实体就不一样了,因为它是被存放在图形其他数据库 中的,名字的不稳定性要影响到对实体的操作。应用程序必须在下一次对同一图文件中的同一实体进行操作,可以使用实体句柄,重新获取其实体名。
选择集的处理
objectarx函数对选择集的处理类似于autolisp。acedssget()函数提供大多数创建选择集方法。它一般通过以下三种方法之一创建选择集:
(1)、提供让用户选择对象。
(2)、象交互式应用autocad一样,利用rickfirst定义、crossing、crossing polygon、fence、last、previous、window、window polygon等匹配条件的方式来选择实体对象,也可以通过指定一个单独点或fence点来选择。
(3)、使用一系列属性和条件筛选当前图其他数据库 来选择实体对象。
该函数原型为:
int acedssget(const chat *str,const void *pt1,const void *pt2,const struct resbuf *entmask,ads_name ss);
acedssget()的第一个参数str,说明所使用的选择条件,如下:
表示码 意义
null 单点选择(如果指定了pt1)或用户选择(如果pt1也为null)
# 非几何选择(all、last、previous)
:$ 提供提示文字
. 用户拾取方式
:? 其他回调函数
a all选择方式
b box选择方式
c crossing选择方式
cp crossing polygon选择方式
:d 可以重复,即可以重复选择一个实体,并加入选择集中
:e 在aperture中的所有实体
f fence选择方式
g groups选择
i 如果存在rickfirst集、则用该集
:k 关键字回调函数
l last选择方式
m 多重选择方式
p previous选择方式
:s 强制单个实体对象被选择
w window选择方式
wp window polygon选择方式
x 用于筛选程序搜索整个图形其他数据库
紧跟着的两个参数用于指定与某些选择方式有关的可选择的点。当不使用他们时,应该取null值。如果第四个参数entmask不是null,则它指向一个缓冲区表,用于存放用筛选选择方式的结果。
此文来自: 马开东博客 转载请注明出处 网址:
第五个参数ss是选择集的识别名字。
下列是调用acedssget()的例子:
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;
//如果有的话,获取当前rickfirst选择集,没有则提供用户选择一个
acedssget(null,null,null,null,ssname);
//如果有的话,获取当前rickfirst选择集
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”,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);
对acedssget()的补充函数是acedssfree(),它能在应用程序用完选择集后释放选择集。选择集是按名字来被使用的。对上面程序段中定义的ads_name,在这里使用为:
acedssfree(ssname);
注意:autocad不能同时打开多于128个选择集,包括运行中的objectarx和autolisp应用程序打开选择集的总和。在不同的系统有可能有所不同。如果超过上限,autocad拒绝创建选择集。因此在不用选择集时,应尽快用acedssfree()释放。
选择集筛选表
当acedssget()函数的entmask参数明确记录了实体的范围值列表时,acedssget()扫描被选择的实体,同时建立一个包含主实体名的选择集,这些实体与筛选条件相匹配。比如,使用这种方法,用户可以得到一个给定的选择集,这个选择集包括给定的层、类型、颜色的所有实体。
筛选表可以与任何的选择项联合使用。如果用“x”选择方式,意味着建立一个仅使用筛选表的选择集。在autocad以前的版本中,如果用“x”选项,acedssget()将扫描全部图形其他数据库 。
注意:要是仅仅筛选表指定为“x”,而参数entmask是nulll,则acedssget()选择所有在其他数据库 中的实体。
参数entmask必须是一个结果缓冲区表。每一个缓冲区指定一个检查参数和匹配的值;缓冲区的rest ype段是一个dxf组码,它指定要查询的参数的种类,而缓冲区的rest ype域指定要匹配的值。下面是相应的例子:
struct resbuf eb1,eb2,eb3;
char sbuf1[10],sbuf2[10];
ads_name ssname1,ssname2;
eb1.rest ype=0; //实体名
strcpy(sbuf1,”circle”);
eb1.resval.rest ring=sbuf1;
eb1.rbnext=null; //无其他内容
//检索所有圆
acedssget(“x”,null,null,&eb1,ssname1);
eb2.rest ype=8;//层名
strcpy(sbuf2,”floor3”);
eb2.resval.rstring=sbuf2;
eb2.rbnext=null;
//检索在图层floor3上的所有实体
acedssget(“x”,null,null,&eb2,ssname2);
注意: 在每个缓冲区中指定的resval必须属于合适的类型,比如:名字类型是字符串(resval.rstring);标高和厚度是双精度浮点型(resval.rreal);颜色、属性和标志值是短整型(resval.rint);拉伸向量是三维的点(resval.rpoint),等等。
如果entmask指定了多个参数,那么只有匹配所有指定条件的实体才能被包含
此文来自: 马开东博客 转载请注明出处 网址:
在选择集里。就象下面的例子:
eb2.rest ype=62;//实体颜色
eb3.resval.rint=1;//红色
eb3.rbnext=null;
eb1.rbnext=&eb2;//增加另外两个条件
eb2.rbnext=&eb3;//建立链表
//检索在图层floor3层上所有红色的圆
acedssget(“x”,null,null,&eb1,ssname1);
除非表中包括关系和条件操作符,否则实体的所有域都要被测试。
如果在其他数据库 中没有实体与指定的筛选条件匹配,函数acedssget()将返回rterror。
前面关于acedssget()的例子用的是“x”选项,它扫描整个图形其他数据库 ;如果筛选表与其他选项(如用户选择、窗口选择等)联合使用,筛选条件只能在被选中的实体上起作用。请看下面的一组例子:
筛选用户选择的实体: |
|