[返回博客](/cn/blog) # 使用 TeighaX 进行高级选择过滤

Vladimir Kalinin 六月 13, 2017 [\#Drawings X](/cn/blog/tag/drawings-x) [\#filter](/cn/blog/tag/filter)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

当使用 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  });
```

有效的关系运算符有：

- "=" — 默认。
- "\*" — 任何值（始终为真）。
- "!=", "&lt;&gt;", "/=" — 不等于。
- "&lt;" — 小于。
- "&lt;=" — 小于或等于。
- "&gt;" — 大于。
- "&gt;=" — 大于或等于。
- "&amp;" — 按位与（仅适用于整数）。
- "&amp;=" — 按位掩码相等（仅适用于整数）。如果 ((value &amp; filter) = filter) 则为真，即检查给定位是否已设置。

在匹配字符串时，您还可以使用通配符，例如，搜索所有以“A”开头的图层上的实体：

```
SelectionSet.Select(AcSelect.acSelectionSetAll, Missing.Value, Missing.Value, new int[] { 8 }, 
new object[] {"A*" });
```

支持的通配符语法相当广泛，本文仅作简要概述。

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
