1. 程式人生 > >[Revit]開始:編寫一個簡單外部命令

[Revit]開始:編寫一個簡單外部命令

1 建立專案

以Visual Studio作為開發工具,測試平臺為Revit 2017

開啟VS,建立一個C# .NET Framwork類庫專案,選擇。.net框架版本為.NET Framwork 4.5.2,確定。


2 專案設定

  1. 引用相關RevitAPI.dllRevitAPIUI.dll,根據情況設定這兩個dll的複製本地屬性,並更改專案平臺目標x64
  2. VS自動為你建立的類名為class1,將這個類名更改為和你要實現的命令相關的名字,便於日後維護。這裡我改為ElementInfo
  3. 引用相關名稱空間:
    csharp using Autodesk.Revit.DB; using Autodesk.Revit.UI;
  4. 檢視API,要在revit內部新增一個外部命令,就必須實現一個IExternalCommand介面。這個介面定義於RevitAPIUI.dll程式集內的Autodesk.Revit.UI名稱空間下,我們已經引用了該名稱空間,接下來就是繼承這個介面並實現。這個介面只有一個Execute函式需要我們去實現。

  5. 繼承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我這個命令執行完畢併成功。當然也可以寫一些簡單的語句進行測試。

  6. 此時我們右鍵專案,生成,就會在專案資料夾的bin\Debug目錄下生成我們建立的外掛dll。

  7. 我們在Revit中使用Addin Manager載入執行一下。選擇我們建立的外部命令類,點選Run,試執行一下。什麼也沒有發生也沒有報錯,和我們預期的一樣。


3 業務程式碼編寫

上面的工作相當於將前期設定給設定完成,並驗證的整個框架的正確性。下面就是根據業務需求實現自己的業務目標。

假定現在我想得到所有選中的構件的一些屬性資訊。

  1. 首先需要從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;
         }

    ``>其中UIApplicationUIDocumentDocument`這些分別代表什麼含義,可檢視API中關於這些類的簡介。

  2. 再查詢API,發現我們想要的Revit選擇集中的內容就在UIDocument類中,UIDocument類中有一個Selection屬性,其具體描述如下:

    點選具體介紹,可以看到這是個只讀屬性,返回一個Selection物件。

    再檢視Selection類,它有一個GetElementIds方法,該方法返回當前選擇的Element的Id。有了元素Id,就能根據Id找到這個Element。這個方法的返回一個泛型介面物件,我們可以直接定義一個該型別的物件接收它。

  3. 迴圈訪問每個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;
     }

    ```

  4. 重新編譯生成,在Revit中用Addin Manager執行。
    若沒有選擇構件:

    若選擇了構件:


4 結語

這個案例只是一個非常非常簡單的外部命令案例,對於複雜的也類似,萬變不離其宗,掌握了基本方法和思路,就能編寫出複雜度更高的外掛。

如有錯誤,懇請指正。


Murphy.L

Perhaps, we’ve just forgotten that we are still pioneers.