大多数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. 【Android】应用安全——反编译

    用java开发最操心的就是得到反编译,所以作为开发人员我们须要知道怎么反编译,那样才干知道怎样防止反编译.保证代码安全. 以下来看下比較经常使用的方法! 第一种方式:利用apktool反编译 1,首先 ...

  2. Jenkins安装与使用

    一.Jenkins简介 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作 二.下载与安装 下载地址 ...

  3. UVa 11582 Colossal Fibonacci Numbers! 【大数幂取模】

    题目链接:Uva 11582 [vjudge] watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fil ...

  4. c#控件重绘的问题

    1.当Panel有背景图像的时候,往Panel添加控件(带图像),画面会非常闪烁,所以,Panel尽量不要带背景图像 2.带背景图像可以参考designer.cs里面的写法... 添加Control之 ...

  5. POJ1050 To the Max 最大子矩阵

    POJ1050 给定一个矩阵,求和最大的子矩阵. 将每一列的值进行累加,枚举起始行和结束行,然后就可以线性优化了 复杂度O(n^3) #include<cstdio> #include&l ...

  6. 浙江省CIO协会钱塘江论坛近日在网易云创沙龙宣布成立

    本文来自网易云社区 9月19日,由网易云与浙江省首席信息官协会共同主办的“网易云创CIO沙龙”在杭州举行,本次活动以“瞩目钱塘,赋能企业数字化创新”为主题,网易云企业服务部总经理岳峥辉,浙江省首席信息 ...

  7. iPhone各尺寸 app界面设计尺寸规范

    ip6: 375 * 667 pt @2x   ~ 750 x 1334 ip6+: 414 * 736 pt @3x ~ 1242 x 2208 ip5: 320 * 568 pt  @2x ~ 6 ...

  8. bzoj Strange Way to Express Integers【excrt】

    其实我没看懂题不如说根本没看--都说是excrt板子那就写个板子吧 注意开long long #include<iostream> #include<cstdio> using ...

  9. bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2989  Solved: 1557[Submit][Statu ...

  10. 为什么Markdown能夺得程序员的青睐

    Markdown基本情况概述 Markdown是在HTML的基础上产生的.HTML的功能已经足够强大,可以编写出漂亮的网页.HTML在没有CSS的加持上,尽管不能显示出绚丽多彩的网页,但是仍然可以达到 ...