明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2158|回复: 4

[选集] 使用Linq选择同心圆

[复制链接]
发表于 2014-8-11 08:49:58 | 显示全部楼层 |阅读模式
本帖最后由 雪山飞狐_lzh 于 2014-8-11 09:02 编辑

在Lisp版看见这个问题
感觉用Linq应该是最简单的,就试着写了下




  1.         [CommandMethod("cc")]
  2.         public static void CC()
  3.         {

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

  7.             PromptEntityOptions optsEnt = new PromptEntityOptions("\n请选择同心圆:");
  8.             optsEnt.SetRejectMessage("\n类型选择错误!");
  9.             optsEnt.AddAllowedClass(typeof(Circle), false);

  10.             double[] rads = null;
  11.             PromptEntityResult resEnt = ed.GetEntity(optsEnt);
  12.             while (resEnt.Status != PromptStatus.Cancel)
  13.             {
  14.                 if (resEnt.Status == PromptStatus.OK)
  15.                 {
  16.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  17.                     {
  18.                         var cir = tr.GetObject(resEnt.ObjectId, OpenMode.ForRead) as Circle;
  19.                         var ss1 = ed.SelectAll(new ResultList { { 0, "circle" }, { 10, cir.Center } });
  20.                         if (ss1.Value.Count == 2)
  21.                         {
  22.                             rads =
  23.                                 (from ObjectId id in ss1.Value.GetObjectIds()
  24.                                  let c = tr.GetObject(id, OpenMode.ForRead) as Circle
  25.                                  select c.Radius)
  26.                                 .ToArray();
  27.                             break;
  28.                         }
  29.                     }
  30.                 }

  31.                 ed.WriteMessage("\n你选择的不是同心圆!");
  32.                 resEnt = ed.GetEntity(optsEnt);

  33.             }

  34.             if (resEnt.Status == PromptStatus.Cancel)
  35.                 return;

  36.             var ss = ed.SelectAll(
  37.                 new ResultList {
  38.                     { 0, "circle" },
  39.                     { -4, "<or"},
  40.                     { 40, rads[0] },
  41.                     { 40, rads[1] },
  42.                     { -4, "or>"}
  43.                 });
  44.             using (Transaction tr = db.TransactionManager.StartTransaction())
  45.             {
  46.                 var q =
  47.                     from ObjectId id in ss.Value.GetObjectIds()
  48.                     let c = tr.GetObject(id, OpenMode.ForRead) as Circle
  49.                     group id by c.Center;
  50.                 var q2 = q.Where(g => g.Count() == 2).SelectMany(g => g).ToArray();
  51.                 ed.SetImpliedSelection(q2);
  52.             }

  53.         }





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2014-8-11 09:16:57 | 显示全部楼层
严重支持大侠。可惜只会LISP!
发表于 2014-8-22 13:05:10 | 显示全部楼层
ResultList类是自定义的?还是哪个父类里面的?我这里提示没有
 楼主| 发表于 2014-8-23 09:47:39 | 显示全部楼层
发表于 2014-8-23 09:51:21 | 显示全部楼层
雪山飞狐_lzh 发表于 2014-8-23 09:47
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=79849&extra=page%3D1%26filter%3Dtypeid%26typeid%3D3 ...

谢谢!我刚才自己已经写了一半了。。。还是版主写的好,果断扔了我的半成品
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-29 04:20 , Processed in 0.179899 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表