好久没有更新博客了,刚开始定的目标是一个月写四篇,这也是叶大神当时给自己定的目标,听起来很容易实现,然而一个月过了以后我都不记得还有博客了……很多东西看起来简单,难在持之以恒。今年无论是工作上还是生活上事情太多,完全打乱了我的节奏。
下面进入本篇的主题,在Revit API中有一些类的功能比较特殊,它能够解决一些非常棘手的问题,但是这些类的命名方式和其他类有比价大的区别,因此这些功能往往隐藏得比较深,不深入探索一下都不会知道API原来还有这样的功能。笔者有时也不知不觉造了好多车轮子以后才发现API竟然提供了相应的功能,只能吐一口老血。
本篇要讲的是ExporterIFCUtils这个类,这是一个毫不起眼的类,甚至不再Revit.DB的Assembly中,因为我没有想要导出IFC,所以也从对它未给予过重视。今天才发现其中有很多通用功能,并不完全是基于导出IFC设定的。其中包括获取墙立面轮廓线和墙洞口轮廓线的功能,这两个功能要通过几何分析来实现的话着实是一件让人蛋疼的工作。
获取门窗洞口
- GetInstanceCutoutFromWall
1
2
3
4
5
6public static CurveLoop GetInstanceCutoutFromWall(
Document pADoc,
Wall pVWall,
FamilyInstance pFamInst,
out XYZ pCutDir
)
门窗的几何中包含了门框、窗框的信息,而对建筑设计来说洞口的尺寸往往更重要,而要通过几何分析把洞口的尺寸找出来是很费劲的,比如通过墙的几何可以获取洞口,但是这个洞口属于哪个门窗需要进一步的几何判断。这个GetInstanceCutoutFromWall()获取的刚好就是洞口的轮廓线,返回一个CurveLoop对象。1
2
3
4
5
6
7
8
9Wall wall = door.Host as Wall;
Document doc = door.Document;
XYZ dir = wall.Orientation;
CurveLoop curveLoop = ExporterIFCUtils.GetInstanceCutoutFromWall(
doc, wall, door, out dir);
foreach (Curve curve in curveLoop)
{
doc.Create.NewModelCurve(curve, SketchPlane.Create(doc, new Plane(dir, curve.GetEndPoint(0))));
}
调用方式非常简洁直观,下边是得到的窗户的轮廓线。
获取墙立面轮廓
- GetDoor2DArcsFromFamily
1
2
3public static IList<CurveLoop> GetElevationProfile(
Wall pVWall
)
这个方法意外地不能执行,报错信息是Autodesk.Revit.Exceptions.ArgumentException: The wall does not have an elevation profile.墙没有立面轮廓,很奇怪,因此要获取墙立面目前来看只能通过几何分析的方式。BuildingCoder有详细的解决方案。
其他有趣的功能
- GetDoor2DArcsFromFamily
获取门在二维视图中标示开启方向的指示弧线。
- SortCurveLoops
可以区分轮廓线的“里”“外”。