使用Idling事件处理插件任务。
#region Namespaces using System; using System.Collections.Generic; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Events; #endregion namespace ModelessForm_IdlingEvent { [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)] [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)] [Autodesk.Revit.Attributes.Journaling(JournalingMode.NoCommandData)] 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.IsDisposed) { m_MyForm.Dispose(); m_MyForm = null; a.Idling -= IdlingHandler; } return Result.Succeeded; } public void ShowForm(UIApplication uiapp) { if (m_MyForm == null || m_MyForm.IsDisposed) { m_MyForm = new ModelessForm(); m_MyForm.Show(); uiapp.Idling += IdlingHandler; } } public void IdlingHandler(object sender, IdlingEventArgs args) { UIApplication uiapp = sender as UIApplication; if (m_MyForm.IsDisposed) { uiapp.Idling -= IdlingHandler; return; } else { RequestId request = m_MyForm.Request.Take(); if (request != RequestId.None) { try { RequestHandler.Execute(uiapp, request); } finally { m_MyForm.WakeUp(); } } } return; } } }
#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_IdlingEvent { [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 Autodesk.Revit.DB; using Autodesk.Revit.UI; namespace ModelessForm_IdlingEvent { public static class RequestHandler { private delegate void DoorOperation(FamilyInstance e); public static void Execute(UIApplication uiapp, RequestId request) { switch (request) { 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: { break; } } return; } private static 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 static void FlipHandAndFace(FamilyInstance e) { e.flipFacing(); e.flipHand(); } private static void MakeLeft(FamilyInstance e) { if (e.FacingFlipped ^ e.HandFlipped) e.flipHand(); } private static void MakeRight(FamilyInstance e) { if (!(e.FacingFlipped ^ e.HandFlipped)) e.flipHand(); } private static void TurnIn(FamilyInstance e) { if (!e.FacingFlipped) e.flipFacing(); } private static void TurnOut(FamilyInstance e) { if (e.FacingFlipped) e.flipFacing(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ModelessForm_IdlingEvent { public enum RequestId:int { None = 0, Delete=1, FlipLeftRight=2, FlipInOut=3, MakeRight=4, MakeLeft=5, TurnOut=6, TurnIn=7, 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.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ModelessForm_IdlingEvent { public partial class ModelessForm : Form { private Request m_request; public Request Request { get { return m_request; } private set { m_request = value; } } public ModelessForm() { InitializeComponent(); Request = new Request(); } 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) { Request.Make(request); DozeOff(); } private void DozeOff() { EnableCommands(false); } public void WakeUp() { EnableCommands(true); } private void btnFlipLeftRight_Click(object sender, EventArgs e) { MakeRequest(RequestId.FlipLeftRight); } private void btnFlipUpDown_Click(object sender, EventArgs e) { MakeRequest(RequestId.FlipInOut); } private void btnFlipLeft_Click(object sender, EventArgs e) { MakeRequest(RequestId.MakeLeft); } private void btnFlipUp_Click(object sender, EventArgs e) { MakeRequest(RequestId.TurnIn); } private void btnFlipRight_Click(object sender, EventArgs e) { MakeRequest(RequestId.MakeRight); } private void btnFlipDown_Click(object sender, EventArgs e) { MakeRequest(RequestId.TurnOut); } 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(); } } }