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;
            }
    
        }
    }
  • 相关阅读:
    linux UID,GID,EUID,EGID,SUID,SGID
    Hard模式题目
    【Todo】Java TreeSet学习 & ceiling,floor
    被信号打断的系统调用
    拟牛顿法——变种及其相互关系
    域名注册查询接口(API)的说明
    HDU 2825 Wireless Password(AC自动机+状压DP)
    串的模式匹配
    Android DES加密的CBC模式加密解密和ECB模式加密解密
    [Web Chart系列之五] 6. 实战draw2d之ConnectionRouter
  • 原文地址:https://www.cnblogs.com/xpvincent/p/3605311.html
Copyright © 2011-2022 走看看