1 創建項目 以Visual Studio作為開發工具,測試平臺為Revit 2017 打開VS,創建一個C .NET Framwork類庫項目,選擇。.net框架版本為 ,確定。 2 項目設置 1. 引用相關 和`RevitAPIUI.dll 複製本地 平臺目標 x64`。 2. VS自動為你創建 ...
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
。 - 引用相關命名空間:
csharp using Autodesk.Revit.DB; using Autodesk.Revit.UI;
查看API,要在revit內部添加一個外部命令,就必須實現一個
IExternalCommand
介面。這個介面定義於RevitAPIUI.dll
程式集內的Autodesk.Revit.UI
命名空間下,我們已經引用了該命名空間,接下來就是繼承這個介面並實現。這個介面只有一個Execute
函數需要我們去實現。
繼承
IExternalCommand
介面,並實現介面。
csharp [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
函數中先添加如下代碼:
```csharp
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的屬性。
```csharp
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.