Revit二次开发:由房间获取房间的墙

 
 

之前用的方法是由房间边界构成的Solid,计算与该Solid相交的Element,然后判断是否为墙。相对来说这个方法比较通用,可以检索出房间的楼板、窗户等各种构件。

SpatialElementBoundaryOptions se=new SpatialElementBoundaryOptions();
se.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Center;
SpatialElementGeometryCalculator calculator =new SpatialElementGeometryCalculator(document,se);
Solid solid = calculator.CalculateSpatialElementGeometry(room)?.GetGeometry();
var list = new FilteredElementCollector(document).WhereElementIsNotElementType().
WherePasses(new ElementIntersectsSolidFilter(solid)).ToList();

foreach (var element in list)
{
Wall wall=element as Wall;
if (wall!=null)
{
wallsOfRoom.Add(wall);
}
}

只是找墙的话,其实用BoundarySegment.ElementId,就可以直接得到构成这个边界部分的元素(墙)。

IList<IList<BoundarySegment>> loops = room.GetBoundarySegments(new SpatialElementBoundaryOptions());

foreach (IList<BoundarySegment> loop in loops)

{
foreach (BoundarySegment segment in loop)
{
Wall wall =document.GetElement(segment.ElementId) as Wall;
if (wall != null)
{
wallsOfRoom.Add(wall);
}
}
}

  •  碰撞检测:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    using Autodesk.Revit.UI;
    using Autodesk.Revit.Attributes;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI.Selection;//类Selection使用

    namespace Collision
    {
    [TransactionAttribute(TransactionMode.Manual)]
    [RegenerationAttribute(RegenerationOption.Manual)]
    public class Class1 : IExternalCommand
    {
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
    UIDocument uiDoc = commandData.Application.ActiveUIDocument;
    Document doc = uiDoc.Document;
    Transaction trans = new Transaction(doc,"Excomm");
    trans.Start();

    Selection select = uiDoc.Selection;
    Reference r = select.PickObject(ObjectType.Element, "选择需要检查的墙");
    Element column = doc.GetElement(r);
    FilteredElementCollector collect = new FilteredElementCollector(doc);

    //ElementIntersectionFilter冲突检查
    ElementIntersectsElementFilter iFilter = new ElementIntersectsElementFilter(column,false);
    collect.WherePasses(iFilter);
    List<ElementId> excludes = new List<ElementId>();
    excludes.Add(column.Id);
    collect.Excluding(excludes);
    List<ElementId> ids = new List<ElementId>();
    select.SetElementIds(ids);

    foreach(Element elem in collect)//遍历每一个元素
    {
    ids.Add(elem.Id);//将elem的Id添加到List中
    }
    select.SetElementIds(ids);
    trans.Commit();

    return Result.Succeeded;
    }
    }

    }

    筛选出和该元素相交的元素之BoundingBoxIntersectsFilter

    //假设元素为ee

    BoundingBoxXYZ box = ee.get_BoundingBox(doc.ActiveView);
    //创建outline,通过boundingboxintersect过滤器
    Outline myOutLn = new Outline(box.Min, box.Max);
    BoundingBoxIntersectsFilter boxee = new BoundingBoxIntersectsFilter(myOutLn);
    FilteredElementCollector collector = new FilteredElementCollector(doc);

    //过滤出相交元素,假设用到的是板类型

    IList<Element> elements = collector.OfClass(typeof(Floor)).WherePasses(boxee).ToElements();

revit 碰撞检测相关的更多相关文章

  1. 实例介绍Cocos2d-x物理引擎:碰撞检测

    碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件,EventListenerPhysicsCo ...

  2. 【Revit API】梁构件支座检查算法

    一.前言         应该是第二次写关于Revit API的博文了.虽然在BIM企业中工作,从事桌面BIM软件开发,但是我是不怎么喜欢写Revit API相关的代码.平时更多的是在写界面展示,架构 ...

  3. Cocos2d-三维拾取Ray-AABB碰撞检测算法【转】

    1.三维拾取技术 在3D游戏中通常会有这样的需求,用户可以选取3D世界中的某些物体进行如拖拽等操作,这时便需要程序通过将二维屏幕上的点坐标转换为三维世界中的坐标,并进行比对,这个过程就需要用到三维拾取 ...

  4. UE4事件相关总结

    转自:http://blog.ch-wind.com/ue4-event-overview/ 事件机制是实现游戏内逻辑的重要部分,在开始进行游戏逻辑的设计和实现之前,对UE4的事件机制进行理解是非常必 ...

  5. JAVA小游戏之两个物体碰撞产生的碰撞检测

    首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战.看起来很简单,但是写起代码来,复杂的要多: 下面举个例子: // 构造一个新的 Rectangle,其左上角的坐标为 ( ...

  6. Java游戏之碰撞检测

    在进行Java游戏开发时,我们经常会遇到碰撞检测的问题.如坦克大战中,炮弹与坦克相遇发生爆炸:守卫者游戏中,守卫者发射的箭与怪物相遇使怪物失血:打飞机游戏中,飞机发送的子弹与敌机相遇干掉敌机.这些都需 ...

  7. Revit安装失败怎样卸载重新安装Revit,解决Revit安装失败的方法总结

    技术帖:Revit没有按照正确方式卸载,导致Revit安装失败.楼主也查过网上关于如何解决Revit安装失败的一些文章,是说删除几个Revit文件和Revit软件注册表就可以解决Revit安装失败的问 ...

  8. 踏上Revit二次开发之路 1 准备工作

    1 准备工作 工欲善其事,必先利其器.在正式开始之前,我觉得有必要先盘点一下需要准备些什么. 1.1 硬件设备 PC机一台(谢绝Apple). 配置不能太低,至少要i3以上的cpu.4g以上的内存和支 ...

  9. 嵌入式单片机STM32应用技术(课本)

    目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...

随机推荐

  1. Nodejs入门级

    应用不同模块分析 我们来分解一下这个应用,为了实现一个应用,我们需要实现哪些部分呢? 我们需要提供Web页面,因此需要一个HTTP服务器 对于不同的请求,根据请求的URL,我们的服务器需要给予不同的响 ...

  2. linux cgroups简介(上)

    Linux CGroups简介 1.CGroups是什么 与Linux namespace对比来看,Linux namespace用来限制进程的运行范围或者运行环境的可见性,比如:uts限制进程读取到 ...

  3. Apache/Nginx的web网页访问加密

  4. (一)MongoDB安装

    (一)MongoDB安装 mongodb 2018年03月06日 15时53分29秒 安装准备 启动mongodb 1.命令行参数启动 2.从配置文件启动 使用服务启动mongodb 参数解释 用户授 ...

  5. flask通过nginx代理后base_url拿不到正确的url_scheme2016-04-14 12:31

    http://www.axiaoxin.com/article/210/ Nginx配置了https请求后,用户发起https请求时首先和Nginx建立连接,完成SSL握手,而后Nginx作为代理是以 ...

  6. which had no Root Element. This likely means the XML is malformed or missing

    今天按照古月老师的步骤,想在RViz中配置插件. 按步骤做下来后,一运行,出现如下错误: [E[ERROR] [1523370744.057263390]: Skipping XML Document ...

  7. python连接redis哨兵集群

    一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度 二.python 连接 redis 哨兵集群 1. 安装redis包 pip install redis 2 ...

  8. Caching POST-post是否能缓存

    https://www.mnot.net/blog/2012/09/24/caching_POST One of the changes in Apple’s release of iOS6 last ...

  9. HDU6703 array

    [传送门] 比赛的时候想了半天的带修改主席树(其实之前只写过一次.),两个log甚至三个log都想了,自闭了五个小时还是不会实现.问了一下西瓜得到了一个非常妙的1 log解法.此处膜瓜

  10. MongoDB 命令速查表

    MongoDB  是一个面向文档可扩展的高性能开源数据库,典型的应用场景有网页数据,缓存,代替文档存储等. 命令的记忆和使用是一门基本功,这里准备了速查表,可以做案头手册. 库操作 切换或使用数据库 ...