#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();
}
}
}