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. Python的Mixin

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826299.html 一:Mixin模式 Mixin编程是一种开发模式,是一种 将多个不同类中的功能单元的 ...

  2. 【使用DIV+CSS重写网站首页案例】步骤分析与代码实现

    使用DIV+CSS重写网站首页案例 步骤分析: 第一步:先定义一个大的 div(整个页面),然后嵌套 8 个小的 div(共八行): 第二步:(第一行)在第一个 div 里面嵌套 3 个小的 div: ...

  3. yum下载Zabbix4.0失败的解决方法

    根据官网说明配置的yum源,今天用yum下载Zabbix时莫名的报错,经过几番折腾,找到了解决方法. 一.报错如下: 二. 解决方法: [root@VM_0_6_centos ~]# cat /etc ...

  4. JS实现俄罗斯方块

    在80后.90后的儿时记忆里,俄罗斯方块是必备的消遣小游戏,它的玩法非常简单基本大家都懂,但如何用编程语言开发一款儿时同款「俄罗斯方块」,恐怕知道的同学就很少啦. 位置掩码和旋转掩码 俄罗斯方块游戏中 ...

  5. python预课04 列表,元祖,统计值计算示例,py文件转为EXE文件,爬虫初步学习

    列表,元组 #list l1 = [1, 2, 3, '高弟弟'] #定义一个列表 #增 l1.append("DSB") #最后增加"DSB"的元素 #删 l ...

  6. js里apply用法

    1.Function.apply,用于构造函数的继承,继承另外一个构建对象的属性与方法 function People(name,age){     this.name = name;     thi ...

  7. 使用apache 的FileUtils处理文件的复制等操作

    今日思语:春风很柔,夏风很烈,秋风清爽,东风凛冽,愿你就是春夏秋冬的风~ 平时对一些文件进行操作,比如说写文件,读文件,复制一个文件等,使用原生File操作需要读取源文件,生成流对象,再写入一个新的文 ...

  8. OKR究竟适不适合国内企业?

    某天见到知乎上有人提问,OKR在中国能行的通吗?细看下面的回复,多数人觉得大部分企业都是不适合的,他们认为让普通员工主动付出努力去达到更高的要求是不可能的,并且公司环境也不适合OKR的推行.但我却有不 ...

  9. .net core 原生支持grpc

    文章转自:https://grpc.io/blog/grpc-on-dotnetcore This is a guest post by Sourabh Shirhatti, a Program Ma ...

  10. mknod