Revit二次开发示例:ChangesMonitor

时间:2021-03-25 05:39:10

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

Revit二次开发示例:ChangesMonitor

 

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

}
}