Issue
選択セットで条件に合った複数のオブジェクトを取得する際、特定の座標を持つ要素を条件に設定するにはどうしたらいいでしょうか?
Solution
選択セットのフィルタリングで座標を扱う際には、オンラインヘルプ 概要 - 選択セットのフィルタ リストでの関係テスト(AutoLISP) で触れられている、カンマ区切りで関係演算子を利用する方法を利用することが出来ます。
点グループ コードの場合、X、Y、Z に対するテストを結合して単一の文字列にできます。このとき、各演算子をカンマで区切ります(たとえば、">,>,*")。文字列から演算子を省略すると、すべてを選択する演算子 "*" とみなされます(たとえば、"=,<>" では 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");
}
記事全体を表示