[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. 引用相關命名空間:

    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;
    
  4. 查看API,要在revit內部添加一個外部命令,就必須實現一個IExternalCommand接口。這個接口定義於RevitAPIUI.dll程序集內的Autodesk.Revit.UI命名空間下,我們已經引用了該命名空間,接下來就是繼承這個接口並實現。這個接口只有一個Execute函數需要我們去實現。

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

  6. 此時我們右鍵項目,生成,就會在項目文件夾的bin\Debug目錄下生成我們創建的插件dll。

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


3 業務代碼編寫

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

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

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

    其中UIApplicationUIDocumentDocument這些分別代表什么含義,可查看API中關於這些類的簡介。

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

    點擊具體介紹,可以看到這是個只讀屬性,返回一個Selection對象。

    再查看Selection類,它有一個GetElementIds方法,該方法返回當前選擇的Element的Id。有了元素Id,就能根據Id找到這個Element。這個方法的返回一個泛型接口對象,我們可以直接定義一個該類型的對象接收它。

  3. 循環訪問每個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;
    }
    
  4. 重新編譯生成,在Revit中用Addin Manager運行。
    若沒有選擇構件:

    若選擇了構件:


4 結語

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

如有錯誤,懇請指正。


Murphy.L

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM