張毅 趙京勝 神洲


關鍵詞 標準 存儲格式 優化
1引言
BIM 全稱“Building Information Modeling”,即建筑信息模型,其是建筑學、工程學及土木工程的新工具,由Autodesk 公司率先提出,已經在全球范圍的建筑業內得到廣泛認可。它可以形容以三維圖形為主,與物件導向、建筑學有關的電腦輔助設計。在BIM 建筑數據傳遞的過程中,各種專業和各種BIM 數據描述形式都存在差異,如IFC 格式數據中的一種交換格式被廣泛應用于各種建筑領域的數據傳遞[1] 。
三維模型輕量化主要包含兩個方面,即模型輕量化顯示和模型文件轉換[2] 。常見的模型處理方法有:(1) 圖元合并,其應用于大模型結構比較復雜,頂點、面比較數據比較大,可以通過算法和根據權重剔除相應的頂點、面,從而到達輕量化模型效果;(2)場景八叉樹劃分,八叉樹可以快速剔除不可見圖元,減少進入渲染區域的繪制對象;(3)幾何對象構件對象化,即相同形狀的幾何對象不做多次拷貝,大模型相同幾何體只做一個加載,只做相同模型構件移動、旋轉、縮放,最終模型文件和瀏覽器內存得以明顯減小;(4)Lod,即模型可以設置Lod,根據距離、級別差異加載不同復雜度的結構模型;(5)模型文件壓縮,即三維模型stl、obj、3ds、obj、json 等文件格式算法壓縮。
2IFC在建筑領域中的應用
目前,IFC 標準格式文件通常為特定的商業交易雙方交換信息[3] 。同時,IFC 標準格式文件可以歸檔項目信息,它的應用頻率會在設計、采購和施工階段逐步增加,并作為長期保存和運營目的的“竣工”信息集合。建筑信息建模工具軟件供應商包括模型創作、設計、模擬和分析、查看等,將為最終用戶提供接口,以某種IFC 格式導出、導入和傳輸數據[4] 。國內在基于IFC 標準的基礎上做了大量工作,如4D 施工管理系統、智能建筑消防管理系統、IFC 建筑幾何表達等。此外,也有不少學者探索利用WebGL 技術建設建筑平臺,如拱壩工程的三維可視化網絡平臺、WebGL 與IFC 的建筑可視化分析方法等。
3IFC格式說明
若對IFC 文件進行存儲上的優化,首先就要了解IFC 文件的構成。IFC 模型文件存儲的層次結構與DIKW 體系類似,其中包含資源層(Resource Layer)、核心層(Kernel Layer)、交互層(Shared Layer)和領域層(Domain Layer)四個層次。各層次結構內的實體之間既可以相互引用屬性,也可以被上層結構引用,但一般不允許下層結構引用,即引用實體資源原則上只能自上而下,或在同層進行。
資源層(Resource Layer)是IFC 文件存儲中的基礎層。其主要存儲在建造建筑過程中產生的基本實體對象和具體結構數據。核心層(Kernel Layer) 是IFC 文件存儲中的第二層。其是實體與實體之間的數據進行描述的關鍵。交互層(Shared Layer)是IFC 模型文件存儲的第三層。其是實現不同的建筑三維設計軟件的數據交換的關鍵,相關數據只可被同屬于該層的數據引用或是被領域層引用,而交互層不能直接引用核心層和資源層的相關數據。領域層(DomainLayer)是IFC 文件存儲中的頂層。其屬于專業性的數據層,具有各個專業的特征和屬性,如在IFC 手冊中就定義了建筑、電力、基礎、結構、設備等9 個專業化的數據領域集的數據。
4優化算法的實現
優化IFC 文件的主要目的是減小IFC 文件的大小,因為在實際的存儲中IFC 文件非常大[5] 。造成該問題的主要原因是重復的實體實例的出現。為了優化算法,本文采用幾何對象構件化,且相同形狀的幾何對象不做多次拷貝,大模型相同幾何體只做一個加載,只做相同模型構件的移動、旋轉、縮放。
首先,對任一IFC 文件進行IFC 實體出現頻率分析,并繪制實體頻率直方圖(圖1)。根據實體頻率直方圖,明顯可以看出存在大量的重復出現的IFC 實體對象。
為了分析該IFC 文件,可以抽取任一相同實體,如抽取的實體為零件加勁板IfcDiscreteAccessory,其除了ID 和位置信息外與其他實體的屬性都相同(圖2),換言之所有實體都可以簡化為三個實體,然后進行不同的坐標轉化,即為另外一個實體。
根于上述特性,我們可以選用圖3 的拓撲排序(Topological sort) 根據節點的依賴關系對圖進行排序。這表明在圖層次結構中沒有父節點或父節點最高的節點將是已排序列表的第一個節點。因此,由于一些節點可以是兄弟節點,所以同一個圖有幾種可能的拓撲排序,并且它們在圖中具有相同的層次位置。
對IFC 文件中的實體實例進行逐行定義(圖4),節點引用其他節點,保持“依賴性較低”的實體排序,以消除重復的實體是一個很好的解決方案。因此,最獨立的實體被排在第一位,下一個實例便可以引用它們。
我們參照IFC 文件里的一個實體之間的引用關系,文件行中的#1 和#3 的IFCCARTESIANPOINT 的內容一致,可以相互替換使用,通過實例的id 來調用它們,#1 將被存儲并添加到新文件中。當#3 出現時,它將被映射到已經注冊的類似實例,所以是#1。在#4處,使用#3 作為實例映射中的鍵,該鍵被映射到#1,因此在存儲文件的過程中,就可以減少一個存儲的IFC實體對象,此方法基于拓撲排序的邏輯處理。因此,由于一些節點可以是兄弟節點,所以同一個圖有幾種可能的拓撲類型,并且由于它們在圖中具有相同的層次位置(或程度),因此它們仍然屬于排序的思想。
在IfcOpenShell 中,map_value 函數允許遞歸遍歷實體實例的屬性值。它接受一個IFC 實例的屬性作為輸入:如果屬性是一個列表或元組,那么它將遞歸地調用自己;如果屬性是python 值,那么它將輸出該值,屬性則引用另一個IFC 實例。
首先,map_value 函數可以是一個等價于基本python 類型的IFC 實例,如IfcBoolean 或IfcInteger。在該情況下,通過重新創建索引為0 的實體及其值來返回。在其他情況下,當屬性是一個IFC 實例時,map_value 函數將創建該屬性。但是,map_value 函數是通過在instance_mapping 映射變量中取其值來創建的,由于實體已經按照拓撲排序進行了排序,因此可以肯定引用已經注冊。否則,若沒有拓撲排序,實體將不能確定地注冊。#1 將被存儲并添加到新文件中,#2 相同與其一致。當#3 出現時,它將被映射到已經注冊的類似實例,所以是#1。在#4 處,map_value 函數將使用#3 作為實例映射中的鍵,該鍵被映射到#1,因此#1 將被添加到新文件中,而不是#3。
按照上述方法處理IFC 文件來對比實體出現頻率,該IFC 文件過濾了大量的冗余實體,因此文件存儲體積減小。
5結論