【Revit二次开发】外部事件(ExternalEvent)
外部事件
外部事件并不是指Csharp中的event关键词修饰的类型,而是一种实现事件机制的接口,它的工作方式与编程中的事件相似:一个插件程序能在某个动作即将发生或发生后得到通知,然后根据这个动作采取行动。
- ExternaEvent.Create()静态方法:创建外部事件
- exteranlEvent.Raise()方法:触发外部事件
- IExternalEventHandler接口: 外部事件处理接口,包含事件触发后所执行的内容。
RevitAPI提供的外部事件框架可以用于非模态对话框。它是特别针对异步处理所开放的事件接口。它和闲置事件(IdlingEvent)处理类似,但可以由用户自己触发。要使用外部事件来实现非模态对话框可以通过下面几步来实现:
- 继承并实现实现外部事件处理接口( IExternalEventHandler);
- 用静态方法ExternalEvent. Create()方法来创建一个外部事件(ExternalEvent);
- 当非模态对话框中某个时候需要调用Revit⑧方法时,调用ExternalEvent. Raise();
- Revit会在下个闲置时间( idling time cycle)到来时调用IExternalEventHandler,Execute( )方法的实现。
ExternalEvent 的创建
调用外部事件类ExternalEvent. Create()方法来创建一个外部事件。该事件所创建的一个实例会被返回给创建者,创建者使用该实例来向Revit发信号触发该事件。Revit会不时地检查是否有外部事件发信号,如果有就会调用外部事件相应的Execute()函数。
ExternalEvent 的触发
调用外部事件类ExternalEvent. Raise()方法来触发一个外部事件。当它被调用后,Revit会等到下一个闲置时间( idling time) 来调用注册好的lExternalEventHandler.Execute()方法。
例如
public static ExternalEvent setParametersHandleEvent = null;
//创建
SetParametersHandle setParametersHandle = new SetParametersHandle();
setParametersHandleEvent = ExternalEvent.Create(setParametersHandle);
public class SetParametersHandle : IExternalEventHandler
实现
Cmd.setParametersHandleEvent.Raise();
调用
例子
//创建一个外部事件并触发此事件
namespace ExternalEventDemo
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class ExteranlEventCmd : IExternalCommand
{
public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
ExternalEvent extEvent = ExternalEvent.Create(new CreateWallEventHandler());//创建
ExternalEventRequest request = extEvent.Raise();//触发
TaskDialog.Show("外部事件", request == ExternalEventRequest.Accepted ? "触发成功" : "触发失败");
return Autodesk.Revit.UI.Result.Succeeded;
}
catch (Exception ex)
{
message = ex.Message;
return Autodesk.Revit.UI.Result.Failed;
}
}
}
}
//实现的功能是创建一个名为“CreateWallEventHandler”、高度为-4m的标高
namespace ExternalEventDemo
{
//外部事件接口
public class CreateWallEventHandler : IExternalEventHandler
{
public void Execute(Autodesk.Revit.UI.UIApplication uiapp)
{
try
{
Document doc = uiapp.ActiveUIDocument.Document;
Transaction tran = new Transaction(doc);
tran.Start(GetName());
CreateLevel(doc, GetName(), -4000);
tran.Commit();
}
catch
{
}
}
public string GetName()
{
return this.GetType().Name;
}
/// <summary>
/// 创建标高
/// </summary>
/// <param name="doc">文档</param>
/// <param name="levelName">标高名称</param>
/// <param name="levelElevation">标高的高度</param>
public void CreateLevel(Document doc, String levelName, double levelElevation)
{
Level newLevel = Level.Create(doc, levelElevation);
Parameter elevationPara = newLevel.get_Parameter(BuiltInParameter.LEVEL_ELEV);
elevationPara.SetValueString(levelElevation.ToString());
newLevel.Name = levelName;
}
}
}
本文来自博客园,作者:Patrick-Rex,转载请注明原文链接:https://www.cnblogs.com/patrickrex/p/18028762
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升