Mở đầu

Bài viết này sẽ tổng hợp số việc mở rộng liên quan đến việc chọn đối tượng còn khá mới mẻ trong Civil3D khi chưa chỉ mới cho phép chọn 1 đối tượng.Chúng ta có thể mở rộng vấn đề này để giải quyết sự lựa chọn cho nhiều đối tượng hơn Selectobject1

Pick chọn nhiều đối tượng

output = []
adoc = Application.DocumentManager.MdiActiveDocument
ed = adoc.Editor
with adoc.LockDocument():
with adoc.Database as db:
with db.TransactionManager.StartTransaction() as t:
bt = t.GetObject(db.BlockTableId, OpenMode.ForWrite)
btr = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite)
for objectid in btr:
obj1 = t.GetObject(objectid, OpenMode.ForRead)
output.append(obj1)
OUT = output,ed.WriteMessage("Done")
view raw PickObject.py hosted with ❤ by GitHub

[CommandMethod("PickObject")]
public static List<Entity> SelectedObject()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
List<Entity> objs = new List<Entity>();
using (Transaction tran = db.TransactionManager.StartTransaction())
{
PromptSelectionResult prompt = ed.GetSelection();
if (prompt.Status == PromptStatus.OK)
{
SelectionSet selectionSet = prompt.Value;
foreach (SelectedObject obj in selectionSet)
{
if (obj!=null)
{
Entity o = tran.GetObject(obj.ObjectId,OpenMode.ForWrite) as Entity;
objs.Add(o);
}
}
}
tran.Commit();
}
return objs;
}
view raw PickObject.cs hosted with ❤ by GitHub

Chọn đối tượng với layer muốn chọn

output = []
adoc = Application.DocumentManager.MdiActiveDocument
ed = adoc.Editor
with adoc.LockDocument():
with adoc.Database as db:
with db.TransactionManager.StartTransaction() as t:
bt = t.GetObject(db.BlockTableId, OpenMode.ForWrite)
btr = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite)
for objectid in btr:
obj1 = t.GetObject(objectid, OpenMode.ForRead)
if obj1.Layer == "Layer1":
output.append(obj1)
else:
pass
OUT = output
view raw PickObjectLayer.py hosted with ❤ by GitHub

[CommandMethod("SelectionFilter")]
public static void LayerSelection()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
TypedValue[] filterlist = new TypedValue[2];
//select circle and line
filterlist[0] = new TypedValue(0, "CIRCLE,LINE");
//8 = DxfCode.LayerName
filterlist[1] = new TypedValue(8, "0,Layer1,Layer2");
SelectionFilter filter =
new SelectionFilter(filterlist);
PromptSelectionResult selRes = ed.SelectAll(filter);
if (selRes.Status != PromptStatus.OK)
{
ed.WriteMessage(
"\nerror in getting the selectAll");
return;
}
ObjectId[] ids = selRes.Value.GetObjectIds();
ed.WriteMessage("No entity found: "
+ ids.Length.ToString() + "\n");
}
view raw PickObjectLayer.cs hosted with ❤ by GitHub

Selectobject2

Chọn đối tượng đã chọn sẵn

[CommandMethod("GetSelection")]
public static void SelectionTest()
{
var ed = Application.DocumentManager.MdiActiveDocument.Editor;
var pso = new PromptSelectionOptions();
pso.SingleOnly = true;
pso.SinglePickInSpace = true;
PromptSelectionResult psr;
var ids = new ObjectIdCollection();
while (true)
{
psr = ed.GetSelection(pso);
if (psr.Status != PromptStatus.OK)
break;
ids.Add(psr.Value[0].ObjectId);
ed.WriteMessage("\n{0} selected objects", ids.Count);
}
}
view raw GetSelection.cs hosted with ❤ by GitHub

Mở rộng

Việc chọn nhiều hay chọn ít, chọn như thế nào là ở tư duy xử lý của mỗi người, chúng ta có muốn vàn cách lựa chọn để tìm ra đối tượng phù hợp cần xử lý cho mình nhất.Ngoài việc lựa chọn như các cách nêu trên, ta có thể lựa chọn theo hàng loạt đối tượng có sẵn rồi lọc layer hoặc chọn theo thuộc tính, chọn theo vị trí ,...

Tham khảo