Building Coder 链接:http://thebuildingcoder.typepad.com/blog/2010/04/element-level-events.html#2
Revit 二次开发论坛链接:http://revit.5d6d.com/viewthread.php?tid=1316&extra=
个人认为对元素层级事件的开放是 Revit API 最重要的新特性之一。该特性允许应用程序对 Revit 数据库的改变(包括对特定元素的更改)进行响应。
实际上 Revit 2011 API 为此提供了两种机制:
1. 元素改变事件(Elements Changed Event)
2. 动态模型更新(Dynamic Model Update)
元素改变事件
在每次事务(Transaction)被提交(Committed)、撤消(Undone)或者重新执行(Redone)之后,Revit 会触发一个新的 Application.DocumentChanged 事件。
这是一个只读的事件,设计目的是允许应用程序捕捉 Revit 数据库的变化,并同步需要的外部数据。如果想要根据元素的变化更新 Revit 数据库本身的话,则应该
使用之后会介绍的动态模型更新框架。
事件处理器(Event Handler)会接收到一个 DocumentChangedEventArgs 对象,包含被执行的操作、涉及的文档和元素等信息。下面是其中一些常用的属性和方法:
1. Operation: 触发事件的操作
2. GetDocument: 事件涉及的文档对象
3. GetAddedElementIds: 文档中新增的元素ID集合
4. GetDeletedElementIds: 文档中删除的元素ID集合
5. GetModifiedElementIds: 文档中被修改的元素ID集合
6. GetTransactionNames: 事件所在的事务(可能多个)名称集合
SDK 例程 ChangesMonitor 展示了如何使用元素改变事件。该例程使用一个数据表来记录 Revit 数据库的所有变化,并将其显示在一个无模式对话框 ChangesInformationForm
中。该源码项目包含两个主要类:
1. ChangesMonitor.cs
实现了一个外部程序(ExternalApplication)和一个外部命令(External Command)。外部程序会创建一个无模式对话框,并在其 OnStartup() 方法中注册
Application.DocumentChanged 事件。外部命令会在对话框被关闭时再重新打开它。
public Result OnStartup( UIControlledApplication application ) { // initialize member variables. m_CtrlApp = application.ControlledApplication; m_ChangesInfoTable = CreateChangeInfoTable(); m_InfoForm = new ChangesInformationForm( ChangesInfoTable ); // 注册事件 m_CtrlApp.DocumentChanged += new EventHandler< Autodesk.Revit.DB.Events.DocumentChangedEventArgs>( CtrlApp_DocumentChanged ); // Form.Show() 无模式显示; // Form.ShowDialog() 模式显示 m_InfoForm.Show(); return Result.Succeeded; }