Revit二次开发示例:ChangesMonitor

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

image

 

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

    }
}
原文地址:https://www.cnblogs.com/xpvincent/p/3605311.html