丁軍晨,王曉東,彭禹立,張雯亮,夏皓倫,馬靖東
(遼寧工程技術大學土木工程學院,遼寧阜新 123000)
Revit 是Autodesk 公司制作的一系列軟件,主要用于建筑信息建模,為設計師和工程師提供了一個設計和記錄建筑信息的平臺,可以根據他們對有關項目的需求,更好的設計、建造和維護建筑。由于Revit 消除了建筑行業很多復雜的任務,在國內外的建筑行業中得到了廣泛的應用。
Autodesk 公司在設計Revit 的同時也為Revit 提供了API 接口[1-2]。Revit API 是一個類庫,只有在Revit 運行時才能夠工作。通過強大的Revit API,用戶可以添加基于Revit API 開發的插件來擴展和增強Revit 的功能和應用。通過這些功能和應用可以在短時間內完成龐雜的工作,大幅度的節省了工程師的時間成本。運用在工程中,可以加快項目的進度。
二次開發技術可以實現以下的功能[3]:(1) 訪問模型的參數數據;(2) 訪問模型的圖像數據;(3) 創建插件完成一些重復龐雜的工作;(4) 通過創建插件來增強Revit 的UI;(5) 對BIM實現各種分析;(6) 自動創建項目文檔;(7) 借助第三方應用來完成如連接外部的數據庫。
編譯完成后, 需要使用Revit 附加模塊AddInManager 將程序運行到Revit 2017 平臺上,附加模塊的運行界面見圖1。

圖1 AddInManger2014 運行界面
本文基于Revit 2017 以及Revit2017 SDK,由于Revit 二次開發的核心運行環境為.NET4.7,因此可以選擇Visual Studio 2017 版本為程序編寫平臺,通過NET4.7環境,使用C#編程語言完成編寫與編譯[4-5],主要工作包括參數信息收集與參數信息載入[6-8]。
在Revit API 與編程技術的支持下,可以選擇需要輸出的構件參數,以及輸出后不同參數所放置的位置。通過收集器與過濾器收集模型相關的參數信息,然后將收集到的相關信息寫入到Excel 表格中。
(1) 在Visual Studio 2020 中創建一個類庫,在類庫中添加引用RevitAPI 與RevitAPIUI,并將“復制本地”勾選為false,通過加載外部命令IExternalApplication 的方式,來實現Revit 軟件與外部應用的同步性。以上操作完成后需要實現OnStartup 和OnshutDown 函數的內容,將用戶所需要的操作放置其中,OnStartup 中的操作會在Revit 啟動時調用并執行,OnshutDown 中的操作會在Revit 關閉時調用并執行。使用IExternalApplication 命令可制作Revit 插件的UI 時需要編寫如下代碼:

(2) 在上述類庫中新建一個類,并調用外部命令IExternalCommand(IExternalCommand 是Revit API 通過外部命令來擴展Revit 時必須在外部命令中實現的接口),調用此外部命令可以讓插件加載運行。在此類中需要在抽象函數Execute 添加相關構件的收集器,為了更好的收集到構件的信息,需要再加入一個過濾器。遍歷過濾器把相關參數寫入DATATABLE 中。
最后將在IExternalCommand 中所編寫的命令添加到Revit 的UI 中,使之成為Revit 插件按鈕的命令。
利用API 為Revit 編寫插件的流程見圖2 所示。

圖2 插件開發流程圖
Revit 圖元是模型的基礎,在Revit 的數據體系中,大部分的類是繼承于元素的。在Revit 中,圖元可大致分為模型圖元、基準圖元、視圖專有圖元[2]。
模型圖元表示建筑業實際的三維幾何圖形,他們顯示再模型的相關視圖中。模型圖元有兩種類型包括主體圖元與模型構件,主體圖元可以獨立存在與模型中,不受其他構件存在與否的影響,其包括墻、樓板等,模型構件必須依附于主體圖元存在,包括樓梯、門等,模型構件又包括結構圖元與MEP 圖元。
基準圖元可以在空間和細節上表達項目場景中的模型,其包括軸網、標高和參照平面。
視圖專有圖元有兩種類型,包括注釋圖元與詳圖,其中注釋圖元包括文字說明、標記等,詳圖包括詳圖線、填充區域等。他們都時模型表現的方法。
模型圖元是BIM信息繼承的載體,各種信息都動態的集中在模型圖元中,而模型圖元又是以各類構件的形式表現出來的。為滿足工程的需求,構件中信息可分為基本信息和擴展信息,其中基本信息是基礎新數據,而擴展信息是為了滿足工程需要加入的信息,需要通過對模型的信息進行擴展才能得到,見圖3。

圖3 Revit 圖元
對構件信息提取需要使用Revit API 的項目參數BuiltlnParameter 或者共享參數SharedParameter,項目參數特定于單一項目中,不能與其他項目進行共享,且不可用于多個項目之間的使用。共享參數則可以用于多個項目與族文件中,不僅可以在族文檔中定義與再定義參數,還可以實現項目參數的功能。共享參數的設定具有更高的普適性。如果項目需要在文件中建立明細表,且需要推廣到所有的項目中,可以采用共享參數來提取構件的參數化屬性信息。
由于Revit 數據結構相對復雜,并不支持將模型構件信息導出Excel,需要通過二次開發將信息輸出到Excel 中。常用的輸出方法有三種,分別為NPOI 庫;Epplus 庫;COM組件。COM組件需要設備安裝Excel 軟件,在導出模型構件信息時需要考慮Excel 版本的問題。NPOI 與Epplus 都是開源的C#讀寫Excel 文檔的項目,它們都可以在沒有安裝Office 情況下對Excel 文檔進行讀寫的操作,NPOI 庫使用較少,因為相同數據結構的數據,Epplus 的導出能力遠比NPOI 強,除此之外,NPOI 庫支持Excel 的版本有限。如果需要大量屬性信息的輸出,可以采用Epplus 庫作為Revit 信息的輸出方法。
用于實例驗證的插件使用了項目參數BuiltlnParameter 提取信息,使用COM組件將信息輸出到Excel 中。其核心代碼如下所示。
此插件可以從模型中提取構件的族類型,位置信息與幾何信息,將提的取構件參數化屬性信息導入Excel表格。插件面板見圖4 所示。

圖4 插件示意圖

為了驗證插件的功能與上文提出理論,以Revit2017 建筑樣例項目(圖5)為例,在這個模型中含有建筑中常用的構件,包括墻、門、窗等構件。

圖5 Revit 2017 建筑樣例項目模型展示圖
從Revit 2017 建筑樣例項目中提取墻的信息,得到墻的族類型、標高、寬度與高度,見表1。

表1 樣例項目模型中提出墻的部分數據
Revit 的二次開發功能為設計師創造了諸多便利,本文通過Revit 二次開發的功能,結合本文對模型構件信息分析與提出的模型構件信息提取與輸出的方法,設計出了一款模型構件信息提取插件,并且通過實例驗證了插件的可行性與本文提出方法的可靠性。通過這款插件可以導出工程所需構件的信息,滿足了一些工程對于模型構件信息進行大批量提取的需求。