Revit二次开发示例:EventsMonitor

在该示例中,插件在Revit启动时弹出事件监控选择界面,供用户设置,也可在添加的Ribbon界面完成设置。当Revit进行相应操作时,弹出窗体会记录事件时间和名称。

 

#region Namespaces
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
#endregion

namespace EventsMonitor
{
    [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
    [Autodesk.Revit.Attributes.Journaling(JournalingMode.NoCommandData)]
    class App : IExternalApplication
    {
        private static UIControlledApplication m_ctrlApp;
        private static LogManager m_logManager;
        private static EventsInfoWindows m_infWindows;
        private static EventsSettingForm m_settingDialog;
        private static List<String> m_appEventsSelection;
        private static EventManager m_appEventMgr;

        public static EventsInfoWindows InfoWindows
        {
            get
            {
                if (null == m_infWindows)
                {
                    m_infWindows = new EventsInfoWindows();
                }
                return m_infWindows;
            }
            set
            {
                m_infWindows = value;
            }
        }

        public static EventsSettingForm SettingDialog
        {
            get
            {
                if (null == m_settingDialog)
                {
                    m_settingDialog = new EventsSettingForm();
                }
                return m_settingDialog;
            }
        }

        public static LogManager EventLogManager
        {
            get
            {
                if (null == m_logManager)
                {
                    m_logManager = new LogManager();
                }
                return m_logManager;
            }

        }

        public static List<String> ApplicationEvents
        {
            get
            {
                if (null == m_appEventsSelection)
                {
                    m_appEventsSelection = new List<string>();
                }
                return m_appEventsSelection;
            }
            set
            {
                m_appEventsSelection = value;
            }
        }

        public static EventManager AppEventMgr
        {
            get
            {
                if (null == m_appEventMgr)
                {
                    m_appEventMgr = new EventManager(m_ctrlApp);
                }
                return m_appEventMgr;
            }
        }


        public Result OnStartup(UIControlledApplication a)
        {
            m_ctrlApp = a;
            m_logManager = new LogManager();
            m_infWindows = new EventsInfoWindows(m_logManager);
            m_settingDialog = new EventsSettingForm();
            m_appEventsSelection = new List<string>();
            m_appEventMgr = new EventManager(m_ctrlApp);

            try
            {
                m_settingDialog.ShowDialog();
                if (DialogResult.OK == m_settingDialog.DialogResult)
                {
                    m_appEventsSelection = m_settingDialog.AppSelectionList;
                }

                m_appEventMgr.Update(m_appEventsSelection);
                m_infWindows.Show();
                AddCustomPanel(a);
            }
            catch (Exception)
            {
                return Result.Failed;
            }

            return Result.Succeeded;
        }

        public Result OnShutdown(UIControlledApplication a)
        {
            Dispose();
            return Result.Succeeded;
        }

        public static void Dispose()
        {
            if (m_infWindows != null)
            {
                m_infWindows.Close();
                m_infWindows = null;
            }
            if (m_settingDialog != null)
            {
                m_settingDialog.Close();
                m_settingDialog = null;
            }
            m_appEventMgr = null;
            m_logManager.CloseLogFile();
            m_logManager = null;
        }

        static private void AddCustomPanel(UIControlledApplication application)
        {
            string panelName = "Events Monitor";
            RibbonPanel ribbonPanelPushButtons = application.CreateRibbonPanel(panelName);
            PushButtonData pushButtonData = new PushButtonData("EventsSetting",
                "Set Events", System.Reflection.Assembly.GetExecutingAssembly().Location,
                "EventsMonitor.Command");
            PushButton pushButtonCreateWall = ribbonPanelPushButtons.AddItem(pushButtonData) as PushButton;
            pushButtonCreateWall.ToolTip = "Setting Events";
        }

    }
}
View Code
#region Namespaces
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
#endregion

namespace EventsMonitor
{
    [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
    [Autodesk.Revit.Attributes.Journaling(JournalingMode.NoCommandData)]
    public class Command : IExternalCommand
    {
        public Result Execute(
          ExternalCommandData commandData,
          ref string message,
          ElementSet elements)
        {
            IDictionary<string, string> journaldata = commandData.JournalData;
            App.SettingDialog.ShowDialog();
            if (DialogResult.OK == App.SettingDialog.DialogResult)
            {
                App.ApplicationEvents = App.SettingDialog.AppSelectionList;
            }

            App.AppEventMgr.Update(App.ApplicationEvents);
            App.InfoWindows.Show();

            return Result.Succeeded;
        }
    }
}
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Events;

namespace EventsMonitor
{
    public class EventManager
    {
        private UIControlledApplication m_app;
        private List<String> historySelection;

        private EventManager()
        {

        }

        public EventManager(UIControlledApplication app)
        {
            m_app = app;
            historySelection = new List<string>();
        }

        public void Update(List<String> selection)
        {
            foreach (String eventname in historySelection)
            {
                if (!selection.Contains(eventname))
                {
                    subtractEvents(eventname);
                }
            }

            foreach (String eventname in selection)
            {
                if (!historySelection.Contains(eventname))
                {
                    addEvents(eventname);
                }
            }

            historySelection.Clear();
            foreach (String eventname in selection)
            {
                historySelection.Add(eventname);
            }

        }

        private void addEvents(String eventName)
        {
            switch (eventName)
            {
                case "DocumentCreating":
                    m_app.ControlledApplication.DocumentCreating += new EventHandler<DocumentCreatingEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentCreated":
                    m_app.ControlledApplication.DocumentCreated += new EventHandler<DocumentCreatedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentOpening":
                    m_app.ControlledApplication.DocumentOpening += new EventHandler<DocumentOpeningEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentOpened":
                    m_app.ControlledApplication.DocumentOpened += new EventHandler<DocumentOpenedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentClosing":
                    m_app.ControlledApplication.DocumentClosing += new EventHandler<DocumentClosingEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentClosed":
                    m_app.ControlledApplication.DocumentClosed += new EventHandler<DocumentClosedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentSavedAs":
                    m_app.ControlledApplication.DocumentSavedAs += new EventHandler<DocumentSavedAsEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentSavingAs":
                    m_app.ControlledApplication.DocumentSavingAs += new EventHandler<DocumentSavingAsEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentSaving":
                    m_app.ControlledApplication.DocumentSaving += new EventHandler<DocumentSavingEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentSaved":
                    m_app.ControlledApplication.DocumentSaved += new EventHandler<DocumentSavedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentSynchronizingWithCentral":
                    m_app.ControlledApplication.DocumentSynchronizingWithCentral += new EventHandler<DocumentSynchronizingWithCentralEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentSynchronizedWithCentral":
                    m_app.ControlledApplication.DocumentSynchronizedWithCentral += new EventHandler<DocumentSynchronizedWithCentralEventArgs>(app_eventsHandlerMethod);
                    break;
                case "FileExporting":
                    m_app.ControlledApplication.FileExporting += new EventHandler<FileExportingEventArgs>(app_eventsHandlerMethod);
                    break;
                case "FileExported":
                    m_app.ControlledApplication.FileExported += new EventHandler<FileExportedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "FileImporting":
                    m_app.ControlledApplication.FileImporting += new EventHandler<FileImportingEventArgs>(app_eventsHandlerMethod);
                    break;
                case "FileImported":
                    m_app.ControlledApplication.FileImported += new EventHandler<FileImportedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentPrinting":
                    m_app.ControlledApplication.DocumentPrinting += new EventHandler<DocumentPrintingEventArgs>(app_eventsHandlerMethod);
                    break;
                case "DocumentPrinted":
                    m_app.ControlledApplication.DocumentPrinted += new EventHandler<DocumentPrintedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "ViewPrinting":
                    m_app.ControlledApplication.ViewPrinting += new EventHandler<ViewPrintingEventArgs>(app_eventsHandlerMethod);
                    break;
                case "ViewPrinted":
                    m_app.ControlledApplication.ViewPrinted += new EventHandler<ViewPrintedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "ViewActivating":
                    m_app.ViewActivating += new EventHandler<ViewActivatingEventArgs>(app_eventsHandlerMethod);
                    break;
                case "ViewActivated":
                    m_app.ViewActivated += new EventHandler<ViewActivatedEventArgs>(app_eventsHandlerMethod);
                    break;
                case "ProgressChanged":
                    m_app.ControlledApplication.ProgressChanged += new EventHandler<ProgressChangedEventArgs>(app_eventsHandlerMethod);
                    break;
            }
        }

        private void subtractEvents(String eventName)
        {
            switch (eventName)
            {
                case "DocumentCreating":
                    m_app.ControlledApplication.DocumentCreating -= app_eventsHandlerMethod;
                    break;
                case "DocumentCreated":
                    m_app.ControlledApplication.DocumentCreated -= app_eventsHandlerMethod;
                    break;
                case "DocumentOpening":
                    m_app.ControlledApplication.DocumentOpening -= app_eventsHandlerMethod;
                    break;
                case "DocumentOpened":
                    m_app.ControlledApplication.DocumentOpened -= app_eventsHandlerMethod;
                    break;
                case "DocumentClosing":
                    m_app.ControlledApplication.DocumentClosing -= app_eventsHandlerMethod;
                    break;
                case "DocumentClosed":
                    m_app.ControlledApplication.DocumentClosed -= app_eventsHandlerMethod;
                    break;
                case "DocumentSavedAs":
                    m_app.ControlledApplication.DocumentSavedAs -= app_eventsHandlerMethod;
                    break;
                case "DocumentSavingAs":
                    m_app.ControlledApplication.DocumentSavingAs -= app_eventsHandlerMethod;
                    break;
                case "DocumentSaving":
                    m_app.ControlledApplication.DocumentSaving -= app_eventsHandlerMethod;
                    break;
                case "DocumentSaved":
                    m_app.ControlledApplication.DocumentSaved -= app_eventsHandlerMethod;
                    break;
                case "DocumentSynchronizingWithCentral":
                    m_app.ControlledApplication.DocumentSynchronizingWithCentral -= app_eventsHandlerMethod;
                    break;
                case "DocumentSynchronizedWithCentral":
                    m_app.ControlledApplication.DocumentSynchronizedWithCentral -= app_eventsHandlerMethod;
                    break;
                case "FileExporting":
                    m_app.ControlledApplication.FileExporting -= app_eventsHandlerMethod;
                    break;
                case "FileExported":
                    m_app.ControlledApplication.FileExported -= app_eventsHandlerMethod;
                    break;
                case "FileImporting":
                    m_app.ControlledApplication.FileImporting -= app_eventsHandlerMethod;
                    break;
                case "FileImported":
                    m_app.ControlledApplication.FileImported -= app_eventsHandlerMethod;
                    break;
                case "DocumentPrinting":
                    m_app.ControlledApplication.DocumentPrinting -= app_eventsHandlerMethod;
                    break;
                case "DocumentPrinted":
                    m_app.ControlledApplication.DocumentPrinted -= app_eventsHandlerMethod;
                    break;
                case "ViewPrinting":
                    m_app.ControlledApplication.ViewPrinting -= app_eventsHandlerMethod;
                    break;
                case "ViewPrinted":
                    m_app.ControlledApplication.ViewPrinted -= app_eventsHandlerMethod;
                    break;
                case "ViewActivating":
                    m_app.ViewActivating -= app_eventsHandlerMethod;
                    break;
                case "ViewActivated":
                    m_app.ViewActivated -= app_eventsHandlerMethod;
                    break;
                case "ProgressChanged":
                    m_app.ControlledApplication.ProgressChanged -= app_eventsHandlerMethod;
                    break;
            }
        }

        public void app_eventsHandlerMethod(Object obj, EventArgs args)
        {
            // generate event information and set to information window 
            // to track what event be touch off.
            App.EventLogManager.TrackEvent(obj, args);
            // write log file.
            App.EventLogManager.WriteLogFile(obj, args);
        }

    }
}
View Code
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 EventsMonitor
{
    public partial class EventsInfoWindows : Form
    {
        private LogManager m_dataBuffer;



        public EventsInfoWindows()
        {
            InitializeComponent();
        }

        public EventsInfoWindows(LogManager dataBuffer)
            : this()
        {
            m_dataBuffer = dataBuffer;
            Initialize();
        }

        private void Initialize()
        {
            appEventsLogDataGridView.AutoGenerateColumns = false;
            appEventsLogDataGridView.DataSource = m_dataBuffer.EventsLog;
            timeColumn.DataPropertyName = "Time";
            eventColumn.DataPropertyName = "Event";
            typeColumn.DataPropertyName = "Type";
        }

        private void EventsInfoWindows_FormClosed(object sender, FormClosedEventArgs e)
        {
            App.InfoWindows = null;
        }

        private void EventsInfoWindows_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 appEventsLogDataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            appEventsLogDataGridView.CurrentCell = appEventsLogDataGridView.Rows[appEventsLogDataGridView.Rows.Count - 1].Cells[0];
        }



    }
}
View Code
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 EventsMonitor
{
    public partial class EventsSettingForm : Form
    {

        private List<String> m_appSelection;

        public List<String> AppSelectionList
        {
            get
            {
                if (null == m_appSelection)
                {
                    m_appSelection = new List<string>();
                }
                return m_appSelection;
            }
            set
            {
                m_appSelection = value;
            }
        }

        public EventsSettingForm()
        {
            InitializeComponent();
            m_appSelection = new List<string>();
        }

        private void FinishToggle_Click(object sender, EventArgs e)
        {
            m_appSelection.Clear();
            foreach (object item in AppEventsCheckedList.CheckedItems)
            {
                m_appSelection.Add(item.ToString());
            }
            this.DialogResult = DialogResult.OK;
            this.Hide();
        }

        private void EventsSettingForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.Hide();
        }

        private void checkAllButton_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < AppEventsCheckedList.Items.Count; i++ )
            {
                AppEventsCheckedList.SetItemChecked(i, true);
            }
        }

        private void checkNoneButton_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < AppEventsCheckedList.Items.Count; i++)
            {
                AppEventsCheckedList.SetItemChecked(i, false);
            }
        }

        private void cancelButton_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Hide();
        }


    }
}
View Code
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;

namespace EventsMonitor
{
    public class LogManager
    {
        private DataTable m_eventsLog;
        private TextWriterTraceListener m_txtListener;
        private string m_filePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        private string m_tempFile;

        public DataTable EventsLog
        {
            get
            {
                return m_eventsLog;
            }
        }

        public LogManager()
        {
            CreateLogFile();
            m_eventsLog = CreateEventsLogTable();
        }

        private void CreateLogFile()
        {
            m_tempFile = Path.Combine(m_filePath, "Temp.log");
            if (File.Exists(m_tempFile)) File.Delete(m_tempFile);
            m_txtListener = new TextWriterTraceListener(m_tempFile);
            Trace.Listeners.Add(m_txtListener);
        }

        public void CloseLogFile()
        {
            Trace.Flush();
            Trace.Listeners.Remove(m_txtListener);
            Trace.Close();
            m_txtListener.Close();

            string log = Path.Combine(m_filePath, "EventsMonitor.log");
            if (File.Exists(log)) File.Delete(log);
            File.Copy(m_tempFile, log);
            File.Delete(m_tempFile);
        }

        private DataTable CreateEventsLogTable()
        {
            DataTable eventsInfoLogTable = new DataTable("EventsLogInfoTable");

            DataColumn timeColumn = new DataColumn("Time", typeof(System.String));
            timeColumn.Caption = "Time";
            eventsInfoLogTable.Columns.Add(timeColumn);

            DataColumn eventColum = new DataColumn("Event", typeof(System.String));
            eventColum.Caption = "Event";
            eventsInfoLogTable.Columns.Add(eventColum);

            DataColumn typeColumn = new DataColumn("Type", typeof(System.String));
            typeColumn.Caption = "Type";
            eventsInfoLogTable.Columns.Add(typeColumn);

            return eventsInfoLogTable;
        }

        public void TrackEvent(Object sender, EventArgs args)
        {
            DataRow newRow= m_eventsLog.NewRow();
            newRow["Time"] = System.DateTime.Now.ToString();
            newRow["Event"] = GetEventsName(args.GetType());
            newRow["Type"] = sender.GetType().ToString();

            m_eventsLog.Rows.Add(newRow);
        }

        public void WriteLogFile(Object sender, EventArgs args)
        {
            Trace.WriteLine("*********************************************************");
            if (null == args)
            {
                return;
            }

            Type type = args.GetType();
            String eventName = GetEventsName(type);
            Trace.WriteLine("Raised " + sender.GetType().ToString() + "." + eventName);
            Trace.WriteLine("---------------------------------------------------------");

            Trace.WriteLine("  Start to dump Sender and EventArgs of Event... \n");
            if (null != sender)
            {
                Trace.WriteLine("    [Event Sender]: " + sender.GetType().FullName);
            }
            else
            {
                Trace.WriteLine("    Sender is null, it's unexpected!!!");
            }


            PropertyInfo[] propertyInfos = type.GetProperties();

            foreach (PropertyInfo propertyInfo in propertyInfos)
            {
                try
                {
                    if (!propertyInfo.CanRead)
                    {
                        continue;
                    }
                    else
                    {
                        Object propertyValue;
                        String propertyName = propertyInfo.Name;
                        switch (propertyName)
                        {
                            case "Document":
                            case "Cancellable":
                            case "Cancel":
                            case "Status":
                            case "DocumentType":
                            case "Format":
                                propertyValue = propertyInfo.GetValue(args, null);
                                // Dump current property value
                                Trace.WriteLine("    [Property]: " + propertyInfo.Name);
                                Trace.WriteLine("    [Value]: " + propertyValue.ToString());
                                break;
                        }
                    }

                }
                catch (Exception ex)
                {
                    Trace.WriteLine("    [Property Exception]: " + propertyInfo.Name + ", " + ex.Message);
                }
            }

        }


        private String GetEventsName(Type type)
        {
            String argName = type.ToString();
            String tail = "EventArgs";
            String head = "Autodesk.Revit.DB.Events.";
            int firstIndex = head.Length;
            int length = argName.Length - head.Length - tail.Length;
            String eventName = argName.Substring(firstIndex, length);
            return eventName;
        }

    }
}
View Code

 

posted @ 2014-03-19 16:59  马语者  阅读(2233)  评论(0编辑  收藏  举报