当使用 ActiveX 接口访问 Teigha 时,遍历布局中的所有实体以查找特定子集会产生不可避免的开销。为了使实体可供 COM 客户端访问,应为其创建并附加一个包装器。
对于 VB6,还存在 IDispatch 调用成本,对于 .NET,则存在参数封送成本。在许多情况下,通过使用选择过滤器可以提高选择性能。选择过滤器允许按实体类型 (DXF 名称)、图层名称、块的块名称等进行过滤。本质上,您可以过滤实体 DXF 表示中的任何字段。
选择过滤起源于 LISP 接口,其语法如下:
(ssget "X" '((0 . "CIRCLE")))
这表示“获取类型为‘CIRCLE’的所有实体的选择集”(DXF 组代码 0 用于实体类型)。在 ActiveX (C#) 语法中,类似的 IAcadSelectionSet.Select 调用如下所示:
IAcadSelectionSet SelectionSet = oApp.ActiveDocument.SelectionSets.Add("Test");
SelectionSet.Select(AcSelect.acSelectionSetAll, Missing.Value, Missing.Value, new int[] { 0 },
new object[] { "CIRCLE" });
您可以在过滤器中组合多个条件,例如,要选择“Annotations”图层上的所有文本实体,您可以这样做:
SelectionSet.Select(AcSelect.acSelectionSetAll, Missing.Value, Missing.Value, new int[] { 0, 8 },
new object[] { "TEXT", "Annotations" });
如果您需要在“Annotations”图层上选择文本和多行文本,请使用逻辑运算符括号。在 LISP 语法中,它看起来像这样:
(ssget "X" '((-4 . "<OR")(0 . "TEXT")(0 . "MTEXT")(-4, "OR>")(8 . "Annotations")))
默认情况下,所有不在运算符括号中的条件都被视为在“and”括号中。也就是说,第二个示例可以改写为:
SelectionSet.Select(AcSelect.acSelectionSetAll, Missing.Value, Missing.Value, new int[] { -4, 0, 8, -4 },
new object[] { "<AND", "TEXT", "Annotations", "AND>" });
支持的逻辑运算符是“AND”、“OR”、“NOT”和“XOR”,具有通常的含义。除了检查实体属性是否等于某个值之外,您还可以将它们与值进行比较。例如,要查找半径大于 1.0 的圆:
SelectionSet.Select(AcSelect.acSelectionSetAll, Missing.Value, Missing.Value, new int[] { 0, -4, 40 },
new object[] { "CIRCLE", ">", 1.0 });
有效的关系运算符有:
- "=" — 默认。
- "*" — 任何值(始终为真)。
- "!=", "<>", "/=" — 不等于。
- "<" — 小于。
- "<=" — 小于或等于。
- ">" — 大于。
- ">=" — 大于或等于。
- "&" — 按位与(仅适用于整数)。
- "&=" — 按位掩码相等(仅适用于整数)。如果 ((value & filter) = filter) 则为真,即检查给定位是否已设置。
在匹配字符串时,您还可以使用通配符,例如,搜索所有以“A”开头的图层上的实体:
SelectionSet.Select(AcSelect.acSelectionSetAll, Missing.Value, Missing.Value, new int[] { 8 },
new object[] {"A*" });
支持的通配符语法相当广泛,本文仅作简要概述。