李丹妮 張軍 王凱 管昌生
(1、中交第二公路勘察設(shè)計(jì)研究院有限公司,湖北武漢 430056 2、中交集團(tuán)隧道與地下空間工程技術(shù)研發(fā)中心,湖北武漢 430056 3、武漢理工大學(xué),湖北武漢 430070)
目前BIM技術(shù)的應(yīng)用得到了大家的普遍認(rèn)可[1]。傳統(tǒng)的二維設(shè)計(jì)存在著先天不足,本來(lái)建筑是以三維空間為主體的,但是傳統(tǒng)的設(shè)計(jì)交付都是以二維圖形作為交付物,在這個(gè)三維向二維轉(zhuǎn)換過(guò)程中,多專業(yè)之間的協(xié)調(diào)很難保證[2],施工過(guò)程中又以二維圖紙為藍(lán)圖進(jìn)行施工,必然存在信息上的不對(duì)位,出現(xiàn)諸如碰撞、設(shè)計(jì)出來(lái)的功能區(qū)使用功能的不合理等問(wèn)題。
BIM是以三維數(shù)字技術(shù)作為基礎(chǔ),集成工程中各種數(shù)據(jù)信息進(jìn)行建筑三維模型建立,通過(guò)數(shù)字信息仿真模擬建筑物所具有真實(shí)信息[3]。BIM技術(shù)是一個(gè)完整、豐富建筑信息化協(xié)作平臺(tái),在建筑信息化領(lǐng)域逐步受到廣泛關(guān)注和認(rèn)可[4]。BIM理念實(shí)現(xiàn)需要一個(gè)兼具廣度和深度的標(biāo)準(zhǔn)體系,才能實(shí)現(xiàn)工程各階段之間信息共享互換。BIM是集計(jì)算機(jī)輔助設(shè)計(jì)與制造于一體的計(jì)算機(jī)集成制造系統(tǒng)理念和基于產(chǎn)品數(shù)據(jù)管理PDM 與STEP 標(biāo)準(zhǔn)的產(chǎn)品信息模型[5]。BIM技術(shù)是以建筑項(xiàng)目中各種相關(guān)數(shù)據(jù)信息作為基礎(chǔ),進(jìn)而對(duì)數(shù)據(jù)模型信息進(jìn)行整合,實(shí)現(xiàn)對(duì)建筑工程項(xiàng)目設(shè)施實(shí)體與功能特性數(shù)字化表達(dá)。標(biāo)準(zhǔn)和完整的建筑信息模型能夠使建筑項(xiàng)目生命周期在各個(gè)不同階段的數(shù)據(jù)、過(guò)程和資源得到共享和關(guān)聯(lián),可以讓建筑項(xiàng)目建設(shè)方與參與方進(jìn)行交流和使用[6]。建筑信息模型具有信息集成、協(xié)同管理、相同項(xiàng)目數(shù)據(jù)源功能,可解決分布式以及不同工程數(shù)據(jù)之間一致性和全生命周期信息共享問(wèn)題,支持項(xiàng)目生命周期中所有相關(guān)工程信息創(chuàng)建、管理、共享以及互換[7]。隨著B(niǎo)IM技術(shù)高速發(fā)展,建筑行業(yè)發(fā)展必將進(jìn)入一個(gè)全新的時(shí)期[8]。
本文通過(guò)Revit API 插件開(kāi)發(fā)實(shí)現(xiàn)快速道路及場(chǎng)地平整模擬,目前對(duì)基于.NET 的Revit 二次開(kāi)發(fā)相關(guān)文獻(xiàn)相對(duì)較少,因此通過(guò)Revit 進(jìn)行二次開(kāi)發(fā),打通各類軟件信息交流以及開(kāi)發(fā)插件使Revit 本土化已成為研究熱點(diǎn)。本文開(kāi)發(fā)插件成果,可以提高BIM建模設(shè)計(jì)的效率,便于BIM技術(shù)推廣應(yīng)用。
在Revit 中參數(shù)化表現(xiàn)為模型的所有元素之間的關(guān)系,簡(jiǎn)單來(lái)說(shuō)參數(shù)化就是讓模型各個(gè)元素隨著用戶指定的參數(shù)進(jìn)行協(xié)調(diào)變化。Revit 模型中所有參數(shù)的修改,都可以自動(dòng)調(diào)動(dòng)Revit 參數(shù)化修改引擎,來(lái)協(xié)調(diào)任何相關(guān)位置上的模型或者視圖等變化。Revit 所提供的API 包含了對(duì)幾乎所有元素的參數(shù)的讀取、修改、甚至還可以定義新的參數(shù)。
軟件的外部事件開(kāi)發(fā)方法,不同于大部分現(xiàn)有二次開(kāi)發(fā)方法。目前大部分論研究是用外部命令加外部應(yīng)用的方式進(jìn)行組合開(kāi)發(fā),主要是為了避免選項(xiàng)卡中有過(guò)多的按鈕、以及可以實(shí)現(xiàn)插件非模態(tài)運(yùn)行。因此,本文采用了外部事件、外部命令和外部應(yīng)用相結(jié)合的方式,進(jìn)行插件軟件的開(kāi)發(fā)。關(guān)鍵技術(shù)是應(yīng)用winform 與外部事件相結(jié)合組插件程序的主要部分,可以實(shí)現(xiàn)操作Revit 和操作本插件之間的靈活切換,實(shí)現(xiàn)特定功能創(chuàng)建。其中winform 作為插件的主界面,外部事件作為響應(yīng)用戶操作主界面的響應(yīng)部分。本插件程序由主界面向主程序傳遞各類用戶輸入的參數(shù),整個(gè)插件主要由主界面和主程序構(gòu)成。
3.1.1 創(chuàng)建插件主界面。Revit 允許用戶自定義Ribbon 面板[10],方便用戶按照自己的意圖在Revit 中實(shí)現(xiàn)用戶與Revit 的交互。本文應(yīng)用強(qiáng)大的Winform 來(lái)實(shí)現(xiàn)交互的用戶友好性。WinForm 是.Net 開(kāi)發(fā)平臺(tái)中對(duì)Windows Form 的一種稱謂,它功能強(qiáng)大、操作方便、使用安全,可以應(yīng)用它創(chuàng)建豐富的界面,其本身自帶大量功能強(qiáng)大的控件,甚至可以讓用戶不寫一行代碼也能創(chuàng)建簡(jiǎn)單的窗體程序。為了調(diào)用Winform 來(lái)作為主程序的交互界面,本文先調(diào)用RevitAPI 中的外部應(yīng)用方法來(lái)生成調(diào)用Winform,在Revit 中創(chuàng)建一個(gè)Ribbon 面板以及在面板上生成彈出主界面窗口的命令按鈕。編寫代碼實(shí)現(xiàn)彈出主窗口,在對(duì)button Data 變量初始化時(shí),指定了要實(shí)現(xiàn)的命令的類的名字Auto generation For Foundation Pile. Foundation Piles Command,單擊命令按鈕時(shí),將會(huì)調(diào)用這個(gè)類。而Foundation Piles Command 這個(gè)類的實(shí)現(xiàn)將會(huì)把主界面彈出來(lái)。
通過(guò)兩步代碼編寫,并在整個(gè)項(xiàng)目中添加一個(gè)Winform 窗體,即可實(shí)現(xiàn)單擊Ribbon 面板上的命令按鈕,彈出主界面窗口,生成的窗口為非模態(tài)窗口,便于用戶在插件窗口與Revit 窗口之間自由切換,實(shí)現(xiàn)模態(tài)窗口所不能實(shí)現(xiàn)的功能。
3.1.2 軸網(wǎng)生成主要算法。軸網(wǎng)相當(dāng)于地球的經(jīng)緯網(wǎng),在Revit 里起到“定海神針”的作用,整個(gè)建筑都是以軸網(wǎng)為定位依據(jù)建立起來(lái)的。目前在Revit 里建立軸網(wǎng)的一般步驟為:①一般選擇場(chǎng)地樓層平面→②選擇建筑選項(xiàng)卡→③單擊軸網(wǎng)命令按鈕→④在目標(biāo)位置畫出軸網(wǎng)→⑤重復(fù)第④步→⑥生成目標(biāo)軸網(wǎng)。
通過(guò)這幾個(gè)步驟,就可以將想要的軸網(wǎng)畫出來(lái),在軸網(wǎng)軸線比較少時(shí),感覺(jué)不出用傳統(tǒng)Revit 軸網(wǎng)繪制方式的缺陷,如果軸線很多時(shí),傳統(tǒng)繪制軸網(wǎng)方法就比較費(fèi)時(shí)了。因此,可以通過(guò)Revit 的二次開(kāi)發(fā)來(lái)解決這一重復(fù)性高的工作,利用輸入幾個(gè)參數(shù)來(lái)自動(dòng)畫出軸網(wǎng),為設(shè)計(jì)師節(jié)省寶貴的時(shí)間,提升設(shè)計(jì)效率。本插件的自動(dòng)生成軸網(wǎng)功能借鑒了PKPM生成軸網(wǎng)的方式,使用了下開(kāi)間間距、下開(kāi)間數(shù)量、左進(jìn)深深度、左進(jìn)深數(shù)量四個(gè)參數(shù)控制軸網(wǎng)的生成。為了保護(hù)這四個(gè)變量不受BuildGrid類之外的代碼對(duì)它們進(jìn)行直接修改,在BuildGrid 類內(nèi)部設(shè)立了四個(gè)與這四個(gè)變量一一對(duì)應(yīng)的屬性,它們分別是XKJ_D、XKJ_N、ZJS_D、ZJS_N。通過(guò)這種設(shè)立屬性的方式,可以保護(hù)整個(gè)程序數(shù)據(jù)的穩(wěn)定性,從而減少因?yàn)樽兞勘灰馔庑薷亩鸬碾y以發(fā)現(xiàn)的錯(cuò)誤。
此方法將下開(kāi)間的軸線與左進(jìn)深的軸線進(jìn)行分開(kāi)生成,這樣的好處在于,方便維護(hù)升級(jí)算法、便于發(fā)現(xiàn)錯(cuò)誤。此方法的前四個(gè)參數(shù)由BuildGrid 類內(nèi)的四個(gè)雙精度浮 點(diǎn) 變 量 doubleXiaKaiJian_Distance、double XiaKaiJian_Number、double ZuoJingSheng_Distance、double ZuoJingSheng_Number 傳入,而這四個(gè)雙精度浮點(diǎn)變量的值由BuildGrid 類內(nèi)部的四個(gè)屬性進(jìn)行賦值。為了從BuildGrid 類外部獲得XKJ_D、XKJ_N、ZJS_D、ZJS_N 的屬性值,因此從主界面的四個(gè)文本框把用戶輸入的值賦予XKJ_D、XKJ_N、ZJS_D、ZJS_N 四個(gè)屬性,界面如圖1 所示。然后,通過(guò)外部事件建立連接建立主界面與主程序的連接。在非Revit 內(nèi)部環(huán)境中建立外部應(yīng)用、外部命令,這在目前的幾個(gè)版本的Revit 中是被禁止的,因此需要借助外部事件來(lái)解決這一問(wèn)題。但在應(yīng)用外部事件做開(kāi)發(fā)時(shí),要注意外部事件在被觸發(fā)后,外部事件觸發(fā)之后的代碼會(huì)與外部事件同時(shí)執(zhí)行,它們分別屬于不同的線程。通過(guò)代碼設(shè)計(jì),可以看到下開(kāi)間間距屬性與左進(jìn)深屬性,分別都除以變量ZhuanHuanZhi,這是因?yàn)镽evit內(nèi)部基本單位是英尺,如果要獲取或設(shè)置構(gòu)件參數(shù)數(shù)值需要進(jìn)行單位轉(zhuǎn)換。軸網(wǎng)生成效果如圖2 所示。
圖1 參數(shù)選擇界面
圖2 軸網(wǎng)生成效果圖
用戶自己在Revit 中創(chuàng)建基樁族、使用族庫(kù)大師等插件獲得基樁族、編程開(kāi)發(fā)自動(dòng)生成基樁族。無(wú)論是從各大插件還是用戶自行創(chuàng)建,都可以很方便的獲得各類基樁族。因此本文采用從外部載入基樁族,作為自動(dòng)生成的基樁功能的基樁族來(lái)源。
基樁作為與軸網(wǎng)具有強(qiáng)烈關(guān)系的地下構(gòu)件,因此基樁的定位點(diǎn)主要是定位在捕捉軸網(wǎng)中的軸線交點(diǎn)上。以下就是基樁的自動(dòng)定位和生成的主要代碼及開(kāi)發(fā)思路:
3.2.1 加載族到項(xiàng)目中。單擊圖3 中的“加載基樁族”按鈕,通過(guò)Open File Dialog open Foundation = new Open File Dialog() 創(chuàng)建加載外部基樁族對(duì)話框,而后將讀取到外部基樁族的路徑傳遞到主程序中的Load Foundation Family 類中,將Load Foundation Family 類中Path of Foundation Family 屬性賦值,為加載基樁族對(duì)話框所讀取到路徑值。 使用 doc.Load Family(path_O_Foundation,out family)這條語(yǔ)句。若這條語(yǔ)句返回True,則對(duì)話框中選定的基樁族將成功加載進(jìn)項(xiàng)目中,其中doc 是Document 類的一個(gè)實(shí)例化對(duì)象。在將基樁族加載進(jìn)入項(xiàng)目的同時(shí),主界面將同時(shí)使用timer 控件進(jìn)行對(duì)加載進(jìn)入項(xiàng)目中的基樁族進(jìn)行族類型的掃描。由于本插件中Load Foundation Family 類與生成基樁的類Build Foundation 有很強(qiáng)的順序關(guān)系,Build Foundation類需要得到已經(jīng)加載到項(xiàng)目中的外部基樁族的族類型參數(shù),所以在Load Foundation Family 類中,將Load Foundation Family 類所需要的參數(shù)進(jìn)行屬性化設(shè)置,方便保護(hù)類本身的數(shù)據(jù)安全、以及不同類之間傳遞信息。
圖3 加載基樁族
3.2.2 捕捉軸網(wǎng)交點(diǎn)。在生成基樁之前需要獲知基樁的定位點(diǎn),工程中基樁一般位于軸線交點(diǎn)上,本插件將采用軸線交點(diǎn)作為基樁生成的定位點(diǎn)。為了增加主程序的可讀性、簡(jiǎn)潔性以及代碼的模塊化、復(fù)用性,單獨(dú)編寫了一個(gè)方法類method,在這個(gè)類中包含多個(gè)主程序需要的通用方法。其方法是Get Intersection From Grids(Document doc),本方法只需讀入一個(gè)文檔類Document參數(shù),即可返回此文檔中軸線交點(diǎn)集合List<XYZ>,本方法獲取交點(diǎn)集合的思路是通過(guò)兩個(gè)for each 遍歷語(yǔ)句來(lái)實(shí)現(xiàn)交點(diǎn)集合的尋找與裝載。
通過(guò)方法Get Intersection From Grids(Document doc),就可以獲得基樁群的定位點(diǎn)集,這個(gè)點(diǎn)集是至關(guān)重要的基樁群定位信息集合。有了這個(gè)集合,就可以為創(chuàng)建指定位置的基樁群做好準(zhǔn)備。
3.2.3 獲取基樁族類型及標(biāo)高。Revit 為了系統(tǒng)化管理圖元,將所有的圖元都進(jìn)行了分類,分類的級(jí)別有三級(jí),即:一級(jí)分類:族類別,將項(xiàng)目進(jìn)行專業(yè)上的分類,例如梁、結(jié)構(gòu)柱、條形基礎(chǔ)等就歸為結(jié)構(gòu)類的族類別,放在結(jié)構(gòu)選項(xiàng)卡中方便用戶尋找。二級(jí)分類:族,每種族都是一系列子構(gòu)件的集合,例如一級(jí)分類中的梁元素就包括了很多種類型的梁,例如矩形梁、工字鋼梁、疊合梁等。三級(jí)分類:族類型,族類型是更小一級(jí)的單位,它是二級(jí)分類的細(xì)化,是同一族下的不同子類型,例如300×600矩形梁、400×800 矩形梁等。
由上可知,用戶在通過(guò)插件主界面加載外部基樁族后,需要指定用戶想要生成的族類型。本插件會(huì)默認(rèn)一個(gè)族類型供用戶使用如圖4 中紅色矩形框中所示,當(dāng)然用戶也可以通過(guò)主界面中的下拉列表選擇來(lái)指定自己想要的族類型。
圖4 默認(rèn)族類別
3.2.4 生成基樁。單擊“生成基樁”按鈕,將外部基樁族與用戶所選用的外部基樁族類型,這兩個(gè)參數(shù)傳入主程序中的Build Foundation 類中的兩個(gè)對(duì)應(yīng)屬性,隨后觸發(fā)Build Foundation 類的外部事件,開(kāi)啟事物,生成基樁群。因?yàn)榍懊嬉呀?jīng)獲得生成基樁群的所有參數(shù),故生成基樁群的核心代碼在這一步只有一個(gè)遍歷語(yǔ)句和一條創(chuàng)建語(yǔ)句。生成的基樁群如圖5。
圖5 生成的基樁群三維示例
本文探討了revit 插件開(kāi)發(fā)的基本方法,針對(duì)軸網(wǎng)設(shè)計(jì)與樁基設(shè)計(jì),對(duì)基于BIM技術(shù)建模的快速繪制BIM模型方法進(jìn)行了研究。其中包括代碼編寫、模塊主要功能實(shí)現(xiàn)與測(cè)試,功能算法分析。對(duì)具體開(kāi)發(fā)過(guò)程中的外部事件與外部應(yīng)用、外部命令相結(jié)合、發(fā)揮了外部事件、外部應(yīng)用、外部命令各自特特征,并對(duì)插件軟件進(jìn)行了模塊化編制與應(yīng)用。通過(guò)AUOTODEAK 公司對(duì)外界開(kāi)放RevitAP,可以通過(guò)軟件工程師開(kāi)發(fā)相應(yīng)算法來(lái)解決國(guó)內(nèi)用戶的本土化需求。