EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 600|回复: 1
打印 上一主题 下一主题

如何编程判断构件相交?

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-15 12:46:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近日看到一个5d6d的关于Revit API的论坛 既不标识本博文章的链接,也没有说明作者就在其论坛内转载本博的文章,而且发帖人写的是论坛的管理员。 为了更好服务广大Revit API 爱好者,请该版主改正这种行为,在引用本博的帖子里至少补上本博每篇文章链接。这样本博对已有文章的修改和更新读者们有机会过来看看。如果尊重原创,请署上原作者。



应一朋友询问,写了如下的文章。



碰撞检查是大家都非常感兴趣的内容,首先涉及到的就是构件之间的相交。可以通过对象过滤器来实现求出给定对象相交的其它对象。



在Revit2011中,没有直接提供构件相交的过滤器。我们可以变通使用这个过滤器BoundingBoxIntersectsFilter 它实现的功能是给定一个空间立方体,(用OutLine类表示),找出对象的BoundingBox与这个空间立方体相交的对象。这个也有不准确的地方,因为用的是对象的外包立方体,毕竟外包立方体与对象自身的几何体不是等同的。



在Revit 2012里提供了精确的的对象相交的过滤器:ElementIntersectsFilter 。 这个过滤器可以准确找到与制定对象相交的对象。请看下面示例代码:


  1. [csharp] view plaincopy
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Text;  
  5. using System.Windows.Forms;  
  6.   
  7. using Autodesk.Revit.DB;  
  8. using Autodesk.Revit.UI;  
  9. using Autodesk.Revit.ApplicationServices;  
  10. using Autodesk.Revit.Attributes;  
  11. using Autodesk.Revit.UI.Selection;  
  12.   
  13.   
  14. [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]  
  15. public class FindIntersectWallsByElement : IExternalCommand  
  16. {  
  17.   public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)  
  18.   {  
  19.   
  20.     UIApplication app = commandData.Application;  
  21.     Document doc = app.ActiveUIDocument.Document;  
  22.     Transaction trans = new Transaction(doc, "ExComm");  
  23.     trans.Start();  
  24.   
  25.     //pick the column  
  26.     Selection sel = app.ActiveUIDocument.Selection;  
  27.     Reference ref1 = sel.PickObject(ObjectType.Element, "Please pick a column");  
  28.     Element column = doc.GetElement(ref1);  
  29.   
  30.     FilteredElementCollector collector = new FilteredElementCollector(doc);  
  31.     ElementIntersectsElementFilter elementFilter = new ElementIntersectsElementFilter(column, false);  
  32.     collector.WherePasses(elementFilter);  
  33.   
  34.     List<ElementId> excludes = new List<ElementId>();  
  35.     excludes.Add(column.Id);  
  36.     collector.Excluding(excludes);  
  37.   
  38.     sel.Elements.Clear();  
  39.   
  40.     //Add these interseting element to the selection  
  41.     foreach (Element elem in collector)  
  42.     {  
  43.       sel.Elements.Add(elem);  
  44.     }  
  45.   
  46.     trans.Commit();  
  47.     return Result.Succeeded;  
  48.   }  
  49. }  
复制代码
在Revit 2012里也可以给定一个空间立方体,找出与这个空间立方体相交的对象。使用过滤器ElementIntersectsSolidFilter。请看下面代码。


  1. [csharp] view plaincopy
  2. [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]  
  3. public class FindIntersectWallsByGeometry : IExternalCommand  
  4. {  
  5.   public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)  
  6.   {  
  7.   
  8.     UIApplication app = commandData.Application;  
  9.     Document doc = app.ActiveUIDocument.Document;  
  10.     Transaction trans = new Transaction(doc, "ExComm2");  
  11.     trans.Start();  
  12.   
  13.     //pick a point to draw solid  
  14.     Selection sel = app.ActiveUIDocument.Selection;  
  15.     XYZ pt = sel.PickPoint("Please pick a point to get the close walls");  
  16.   
  17.     //XYZ pttemp1 = sel.PickPoint(Autodesk.Revit.UI.​Selection.ObjectSnapTypes.None, "Pick leader end...");  
  18.     //XYZ pttemp2 = sel.PickPoint(Autodesk.Revit.UI.Selection.ObjectSnapTypes.None, "Pick leader elbow...");  
  19.   
  20.     //  
  21.     double dBoxLength = 3;  
  22.   
  23.     XYZ pt1 = new XYZ(pt.X - dBoxLength / 2, pt.Y - dBoxLength / 2, pt.Z);  
  24.     XYZ pt2 = new XYZ(pt.X + dBoxLength / 2, pt.Y - dBoxLength / 2, pt.Z);  
  25.     XYZ pt3 = new XYZ(pt.X + dBoxLength / 2, pt.Y + dBoxLength / 2, pt.Z);  
  26.     XYZ pt4 = new XYZ(pt.X - dBoxLength / 2, pt.Y + dBoxLength / 2, pt.Z);  
  27.   
  28.     Line lineBottom = app.Application.Create.NewLineBound(pt1, pt2);  
  29.     Line lineRight = app.Application.Create.NewLineBound(pt2, pt3);  
  30.     Line lineTop = app.Application.Create.NewLineBound(pt3, pt4);  
  31.     Line lineLeft = app.Application.Create.NewLineBound(pt4, pt1);  
  32.   
  33.     CurveLoop profile = new CurveLoop();  
  34.     profile.Append(lineBottom);  
  35.     profile.Append(lineRight);  
  36.     profile.Append(lineTop);  
  37.     profile.Append(lineLeft);  
  38.   
  39.     List<CurveLoop> loops = new List<CurveLoop>();  
  40.     loops.Add(profile);  
  41.   
  42.     XYZ vector = new XYZ(0, 0, 1);  
  43.     Solid solid = GeometryCreationUtilities.CreateExtrusionGeometry(loops, vector, 10);  
  44.   
  45.   
  46.   
  47.     FilteredElementCollector collector = new FilteredElementCollector(doc);  
  48.     ElementIntersectsSolidFilter solidFilter = new ElementIntersectsSolidFilter(solid);  
  49.     collector.WherePasses(solidFilter);  
  50.   
  51.     sel.Elements.Clear();  
  52.     //Add these interseting element to the selection  
  53.     foreach (Element elem in collector)  
  54.     {  
  55.       sel.Elements.Add(elem);  
  56.     }  
  57.   
  58.     trans.Commit();  
  59.     return Result.Succeeded;  
  60.   }  
  61. }  
复制代码
请看我的一个过滤器专题讲座提到的如何使用上面的方法 http://blog.csdn.net/joexiongjin/article/details/6792174

叶雄进

转载请注明出处: http://blog.csdn.net/joexiongjin/article/details/7280419

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对

相关帖子

工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-25 06:36

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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