天天看點

03插件內建1

所謂插件內建,就是通過實作外部指令和外部應用程式來添加擴充revit的功能。在revit中,通過addin清單來識别該插件是外部指令和外部應用程式

  • 外部指令:一般會顯示在附加功能的外部工具下拉清單中,會自動調用外部的應用程式,關閉時會自動解除安裝;
  • 外部應用程式:通過外部應用程式和指令添加功能,revit功能區頁籤和功能區面闆可以使用外部應用程式進行定制,定制好的按鈕會綁定到外部指令,通過注冊出現在revit中(添加清單),在使用時定制的圖示按鈕會顯示在功能面闆上。注:清單的加載是按字母排序加載的

在這我們還需要了解下RevitApi.dll和RevitApiUI.dll

RevitApi.dll:包含用于通路REVIT的應用程式、檔案、圖元和參數的資料庫級的方法,還包含IExternalDBApplicaltion及相關接口

RevitApiUI.dll:包含所有與操控和定制REVIT使用者界面相關的API接口,常用的接口及類有以下幾點:

-------------接口--------------

外部指令接口:IExternalCommand

外部應用程式接口:IExternalApplicaltion

外部指令控制接口:IExternalCommandAvailability:一般用于檢查所選的類别,是否滿足指令運作條件。

-------------類--------------

UI選擇類:Selection

面闆類:RibbonPanel、RibbonItem

對話框類:TaskDialogs

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;

namespace _05傳回指令
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]
    public class ResultExecuteTest : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            try
            {
                //示例删除選擇的圖元

                //從REVIT資料中檢索document
                Document doc = commandData.Application.ActiveUIDocument.Document;
                //擷取UI操作的document
                UIDocument uidoc = commandData.Application.ActiveUIDocument;                

                //把需要選擇到要删除的圖元的ID添加到集合中
                ICollection<ElementId> ids = doc.Delete(uidoc.Selection.GetElementIds());

                //設定對話框
                TaskDialog taskDialog = new TaskDialog("對話框的标題請自行設定");
                taskDialog.MainContent =
                    "點選YES确認删除選中的圖元" + "\n" + "點選NO,選中的圖元将不會被删除" + "\n" + "點選Cancel,關閉對話框,圖元不會被删除";

                //設定按鈕
                TaskDialogCommonButtons buttons = TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No | TaskDialogCommonButtons.Cancel;
                taskDialog.CommonButtons = buttons;
                //把按鈕資訊傳回給result
                TaskDialogResult taskDialogResult = taskDialog.Show();
                //判斷使用者是否确認删除
                if(taskDialogResult==TaskDialogResult.Yes)
                {
                    message = "删除成功";
                    return Result.Succeeded;
                }
                else if(taskDialogResult==TaskDialogResult.No)
                {
                    //恢複選中圖元
                    elements = uidoc.Selection.Elements;
                    message = "删除失敗";
                    return Result.Failed;
                }
                else
                {
                    return Result.Cancelled;
                }
            }
            catch (Exception)
            {

                message = "程式錯誤";
                return Result.Failed;
            }
        }
    }
}
           

IExternalCommandAvailability:

抽象方法IsCommandAvailable傳遞應用以及一組REVIT所選項類别相比對到的應用。常用檢查所選擇的類别是否滿足指令運作條件。

示例:

public class SampleAccessibilityCheck : IExternalCommandAvailability
    {
        public bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories)
        {
            //按鈕沒有活動選項時可以被點選
            if(selectedCategories.IsEmpty)
            {
                return true;
            }
            //至少選中一個類型别時(牆)可以被點選
            foreach (Category citem in selectedCategories)
            {
                if(citem.Id.IntegerValue==(int)BuiltInCategory.OST_Walls)
                {
                    return true;
                }
            }

            return false;
        }
    }
           

繼續閱讀