- UID
- 658062
- 积分
- 2147
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2008-10-22
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在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 |
|