Revit二次开发示例:ChangesMonitor
在本示例中,程序监控Revit打开文件事件,并在创建的窗体中更新文件信息。

#region Namespaces
using System;
using System.Collections.Generic;
using System.Data;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
#endregion namespace ChangesMonitor
{
[Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(JournalingMode.NoCommandData)]
class App : IExternalApplication
{
private static ControlledApplication m_CtrlApp;
private static DataTable m_ChangesInfoTable;
private static ChangesInformationForm m_InfoForm; public static DataTable ChangesInfoTalbe
{
get { return m_ChangesInfoTable; }
set { m_ChangesInfoTable = value; }
} public static ChangesInformationForm InfoForm
{
get { return App.m_InfoForm; }
set { App.m_InfoForm = value; }
} public Result OnStartup(UIControlledApplication a)
{
m_CtrlApp = a.ControlledApplication;
m_ChangesInfoTable = CreateChangeInfoTable();
m_InfoForm = new ChangesInformationForm(ChangesInfoTalbe); m_CtrlApp.DocumentChanged += m_CtrlApp_DocumentChanged; m_InfoForm.Show(); return Result.Succeeded;
} void m_CtrlApp_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e)
{
Document doc = e.GetDocument(); ICollection<ElementId> addedElem = e.GetAddedElementIds();
foreach (ElementId id in addedElem)
{
AddChangeInfoRow(id, doc, "Added");
} ICollection<ElementId> deletedElem = e.GetDeletedElementIds();
foreach (ElementId id in deletedElem)
{
AddChangeInfoRow(id, doc, "Deleted");
} ICollection<ElementId> modifiedElem = e.GetModifiedElementIds();
foreach (ElementId id in modifiedElem)
{
AddChangeInfoRow(id, doc, "Modified");
} } public Result OnShutdown(UIControlledApplication a)
{
m_CtrlApp.DocumentChanged -= m_CtrlApp_DocumentChanged;
m_InfoForm = null;
m_ChangesInfoTable = null; return Result.Succeeded;
} private DataTable CreateChangeInfoTable()
{
// create a new dataTable
DataTable changesInfoTable = new DataTable("ChangesInfoTable"); // Create a "ChangeType" column. It will be "Added", "Deleted" and "Modified".
DataColumn styleColumn = new DataColumn("ChangeType", typeof(System.String));
styleColumn.Caption = "ChangeType";
changesInfoTable.Columns.Add(styleColumn); // Create a "Id" column. It will be the Element ID
DataColumn idColumn = new DataColumn("Id", typeof(System.String));
idColumn.Caption = "Id";
changesInfoTable.Columns.Add(idColumn); // Create a "Name" column. It will be the Element Name
DataColumn nameColum = new DataColumn("Name", typeof(System.String));
nameColum.Caption = "Name";
changesInfoTable.Columns.Add(nameColum); // Create a "Category" column. It will be the Category Name of the element.
DataColumn categoryColum = new DataColumn("Category", typeof(System.String));
categoryColum.Caption = "Category";
changesInfoTable.Columns.Add(categoryColum); // Create a "Document" column. It will be the document which own the changed element.
DataColumn docColum = new DataColumn("Document", typeof(System.String));
docColum.Caption = "Document";
changesInfoTable.Columns.Add(docColum); // return this data table
return changesInfoTable;
} private void AddChangeInfoRow(ElementId id, Document doc, string changeType)
{
Element elem = doc.GetElement(id); DataRow newRow = m_ChangesInfoTable.NewRow(); if(elem==null)
{
// this branch is for deleted element due to the deleted element cannot be retrieve from the document.
newRow["ChangeType"] = changeType;
newRow["Id"] = id.IntegerValue.ToString();
newRow["Name"] = "";
newRow["Category"] = "";
newRow["Document"] = "";
}
else
{
newRow["ChangeType"]=changeType;
newRow["Id"]=id.IntegerValue.ToString();
newRow["Name"]=elem.Name;
newRow["Category"]=elem.Category.Name;
newRow["Document"]=doc.Title;
} m_ChangesInfoTable.Rows.Add(newRow);
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace ChangesMonitor
{
public partial class ChangesInformationForm : Form
{
public ChangesInformationForm()
{
InitializeComponent(); } public ChangesInformationForm(DataTable dataBuffer)
:this()
{
changesdataGridView.DataSource = dataBuffer;
changesdataGridView.AutoGenerateColumns = false; } private void ChangesInfoForm_Shown(object sender, EventArgs e)
{
int left = Screen.PrimaryScreen.WorkingArea.Right - this.Width - 5;
int top = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
Point windowLocation = new Point(left, top);
this.Location = windowLocation; } private void changesdataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
changesdataGridView.CurrentCell = changesdataGridView.Rows[changesdataGridView.Rows.Count - 1].Cells[0];
} private void ChangesInformationForm_FormClosed(object sender, FormClosedEventArgs e)
{
App.InfoForm = null;
} }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace ChangesMonitor
{
public partial class ChangesInformationForm : Form
{
public ChangesInformationForm()
{
InitializeComponent(); } public ChangesInformationForm(DataTable dataBuffer)
:this()
{
changesdataGridView.DataSource = dataBuffer;
changesdataGridView.AutoGenerateColumns = false; } private void ChangesInfoForm_Shown(object sender, EventArgs e)
{
int left = Screen.PrimaryScreen.WorkingArea.Right - this.Width - 5;
int top = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
Point windowLocation = new Point(left, top);
this.Location = windowLocation; } private void changesdataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
changesdataGridView.CurrentCell = changesdataGridView.Rows[changesdataGridView.Rows.Count - 1].Cells[0];
} private void ChangesInformationForm_FormClosed(object sender, FormClosedEventArgs e)
{
App.InfoForm = null;
} }
}
Revit二次开发示例:ChangesMonitor的更多相关文章
- Revit二次开发示例:HelloRevit
本示例实现Revit和Revit打开的文件的相关信息. #region Namespaces using System; using System.Collections.Generic; using ...
- Revit二次开发示例:EventsMonitor
在该示例中,插件在Revit启动时弹出事件监控选择界面,供用户设置,也可在添加的Ribbon界面完成设置.当Revit进行相应操作时,弹出窗体会记录事件时间和名称. #region Namespace ...
- Revit二次开发示例:ErrorHandling
本示例介绍了Revit的错误处理. #region Namespaces using System; using System.Collections.Generic; using Autodes ...
- Revit二次开发示例:AutoStamp
该示例中,在Revit启动时添加打印事件,在打印时向模型添加水印,打印完成后删除该水印. #region Namespaces using System; using System.Collect ...
- Revit二次开发示例:ModelessForm_ExternalEvent
使用Idling事件处理插件任务. #region Namespaces using System; using System.Collections.Generic; using Autodesk. ...
- Revit二次开发示例:Journaling
关于Revit Journal读写的例子. #region Namespaces using System; using System.Collections.Generic; using Sys ...
- Revit二次开发示例:DisableCommand
Revit API 不支持调用Revit内部命令,但可以用RevitCommandId重写它们(包含任意选项卡,菜单和右键命令).使用RevitCommandId.LookupCommandId()可 ...
- Revit二次开发示例:DesignOptions
本例只要演示Revit的类过滤器的用法,在对话框中显示DesignOption元素. #region Namespaces using System; using System.Collections ...
- Revit二次开发示例:DeleteObject
在本例中,通过命令可以删除选中的元素. 需要注意的是要在代码中加入Transaction,否则的话会出现Modifying is forbidden because the document has ...
随机推荐
- 2016.6.19——C++杂记
C++杂记 补充的小知识点: 1.while(n--)和while(--n)区别: while(n--)即使不满足也执行一次循环后跳出. while(--n)不满足直接跳出循环,不执行语句. 用cou ...
- 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理
令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...
- Flask:初见
Windows 10家庭中文版,Python 3.6.4 从Flask官网开始学起. 介绍 Flask是一个Python的Web开发微框架,基于Werkzeug.Jinja2模块(and good i ...
- java基础47 装饰着模式设计
1.装饰者模式 增强一个类的功能,而且还可以让这些装饰类相互装饰 2.装饰者设计模式的步骤 1.在装饰类的内部维护一个被装饰类的引用 2.让装饰者有一个共同的父类或者父接口 3.实例 packa ...
- Oracle 中count(1) 、count(*) 和count(列名) 函数的区别
1)count(1)与count(*)比较: 1.如果你的数据表没有主键,那么count(1)比count(*)快2.如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快3. ...
- 洛谷P2279消防局的设立
传送门啦 一个很摸不清头脑的树形dp 状态: $ dp[i][0] $ :选自己 $ dp[i][1] $ :选了至少一个儿子 $ dp[i][2] $ :选了至少一个孙子 ------------- ...
- 应用服务器中对JDK的epoll空转bug的处理
原文链接:应用服务器中对JDK的epoll空转bug的处理 前面讲到了epoll的一些机制,与select和poll等传统古老的IO多路复用机制的一些区别,这些区别实质可以总结为一句话, 就是epol ...
- 由结构体成员地址计算结构体地址——list_entry()原理详解
#define list_entry(ptr, type, member) container_of(ptr, type, member) 在进行编程的时候,我们经常在知道结构体地址的情况下,寻找其中 ...
- 在VirtualBox虚拟机中安装Centos操作系统怎么与本地XShell远程连接
问题: 在VirtualBox安装好了CentOS操作系统后,我们怎么才可以用XSell连接虚拟机中的CentOS呢? 答案: (1)在windows下用cmd--ipconfig查看VirtualB ...
- Linux学习笔记:vi常用命令
在Linux系统中常用vi命令进行文本编辑. vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器.Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved), ...