RevitAPI:监听文档改变ControlledApplication/Application.DocumentChanged事件

来源:互联网 发布:网络延迟对网速的影响 编辑:程序博客网 时间:2024/06/01 18:49

很多时候,我想通过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,获得这些对象之后,几乎可以做任何事情了。


0 0