在Lisp版看见这个问题
感觉用Linq应该是最简单的,就试着写了下
apcenkgswxy.JPG
- [CommandMethod("cc")]
- public static void CC()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- PromptEntityOptions optsEnt = new PromptEntityOptions("\n请选择同心圆:");
- optsEnt.SetRejectMessage("\n类型选择错误!");
- optsEnt.AddAllowedClass(typeof(Circle), false);
- double[] rads = null;
- PromptEntityResult resEnt = ed.GetEntity(optsEnt);
- while (resEnt.Status != PromptStatus.Cancel)
- {
- if (resEnt.Status == PromptStatus.OK)
- {
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- var cir = tr.GetObject(resEnt.ObjectId, OpenMode.ForRead) as Circle;
- var ss1 = ed.SelectAll(new ResultList { { 0, "circle" }, { 10, cir.Center } });
- if (ss1.Value.Count == 2)
- {
- rads =
- (from ObjectId id in ss1.Value.GetObjectIds()
- let c = tr.GetObject(id, OpenMode.ForRead) as Circle
- select c.Radius)
- .ToArray();
- break;
- }
- }
- }
- ed.WriteMessage("\n你选择的不是同心圆!");
- resEnt = ed.GetEntity(optsEnt);
- }
- if (resEnt.Status == PromptStatus.Cancel)
- return;
- var ss = ed.SelectAll(
- new ResultList {
- { 0, "circle" },
- { -4, ""}
- });
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- var q =
- from ObjectId id in ss.Value.GetObjectIds()
- let c = tr.GetObject(id, OpenMode.ForRead) as Circle
- group id by c.Center;
- var q2 = q.Where(g => g.Count() == 2).SelectMany(g => g).ToArray();
- ed.SetImpliedSelection(q2);
- }
- }
|