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;

        }



    }

}

你可能感兴趣的:(Monitor)