mccad 发表于 2014-2-28 15:42:18

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

选择集过滤表 当acedSSGet()函数的entmask参数明确记录了实体的范围值列表时,acedSSGet()扫描被选择的实体,同时建立一个包含主实体名的选择集,这些实体与筛选条件相匹配.例如,使用这种方法,用户可以得到一个给定的选择集,这个选择集包括给定层、给定类型或给定颜色的所有实体.过滤表可以与任何选择项联合使用.如果选用"X"选择方式,意味着建立一个仅使用过滤表的选择集.在AutoCAD以前的版本中,如果使用"X"选项,acedSSGet()将扫描全部图形数据库.注意如果仅仅过滤表指定为 (“X”) 而参数entmask 为 NULL, acedSSGet() 选择所有在数据库中的实体.参数 entmask 必须是一个结果缓冲区表.每一个缓冲区指定一个检查参数和匹配的值;缓冲区的restype段是一个DXF组码,它指示要查询的参数种类,而缓冲区的resval域指定要匹配的值.下面是一些实例.struct resbuf eb1, eb2, eb3; char sbuf1, sbuf2;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);

luowy 发表于 2014-2-28 17:22:20

给点有用的吧,这些东西没什么实用性

434939575 发表于 2014-3-1 10:40:00

让咱们了解下也好。只是看不懂。
页: [1]
查看完整版本: 选择集,实体,和符号表函数(二)选择集的处理(1)选择集过滤表