Revit API: 自定义导出 CustomExporter

前言

在几年前,从 Revit 里面导出几何图形和数据一度非常火热,现在已经是成了 Revit API 开发领域的基本功了。
API 领域的大牛 Jeremy Tammik 早在2014年就发布了这个开源的项目,用于导出:https://github.com/va3c/RvtVa3c
另外,它还提供了在浏览器显示导出模型的工具,在这个 github 的 repo 里面有详细的介绍。

原理

数据最终是如何导出的,还是要去看它使用了哪些 Revit API。

CustomExporter

Autodesk.Revit.DB::CustomExporter,这个类实际上就是一个框架入口,你需要把你自己定义的导出方式传递给它。

/// 
/// 代码来自 Revit API SDK
/// 导出一个三维视图
/// 
internal void ExportA3DView(Document document, View a3DView)
{
     
   // 这个 MyExportContext 是你自己定义的类
   MyExportContext context = new MyExportContext(document);

   // 把你自己定义的这个 context 传给 CustomExporter
   CustomExporter exporter = new CustomExporter(document, context);

   // 做一些设置
   exporter.IncludeGeometricObjects = false;
   exporter.ShouldStopOnError = true;

   // 开始导出
   exporter.Export(a3DView);
}

MyExportContext

重点来了,作为外部开发者,可以控制的只有这个 MyExportContext
在 RvtVa3c, 在 https://github.com/va3c/RvtVa3c/blob/gh-pages/RvtVa3c/Va3cExportContext.cs#L28。
public class Va3cExportContext : IExportContext 可以看出需要实现 IExportContext 这个接口。

IExportContext

这个接口非常直白,几乎不需要解释。

namespace Autodesk.Revit.DB
{
     
    public interface IExportContext
    {
     
        void Finish();
        bool IsCanceled();
        RenderNodeAction OnElementBegin(ElementId elementId);
        void OnElementEnd(ElementId elementId);
        RenderNodeAction OnFaceBegin(FaceNode node);
        void OnFaceEnd(FaceNode node);
        RenderNodeAction OnInstanceBegin(InstanceNode node);
        void OnInstanceEnd(InstanceNode node);
        void OnLight(LightNode node);
        RenderNodeAction OnLinkBegin(LinkNode node);
        void OnLinkEnd(LinkNode node);
        void OnMaterial(MaterialNode node);
        void OnPolymesh(PolymeshTopology node);
        void OnRPC(RPCNode node);
        RenderNodeAction OnViewBegin(ViewNode node);
        void OnViewEnd(ElementId elementId);
        bool Start();
    }
}

除了这个接口,还有其它几个接口,比如这个为模型数据做特化的接口 IModelExportContext

namespace Autodesk.Revit.DB
{
     
    public interface IModelExportContext : IExportContext
    {
     
        RenderNodeAction OnCurve(CurveNode node);
        void OnLineSegment(LineSegment segment);
        RenderNodeAction OnPoint(PointNode node);
        RenderNodeAction OnPolyline(PolylineNode node);
        void OnPolylineSegments(PolylineSegments segments);
        void OnText(TextNode node);
    }
}

结论

做导出,实际并不复杂。复杂的是你的用户场景,你需要导出那些数据。另外,你的数据又要如何显示,如何使用等等。

你可能感兴趣的:(Revit,API)