• Revit二次开发示例:ModelessForm_ExternalEvent


     

    #region Namespaces
    using System;
    using System.Collections.Generic;
    using Autodesk.Revit.ApplicationServices;
    using Autodesk.Revit.Attributes;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;
    #endregion
    
    namespace ModelessForm_ExternalEvent
    {
        [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
        [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
        [Autodesk.Revit.Attributes.Journaling(JournalingMode.NoCommandData)]
        public class App : IExternalApplication
        {
            internal static App thisApp = null;
            private ModelessForm m_MyForm;
    
    
            public Result OnStartup(UIControlledApplication a)
            {
                m_MyForm = null;
                thisApp = this;
    
                return Result.Succeeded;
            }
    
            public Result OnShutdown(UIControlledApplication a)
            {
                if (m_MyForm != null && m_MyForm.Visible)
                {
                    m_MyForm.Close();
                }
    
                return Result.Succeeded;
            }
    
            public void ShowForm(UIApplication uiapp)
            {
                if (m_MyForm == null || m_MyForm.IsDisposed)
                {
                    RequestHandler handler = new RequestHandler();
                    ExternalEvent exEvent = ExternalEvent.Create(handler);
    
                    m_MyForm = new ModelessForm(exEvent, handler);
                    m_MyForm.Show();
                }
            }
    
            public void WakeFormUp()
            {
                if (m_MyForm != null)
                {
                    m_MyForm.WakeUp();
                }
            }
        }
    }

     

    #region Namespaces
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using Autodesk.Revit.ApplicationServices;
    using Autodesk.Revit.Attributes;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;
    using Autodesk.Revit.UI.Selection;
    #endregion
    
    namespace ModelessForm_ExternalEvent
    {
        [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)
            {
                try
                {
                    App.thisApp.ShowForm(commandData.Application);
                    return Result.Succeeded;
                }
                catch (Exception ex)
                {
                    message = ex.Message;
                    return Result.Failed;
                }
    
                
            }
        }
    }

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace ModelessForm_ExternalEvent
    {
        public enum RequestId : int
        {
            /// <summary>
            /// None
            /// </summary>
            None = 0,
            /// <summary>
            /// "Delete" request
            /// </summary>
            Delete = 1,
            /// <summary>
            /// "FlipLeftRight" request
            /// </summary>
            FlipLeftRight = 2,
            /// <summary>
            /// "FlipInOut" request
            /// </summary>
            FlipInOut = 3,
            /// <summary>
            /// "MakeRight" request
            /// </summary>
            MakeRight = 4,
            /// <summary>
            /// "MakeLeft" request
            /// </summary>
            MakeLeft = 5,
            /// <summary>
            /// "TurnOut" request
            /// </summary>
            TurnOut = 6,
            /// <summary>
            /// "TurnIn" request
            /// </summary>
            TurnIn = 7,
            /// <summary>
            /// "Rotate" request
            /// </summary>
            Rotate = 8
        }
    
        public class Request
        {
            private int m_request = (int)RequestId.None;
    
            public RequestId Take()
            {
                return (RequestId)Interlocked.Exchange(ref m_request, (int)RequestId.None);
            }
    
            public void Make(RequestId request)
            {
                Interlocked.Exchange(ref m_request, (int)request);
            }
    
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;
    
    namespace ModelessForm_ExternalEvent
    {
        public class RequestHandler:IExternalEventHandler
        {
            private delegate void DoorOperation(FamilyInstance e);
            private Request m_request = new Request();
            
            public Request Request
            {
                get { return m_request; }
            }
    
            public string GetName()
            {
                return "R2013 External Event Sample";
            }
    
            public void Execute(UIApplication uiapp)
            {
                try
                {
                    switch (Request.Take())
                    {
                        case RequestId.None:
                            {
                                return;
                            }
                        case RequestId.Delete:
                            {
                                ModifySelectedDoors(uiapp, "Delete doors", e => e.Document.Delete(e.Id));
                                break;
                            }
                        case RequestId.FlipLeftRight:
                            {
                                ModifySelectedDoors(uiapp, "Flip door Hand", e => e.flipHand());
                                break;
                            }
                        case RequestId.FlipInOut:
                            {
                                ModifySelectedDoors(uiapp, "Flip door Facing", e => e.flipFacing());
                                break;
                            }
                        case RequestId.MakeLeft:
                            {
                                ModifySelectedDoors(uiapp, "Make door Left", MakeLeft);
                                break;
                            }
                        case RequestId.MakeRight:
                            {
                                ModifySelectedDoors(uiapp, "Make door Right", MakeRight);
                                break;
                            }
                        case RequestId.TurnOut:
                            {
                                ModifySelectedDoors(uiapp, "Place door Out", TurnOut);
                                break;
                            }
                        case RequestId.TurnIn:
                            {
                                ModifySelectedDoors(uiapp, "Place door In", TurnIn);
                                break;
                            }
                        case RequestId.Rotate:
                            {
                                ModifySelectedDoors(uiapp, "Rotate door", FlipHandAndFace);
                                break;
                            }
                        default:
                            {
                                // some kind of a warning here should
                                // notify us about an unexpected request 
                                break;
                            }
                    }
                }
                finally
                {
    
                    App.thisApp.WakeFormUp();
                }
    
                return;
            }
    
    
            private void ModifySelectedDoors(UIApplication uiApp, string text, DoorOperation operation)
            {
                UIDocument uidoc = uiApp.ActiveUIDocument;
    
                if ((uidoc != null) && (uidoc.Selection != null))
                {
                    ICollection<ElementId> selElements = uidoc.Selection.GetElementIds();
                    if (selElements.Count > 0)
                    {
                        FilteredElementCollector collector = new FilteredElementCollector(uidoc.Document, selElements);
                        ICollection<Element> doorset = collector.OfCategory(BuiltInCategory.OST_Doors).ToElements();
                        
                        if (doorset != null)
                        {
                            using (Transaction trans = new Transaction(uidoc.Document))
                            {
                                if (trans.Start(text) == TransactionStatus.Started)
                                {
                                    foreach (FamilyInstance door in doorset)
                                    {
                                        operation(door);
                                    }
                                    trans.Commit();
                                }
                            }
                        }
                    }
                }
            }
    
            private void FlipHandAndFace(FamilyInstance e)
            {
                e.flipFacing();
                e.flipHand();
            }
    
            private static void MakeLeft(FamilyInstance e)
            {
                if (e.FacingFlipped ^ e.HandFlipped) e.flipHand();
            }
    
            private void MakeRight(FamilyInstance e)
            {
                if (!(e.FacingFlipped ^ e.HandFlipped)) e.flipHand();
            }
    
            private void TurnIn(FamilyInstance e)
            {
                if (!e.FacingFlipped) e.flipFacing();
            }
    
            private void TurnOut(FamilyInstance e)
            {
                if (e.FacingFlipped) e.flipFacing();
            }
    
        }
    
    }
    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;
    using Autodesk.Revit.UI;
    
    namespace ModelessForm_ExternalEvent
    {
        public partial class ModelessForm : Form
        {
            private RequestHandler m_Handler;
            private ExternalEvent m_ExEvent;
    
            public ModelessForm(ExternalEvent exEvent, RequestHandler handler)
            {
                InitializeComponent();
    
                m_Handler = handler;
                m_ExEvent = exEvent;
            }
    
            private void ModelessForm_FormClosed(object sender, FormClosedEventArgs e)
            {
                m_ExEvent.Dispose();
                m_ExEvent = null;
                m_Handler = null;
            }
    
            private void EnableCommands(bool status)
            {
                foreach (Control ctrl in this.Controls)
                {
                    ctrl.Enabled = status;
                }
                if (!status)
                {
                    this.btnExit.Enabled = true;
                }
            }
    
            private void MakeRequest(RequestId request)
            {
                m_Handler.Request.Make(request);
                m_ExEvent.Raise();
                DozeOff();
            }
    
            private void DozeOff()
            {
                EnableCommands(false);
            }
    
            public void WakeUp()
            {
                EnableCommands(true);
            }
    
    
            private void btnFlipLeftRight_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.FlipLeftRight);
            }
    
            private void btnFlipInOut_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.FlipInOut);
            }
    
            private void btnFlipLeft_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.MakeLeft);
            }
    
            private void btnFlipIn_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.TurnIn);
            }
    
            private void btnFlipRight_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.MakeRight);
            }
    
            private void btnFlipOut_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.Rotate);
            }
    
            private void btnRotate_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.Rotate);
            }
    
            private void btnDeleted_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.Delete);
            }
    
            private void btnExit_Click(object sender, EventArgs e)
            {
                Close();
            }
    
            
    
            
    
            
    
            
        }
    }

     

    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;
    using Autodesk.Revit.UI;
    
    namespace ModelessForm_ExternalEvent
    {
        public partial class ModelessForm : Form
        {
            private RequestHandler m_Handler;
            private ExternalEvent m_ExEvent;
    
            public ModelessForm(ExternalEvent exEvent, RequestHandler handler)
            {
                InitializeComponent();
    
                m_Handler = handler;
                m_ExEvent = exEvent;
            }
    
            private void ModelessForm_FormClosed(object sender, FormClosedEventArgs e)
            {
                m_ExEvent.Dispose();
                m_ExEvent = null;
                m_Handler = null;
            }
    
            private void EnableCommands(bool status)
            {
                foreach (Control ctrl in this.Controls)
                {
                    ctrl.Enabled = status;
                }
                if (!status)
                {
                    this.btnExit.Enabled = true;
                }
            }
    
            private void MakeRequest(RequestId request)
            {
                m_Handler.Request.Make(request);
                m_ExEvent.Raise();
                DozeOff();
            }
    
            private void DozeOff()
            {
                EnableCommands(false);
            }
    
            public void WakeUp()
            {
                EnableCommands(true);
            }
    
    
            private void btnFlipLeftRight_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.FlipLeftRight);
            }
    
            private void btnFlipInOut_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.FlipInOut);
            }
    
            private void btnFlipLeft_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.MakeLeft);
            }
    
            private void btnFlipIn_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.TurnIn);
            }
    
            private void btnFlipRight_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.MakeRight);
            }
    
            private void btnFlipOut_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.Rotate);
            }
    
            private void btnRotate_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.Rotate);
            }
    
            private void btnDeleted_Click(object sender, EventArgs e)
            {
                MakeRequest(RequestId.Delete);
            }
    
            private void btnExit_Click(object sender, EventArgs e)
            {
                Close();
            }
    
            
    
            
    
            
    
            
        }
    }
  • 相关阅读:
    一生不可错过的五句话
    分布式缓存系统Memcached简介与实践[转]
    telnet serverip serverport 可以测试服务器端口是否通
    使用c#生成高品质小空间的缩略图
    sql server2005对tsql的增强之在聚合函数的后面使用over关键字
    (转)让你受益终身的10个Word实用技巧
    sql取所有记录中每天的最后一笔交易的记录
    屏蔽服务器端包含在文件不存在时报错的错误信息
    c#农历日历类
    Niubility 英语教程
  • 原文地址:https://www.cnblogs.com/xpvincent/p/3620143.html
Copyright © 2020-2023  润新知