TeighaへのActiveXインターフェースを使用する場合、特定のサブセットを探しながらレイアウト内のすべてのエンティティを走査すると、避けられないオーバーヘッドが発生します。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」レイヤー上のテキストとMテキストを選択する必要がある場合は、論理演算子ブラケットを使用します。LISP構文では次のようになります。
(ssget "X" '((-4 . "<OR")(0 . "TEXT")(0 . "MTEXT")(-4, "OR>")(8 . "Annotations")))
デフォルトでは、演算子ブラケット内にないすべての条件は「AND」ブラケット内にあると見なされます。つまり、2番目の例は次のように言い換えることができます。
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 });
有効な関係演算子は次のとおりです。
- "=" — デフォルト。
- "*" — 何でも可(常に真)。
- "!=", "<>", "/=" — 等しくない。
- "<" — より小さい。
- "<=" — 以下。
- ">" — より大きい。
- ">=" — 以上。
- "&" — ビットごとのAND(整数にのみ適用可能)。
- "&=" — ビットマスクされた等しい(整数にのみ適用可能)。((value & filter) = filter) の場合に真となります。つまり、指定されたビットが設定されているかどうかを確認します。
文字列を照合する際にワイルドカードを使用することもできます。例えば、「A」で始まるレイヤー上のすべてのエンティティを検索する場合などです。
SelectionSet.Select(AcSelect.acSelectionSetAll, Missing.Value, Missing.Value, new int[] { 8 },
new object[] {"A*" });
サポートされているワイルドカード構文はかなり広範囲にわたり、この記事では簡単に要約されているにすぎません。