李磊 羅文


摘 ? 要:Revit是我國(guó)建筑業(yè)BIM體系中使用最廣泛的軟件之一。但是Revit模型加載渲染的時(shí)間較長(zhǎng),需要通過相應(yīng)的模型查看器進(jìn)行查看,缺乏便捷性和易操作性。Revit軟件支持的導(dǎo)出格式并不能滿足人們輕量化查看的需求,自定義模型導(dǎo)出加Web顯示使得隨時(shí)查看模型成為可能。可以導(dǎo)出為常見的WebGL可加載三維模型格式,如josn,obj,collada等格式。文章對(duì)此展開分析。
關(guān)鍵詞:Revit;模型導(dǎo)出;WebGL
1 ? ?意義
Revit導(dǎo)出BIM模型支持多種導(dǎo)出格式,如CAD格式、DWF格式、圖像文件等,便于模型的格式轉(zhuǎn)換,以實(shí)現(xiàn)多種查看方式。CAD,DWF等格式需要相關(guān)模型查看器的支持才能對(duì)模型進(jìn)行使用,且導(dǎo)出的模型體積大、導(dǎo)出時(shí)間長(zhǎng),不利于非相關(guān)專業(yè)人員的操作,并不符合易上手、輕量、快速的需求。自定義導(dǎo)出模型的實(shí)現(xiàn),有助于根據(jù)實(shí)際需求導(dǎo)出模型,具有針對(duì)性與靈活性等特點(diǎn),在實(shí)際工程領(lǐng)域有很大的實(shí)用意義。
2 ? ?Revit二次開發(fā)
Revit在具有強(qiáng)大功能的同時(shí),還提供了豐富的應(yīng)用程序接口API。用戶可以通過API來集成其他應(yīng)用程序或者使用API來二次開發(fā)自己的應(yīng)用程序,操縱和訪問Revit。本次開發(fā)采用C#,利用C#進(jìn)行Revit開發(fā)能方便地利用其完整且豐富的類庫(kù)設(shè)計(jì)出跨平臺(tái)的軟件[1]。
Revit API將其規(guī)范和機(jī)制封裝在兩個(gè)程序集中[2]:Revit API.dll程序集中包含了訪問Revit數(shù)據(jù)庫(kù)級(jí)別的外部應(yīng)用的接口;Revit APIUI.dll包含了所有操作和定制Revit UI的接口,如IExternalCommand,IExternalApplication相關(guān)接口。用戶需要將IExternalCommand,IExternalApplication和IExternalDBApplication接口實(shí)現(xiàn),才能完成通過Revit API來訪問和擴(kuò)展Revit。
3 ? ?自定義導(dǎo)出格式
以JSON格式作為例子來實(shí)現(xiàn)自定義導(dǎo)出過程,其他格式流程基本相似。
自定義數(shù)據(jù)結(jié)構(gòu)作為導(dǎo)出模型的容器JsonModel,依照Three.js可加載JSON格式,JsonModel部分代碼如圖1所示。
其中,Geometry和Material結(jié)構(gòu)包括UUID,name,Type等普通屬性,Geometry還包含頂點(diǎn)屬性、法向量與面屬性。Material包含顏色、透明度等屬性,可根據(jù)實(shí)際需求構(gòu)建。若干Geometry和Material構(gòu)成mesh類,一個(gè)Group類表示Revit模型中的一個(gè)實(shí)體,包含多個(gè)children,由mesh構(gòu)成。
在自定義導(dǎo)出JSON時(shí),通過實(shí)現(xiàn)IExportContext提供的語(yǔ)境接口,自定義一個(gè)格式轉(zhuǎn)換語(yǔ)境JsonExportContext,將其作為參數(shù)傳給CustomExporter,產(chǎn)生一個(gè)輸出設(shè)備來觸發(fā)格式轉(zhuǎn)換過程。
4 ? ?三維模型導(dǎo)出實(shí)現(xiàn)
通過自定義IExportContext的方法能夠?qū)崿F(xiàn)對(duì)幾何數(shù)據(jù)、材質(zhì)和模型對(duì)象的格式轉(zhuǎn)換[3]。
(1)Start()在模型導(dǎo)出方法還未進(jìn)行時(shí)調(diào)用,在此時(shí)可以對(duì)組棧、族類型棧、數(shù)據(jù)字典等進(jìn)行初始化獲得一片存儲(chǔ)空間。建立一個(gè)Scene對(duì)象作為元素的容器,將其放進(jìn)組棧中。
(2)OnElementBegin ()用于加載元素,一個(gè)元素可能由多個(gè)多邊形網(wǎng)格組成,也可能由不同的實(shí)例構(gòu)成。Element是revit其他模型結(jié)構(gòu)的基類。
(3)OnInstanceBegin()用于加載實(shí)例。一個(gè)實(shí)例包含許多的多邊形網(wǎng)格,共同組成實(shí)例對(duì)象,所以需要建立一個(gè)實(shí)例鏈表,用于存儲(chǔ)網(wǎng)格對(duì)象。部分代碼如圖2所示。
TransformToArray(Transform transform, double[] matrix)是自定義的坐標(biāo)格式轉(zhuǎn)換方法,用于獲取與節(jié)點(diǎn)相關(guān)的轉(zhuǎn)換矩陣并實(shí)現(xiàn)存儲(chǔ)。其中,Transform是Revit二次開發(fā)的坐標(biāo)轉(zhuǎn)換矩陣,從模型空間的位置合方向構(gòu)建出來。3個(gè)向量(BasisX,BasisY,BasisZ)和原點(diǎn)提供了所有的變換信息。獲取幾何信息流程如圖3所示。
(1)OnMaterial()主要用于加材質(zhì)數(shù)據(jù)。將獲取的材質(zhì)id在材質(zhì)數(shù)據(jù)字典中進(jìn)行查找,如果找到,則直接調(diào)用;如果沒有找到,創(chuàng)建一個(gè)新的材質(zhì)對(duì)象,將當(dāng)前節(jié)點(diǎn)的材質(zhì)數(shù)據(jù)存儲(chǔ)到對(duì)象中,將這個(gè)對(duì)象加入materials的數(shù)據(jù)鏈表中,并在數(shù)據(jù)字典中添加新的匹配項(xiàng)。
(2)OnPolymesh()主要用于幾何對(duì)象的格式轉(zhuǎn)換。通過id在幾何數(shù)據(jù)的字典中進(jìn)行查找,如果找到,則直接引用,將幾何數(shù)據(jù)和材質(zhì)id進(jìn)行關(guān)聯(lián),添加網(wǎng)格對(duì)象;如果沒有找到,需要對(duì)幾何數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換,然后再進(jìn)行關(guān)聯(lián)。在建立網(wǎng)格時(shí),節(jié)點(diǎn)提供了幾何拓?fù)渌枰娜啃畔ⅲ瑢?dǎo)出器能夠讀取其支持的點(diǎn)和法向量等,并轉(zhuǎn)換成需要導(dǎo)出的格式。圖3為OnPolymesh()方法的流程。
在幾何數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換時(shí),根據(jù)PolymeshTopology.DistributionOfNormals指出的法向量分布方式不同,選擇不同的轉(zhuǎn)換格式。法向量有3種分布方式:在頂點(diǎn)處表示,三角網(wǎng)格面和整個(gè)面用法向量表示。在導(dǎo)出幾何數(shù)據(jù)時(shí),需要將頂點(diǎn)坐標(biāo)、法向量、面進(jìn)行導(dǎo)出。
(1)OnInstanceEnd()用于實(shí)例加載完成的時(shí)候,方法實(shí)現(xiàn)與元素加載結(jié)束時(shí)相同,如果實(shí)例中包含子節(jié)點(diǎn),則將其作為元素對(duì)象的子節(jié)點(diǎn)進(jìn)行存儲(chǔ),否則丟棄。
(2)OnElementEnd()用于元素加載完成的時(shí)候,在方法中判斷棧中元素是否導(dǎo)出結(jié)束,加以處理。
(3)Finish()用于整個(gè)導(dǎo)出過程的最后,此時(shí)模型已經(jīng)完成了格式基本轉(zhuǎn)化,各個(gè)屬性和屬性值之間為鍵值對(duì)的形式。一個(gè)完整模型的數(shù)據(jù)此時(shí)被裝在model中,所以需要將model中的數(shù)據(jù)進(jìn)行序列化,轉(zhuǎn)換為字符串寫入本地存儲(chǔ)區(qū)。
至此自定義導(dǎo)出結(jié)束。
5 ? ?結(jié)語(yǔ)
以上Revit三維模型自定義導(dǎo)出實(shí)現(xiàn)了依照需求靈活導(dǎo)出模型結(jié)構(gòu),可用于前端可視化、模型壓縮等方向。并且該導(dǎo)出過程并不局限于JSON格式,解決了Revit自有模型缺乏便捷性和易操作性等問題。在導(dǎo)出過程中壓縮模型是一個(gè)可以繼續(xù)研究的方向。本過程的實(shí)現(xiàn)具有實(shí)際工程應(yīng)用價(jià)值與理論價(jià)值。
[參考文獻(xiàn)]
[1]宦國(guó)勝.API開發(fā)指南—Autodesk Revit[M].北京:中國(guó)水利水電出版社,2016
[2]陳志楊,羅飛.基于WebGL的Revit三維建筑模型重建[J].浙江工業(yè)大學(xué)學(xué)報(bào),2016(6):608-613.
[3]歐特克.Autodesk Revit二次開發(fā)基礎(chǔ)教程[M].上海:同濟(jì)大學(xué)出版社,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