大多数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()的例子:

  1. ads_point pt1,pt2,pt3,pt4;
  2. struct resbuf *pointlist;
  3. ads_name ssname;
  4. pt1[x]=pt1[y]=pt1[z]=0.0;
  5. pt2[x]=pt2[y]=5.0;pt2[z]=0.0;
  6. //如果有的话,获取当前RICKFIRST选择集,没有则提供用户选择一个
  7. acedSSGet(NULL,NULL,NULL,NULL,ssname);
  8. //如果有的话,获取当前RICKFIRST选择集
  9. acedSSGet(“I”,NULL,NULL,NULL,ssname);
  10. //使用最近使用过的选择集
  11. acedSSGet(“P”,NULL,NULL,NULL,ssname);
  12. //选择最后加入到数据库中的对象
  13. acedSSGet(“L”,NULL,NULL,NULL,ssname);
  14. //选择通过点(5,5)的实体
  15. acedSSGet(NULL,pt2,NULL,NULL,ssname);
  16. //选择从点(0,0)到点(5,5)的窗口中的实体
  17. acedSSGet(“W”,pt1,pt2,NULL,ssname);
  18. //选择指定多边形包围的实体
  19. pt3[x]=10.0;pt3[y]=5.0;pt3[z]=0.0;
  20. pt4[x]=5.0;pt4[y]=pt4[z]=0.0;
  21. pointlist=acutBuildlist(RTPOINT,pt1, RTPOINT,pt2, RTPOINT,pt3, RTPOINT,pt4,0);
  22. acedSSGet(“WP”,pointlist,NULL,NULL,ssname);
  23. //选择选择从点(0,0)到点(5,5)的窗口内交叉的实体
  24. acedSSGet(“C”,pointlist,NULL,NULL,ssname);
  25. acutRelRb(pointlist);
  26. //选择与指定栅栏交叉的实体
  27. pt4[y]=15.0;pt4[z]=0.0;
  28. pointlist=acutBuildlist(RTPOINT,pt1, RTPOINT,pt2, RTPOINT,pt3, RTPOINT,pt4,0);
  29. acedSSGet(“F”,pointlist,NULL,NULL,ssname);
  30. 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必须是一个结果缓冲区表。每一个缓冲区指定一个检查参数和匹配的值;缓冲区的restype段是一个DXF组码,它指定要查询的参数的种类,而缓冲区的restype域指定要匹配的值。下面是相应的例子:

  1. struct resbuf eb1,eb2,eb3;
  2. char sbuf1[10],sbuf2[10];
  3. ads_name ssname1,ssname2;
  4. eb1.restype=0; //实体名
  5. strcpy(sbuf1,”CIRCLE”);
  6. eb1.resval.restring=sbuf1;
  7. eb1.rbnext=NULL; //无其他内容
  8. //检索所有圆
  9. acedSSGet(“X”,NULL,NULL,&eb1,ssname1);
  10. eb2.restype=8;//层名
  11. strcpy(sbuf2,”FLOOR3”);
  12. eb2.resval.rstring=sbuf2;
  13. eb2.rbnext=NULL;
  14. //检索在图层FLOOR3上的所有实体
  15. acedSSGet(“X”,NULL,NULL,&eb2,ssname2);

注意: 在每个缓冲区中指定的resval必须属于合适的类型,比如:名字类型是字符串(resval.rstring);标高和厚度是双精度浮点型(resval.rreal);颜色、属性和标志值是短整型(resval.rint);拉伸向量是三维的点(resval.rpoint),等等。
如果entmask指定了多个参数,那么只有匹配所有指定条件的实体才能被包含在选择集里。就象下面的例子:

  1. eb2.restype=62;//实体颜色
  2. eb3.resval.rint=1;//红色
  3. eb3.rbnext=NULL;
  4. eb1.rbnext=&eb2;//增加另外两个条件
  5. eb2.rbnext=&eb3;//建立链表
  6. //检索在图层FLOOR3层上所有红色的圆
  7. acedSSGet(“X”,NULL,NULL,&eb1,ssname1);

除非表中包括关系和条件操作符,否则实体的所有域都要被测试。
如果在数据库中没有实体与指定的筛选条件匹配,函数acedSSGet()将返回RTERROR。
前面关于acedSSGet()的例子用的是“X”选项,它扫描整个图形数据库;如果筛选表与其他选项(如用户选择、窗口选择等)联合使用,筛选条件只能在被选中的实体上起作用。请看下面的一组例子:
筛选用户选择的实体:

  1. eb1.restype=0;//实体类型组
  2. strcpy(sbuf1,”TEXT”);
  3. eb1.resval.rstring=sbuf1;//类型为TEXE
  4. eb1.rbnext=NULL;
  5. //让用户生成选择集,但该选择集中只能有TEXT实体
  6. acedSSGet(NULL,NULL,NULL,&eb1,ssname1);

筛选前一个选择集:

  1. eb1.restype=0;//实体类型组
  2. strcpy(sbuf1,”LINE”);
  3. eb1.resval.rsting=sbuf1;//类型为LINE.
  4. Eb1.rbnext=NULL;
  5. //选择在上一个选择集中符合条件的实体
  6. acedSSGet(“P”,NULL,NULL,&eb1,ssname1);

在选择窗口内筛选实体:

  1. eb1.restype=8;//层
  2. strcpy(sbuf1,”FLOOR8”);
  3. eb1.resval.rstring=sbuf1;//层名
  4. eb1.rbnext=NULL;
  5. //选择在窗口内并在FLOOR8层上的实体
  6. acedSSGet("W", pt1, pt2, &eb1, ssname1);

注意:某些组码在不同的实体里有不同的含义,并且不是所有的组码都存在于所有的实体内。如果在筛选程序中指定一个特定的组码,不包含该组码的实体将被排除在acedSSGet()所返回的选择集之外。

筛选表中的通配符
筛选表中指定的符号可以包括通配符。由函数acedSSGet()织别的通配符与函数acutWcMatch()织别的通配符完全一样。
例如,下面的程序代码可以检索一个名为K2的匿名块:

  1. eb2.restype=2;//块名
  2. strcpy(sbuf1,”*K2”);
  3. eb2.resval.rstring=sbuf1;//匿名块名
  4. eb2.rbnext=NULL;
  5. //选择匿名块*K2的块插入引用
  6. acedSSGet(“X”,NULL,NULL,&eb2,ssname1);

筛选扩展数据
扩展数据是字符串、数据、三维点、距离、层名,或者是其他附加在对象上得数据,特别是由外部应用程序附加到对象上得数据。
扩展数据大小为16KB。
通过指定,我们可以为一个特殊的应用程序使用-3组码在筛选表中指定扩展数据来检索扩展数据。例如:,函数acedSSGet()返回一个以指定名字注册的带扩展数据的实体。acedSSGet()不检索每个扩展数据项(组码的范围为1000—2000)。
下面程序用于选择所有带有扩展数据的圆(Circle),应用程序为这些扩展数据注册的一个标志符(ID)为“APPNAME”。

  1. eb1.restype=0;//实体类型
  2. strcpy(sbuf1,”CIRCLE”);
  3. eb1.resval.rstring=sbuf1;//实体为CIRCLE
  4. eb1.rbnext=&eb2;
  5. eb2.restype=-3;//扩展数据
  6. eb2.rbnext=&eb3;
  7. eb3.restype=1001;
  8. strcpy(sbuf2,”APPNAME”);
  9. eb3.resval.rstring=sbuf2;//APPNAME应用程序
  10. eb3.rbnext=NULL;
  11. //选择注册到APPNAME应用程序中的圆的扩展数据
  12. acedSSGet(“X”,NULL,NULL,&eb1,ssname1);

如果不止一个应用程序名包含在表中,则acedSSGet()在选择集中所包含实体,必须对所有指定的应用程序都有扩展数据。比如,下面的程序选择带有注册到“APP1”和“APP2”中的扩展数据的圆。

  1. eb1.restype=0;//实体类型
  2. strcpy(sbuf1,”CIRCLE”);
  3. eb1.resval.rstring=sbuf1;//圆
  4. eb1.rbnext=&eb2;
  5. eb2.restype=-3;//扩展数据
  6. eb2.rbnext=&eb3;
  7. eb3.restype=1001;
  8. strcpy(sbuf2,”APP1”);
  9. eb2.resval.restring=sbuf2;//应用程序APP1
  10. eb2.rbnext=&eb4;
  11. eb4.restype=1001;//扩展数据
  12. strcpy(sbuf3,”APP2”);
  13. eb4.resval.rstring=sbuf3;//应用程序APP2
  14. eb4.rbnext=NULL;
  15. //选择注册应用程序APP1和APP2的圆扩展数据
  16. acedSSGet(“X”,NULL,NULL,&eb1,ssname1);

下面的程序与上面的作用相同。

  1. eb1.restype=0;
  2. strcpy(sbuf1,”CIRCLE”);
  3. eb1.resval.rstring=sbuf1;
  4. eb1.rbnext=&eb2;
  5. eb2.restype=-3;
  6. eb2.rbnext=&eb3;
  7. eb3.restype=1001;
  8. strcpy(sbuf2,”APP[12]”);//”APP[12]”
  9. eb3.resval.rstring=sbuf2;
  10. eb3.rbnext=NULL;
  11. //选择注册到APP1和APP2的圆的扩展数据
  12. acedSSGet(“X”,NULL,NULL,&eb1,ssname1);

关系检测

除非用户另外指定,在一个筛选表中的每一项与实体之间,有一个隐含的等量(equals)检测,对于数字量(整数、实数值、点和向量),通过在筛选表中包括关系操作符,用户可指定另外一些关系,关系操作符当做一个特殊的组(即-4组)传递,其值是一个在筛选表中将被应用于下一组检测的字符串。
下面的程序可以挑选半径大于等于2。0的圆:

  1. eb3.restype=40;//半径
  2. eb3.resval.rreal=2.0;
  3. eb3.rbnext=NULL;
  4. eb2.restype=-4;//筛选操作
  5. strcpy(sbuf1,”>=”);
  6. eb2.resval.rstring=&eb3;
  7. eb1.restype=0;//实体类型
  8. strcpy(sbuf2,”CIRCLE”);
  9. eb1.resval.rstring=sbuf2;//圆
  10. eb1.rbnext=&eb2;
  11. //选择半径大于等于2。0的圆
  12. acedSSGet(“X”,NULL,NULL,&eb1,ssname1);

条件筛选

条件操作符也可由-4组指定,但它们必须是配对的。下面的的程序用来挑选半径为1。0的圆,并且在“ABC”层上的所有直线:

  1. struct resbuf* prb;prb = acutBuildList(-4, "<or",-4, "<and", RTDXF0,    "CIRCLE", 40, 1.0, -4, "and>", -4, "<and", RTDXF0,     "LINE", 8, "ABC", -4, "and>", -4, "or>", 0);
  2. acedSSGet("X", NULL, NULL, prb, ssname1);

条件操作符不是大小写敏感的,可以使用小写形式。

用于检测扩展数据的条件表达式只能包含-3组。为了选择带有寄存于“APP1”和“APP2”其中之一的扩展数据的所有圆,可以用以下程序来实现:

    1. prb = acutBuildList(-4, "<xor", -3, "APP1", -3, "APP2",     -4, "xor>", 0);
    2. acedSSGet("X", NULL, NULL, prb, ssname1);

acedssget的更多相关文章

  1. acedSSGet 翻译

    ObjectARX 参考指南 > 全局函数 > AcEd 全局函数 > acedSSGet 函数 acedSSGet 折叠全部 C++ int acedSSGet( const AC ...

  2. acedSSGet使用自定义提示字符:$模式

          ads_name ss; struct resbuf *pRbList=NULL; pRbList=acutBuildList(RTDXF0,_T("lwpolyline,ins ...

  3. acedssget F 方式

    ads_point p1; ads_point p2; acedGetPoint(NULL, _T("\n插入第一点"), p1); acedGetPoint(p1, _T(&qu ...

  4. ObjectARX® for Beginners: An Introduction

    转:ObjectARX® for Beginners: An Introduction Lee Ambrosius – Autodesk, Inc.         CP4164-L    Objec ...

  5. acedSSSetFirst选择集夹点亮显实例

    ads_name ss; //执行预选 好像可以无视PICKSTYLE变量 if (RTNORM != acedSSGet(_T("I"),NULL,NULL,NULL,ss)) ...

  6. 设置视口中心点setViewCenter

    ads_point pt; ads_name ent,ss; //切换到模型空间 acedMspace(); if (RTNORM != acedGetPoint(NULL,_T("\n选择 ...

  7. arx代码片段

    ObjectARX代码片段二   转载自网络 一  在ARX中禁用AutoCAD的某个命令 以LINE命令为例,在程序中加入下面的一句即可禁用LINE命令: acedCommand(RTSTR, &q ...

  8. ARX亮显问题

    转载一段acedSSSetFirst的用法仅供参考:打个比方,我创建了一个命令,这个命令的功能是提示用户选择,然后只过滤文本对象作为选择集,随后在屏幕上使得这个选择集的所有成员都亮显,并且能够显示出各 ...

  9. acedinitget

    // 提示用户选择选择方式 acedInitGet(0, _T("W CP")); int nRs = acedGetKword(_T("\n请输入关键字确定选择方式[窗 ...

随机推荐

  1. xib或者storyboard设置颜色偏问题(与代码设置颜色不一致)

    选中xib中的label,在右边栏的第三个标签页中第三项是User Defined Runtime Attributes 添加一个keyPath,keyPath值为layer.borderWidth, ...

  2. C语言之基本算法21—可逆素数

    /* ================================================================== 题目:可逆素数是指一个数是素数,逆序后还是素数,如ABC是素 ...

  3. HDU 1226 超级password

    跟POJ 1465 multiple 类是.仅仅只是多了2个条件,长度不能超过500.还有就是 可能不是十进制. bfs+同余定理,就是用 mod 来判重. G++ 15ms 每次枚举一位,然后记录下 ...

  4. SSL和SSH的差别

    有人说,SSH通常是用来提供安全的登录用的.SSL仅仅是一个在协议层中增加的一层用来提供安全.    SSH工作在TCP之上,能够在启动一个SSH应用后.在其通道里执行其他协议的应用.如邮件.    ...

  5. 一张图告诉你是须要 SQL 还是 Hadoop

    译序 非常多朋友问时下如火如荼的 Hadoop 是否适合引进我们自己的项目,什么时候用 SQL.什么时候用 Hadoop,它们之间怎样取舍?Aaron Cordova 用一张图来回答你这个问题,对于不 ...

  6. HTML DOM Table 对象

    Table 对象 Table 对象代表一个 HTML 表格. 在 HTML 文档中 <table> 标签每出现一次,一个 Table 对象就会被创建. Table 对象集合 集合 描述 c ...

  7. 2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div. 2)V - Gears

    Problem V | limit 4 secondsGearsA set of gears is installed on the plane. You are given the center c ...

  8. POJ2069 最小球覆盖 几何法和退火法

    对这种问题不熟悉的读者 可以先去看一看最小圆覆盖的问题 ZOJ1450 现在我们来看最小球覆盖问题POJ2069 题目很裸,给30个点 求能覆盖所有点的最小球的半径. 先给出以下几个事实: 1.对于一 ...

  9. POJ1228 Grandpa's Estate 稳定凸包

    POJ1228 转自http://www.cnblogs.com/xdruid/archive/2012/06/20/2555536.html   这道题算是很好的一道凸包的题吧,做完后会加深对凸包的 ...

  10. Java中wait和sleep方法的区别

    1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...