[Revit]開始:編寫一個簡單外部命令
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.