Revit二次開發 外部命令和外部應用


  • 外部命令
通過IExternalCommand來添加自己的應用。Revit通過.addin文件來識別和加載外部插件
 
基本原理
Revit沒有其他命令在運行或者沒有處於編輯模式,那么已經注冊了的外部命令(ExternalCommand)就可以被激活。插件被選中,外部命令對象將被創建出來,並且執行Execute函數。執行完畢,外部命令對象被銷毀。
 
IExternalCommand是RevitAPI用戶通過外部命令來擴展開發是必須實現的接口。IExternalCommand接口里面只有一個抽象函數Execute,重載這個函數來實現IExternalCommand。Execute有三個參數:輸入參數commandData(ExcternalCommandData)、輸出參數messamg(String)、輸出參數elements(ElementSet)。
public interface IExternalCommand
{
public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements);
}
 
commandData(ExternalCommandData)
ExternalCommandData對象包含了外部命令所需要的Application以及一些視圖的引用。在外部命令中,所有的Revit的數據都可以直接或者間接的獲取到。
 
ExternalCommandData中的屬性
屬性
Application(Autodesk.Revit.UI.UIApplication)  用於表示適用於當前外部命令的Appliacation對象
View(Autodesk.Revit.DB.VIew)  用於表示當前外部命令起作用的視圖對象
JournalData(IDictionary<String,String>)  用於在Revit Journal文件中讀寫的數據字典,只要應用與做自動化測試與外部命令交互使用。
 
message(String)
外部命令可以通過這個參數返回執行信息。用戶可以在外部命令執行過程中的任何時候給這個參數設值或者追加信息。外部命令的Execute函數返回Autodesk.Revit.UI.Result.Failed或者Autodesk.Revit.UI.Result.Canceled,這個信息才會被顯示在UI上。
 
elements(ElementSet)
外部命令返回Autodesk.Revit.UI.Result.Failed或者Autodesk.Revit.Result.Canceled並且message參數不為空的時候,錯誤或者警告對話框會彈出來,點擊上面的顯示按鈕,elements參數中的元素將會被高亮顯示。
 
Result(返回值)
Result返回值有三種:Result.Succeeded、Result.Failed、Result.Canceled。當命令部隊Succeeded,那么Revit就會把此外部命令進行的所有操作撤銷。
 
 
 
  • 外部應用
插件開發者可以通過實現IExternalApplications來添加自己的應用。Revit同樣通過.addin文件來識別和加載實現IExternalApplication的外部插件。
IExternalApplication接口有兩個抽象函數OnStartup和OnShutdown,參數都是UIControlledApplication類型。用戶可以通過實現了IExternalApplication的外部應用中重載Onstartup和OnShutdown函數,在Revit啟動或者關閉是定制所需的功能。
UIControlledApplication類是一種特殊的應用類,不提供訪問Revit文檔的途徑。UIControlledApplication只在OnStartup和OnShutdown函數范圍內起作用,在這個作用於區間內用戶無法獲得Revit文檔。UIControlledApplicatiion類提供訪問定制UI和注冊時間的方法。
public Autodesk.Revit.UI.Result OnStarup(UIControlledApplication application)
{
//添加一個新的ribbon面包
RibbonPanel ribbonPanel = application.CreateRibbonPanel("NewRibbonPanel");
//在新的Ribbon面板上添加一個按鈕
//點擊這個按鈕,調用Hello World 實例
PushButton pushButton = ribbonPanel.AddItem(new PushButtonData("HelloRevit","HelloRevit",@"c:\Projects\HelloRevit.dll","helloRevit.Class1")) as PushButton;
return Result.Succeeded;
}
 
Public Result OnShutdown(UIControlledApplication application)
{
//UI定制不需要特別在OnShutdown方法中處理
return Result.Succeeded;
}
 
數據庫(DB)級別的外部應用
數據庫級別的外部應用與一般外部應用不同的是,她沒有提供任何訪問RevitUI的就看,它一般用於事件處理,插件開發者可以同過實現IExternalDBAoolication來添加所需的DB基本的外部應用。
 
外部應用注冊
如果想在Revit中調用插件,需要對插件進行注冊。Reit通過后綴名為 .addin的文件(XML格式)來實現注冊。
(1)如果希望該插件只有當前用戶可以使用,需要將文件放入:
c:\Users\<user>\AppData\Roaming\Autodesk\Revit\Addins\20XX\
(2)如果希望所有用戶都可以使用,需要將文件放入:
c:\ProgramData\Autodesk\Revit\Addins\20XX\
 
addin文件中的XML標簽
Assembly 指定插件程序集的全路徑。每個ExternalCommand和ExternalApplication都必須有這個值
FullClassName 指定實現了IExternalCommand或者IExternalApplication接口的插件程序集的類名。需要完整的命名空間,每個ExternalCommand和ExternalApplication都必須有這個值
AddInId 指定一個全局的GUID值。每一個插件都需要有一個GUID值,並且在一個Revit會話中,這個GUID值是唯一的。在插件中可以通過UIApplication.ActiveAddInId屬性獲取到.Addin文件中對應插件的GUID值
Name 為插件指定一個名字。只有類型為ExternalApplication的插件需要這個標簽
Text 為插件指定一個在”附加模塊“選項卡中顯示的名字。類型為ExternalCommand的插件可以指定這個值
Description 為插件提供一段簡介。類型為ExternalCommand的插件需要這個標簽
VisibilituMode 為插件指定可見屬性。類型為ExternalCommand的插件需要這個標簽
Discipline 為插件指定在哪個產品可見。默認都可見。類型為ExternalCommand的插件需要這個標簽
LargeImage 為插件設置在外部工具下啦菜單中顯示的大圖標。默認不顯示。類型為ExternalCommand的插件需要這個標簽
SmallImage 為插件設置在快速訪問工具條中顯示的小圖標。類型為ExternalCommand的插件需要這個標簽
LongDescription 為插件提供一段長的描述,這段描述將作為按鈕的提示文本的擴展部分。類型為ExternalCommand的插件需要這個標簽
TooltipImage 為插件的提示文本提供一個圖片,當鼠標在這個外部命令上停留時顯示。類型為ExternalCommand的插件需要這個標簽
LanguageType 為插件設置語言種類。
AllowLoadIntoExistingSession 將該標簽設置為false將阻止Revit不重啟就自動加載到 .addin文件里面的插件。默認不重啟自動加載新加入到.addin文件里面的插件
VendorId 改標簽標明插件的插件提供商名稱。
VendorDescription 插件提供商的描述。
 
屬性
RevitAPI提供了多種屬性方便用戶配置自己的ExternalCommand和ExternalApplication的行為。
Transaction屬性
用戶必須在實現IExternalCommand接口時指定外面命令使用的TransactionMode屬性。
該屬性沒有默認值,用戶必須顯示地指定。該屬性控制RevitAPI礦建如何在調用外面命令時處理其中的事務(Transaction)。下面是RevitAPI支持的Transaction屬性模式。
屬性設置例如
[Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]
public class Hello : IExternalCommand
{
}
1)TransactionMode.Automatic:Revit會在調用外部命令之前自動創建一個Transaction,會在外面命令結束時提交或者回滾(成功提交,異常回滾)。該模式下外部命令不能創建自己的Transaction,但是可以創建SubTransactions。
2)TransactionMode.Maanual:在該模式下Revit不會自動創建Transaction。如過用戶需要修改Revit模型,則需要在自己的外部命令中來創建自己的Transaction,並且自建管理這個Transaction提交還是回滾。
3)TransactionMode.ReadOnly:在該模式下外部命令不能有任何的Transaction。外部命令只能讀取Revit模型。在該模式下試圖創建任何Transaction或者修改Revit模型,都將拋出異常。
上述三種TransactionMode都只在活動文檔范圍內有效。
 
Journaling屬性
Journaling屬性是一個可選屬性,用戶可以自行選擇使用或者不使用。該屬性控制Revit Journal文件在執行外部命令過程中的行為。
屬性設置例如
[Journaling(JournalingMode.NoCommandData)]
public class Hello : IExternalCommand
{
}
1)JournalingMode.NoCommandData:使用該模式,Revit將不會把ExternalCommandData.JournalData的內容寫到Revit Journale中。
2)JournalingMode.,UsingCommandData:使用該模式,Revit使用IDictionary<String.String>格式把ExternalCpmmandData.JournalData的內容寫到Revit Journale中。默認屬性
 
 
  • Revit應用類和文檔類(Application/Document)
Revit與office一樣,使用多文檔模式。在RevitAPI的類結構中,應用類的和文檔類是處於最頂層的。他們主要分為Application、UIApplication、Document和UIDocument這幾大類。
一個Revit應用對象對應一個獨立的Revit會話。用戶可以通過這個對象訪問Revit文檔、選項以及其他應用范圍的數據和設置。
1)Autodesk.Revit.UI.UIApplication:提供訪問UI級別接口的應用類,包括訪問用戶界面RibbonPanels、獲得用戶界面的活動文檔等能力。
2)Autodesk.Revit.ApplicationServies.Application:提供訪問其他應用級別內容接口的應用類。
一個Revit文檔對象對象一個獨立的Revit工程文件。Revit可以同時有多個工程打開,每個工程可以有多個視圖。
1)Autodesk.Revit.UI.UIDocument:提供訪問UI級別接口的文檔類,比如提供Selectiong來表示擁護界面的選擇集。
2)Autodesk.Revit.DB.Document:提供訪問替他文檔基本內容的文檔類。
如果有多文檔打開,那么處於最頂層或者活動的視圖所在的工程或者文檔就是活動文檔。
 
Revit應用類
Revit應用類主要分為UIApplication和Application兩大類。
RevitAPI分為UIControlledApplication和ControlledApplication。這兩類Application是對UIApplication和Application的進一步封裝,用戶無法通過這兩個應用類訪問Revit文檔。但是可以實現UI定制和一些事件處理。
Application表示一個Revit應用,提供對文檔、選項以及其他應用范圍的數據的訪問和設置。 用戶可以通過IExternalCommand的Execute函數中的ExternalCommandData來獲取Application對象。例如:Autodesk.Revit.ApplicationSerbices.Application app = commandData.Application.Application;
Revit提供了共享參數機制。Application類中的OpenSharedParameterFile()方法可以用來訪問共享參數文件。Application中的SharedParametersFilename屬性提供了共享參數文件的名稱。
獲取UIApplication對象。用戶可以通過IExternalCommand的Excute函數中的ExternalCommandData來獲取UIApplication對象,例如:
Autodesk.Revit.UI.UIApplication uiApp = commandData.Application;
UIApplication提供了ActiveAddInId屬性來獲取當前活躍的外部命令或者外部應用的ID,同屬UIApplication也提供了LoadedApplications屬性來返回一個成功加載插件的列表。
UIApplication提供了創建自定義Ribbon面板和控件的方法。
 
文檔類
Revit文檔類主要分為UIDocument和Document兩類
Document類用於表示打開的Revit工程。打開多個工程即同時擁有多個Document對象。對象用於存儲Revit的元素、管理視圖和數據。
Document類提供了SiteLoctaion屬性來渠道項目地理位置信息。每個工程應該有一個場地信息來表示這個工程位於什么位置。下面是SiteLocation類的屬性
Elevation 當前海拔位置
Latitude 當前維度
Longitude 當前經度
PlaceName 當前地名
TimeZone 當前時區
WeatherStationName 當前氣象站名
 
 


免責聲明!

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



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