using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DotNet.Revit.ExternalEvent
{
///
/// 外部事件的封装.
///
public class ExternalEventHelper
{
private readonly ExternalEventHandlerCommon externalEventHandlerCommon;
private readonly Autodesk.Revit.UI.ExternalEvent externalEvent;
///
/// 外部事件刚刚开始并且准备执行时触发.
///
public event EventHandler Started;
///
/// 外部事件结束时触发.
///
public event EventHandler End;
public ExternalEventHelper(UIApplication uiApp)
{
this.externalEventHandlerCommon = new ExternalEventHandlerCommon();
this.externalEvent = Autodesk.Revit.UI.ExternalEvent.Create(this.externalEventHandlerCommon);
this.externalEventHandlerCommon.Started += externalEventCommon_Started;
this.externalEventHandlerCommon.End += externalEventCommon_End;
}
public ExternalEventHelper(UIControlledApplication uiControlApp)
{
this.externalEventHandlerCommon = new ExternalEventHandlerCommon();
this.externalEvent = Autodesk.Revit.UI.ExternalEvent.Create(this.externalEventHandlerCommon);
this.externalEventHandlerCommon.Started += externalEventCommon_Started;
this.externalEventHandlerCommon.End += externalEventCommon_End;
}
public void Invoke(Action action, string name = "")
{
var nf = string.IsNullOrWhiteSpace(name) ? Guid.NewGuid().ToString() : name;
this.externalEventHandlerCommon.Actions.Enqueue(new KeyValuePair>(nf, action));
this.externalEvent.Raise();
}
private void externalEventCommon_End(object sender, ExternalEventArg e)
{
if (this.End != null)
this.End(this, e);
}
private void externalEventCommon_Started(object sender, ExternalEventArg e)
{
if (this.Started != null)
this.Started(this, e);
}
class ExternalEventHandlerCommon : IExternalEventHandler
{
internal Queue>> Actions { get; set; }
public event EventHandler Started;
public event EventHandler End;
internal ExternalEventHandlerCommon()
{
this.Actions = new Queue>>();
}
public void Execute(UIApplication app)
{
while (this.Actions.Count > 0)
{
var first = this.Actions.Dequeue();
if (string.IsNullOrWhiteSpace(first.Key) || first.Value == null)
continue;
try
{
if (this.Started != null)
this.Started(this, new ExternalEventArg(app, first.Key));
first.Value(app);
}
finally
{
this.End(this, new ExternalEventArg(app, first.Key));
}
}
}
public string GetName()
{
return "";
}
}
}
///
/// 外部事件参数.
///
///
public class ExternalEventArg : EventArgs
{
public ExternalEventArg(UIApplication app, string name)
{
this.App = app;
this.Name = name;
}
public UIApplication App { get; private set; }
public string Name { get; private set; }
}
}