RevitAPI:監聽文檔改變ControlledApplication/Application.DocumentChanged事件

很多時候,我想通過API獲取上一次操作有哪些對象被創建、修改或者刪除了。或者想監聽文檔的改變事件,一旦改變發生,程序就做一些特定的事情,例如,把這些改變記錄在數據庫中,再和其他應用進行交流。

這個時候,就要用到ControlledApplication.DocumentChanged或者Application.DocumentChanged事件了。

這裏,我先推薦大家學習一個SDK裏面的例子,名字就叫:DocumentChanged,它用來把所有的對文檔的修改記錄下來,顯示在一個表格裏面:


接下來我們看怎麼使用。


首先,我們需要註冊這個事件,通常情況下,會在IExternalApplication裏面註冊,因爲它是ControlledApplication或Application類的事件,如果在IExternalCommand裏面註冊的話,當Execute函數退出的時候,需要註銷這個事件,否則可能造成事件無法管控。

但是在測試環境的時候,我們可以使用IExternalCommand來註冊事件,這樣比較方便使用AddInManager來加載和調試。

這裏我們就以IExternalApplication作爲例子:

public class DocChangedRegistryApp : IExternalApplication
{
    public Result OnStartup(UIControlledApplication application)
    {
        //註冊事件
        application.ControlledApplication.DocumentChanged
            += ControlledApplication_DocumentChanged;
        return Result.Succeeded;
    }

    public Result OnShutdown(UIControlledApplication application)
    {
        //註銷事件
        application.ControlledApplication.DocumentChanged
            -= ControlledApplication_DocumentChanged;
        return Result.Succeeded;
    }

    void ControlledApplication_DocumentChanged(object sender, DocumentChangedEventArgs e)
    {
        var doc = e.GetDocument(); //獲取對應的文檔對象
        var added = e.GetAddedElementIds(); //獲取增加的對象
        var deleted = e.GetDeletedElementIds(); //獲取刪除的對象
        var modified = e.GetModifiedElementIds(); //獲取修改的對象
        //自己的後續程序
    }
}

可以看到,在事件的handler函數裏面,我們可以獲取對應的Document對象,以及增刪改的元素的Id,獲得這些對象之後,幾乎可以做任何事情了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章