我们在平时项目中经常会需要收集该楼层的所有房间并且获得其房间轮廓线去辅助完成其他的功能。
下面我们讲一下怎样子收集房间轮廓线:
//先获得当前的视图
View view = doc.ActiveView;
//然后再搜索再当前视图中的房间,案例选取其中的一个房间
Room room1 = new FilteredElementCollector(doc, view.Id).OfClass(typeof(SpatialElement)).Cast<Room>().FirstOrDefault();
//再新建一个CurveLoop把轮廓线连成一条线
CurveLoop cl = new CurveLoop();
SpatialElementBoundaryOptions opts = new SpatialElementBoundaryOptions();
// BoundarySegment是表示区域边界的对象
IList<IList<BoundarySegment>> blist = room.GetBoundarySegments(opts);
//案例选取其中的第一条轮廓线
IList<BoundarySegment> bsFlist = blist.First();
foreach (BoundarySegment bs in bsFlist)
{
//把线添加到CurveLoop中
cl.Append(bs.GetCurve());
}
SpatialElement类
是表示Revit模型中的封闭区域或体积的类,是房间、空间和面积的父类。因此收集房间的时候,直接用OfClass(typeof(Room))是会弹出错误的,房间的父类是SpatialElement,不是Room。
注意:收集房间轮廓的时候,会出现轮廓线不连续的问题。有可能是一下这种情况。
我们直接看上去墙是连续的。可是我们放大看会发现,其实墙不平行的,如下图:
当两个墙相差的距离10mm以内时,你会发现,房间的轮廓线并不是和墙边线重合的,可是我们收集出来的房间轮廓线是沿着墙边的。(红色的线条为收集出来的线条)
这样子就会存在一个误差的问题,导致在连接的时候出现线不重合的情况。我这里提供一个思路大家,如果在项目需求并不需要特别精确到毫米的时候,可以先收集到这些线,然后取线的起点,最后再重新连成一条线。
今天的分享就到这里了,对上面有什么疑问的,或者出错的,请直接在评论区指出,谢谢,希望对你有所帮助。