1 創建項目
以Visual Studio作為開發工具,測試平台為Revit 2017
打開VS,創建一個C# .NET Framwork類庫項目,選擇。.net框架版本為.NET Framwork 4.5.2
,確定。
2 項目設置
-
引用相關
RevitAPI.dll
和RevitAPIUI.dll
,根據情況設置這兩個dll的復制本地
屬性,並更改項目平台目標
為x64
。 -
VS自動為你創建的類名為class1,將這個類名更改為和你要實現的命令相關的名字,便於日后維護。這里我改為
ElementInfo
。 -
引用相關命名空間:
using Autodesk.Revit.DB; using Autodesk.Revit.UI;
-
查看API,要在revit內部添加一個外部命令,就必須實現一個
IExternalCommand
接口。這個接口定義於RevitAPIUI.dll
程序集內的Autodesk.Revit.UI
命名空間下,我們已經引用了該命名空間,接下來就是繼承這個接口並實現。這個接口只有一個Execute
函數需要我們去實現。
-
繼承
IExternalCommand
接口,並實現接口。[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] public class ElementInfo : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { return Result.Succeeded; } }
這里我們
Execute
函數里面只有一個返回Result.Succeeded
的語句,即什么事情也不做直接返回成功,通知Revit我這個命令執行完畢並成功。當然也可以寫一些簡單的語句進行測試。 -
此時我們右鍵項目,生成,就會在項目文件夾的
bin\Debug
目錄下生成我們創建的插件dll。
-
我們在Revit中使用
Addin Manager
加載運行一下。選擇我們創建的外部命令類,點擊Run,試運行一下。什么也沒有發生也沒有報錯,和我們預期的一樣。
3 業務代碼編寫
上面的工作相當於將前期設置給設置完成,並驗證的整個框架的正確性。下面就是根據業務需求實現自己的業務目標。
假定現在我想得到所有選中的構件的一些屬性信息。
-
首先需要從Revit中選擇構件,然后需要再用代碼拿到這些構件的引用,要拿到這些,我們需要先拿到Revit中一些常用的object的引用。在我們
Execute
函數中先添加如下代碼:public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiApplication = commandData.Application; UIDocument uiDocument = uiApplication.ActiveUIDocument; Document document = uiDocument.Document; return Result.Succeeded; }
其中
UIApplication
、UIDocument
、Document
這些分別代表什么含義,可查看API中關於這些類的簡介。 -
再查找API,發現我們想要的Revit選擇集中的內容就在
UIDocument
類中,UIDocument
類中有一個Selection
屬性,其具體描述如下:
點擊具體介紹,可以看到這是個只讀屬性,返回一個
Selection
對象。
再查看
Selection
類,它有一個GetElementIds
方法,該方法返回當前選擇的Element的Id。有了元素Id,就能根據Id找到這個Element。這個方法的返回一個泛型接口對象,我們可以直接定義一個該類型的對象接收它。
-
循環訪問每個ElementId對象,取出這個對象對代表的Element,再訪問該Element的屬性。
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiApplication = commandData.Application; UIDocument uiDocument = uiApplication.ActiveUIDocument; Document document = uiDocument.Document; ICollection<ElementId> selectedElIds = uiDocument.Selection.GetElementIds(); string info = ""; //判斷用戶是否選中了構件 if (selectedElIds.Count != 0) { //若選擇集中至少含有一個構件,則循環訪問每個ElementId foreach (ElementId elementId in selectedElIds) { //根據ElementId得到Element Element element = document.GetElement(elementId); //將信息添加到info變量中 info += $"Id:{elementId.IntegerValue} Name:{element.Name}\n"; } //利用Revit內置的對話窗口顯示相關info信息 TaskDialog.Show("result", info); } else { //若選擇集中至少含有一個構件,將提示信息返回給用戶 TaskDialog.Show("result", "請先選擇構件"); } return Result.Succeeded; }
-
重新編譯生成,在Revit中用Addin Manager運行。
若沒有選擇構件:
若選擇了構件:
4 結語
這個案例只是一個非常非常簡單的外部命令案例,對於復雜的也類似,萬變不離其宗,掌握了基本方法和思路,就能編寫出復雜度更高的插件。
如有錯誤,懇請指正。
Murphy.L
Perhaps, we’ve just forgotten that we are still pioneers.