选择集过滤表 当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);
|