【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;
        }
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤影墨客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值