找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2395|回复: 0

[分享] C#-AutoCAD中选择特定条件图元:选择集?linq

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-18 06:06:18 来自手机 | 显示全部楼层 |阅读模式

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

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

×
在CAD中选择过滤图元,比较常规的做法就是构建过滤器,创建选择集; 但是C#带来个更强大的工具:采用Linq语句选择特定条件的图元。 先说说传统的选择集:大致总结几点
1.首先要熟悉组码,然后利用它组合起来构建过滤器。
2.过滤器很受限制。往往不能一次到位,还需要对得到的选择集中的对象进行再次筛选。
3.选择集中对象多的话速度将是非常非常之慢。
个人觉得唯一的优点可能就是对于一些简单的选择应用起来比较方便吧。
再看Linq:
1.任意写你的选择的条件代码,想怎么过滤就怎么过滤。强大,随便举个例子:选择集只可以过滤轻量多段线的扩展数据,而使用Linq简单几个语句就能过滤其他图元的扩展数据。
2.当选择的对象多的时候,速度几乎不受影响,速度非常之快。
那怎么使用Linq语句呢?
1.首先创建一个数据源,作为Linq的数据源。
2.那就是写条件语句选择相关图元啦!
个人觉得对于选择特定图元,如果被选择的图元少且能一步到位选择到,那还是用选择集相对方便点。如果是不能一步到位或者图元很多,那明显应该是用Linq来选择图元。

举个代码例子:首先是创建一个数据源。先是2个我编写的Databasede扩展方法,分别返回某块中的所有实体。如下:
/// <summary>
/// 得到模型中所有实体
/// </summary>
public static IEnumerable<Entity> GetAllEntitiesInModelSpace(this Database db, Transaction trans, OpenMode openMode, bool openErased)
{
returnGetEntitiesInBlock(db, BlockTableRecord.ModelSpace,trans, openMode);
}
/// <summary>
/// 得到某块中所有实体
/// </summary>
public static IEnumerable<Entity> GetEntitiesInBlock(this Database db, string blockName,Transaction trans, OpenMode openMode)
{
List<Entity> list = new List<Entity>();
BlockTable table = (BlockTable)trans.GetObject(db.BlockTableId, 0);
try
{
BlockTableRecord record = (BlockTableRecord)trans.GetObject(table[blockName], 0);
foreach (ObjectId id in record)
{
Entity entity = (Entity)trans.GetObject(id, openMode);
list.Add(entity);
}
}
catch (Exception exception)
{
Application.ShowAlertDialog(exception.Message);
}
return list;
}
上面这个就可以作为数据源,可以把模型中的所有实体作为搜索过滤的数据源。我这里就是举个例子把'TK_平面图框'这个块中的所有实体做为数据源
接下来过滤:找到TK_平面图框中是'第 页'的单行或者多行文字,如下:
var ents = from ent1 in MOKACADEx.CurrentDatabase.GetEntitiesInBlock('TK_平面图框',trans, OpenMode.ForRead)
where (ent1 is MText && (Regex.Replace(((MText)ent1).Text.Trim(), @'\s', '') == '第页') || (ent1 is DBText && (Regex.Replace(((DBText)ent1).TextString.Trim(), @'\s', '') == '第页')))
select ent1;
得到的ents就是结果了,用foreach操作,也可用ents.ElementAt(0)等等操作(需要保证有图元)。
对了上面那个CurrentDatabase是个静态属性
/// <summary>
/// 得到当前活动的数据库
/// </summary>
/// <returns>当前活动的数据库</returns>
public static Autodesk.AutoCAD.DatabaseServices.Database CurrentDatabase
{
get
{
return HostApplicationServices.WorkingDatabase;
}
}
这样做的好处就是不需要频繁的定义使用。直接MOKACADEx.CurrentDatabase。MOKACADEx是我的类名,具体可以进群共享,里面有完整的代码。

http://blog.sina.cn/dpool/blog/s/blog_69e8fdf00100zgtj.html?type=-1
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-6 00:59 , Processed in 0.396328 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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