1. 程式人生 > >RevitAPI:監聽文件改變ControlledApplication/Application.DocumentChanged事件

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,獲得這些物件之後,幾乎可以做任何事情了。