Revit API 查找房间内构件

需求:算量时装饰等类的构件需统计房间信息,水电等类的构件统计所在系统。
主要方法:得到房间Solid,然后通过Solid过滤出与其相交的构件。从而判断构件所在房间,跨房间的构件通过窗体显示出来,由用户判断所在房间。
首先,API中有个内置参数为BuiltInParameter.ELEM_ROOM_NAME,可以直接获取房间名称。目前来看,普通族可以获取的此参数,而墙体、水管等系统族没有此参数。而且如果是跨房间构件,该参数为空,其可信度较高。
接下来,获取房间边界。可以通过BoundarySegment获取到想要的Curve及ElementId。房间边界包括四种构件类型:
  • 模型线
  • 屋顶
房间中心的墙体需要在属性中,将房间边界属性设置为False,否则将被看做是房间边界。对比效果如图1所示:
Revit API 查找房间内构件
图1
在放置房间前,通过设置“房间计算面积”(图2所示)选项,可以改变房间边界的位置。
Revit API 查找房间内构件
Revit API 查找房间内构件                                                       图2
该设置在API中对应的枚举为:SpatialElementBoundaryLocation Enumeration。具体说明如图3所示:
Revit API 查找房间内构件
Revit API 查找房间内构件                                                                     图3
如果不设置的话,默认的应该是Finish,因为也要查找墙体中的构件,这样可能导致丢东西,所以要设置为Center。对比图由图4所示:
Revit API 查找房间内构件
Revit API 查找房间内构件                                                                                     图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