zoukankan      html  css  js  c++  java
  • 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;
            }
    
        }
    }
  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/xpvincent/p/3605311.html
Copyright © 2011-2022 走看看