劉穎華,解琳琳,李愛群,侯妙樂,劉浩宇
(1.北京未來城市設(shè)計高精尖創(chuàng)新中心,北京 100044;2.北京市建筑遺產(chǎn)精細重構(gòu)與健康監(jiān)測重點實驗室,北京 100044;3.北京建筑大學測繪與城市空間信息學院,北京 100044;4.北京建筑大學土木與交通工程學院,北京 100044)
古木建筑作為人類文明留存的一種方式,具有重要的價值,隨著時間的推移,會不可避免地產(chǎn)生以裂縫為典型代表的殘損。如何面向保護需求直觀記錄古木建筑的殘損現(xiàn)狀,是其安全性能評估與提升的重要基礎(chǔ),是歷史建筑科學保護與發(fā)展的重要前提。
近年來,建筑信息模型(building information modeling,BIM)的發(fā)展為建筑的科學表達和各類信息的集成提供了重要支撐[1-2]。結(jié)合BIM技術(shù)與文物遺產(chǎn)領(lǐng)域,在世界范圍內(nèi)逐漸形成了適用于歷史建筑的 BIM,稱為建筑遺產(chǎn)信息模型(historic building information modeling,HBIM)[3-4],HBIM 是如今歷史建筑數(shù)字化保護趨勢中的前沿技術(shù)[5]。鑒于古建筑殘損類型繁多、殘損程度不一的情況,在借用 HBIM 技術(shù)對殘損信息表達與信息集成更新時,面臨以下難題:
(1)殘損信息表達方面。歷史建筑在保存過程中會經(jīng)受各種各樣的破壞,構(gòu)件出現(xiàn)了很多損傷[6-7]。理論上應(yīng)盡可能對所有損傷信息進行詳細表達,然而在實際保護中由于工作量巨大而往往無法得到有效實施,更重要的是不同保護需求下(如搶救性保護和預(yù)防性保護),對不同程度損傷存在不同的認知和表達需求。以應(yīng)縣木塔為例,其二層明層出現(xiàn)了一定程度的傾斜,各類構(gòu)件出現(xiàn)了較大的裂縫,由于該類裂縫可能對結(jié)構(gòu)安全性能影響較大,應(yīng)予以精準的表達。對于其他樓層損傷則可采用相對簡單但偏于保守的表達方法。BIM 中的多層級(level of detail,LoD)模型可以有效解決該問題。然而目前對于木構(gòu)件,暫不存在相應(yīng)的多層級裂縫模型。
(2)信息集成方面。了解到目前遺產(chǎn)從業(yè)人員大都將調(diào)研信息記錄在外部數(shù)據(jù)庫(如電子表格或電子文檔)中,詳細的文本記錄有利于細致地了解歷史建筑信息,但缺乏直觀性。盡管BIM具有強大的信息集成功能,通過模型鏈接的屬性電子表可實現(xiàn)數(shù)據(jù)、文本等信息的科學管理[4],實現(xiàn)二維數(shù)據(jù)與三維模型之間的連通,彌補傳統(tǒng)方法的不足,但BIM自帶的屬性表不夠豐富,有必要梳理殘損特性,完善屬性表內(nèi)容,實現(xiàn)條理性的信息管理方法。
(3)信息持續(xù)更新方面。歷史建筑信息一方面可以用于驗證HBIM的合理性和可靠性,另一方面信息持續(xù)集成至模型中可服務(wù)于歷史建筑的全生命周期管理。目前HBIM的屬性電子表內(nèi)容,通常是采用手動方式錄入,自動化程度低。而古木建筑構(gòu)件數(shù)量眾多,并且由于價值極高需要持續(xù)采集數(shù)據(jù),導致數(shù)據(jù)量大且更新周期短,既有手動方法無法滿足古木建筑保護需求,因此亟需開發(fā)自動化算法實現(xiàn)古建筑信息在HBIM中的高效持續(xù)集成更新管理。
針對上述難題,本文以古木建筑裂縫損傷為例,基于《古建筑木結(jié)構(gòu)維護與加固技術(shù)規(guī)范》(以下簡稱《規(guī)范》)明確了裂縫的重要性程度,建議了裂縫信息多層級表達方法及其多層級參數(shù)化數(shù)學模型;梳理裂縫重要屬性,提出了基于Revit平臺的裂縫信息集成方法;在此基礎(chǔ)上,通過二次開發(fā),實現(xiàn)了裂縫信息在 HBIM 中的自動化集成更新與可視化展示。最后通過對典型古木建筑的裂縫信息表達與集成實驗驗證了該方法的可靠性和高效性(圖1)。
圖1 裂縫信息表達與集成更新研究流程圖
多層級表達方法是面向不同保護需求實現(xiàn)裂縫信息的留取和表達。以柱為例,我國《古建筑木結(jié)構(gòu)維護與加固技術(shù)規(guī)范》規(guī)定木柱裂縫可以根據(jù)最大裂縫寬度分為3類[8],對于裂縫寬度小于3 mm的構(gòu)件定義為輕度損傷,對于裂縫寬度介于3~30 mm之間的構(gòu)件定義為中度損傷;對于裂縫寬度大于30 mm的構(gòu)件定義為重度損傷。本文基于上述原則建議了一套裂縫損傷多層級表達標準(以下簡稱“標準”)及其參數(shù)化數(shù)學模型(表1)。
(1)LoD100,可表達所有殘損程度裂縫,采用色塊反映殘損等級,方便統(tǒng)計古木建筑整體構(gòu)件損傷程度情況,主要服務(wù)于預(yù)防性保護,分別采用藍色、黃色和紅色色塊表達輕度、中度和重度裂縫。
(2)LoD200,用于表達中度和重度裂縫,偏于保守反映裂縫的最大寬度(wmax)、最大深度(dmax)和長度(h)信息,將裂縫表達為三棱柱,可用于預(yù)防性保護和搶救性保護,如古木建筑抗震性能安全性評估。
(3)LoD300,用于表達重度裂縫,依據(jù)中國文化遺產(chǎn)研究院提出的裂縫數(shù)據(jù)采集要求,提供沿裂縫長度方向多處的裂縫寬度和深度信息,如距裂縫頂端長度為hi處的裂縫寬度和深度分別為wi和di,盡可能詳實的留存裂縫信息,主要用于搶救性保護。
表1 古木建筑柱子裂縫模型多LoD表達標準
對于歷史建筑,應(yīng)對其信息進行科學地集成管理。BIM的特色在于可集成豐富的信息,基于參數(shù)建立的三維 BIM 模型可以通過電子表格顯示該模型所關(guān)聯(lián)的所有對象及其相應(yīng)的參數(shù)與特性。在Revit軟件中,每個構(gòu)件模型都關(guān)聯(lián)了屬性選項卡,可以通過電子列表的方式管理構(gòu)件的詳細信息。本文結(jié)合古木建筑保護從業(yè)一線人員的保護需求,梳理了裂縫信息需要管理的屬性內(nèi)容,包括:①構(gòu)件的唯一識別碼;②裂縫信息描述文本文件;③最大裂縫寬度;④裂縫損傷程度。結(jié)合已有屬性選項卡選項和自定義屬性選項,本文重新定義了古木構(gòu)件的屬性,圖2為柱構(gòu)件的新屬性選項卡,即裂縫信息的集成方式。
圖2 裂縫信息集成方式
對于任一構(gòu)件,可按下述流程對其裂縫信息與HBIM模型進行集成管理:
(1)基于唯一構(gòu)件識別碼選取構(gòu)件,即“標記”屬性,在前期建立HBIM時需賦予每個構(gòu)件唯一識別碼;
(2)為構(gòu)件增加裂縫“寬度”和“殘損等級”屬性選項;
(3)在“注釋”屬性內(nèi)標注裂縫信息描述文本;
(4)提取“注釋”屬性中的裂縫最大寬度wmax(對于輕度損傷的構(gòu)件從“注釋”內(nèi)直接提取裂縫寬度值,對于中度損傷的構(gòu)件從“注釋”內(nèi)提取裂縫最大寬度值,對于重度損傷的構(gòu)件從“注釋”內(nèi)提取沿著裂縫長度方向最寬處的裂縫寬度值),并添加至“寬度”屬性;
(5)基于《規(guī)范》判定裂縫的損傷程度將結(jié)果添加至“殘損等級”屬性;
(6)以“殘損等級”作為過濾條件,對所有損傷程度的構(gòu)件按“標準”進行殘損等級色塊渲染。
圖3為一古木亭子柱裂縫信息集成及LoD表達的示意,從圖中可以看出基于HBIM技術(shù)可以直觀的展示裂縫損傷程度,并系統(tǒng)集成裂縫的相關(guān)信息。然而該方法目前通過手動完成,對于小體量的古木建筑可以采用手動方法,但對于以應(yīng)縣木塔為典型代表的大型古木建筑則會難以處理。更重要的是,信息與HBIM的集成大都是手動復制外部數(shù)據(jù)庫內(nèi)容添加至屬性,外部數(shù)據(jù)庫信息的更新無法在HBIM構(gòu)件屬性中實現(xiàn)同步更新。為解決上述不足,有必要在 Revit平臺上進行二次開發(fā)實現(xiàn)信息在HBIM 中的自動寫入、提取和更新渲染[9],實現(xiàn)歷史建筑信息的高效、持續(xù)更新集成。
圖3 古亭局部木柱裂縫信息集成結(jié)果
通過對Revit軟件進行二次開發(fā),可創(chuàng)建滿足裂縫信息自動更新需求的插件。插件使用時有3個應(yīng)用條件:①為每個構(gòu)件設(shè)定唯一識別碼;②TXT格式殘損信息文檔,文檔內(nèi)容包括構(gòu)件名稱、構(gòu)件唯一識別碼、構(gòu)件殘損情況(固定格式描述了最大裂縫寬度、最大裂縫深度、裂縫長度、沿著裂縫長度方向各處的裂縫寬度和裂縫深度);③在 HBIM 所鏈接的電子列表中將構(gòu)件識別碼寫入“標記”框中。二次開發(fā)的環(huán)境配置與算法流程如下。
環(huán)境配置方面需要 3個工具:Revit應(yīng)用程序編程接口(application programming interface,API)、Revit軟件開發(fā)工具包(software development kit,SDK)、開發(fā)工具。①API是Revit軟件與外界交互的窗口[10],通過API可以訪問Revit軟件的每個功能,并且可以創(chuàng)建開發(fā)新的功能。②Revit SDK里有工具實現(xiàn)接口鏈接,還可以幫助用戶了解API的用法。③需要完整的開發(fā)工具集VS(Microsoft visual studio)編譯器[11],用于快速調(diào)用類集中算法和數(shù)據(jù)結(jié)構(gòu)的NET Framework框架[12]以及C#語言。
針對Revit軟件進行二次開發(fā)具有統(tǒng)一的基本架構(gòu):基于C#創(chuàng)建類庫工程[13],添加RevitAPI引用,然后從 Iexternal-Command接口派生,重載Execute()方法,在Execute()函數(shù)中編寫程序?qū)崿F(xiàn)外部命令。針對本文要實現(xiàn)的信息更新功能,其算法設(shè)計流程如圖4所示。
圖4 裂縫信息自動更新算法設(shè)計流程
(1)構(gòu)件類別選取與參數(shù)增加。歷史建筑內(nèi)含構(gòu)件種類豐富,不同的構(gòu)件在HBIM里表現(xiàn)為不同的類別,如柱構(gòu)件屬于柱類別、枓栱構(gòu)件作為嵌套族屬于常規(guī)模型類別等,因此先明確需要進行信息集成更新的目標構(gòu)件,及其在模型中對應(yīng)的類別,將之篩選出來。篩選構(gòu)件類別是通過類的類型來進行元素過濾訪問[14]。首先創(chuàng)建元素類別過濾器,將所有類別元素選中;再通過內(nèi)建類別過濾器篩選目標,若目標類別為一種,如柱,則使用內(nèi)建類別過濾器過濾出所有柱元素,若目標類別為多種,如柱和梁枋,則需使用邏輯過濾器將內(nèi)建類別過濾器與常規(guī)模型過濾器進行合并,從而找到所有柱與梁枋的類別元素;最后在當前模型項目中構(gòu)造收集器,其用來迭代以及過濾元素的主要類[14],將符合過濾條件的類別收集在收集器內(nèi),方便后續(xù)迭代遍歷使用。
為目標類別增加參數(shù),即擴充電子列表內(nèi)容與數(shù)量。由于 BIM 中的“信息”存儲,是通過“參數(shù)”設(shè)置并在項目中賦予實例參數(shù)值來實現(xiàn)的,因此可通過添加“共享參數(shù)”的設(shè)置為類別元素增加額外的參數(shù)[15]。梳理裂縫損傷的重要屬性,決定創(chuàng)建“寬度”與“殘損等級”共享參數(shù)。創(chuàng)建流程是新建共享參數(shù)組文件,在文件內(nèi)定義“寬度”與“殘損等級”參數(shù),將之創(chuàng)建為實例參數(shù),最后將參數(shù)的定義與上一步得到的目標類別綁定,就實現(xiàn)了新列表欄的自動擴充(圖)。
圖5 參數(shù)添加示意
(2)電子列表內(nèi)容寫入及解析。將裂縫信息TXT文檔中第 3列“殘損信息”內(nèi)容批量自動寫至“注釋”欄。由于殘損文檔與HBIM都事先為構(gòu)件對應(yīng)了唯一識別碼,因此將構(gòu)件識別碼作為傳入?yún)?shù),將文檔信息與模型進行關(guān)聯(lián)。首先遍歷所有編號,再遍歷每個編號構(gòu)件的所有屬性(所有列表內(nèi)容),之后獲取目標列表框“注釋”;最后修改對應(yīng)編號的注釋信息,實現(xiàn)裂縫文本信息批量對應(yīng)錄入“注釋”列表框。
電子列表中“寬度”欄內(nèi)容的寫入是通過解析注釋信息而自動獲取的。首先對“注釋”框內(nèi)容(即殘損信息)進行分割,成為由逗號隔開的若干個分句,遍歷所有分句,判斷是否包含“寬”字符,若包含則遍歷該分句,利用ASCII碼查找到寬度值,需要注意的是有時會得到多個寬度值,取最大值作為結(jié)果;若不包含“寬”字符,則令寬度信息值為 0。最后將結(jié)果錄入“寬度”列表框。“注釋”框與“寬度框”內(nèi)容寫入結(jié)果如圖6所示。
圖6 電子列表內(nèi)容寫入示意
(3)殘損等級判斷與色塊填充。“殘損等級”的自動判斷是基于《規(guī)范》中提到的木構(gòu)件裂縫等級劃分內(nèi)容對“寬度”值進行范圍判斷而得;最后將判斷結(jié)果匹配到相應(yīng)構(gòu)件的“殘損等級”列表框。
確定殘損等級后,為構(gòu)件自動填充相應(yīng)色塊。Revit軟件有多種填充樣式可供選擇,如交叉填充、分區(qū)填充等,本文使用實體填充樣式。首先定義實體填充,并根據(jù)3類殘損等級對應(yīng)建立3個過濾器(輕度等級過濾器、中度等級過濾器、重度等級過濾器);獲取共享參數(shù)組中的“殘損等級”,過濾器依不同的殘損等級進行過濾,記錄每個殘損等級對應(yīng)的構(gòu)件識別碼;按“古木建筑柱子裂縫模型多LoD表達標準”中等級表達的配色方案,對每個等級所收集的識別碼構(gòu)件進行相應(yīng)色塊的實體填充。
將上述 3個流程進行代碼編寫,并生成 DLL動態(tài)鏈接庫文件。編寫過程中需要使用大量函數(shù),表2列出部分關(guān)鍵函數(shù)。
表2 Revit二次開發(fā)關(guān)鍵函數(shù)使用列表
為方便外部命令程序的集成和調(diào)用[16],可通過編寫外部應(yīng)用來集成插件。從Iexternal-Application接口派生,重載OnStartup和OnShutdown方法,使外部應(yīng)用隨著 Revit 軟件一起啟動和關(guān)閉,載入已生成的 DLL文件,在附加模塊欄內(nèi)為此命令生成面板與“Update”按鈕(圖7),HBIM裂縫信息自動更新的開發(fā)工作結(jié)束。
圖7 信息更新插件
為驗證本文方法的可靠性,以圖所示的HBIM 為例進行裂縫信息多層級表達與信息自動集成更新實驗,實驗環(huán)境配置參數(shù)見表3,此時柱子模型均為LoD100層級。首先為柱子設(shè)置唯一識別碼,并寫入構(gòu)件的“標記”列表框;然后為柱子虛設(shè)裂縫殘損信息,且錄入TXT文檔;最后在Revit軟件中點擊“Update”按鈕,實現(xiàn)一鍵批量集成更新裂縫信息。本文實驗涉及目標柱子構(gòu)件數(shù)量是64個,該方法用時4 s完成了柱子裂縫信息集成更新,結(jié)果如圖9(a)所示。之后以色塊結(jié)果為快速索引在相應(yīng)柱子模型基礎(chǔ)上添加LoD200與LoD300裂縫模型,完成裂縫模型的多層級表達,結(jié)果如圖9(b)所示。
由實驗結(jié)果可得,本文算法快速實現(xiàn)了柱子模型和裂縫信息的鏈接,由色塊填充結(jié)果直觀反映出構(gòu)件受損程度;由屬性選項卡下電子列表框中的各項信息,可把握裂縫的詳細情況;由單個模型的多細節(jié)層次表達,可直觀得到構(gòu)件的受損細節(jié)。
圖8 實驗對象
表3 實驗環(huán)境配置參數(shù)
圖9 裂縫信息自動集成與多層級模型表達結(jié)果
本文在古木建筑裂縫損傷表達與信息集成更新方面,針對模型構(gòu)建的精細度劃分問題,結(jié)合國家相關(guān)規(guī)范建議了裂縫模型多LoD表達標準;針對信息集成問題,考慮從業(yè)人員需求進行裂縫屬性梳理,提出了基于Revit平臺的裂縫信息集成管理方法;面對信息量龐大的問題,對Revit軟件進行二次開發(fā)實現(xiàn)信息批量自動化集成更新。最后進行實驗驗證。
實驗結(jié)果表明將模型多細節(jié)層級表達方法、HBIM技術(shù)與Revit二次開發(fā)相結(jié)合方法,應(yīng)用在信息表達集成中,可以高效地完成一些工作量較大、規(guī)律性較強的工作,有利于歷史建筑信息的全生命周期管理,便于安全性能評估,為后期運營管理與保護措施決策等工作提供參考。