找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2459|回复: 7

[分享] 使用Linq选择同心圆

[复制链接]
发表于 2014-8-11 08:59:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

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


3.JPG

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

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

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

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

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

  32.             }

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

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

  52.         }

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-8-11 09:29:08 | 显示全部楼层
直接窗口选择圆,然后用 GroupBy  circle.center 更好吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-11 09:41:13 来自手机 | 显示全部楼层
窗选的不可预料性有点多 呵呵

点评

学习了,只要是同心圆就选择  详情 回复 发表于 2014-8-11 10:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-11 10:08:54 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-11 09:41
窗选的不可预料性有点多 呵呵

学习了,只要是同心圆就选择

  1.         [CommandMethod("SelCircle")]
  2.         public void SelectCircle()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;

  7.             TypedValue[] filter = new TypedValue[1]
  8.             {
  9.                 new TypedValue(0, "CIRCLE")
  10.             };

  11.             PromptSelectionOptions pso = new PromptSelectionOptions();
  12.             pso.MessageForAdding = "\nSelect Circles";

  13.             PromptSelectionResult psr = ed.GetSelection(pso, new SelectionFilter(filter));
  14.             if (psr.Status != PromptStatus.OK) return;

  15.             using (Transaction tr = db.TransactionManager.StartTransaction())
  16.             {
  17.                 var q =
  18.                     from ObjectId id in psr.Value.GetObjectIds()
  19.                     let c = tr.GetObject(id, OpenMode.ForRead) as Circle
  20.                     group id by c.Center;
  21.                 var q2 = q.Where(g => g.Count() >= 2).SelectMany(g => g).ToArray();

  22.                 ed.SetImpliedSelection(q2);
  23.             }
  24.         }

点评

嗯 主要是考虑解决用户的可用性问题 问题要求是先选择两个同心圆,再获取相同的所有同心圆  详情 回复 发表于 2014-8-11 15:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2014-8-11 13:39:23 | 显示全部楼层
LINQ是什么东东?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-11 15:23:38 | 显示全部楼层
http://baike.so.com/doc/4973517.html
基本简介
  LINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。            
  从技术角度而言,LINQ定义了大约40个查询操作符,如select、from、in、where以及order by(C#)中。使用这些操作符可以编写查询语句。不过,这些查询还可以基于很多类型的数据,每个数据类型都需要一个单独的LINQ类型。
  经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段。程序员现在都已经认同像 类(classes)、对象(objects)、方法(methods)这样的语言特性。考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据( accessing and integrating information )的复杂度的问题。其中两个最主要访问的数据源与数据库( database )和 XML 相关。
  LINQ 提供了一条更常规的途径即给.Net Framework添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query (LINQ) 。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-11 15:26:31 | 显示全部楼层
csharp 发表于 2014-8-11 10:08
学习了,只要是同心圆就选择

嗯 主要是考虑解决用户的可用性问题 问题要求是先选择两个同心圆,再获取相同的所有同心圆

点评

没看到具体要求,以前遇到的都是直接选同心圆,没有分那么细  详情 回复 发表于 2014-8-11 19:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-11 19:57:53 来自手机 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-11 15:26
嗯 主要是考虑解决用户的可用性问题 问题要求是先选择两个同心圆,再获取相同的所有同心圆

没看到具体要求,以前遇到的都是直接选同心圆,没有分那么细
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 04:23 , Processed in 0.380181 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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