【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;
        }
    }
}
posted @   Patrick-Rex  阅读(121)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
点击右上角即可分享
微信分享提示