Files
DotNet.Revit/DotNet.Revit.ExternalEvent/ExternalEventHelper.cs
2026-02-23 16:57:09 +08:00

125 lines
4.0 KiB
C#

using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DotNet.Revit.ExternalEvent
{
/// <summary>
/// 外部事件的封装.
/// </summary>
public class ExternalEventHelper
{
private readonly ExternalEventHandlerCommon externalEventHandlerCommon;
private readonly Autodesk.Revit.UI.ExternalEvent externalEvent;
/// <summary>
/// 外部事件刚刚开始并且准备执行时触发.
/// </summary>
public event EventHandler<ExternalEventArg> Started;
/// <summary>
/// 外部事件结束时触发.
/// </summary>
public event EventHandler<ExternalEventArg> 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<UIApplication> action, string name = "")
{
var nf = string.IsNullOrWhiteSpace(name) ? Guid.NewGuid().ToString() : name;
this.externalEventHandlerCommon.Actions.Enqueue(new KeyValuePair<string, Action<UIApplication>>(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<KeyValuePair<string, Action<UIApplication>>> Actions { get; set; }
public event EventHandler<ExternalEventArg> Started;
public event EventHandler<ExternalEventArg> End;
internal ExternalEventHandlerCommon()
{
this.Actions = new Queue<KeyValuePair<string, Action<UIApplication>>>();
}
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 "";
}
}
}
/// <summary>
/// 外部事件参数.
/// </summary>
/// <seealso cref="System.EventArgs" />
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; }
}
}