Revit三维模型自定义导出与实现
2020-04-09李磊罗文
李磊 罗文
摘 要:Revit是我国建筑业BIM体系中使用最广泛的软件之一。但是Revit模型加载渲染的时间较长,需要通过相应的模型查看器进行查看,缺乏便捷性和易操作性。Revit软件支持的导出格式并不能满足人们轻量化查看的需求,自定义模型导出加Web显示使得随时查看模型成为可能。可以导出为常见的WebGL可加载三维模型格式,如josn,obj,collada等格式。文章对此展开分析。
关键词:Revit;模型导出;WebGL
1 意义
Revit导出BIM模型支持多种导出格式,如CAD格式、DWF格式、图像文件等,便于模型的格式转换,以实现多种查看方式。CAD,DWF等格式需要相关模型查看器的支持才能对模型进行使用,且导出的模型体积大、导出时间长,不利于非相关专业人员的操作,并不符合易上手、轻量、快速的需求。自定义导出模型的实现,有助于根据实际需求导出模型,具有针对性与灵活性等特点,在实际工程领域有很大的实用意义。
2 Revit二次开发
Revit在具有强大功能的同时,还提供了丰富的应用程序接口API。用户可以通过API来集成其他应用程序或者使用API来二次开发自己的应用程序,操纵和访问Revit。本次开发采用C#,利用C#进行Revit开发能方便地利用其完整且丰富的类库设计出跨平台的软件[1]。
Revit API将其规范和机制封装在两个程序集中[2]:Revit API.dll程序集中包含了访问Revit数据库级别的外部应用的接口;Revit APIUI.dll包含了所有操作和定制Revit UI的接口,如IExternalCommand,IExternalApplication相关接口。用户需要将IExternalCommand,IExternalApplication和IExternalDBApplication接口实现,才能完成通过Revit API来访问和扩展Revit。
3 自定义导出格式
以JSON格式作为例子来实现自定义导出过程,其他格式流程基本相似。
自定义数据结构作为导出模型的容器JsonModel,依照Three.js可加载JSON格式,JsonModel部分代码如图1所示。
其中,Geometry和Material结构包括UUID,name,Type等普通属性,Geometry还包含顶点属性、法向量与面属性。Material包含颜色、透明度等属性,可根据实际需求构建。若干Geometry和Material构成mesh类,一个Group类表示Revit模型中的一个实体,包含多个children,由mesh构成。
在自定义导出JSON时,通过实现IExportContext提供的语境接口,自定义一个格式转换语境JsonExportContext,将其作为参数传给CustomExporter,产生一个输出设备来触发格式转换过程。
4 三维模型导出实现
通过自定义IExportContext的方法能够实现对几何数据、材质和模型对象的格式转换[3]。
(1)Start()在模型导出方法还未进行时调用,在此时可以对组栈、族类型栈、数据字典等进行初始化获得一片存储空间。建立一个Scene对象作为元素的容器,将其放进组栈中。
(2)OnElementBegin ()用于加載元素,一个元素可能由多个多边形网格组成,也可能由不同的实例构成。Element是revit其他模型结构的基类。
(3)OnInstanceBegin()用于加载实例。一个实例包含许多的多边形网格,共同组成实例对象,所以需要建立一个实例链表,用于存储网格对象。部分代码如图2所示。
TransformToArray(Transform transform, double[] matrix)是自定义的坐标格式转换方法,用于获取与节点相关的转换矩阵并实现存储。其中,Transform是Revit二次开发的坐标转换矩阵,从模型空间的位置合方向构建出来。3个向量(BasisX,BasisY,BasisZ)和原点提供了所有的变换信息。获取几何信息流程如图3所示。
(1)OnMaterial()主要用于加材质数据。将获取的材质id在材质数据字典中进行查找,如果找到,则直接调用;如果没有找到,创建一个新的材质对象,将当前节点的材质数据存储到对象中,将这个对象加入materials的数据链表中,并在数据字典中添加新的匹配项。
(2)OnPolymesh()主要用于几何对象的格式转换。通过id在几何数据的字典中进行查找,如果找到,则直接引用,将几何数据和材质id进行关联,添加网格对象;如果没有找到,需要对几何数据进行格式转换,然后再进行关联。在建立网格时,节点提供了几何拓扑所需要的全部信息,导出器能够读取其支持的点和法向量等,并转换成需要导出的格式。图3为OnPolymesh()方法的流程。
在几何数据进行格式转换时,根据PolymeshTopology.DistributionOfNormals指出的法向量分布方式不同,选择不同的转换格式。法向量有3种分布方式:在顶点处表示,三角网格面和整个面用法向量表示。在导出几何数据时,需要将顶点坐标、法向量、面进行导出。
(1)OnInstanceEnd()用于实例加载完成的时候,方法实现与元素加载结束时相同,如果实例中包含子节点,则将其作为元素对象的子节点进行存储,否则丢弃。
(2)OnElementEnd()用于元素加载完成的时候,在方法中判断栈中元素是否导出结束,加以处理。
(3)Finish()用于整个导出过程的最后,此时模型已经完成了格式基本转化,各个属性和属性值之间为键值对的形式。一个完整模型的数据此时被装在model中,所以需要将model中的数据进行序列化,转换为字符串写入本地存储区。
至此自定义导出结束。
5 结语
以上Revit三维模型自定义导出实现了依照需求灵活导出模型结构,可用于前端可视化、模型压缩等方向。并且该导出过程并不局限于JSON格式,解决了Revit自有模型缺乏便捷性和易操作性等问题。在导出过程中压缩模型是一個可以继续研究的方向。本过程的实现具有实际工程应用价值与理论价值。
[参考文献]
[1]宦国胜.API开发指南—Autodesk Revit[M].北京:中国水利水电出版社,2016
[2]陈志杨,罗飞.基于WebGL的Revit三维建筑模型重建[J].浙江工业大学学报,2016(6):608-613.
[3]欧特克.Autodesk Revit二次开发基础教程[M].上海:同济大学出版社,2015.
Abstract:Revit is one of the most widely used BIM software in Chinas construction industry.However, Revit model takes a long time to load and render and needs to be viewed through the corresponding model viewer, which lacks convenience and operability.The export format supported by Revit software cannot meet peoples needs of lightweight viewing. Custom model export plus Web display makes it possible to view the model anytime and anywhere.It can be exported to common WebGL loadable 3d model formats such as josn, obj, collada, etc. This paper analyzes it.
Key words:Revit; model export; WebGL