Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoCAD .NET API :座標要素を利用した選択セット フィルタリング

Issue

選択セットで条件に合った複数のオブジェクトを取得する際、特定の座標を持つ要素を条件に設定するにはどうしたらいいでしょうか?

 

Solution

選択セットのフィルタリングで座標を扱う際には、オンラインヘルプ 概要 - 選択セットのフィルタ リストでの関係テスト(AutoLISP) で触れられている、カンマ区切りで関係演算子を利用する方法を利用することが出来ます。

 

  • 点グループ コードの場合、XYZ に対するテストを結合して単一の文字列にできます。このとき、各演算子をカンマで区切ります(たとえば、">,>,*")。文字列から演算子を省略すると、すべてを選択する演算子 "*" とみなされます(たとえば、"=,<>" では Z がチェックされません)。

次のコードは、円オブジェクトの中心のX 座標が 123.45 以上123.46 以下で、Y 座標が 500.0、Z 座標値を無視するフィルタリングを指定した C# コードの例です。

Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;

TypedValue[] typeAry = new TypedValue[9];
typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "<and"), 0);
typeAry.SetValue(new TypedValue((int)DxfCode.Start, "CIRCLE"), 1);
typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "<and"), 2);
typeAry.SetValue(new TypedValue((int)DxfCode.Operator, ">=,=,*"), 3);
typeAry.SetValue(new TypedValue((int)DxfCode.XCoordinate, new Point3d(123.45, 500.0, 0.0)), 4);
typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "<=,=,*"), 5);
typeAry.SetValue(new TypedValue((int)DxfCode.XCoordinate, new Point3d(123.46, 500.0, 0.0)), 6);
typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "and>"), 7);
typeAry.SetValue(new TypedValue((int)DxfCode.Operator, "and>"), 8);

SelectionFilter filter = new SelectionFilter(typeAry);

PromptSelectionResult psr = ed.SelectAll(filter);

if (psr.Status == PromptStatus.OK)
{
    SelectionSet sset = psr.Value;
    ed.WriteMessage("\nNumber of objects selected : {0}", sset.Count.ToString());
    ObjectIdCollection objIds = new ObjectIdCollection(sset.GetObjectIds());
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        Entity ent;
        foreach (ObjectId objId in objIds)
        {
            ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
            ent.Highlight();
        }
        tr.Commit();
    }
}
else
{
    Application.ShowAlertDialog("\nNumber of objects selected: 0");
}