(1.湖北理工學(xué)院土木建筑工程學(xué)院;2.北京橄欖山軟件有限公司)
謝星星1,羅顯楓1,葉雄進2
建筑信息模型簡稱BIM(Building Information Modeling),是一款先進的三維數(shù)字設(shè)計解決方案,應(yīng)用在房屋建筑工程、結(jié)構(gòu)、機電等領(lǐng)域,利用數(shù)字信息在三維平臺模擬建筑物的真實信息。BIM 技術(shù)有五大特點:可視化、協(xié)調(diào)性、模擬性、可出圖性、優(yōu)化性[1]。
雖然BIM技術(shù)給我們帶來了便利,但是依然有許多不便的地方,例如,在水利、交通等方面就存在諸多不便,需要工程師在Revit平臺進行二次開發(fā)。
Autodesk Revit 不僅功能強大,而且還提供了應(yīng)用程序接口API(Application Programming Interface)。軟件工程師可以通過調(diào)用API 對Revit 應(yīng)用程序進行操作和使用,將繁瑣、重復(fù)的工作自動化[2]。
VB.NET、C++、C#等語言可以調(diào)用Revit API 進行BIM 軟件開發(fā)。利用Revit API進行二次開發(fā)的優(yōu)點:直接讀取模型的幾何參數(shù);直接創(chuàng)建、修改、刪除圖元等操作。
在Visual Studio 里選擇項目類型并創(chuàng)造新的類庫,指定對應(yīng)的命名空間和存儲位置,單擊ok即可。
在Revit的安裝程序中找到RevitAPI.dll和RevitAPIUI.dll文件,為減少成本,可將兩個文件的復(fù)制本地文件屬性改成false(見圖1)[3]。
圖1 開發(fā)流程
在編寫代碼前需要引用相應(yīng)的命名空間,根據(jù)需求判斷是實現(xiàn)IExternalApplication,還是IExternalCommand接口,同時,實現(xiàn)相應(yīng)函數(shù)。
下列代碼是一個簡單的程序:
AddInManager 的作用是在指定路徑加載腳本文件到Revit 平臺中運行,便于使用和調(diào)試,RevitLookup 的作用是查看元素的各個信息,便于查看和使用API。
將兩個文件的addin 文件和dll 文件放到指定文件夾中,將addin 文件中的路徑改為當(dāng)前文件下AddInManager.dll文件路徑,保存關(guān)閉即可。圖2 是打開Revit后添加成功的效果。
圖2 添加成功后的Revit界面
本節(jié)將利用前述配置的Revit開發(fā)環(huán)境進行排水溝快速建模的開發(fā)。
排水溝在建筑物室外和停車場內(nèi)部隨處可見,能有效解決城市的內(nèi)澇問題,也能解決人們生活用水的正常排放處理。排水溝分為暗溝和明溝(見圖3)。左側(cè)是帶蓋排水溝,右側(cè)是無蓋排水溝。注意:需要勾選加載時剪切。
圖3 族效果圖
如圖4 所示,該設(shè)計左側(cè)是一個treeview,右側(cè)是一個Plane 用來放previewcontrol 控件,設(shè)計簡單易懂,避免用戶的消極情緒。當(dāng)用戶選擇了族類別時,右側(cè)的previewcontrol 就顯示該類型的截面形狀,讓用戶修改。
圖4 界面設(shè)計
首先獲取指定文件夾里面的族文件,根據(jù)族名字過濾相應(yīng)的族,例如,族文件名字是否含有“排水溝”。把族的名字和族類型的名字記錄下來,當(dāng)程序運行時(Form.Loaded),填到treeview 里,部分代碼如下:
用戶點擊族類型時,首先加載族到當(dāng)前項目中,打開族文檔并且找到族文檔里的剖面1(見圖5),用Dictionary 對象記錄當(dāng)前族類型里面族參數(shù)名稱和ID和值的三者的關(guān)系,隨后previewcontrol 顯示這個剖面,該圖支持縮放,支持滑動修改操作。
圖5 加載族剖面圖界面
用戶切換視圖時,需要判斷當(dāng)前previewcontrol 是否有視圖顯示,如果有,需要把當(dāng)前顯示的視圖dispose(),隨后在加載其他的視圖,以下是加載和切換視圖的部分代碼:
當(dāng)用戶點擊注釋的時候,判斷附近是否有參數(shù),如果有,則顯示一個TextBox,如圖6。用戶輸入后回車即可修改族參數(shù),其注冊事件代碼如下:
圖6 點擊事件效果
隨即點擊繪制線的按鈕,窗口關(guān)閉,程序調(diào)用Revit 自帶的繪制模型線API(PostCommand),在DocumentChanged 事件中獲取當(dāng)前文檔中變化的元素,最后捕捉鍵盤的Esc 異常錯誤,使程序退出繪制,進入空閑事件,在空閑事件中開啟事務(wù),創(chuàng)建族實例,圖7 就是創(chuàng)建的兩個族實例后的樣子,連接和剪切良好,事件注冊部分代碼如下:
圖7 通過繪制線創(chuàng)建排水溝效果
用戶點擊拾取邊線按鈕創(chuàng)建族實例時,先沿兩條線的中心線創(chuàng)建一條紅色的模型線,用來提示這個地方已經(jīng)創(chuàng)建了,當(dāng)選擇的兩條線不平行或者兩條線沒有交集時,應(yīng)該提示用戶重新選擇(見圖8),創(chuàng)建良好。
圖8 拾取邊線創(chuàng)建族實例效果
該研究的難點是當(dāng)用戶切換previewcontrol界面時,要關(guān)閉當(dāng)前還打開的文檔,會觸發(fā)將要打開的族文檔的載入事件,如果用document.close(),會報異常,但是用document.dispose()就切換正常。目前,剪切和連接板互相剪切時,API 會導(dǎo)致板連接進來,這一問題有待解決。