使用 TeighaX 进行高级选择过滤

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

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

今天就开始行动

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

免费试用