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; } } }