Revit API - ExporterIFCUtils获取墙洞口及轮廓线

好久没有更新博客了,刚开始定的目标是一个月写四篇,这也是叶大神当时给自己定的目标,听起来很容易实现,然而一个月过了以后我都不记得还有博客了……很多东西看起来简单,难在持之以恒。今年无论是工作上还是生活上事情太多,完全打乱了我的节奏。

下面进入本篇的主题,在Revit API中有一些类的功能比较特殊,它能够解决一些非常棘手的问题,但是这些类的命名方式和其他类有比价大的区别,因此这些功能往往隐藏得比较深,不深入探索一下都不会知道API原来还有这样的功能。笔者有时也不知不觉造了好多车轮子以后才发现API竟然提供了相应的功能,只能吐一口老血。

本篇要讲的是ExporterIFCUtils这个类,这是一个毫不起眼的类,甚至不再Revit.DB的Assembly中,因为我没有想要导出IFC,所以也从对它未给予过重视。今天才发现其中有很多通用功能,并不完全是基于导出IFC设定的。其中包括获取墙立面轮廓线和墙洞口轮廓线的功能,这两个功能要通过几何分析来实现的话着实是一件让人蛋疼的工作。

获取门窗洞口

  • GetInstanceCutoutFromWall
    1
    2
    3
    4
    5
    6
    public static CurveLoop GetInstanceCutoutFromWall(
    Document pADoc,
    Wall pVWall,
    FamilyInstance pFamInst,
    out XYZ pCutDir
    )

门窗的几何中包含了门框、窗框的信息,而对建筑设计来说洞口的尺寸往往更重要,而要通过几何分析把洞口的尺寸找出来是很费劲的,比如通过墙的几何可以获取洞口,但是这个洞口属于哪个门窗需要进一步的几何判断。这个GetInstanceCutoutFromWall()获取的刚好就是洞口的轮廓线,返回一个CurveLoop对象。

1
2
3
4
5
6
7
8
9
Wall 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
    3
    public static IList<CurveLoop> GetElevationProfile(
    Wall pVWall
    )

这个方法意外地不能执行,报错信息是Autodesk.Revit.Exceptions.ArgumentException: The wall does not have an elevation profile.墙没有立面轮廓,很奇怪,因此要获取墙立面目前来看只能通过几何分析的方式。BuildingCoder有详细的解决方案。

其他有趣的功能

  • GetDoor2DArcsFromFamily

获取门在二维视图中标示开启方向的指示弧线。

  • SortCurveLoops

可以区分轮廓线的“里”“外”。

文章目录
  1. 1. 获取门窗洞口
  2. 2. 获取墙立面轮廓
  3. 3. 其他有趣的功能