明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2746|回复: 2

选择集,实体,和符号表函数(二)选择集的处理(1)选择集过滤表

[复制链接]
发表于 2014-2-28 15:42:18 | 显示全部楼层 |阅读模式
选择集过滤表
acedSSGet()函数的entmask参数明确记录了实体的范围值列表时,acedSSGet()扫描被选择的实体,同时建立一个包含主实体名的选择集,这些实体与筛选条件相匹配.例如,使用这种方法,用户可以得到一个给定的选择集,这个选择集包括给定层、给定类型或给定颜色的所有实体.
过滤表可以与任何选择项联合使用.如果选用"X"选择方式,意味着建立一个仅使用过滤表的选择集.AutoCAD以前的版本中,如果使用"X"选项,acedSSGet()将扫描全部图形数据库.
注意如果仅仅过滤表指定为 (“X”) 而参数entmask NULL, acedSSGet() 选择所有在数据库中的实体.
参数 entmask 必须是一个结果缓冲区表.每一个缓冲区指定一个检查参数和匹配的值;缓冲区的restype段是一个DXF组码,它指示要查询的参数种类,而缓冲区的resval域指定要匹配的值.
下面是一些实例.
struct resbuf eb1, eb2, eb3;
char sbuf1[10], sbuf2[10];  
ads_name ssname1, ssname2;
eb1.restype = 0;       // 类型为实体名
strcpy(sbuf1, "CIRCLE");
eb1.resval.rstring = sbuf1;
eb1.rbnext = NULL; //无其他属性内容
// Retrieve all circles.
acedSSGet("X", NULL, NULL,&eb1, ssname1);
eb2.restype = 8; // 层名
strcpy(sbuf2, "FLOOR3");
eb2.resval.rstring = sbuf2;
eb2.rbnext = NULL; // 没有其他属性内容
// 检索在 FLOOR3上的所有实体.
acedSSGetacedSSGet("X", NULL, NULL,&eb2, ssname2);
注意 在每个缓冲区中指定的resval必须属于合适的类型,比如:名字类型是字符串(resval.rstring);标高和厚度是双精度浮点型(resval.rreal);颜色、属性和标志值是短整型(resval.rint);拉伸向量是三维的点(resval.rpoint),等等.
如果entmask指定了多个参数,那么只有匹配所有指定条件的实体才能被包含在选择集里.就像下面的例子:
eb3.restype = 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"选项,它扫描整个图形数据库;如果过滤表与其他选项(如用户选择、窗口选择,等等)联合使用,过滤条件只能在被选中的实体上起作用.
下面是一组筛选用户选择实体的例子.
eb1.restype = 0; // 实体类型组
strcpy(sbuf1, "TEXT");vaeb1.resval.rstring = sbuf1; // 类型为文本
eb1.rbnext = NULL;
//让用户生成选择集,但该集合中只能有TEXT实体.
acedSSGet(NULL, NULL, NULL, &eb1,ssname1);
接下来的例子是筛选前一个选择集
eb1.restype = 0; //实体类型组
strcpy(sbuf1, "LINE");
eb1.resval.rstring = sbuf1; // 类型为直线.
eb1.rbnext = NULL;
// 选择在上一个选择集中符合条件的实体.
acedSSGet("P", NULL, NULL,&eb1, ssname1);
下面是在选择窗口内过滤实体.
eb1.restype = 8; // 层
strcpy(sbuf1, "FLOOR9");treb1.resval.rstring = sbuf1; // 层名
eb1.rbnext = NULL;
// 选择在窗口内并在FLOOR9层上的所有实体.
acedSSGet("W", pt1, pt2, &eb1,ssname1);
注意 某些组码在不同的实体里有不同的含义,并且不是所有的组码都存在于所有的实体内.如果在过滤程序中指定一个特定的组码,不包含该组码的实体将被排除在acedSSGet()所返回的选择集之外
本节中包含的内容
·        筛选表中的通配符
·        筛选扩展数据
·        关系检测
·        条件筛选
筛选表中的通配符
筛选表中指定的符号名可以包括通配符.由函数acedSSGet()识别的通配符与函数acutWcMatch()识别的通配符完全一样.
例如,下面的程序代码可以检索一个名叫U2的匿名块.
eb2.restype = 2; // 块名
strcpy(sbuf1,"'*U2"); //
eb2.resval.rstring =sbuf1; // 匿名块名
eb2.rbnext = NULL;
// 选择匿名块*U2的块插入引用.
acedSSGet("X",NULL, NULL, &eb2, ssname1);

发表于 2014-2-28 17:22:20 | 显示全部楼层
给点有用的吧,这些东西没什么实用性
发表于 2014-3-1 10:40:00 | 显示全部楼层
让咱们了解下也好。只是看不懂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 06:46 , Processed in 0.297047 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表