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