所謂插件內建,就是通過實作外部指令和外部應用程式來添加擴充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;
}
}