Revit API 查找房间内构件

需求:算量时装饰等类的构件需统计房间信息,水电等类的构件统计所在系统。
主要方法:得到房间Solid,然后通过Solid过滤出与其相交的构件。从而判断构件所在房间,跨房间的构件通过窗体显示出来,由用户判断所在房间。
首先,API中有个内置参数为BuiltInParameter.ELEM_ROOM_NAME,可以直接获取房间名称。目前来看,普通族可以获取的此参数,而墙体、水管等系统族没有此参数。而且如果是跨房间构件,该参数为空,其可信度较高。
接下来,获取房间边界。可以通过BoundarySegment获取到想要的Curve及ElementId。房间边界包括四种构件类型:
  • 模型线
  • 屋顶
房间中心的墙体需要在属性中,将房间边界属性设置为False,否则将被看做是房间边界。对比效果如图1所示:
图1
在放置房间前,通过设置“房间计算面积”(图2所示)选项,可以改变房间边界的位置。

                                                        图2
该设置在API中对应的枚举为:SpatialElementBoundaryLocation Enumeration。具体说明如图3所示:

                                                                      图3
如果不设置的话,默认的应该是Finish,因为也要查找墙体中的构件,这样可能导致丢东西,所以要设置为Center。对比图由图4所示:

                                                                                      图4
获取边界:
var boundryListList = room.GetBoundarySegments(new SpatialElementBoundaryOptions() {SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Center});
创建房间拉伸体:
var high = room.get_Parameter(BuiltInParameter.ROOM_UPPER_OFFSET).AsDouble();
var low = room.get_Parameter(BuiltInParameter.ROOM_LOWER_OFFSET).AsDouble();
var solid = GeometryCreationUtilities.CreateExtrusionGeometry(listCurveLoop, XYZ.BasisZ, high - low);
需要注意的是:如果创建拉伸体时,必须确保CurveLoop是闭合的,而通过房间边界获取的Curve可能闭合,需要单独处理下,确保其是闭合的。
后来查找资料时才得知还有另一种方法,可以通过SpatialElementGeometryCalculator直接获取房间的Solid,代码如下:var calculator = new SpatialElementGeometryCalculator(doc, new SpatialElementBoundaryOptions() {SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Center}));var solid= calculator.CalculateSpatialElementGeometry(room)?.GetGeometry();
得到Solid后,就可以通过ElementIntersectsSolidFilter过滤出相交构件后,即可筛选出想要的构件:
var list = new FilteredElementCollector(doc).WhereElementIsNotElementType().WherePasses(new ElementIntersectsSolidFilter(solid)).ToList();
如果对准确性要求不高的话,还可以直接通过构件Location获取到坐标进行判断:
room.IsPointInRoom();
doc.GetRoomAtPoint();

参考资料:
  1. http://help.autodesk.com/view/RVT/2016/CHS/?guid=GUID-296B8B21-776F-4CA5-9541-4C9AC4FB1BD7
  2. http://thebuildingcoder.typepad.com/blog/2013/10/determining-a-room-boundary-segment-generating-element.html
  3. https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/Revit-API/files/GUID-E7B451BB-21DC-4D72-AD26-75F0C2E911E4-htm.html
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值