原文链接: Idling Enhancements and External Events

Revit 2013 的一个重要的 API 改进就是空闲事件与无模态对话框的交互。相应的,这篇博文将讨论与之相关的几个主题:

  • 空闲事件的重复性
  • 没有活动文档时的空闲事件
  • 新的外部事件框架
  • RevitWebcam 例程续篇
  • 在事件相应函数中使用 OpenAndActiveDocument() 方法

空闲事件的重复性
Revit 2013 中空闲事件被更新成拥有两种运行模式。空闲事件使用 Revit 2013 的默认模式时,Revit 在每次开始一个空闲会话时就会触发一次空闲事件。而空闲会话的启动条件分两种情况:

1. 用户正在操作 Revit 用户界面

鼠标停止移动一段时间之后;或者一个外部命令完成之后;

2. 用户没有操作 Revit 用户界面

空闲会话的启动是随机的,很多时候 Revit 会很长时间内都不启动空闲会话(这就意味着当用户离开电脑时,无法保证这段时间被程序使用);

Revit 之前版本中的模式在 2013 中作为非默认模式(这就意味着我们之前的空闲事件代码需要更新为显示地指定为新版本的非默认模式)。非默认模式中空闲会话会一直保持开启状态的。这可以保证程序能使用用户离开电脑的这段时间。但是缺点是因为要一直维护空闲会话,所以会导致部分系统资源始终被占用,降低了性能。

Revit 2013 为空闲事件参数提供了方法 SetRaiseWithoutDelay(),用于控制空闲事件的运行模式。如果希望使用非默认模式,则必须在每次空闲事件被触发时,显示地调用 SetRaiseWithoutDelay() 方法。如果当次没有调用,则 Revit 将自动进入默认模式,直到下一次调用 SetRaiseWithoutDelay() 方法为止。

没有活动文档时的空闲事件
与 Revit 2012 不同,空闲事件在 Revit 没有活动文档时也会被触发了。

外部事件框架
空闲事件提供了一种 Revit 与外部异步过程的交互通道。Revit 是不允许外部过程直接调用其 API 的,但是外部过程可以向 Revit 发送请求,让其在下一次空闲事件时处理。一个典型应用就是在 Revit 插件中使用非模态对话框。不过由于非模态对话框在很多时候是没有用户交互的,所以导致空闲事件处理函数在这些时候不用做任何处理就直接返回了(译者注:不低碳啊!)。

Revit 2013 提供了一种更简单和高效的异步处理方式:外部事件框架。外部事件框架的处理有些类似默认模式时的空闲事件。不同的地方在于,外部事件只有在程序显示地触发时才会启动处理逻辑,而不像空闲事件一样经常出现处理函数无事可做的情况。

1. 实现一个继承自 IExternalEvent 接口的外部事件;
2. 调用 ExternalEvent.Create() 创建一个外部事件对象;
3. 当外部异步过程提交一个需要 Revit 处理的请求时,调用外部事件对象的 Raise() 方法;
4. Revit 在下一个可用的空闲周期中调用外部事件对象的 Execute() 方法;

外部事件框架对开发非模态对话框特别有帮助,因为可以避免会话无事可做的情况。

外部事件接口的定义:

public interface IExternalEventHandler
{// 事件处理函数void Execute( UIApplication app );// 事件处理函数的名称string GetName();
}

在一个程序中创建外部事件对象并使用一个线程来驱动它:

 _event = ExternalEvent.Create( new WebcamEventHandler() );Thread thread = new Thread( new ThreadStart( Run ) );thread.Start();

以下是部分的线程执行函数。它使用了外部事件,通过调用其 Raise() 方法发送请求。在外部事件的 Execute() 方法被 Revit 调用时,程序就获得了一个安全的 Revit 上下文来调用 Revit API 了。

static void Run()
{_running = true;while( _running ){_data = new GreyscaleBitmapData( _width, _height, _url );byte[] hash = _data.HashValue;if( null == _lastHash || 0 != CompareBytes( hash, _lastHash ) ){_lastHash = hash;_event.Raise();}Thread.Sleep( _intervalMs );}
}

RevitWebcam 例程续篇
我使用新版的空闲事件和外部事件更新了 RevitWebcam 例程,你可以下载代码(RevitWebcam_2013.zip)比较历史版本和新版本的区别。
你还可以参考 SDK 例程 ModelessForm_ExternalEvent and ModelessForm_IdlingEvent。

在事件响应函数中调用 OpenAndActiveDocument() 方法
在 Revit 2012 中,OpenAndActiveDocument() 方法是无法在任何事件响应函数中被调用的。在 Revit 2013 中,这个限制基本被取消了。以下是几个典型的应用场景:
原始活动文档没有正在处理的事务(包括事务组)时,可以在外部事件处理函数中调用;
对于常规事件(例如:空闲事件、ApplicationInitialized 事件)处理函数来说,如果当前没有活动文档且事件没有嵌套在另外一个事件或者外部命令中时,可以调用;

通常情况下,相对于空闲事件处理函数而言,ApplicationInitialized 事件处理函数更适合用于打开第一个文档。

Building Coder(Revit 二次开发) - 空闲事件(Idling Event)增强和外部事件(External Event)相关推荐

  1. Revit空闲事件(Idling Event)增强和外部事件(External Event)

    关注公众号及时获取文章更新 1.外部实现步骤 (1)新建一个继承并实现外部事件(IEternalEventHandler)接口的类(该类的实例会被注册到Revit中),该接口包括两个需要实现的方法:E ...

  2. Revit二次开发之双事件:空闲事件与DocumentChanged事件

    对以下文章所展示的代码进行了修改,当前展示的代码可直接复制使用. 由于本人初学,下列语言为个人理解,如有错误请指正. <引用1>中: 使用模态对话框,或者尽量保证事件在ExternalCo ...

  3. Revit二次开发5、外部事件(ExternalEvent)

    Revit二次开发5.外部事件(ExternalEvent) 外部事件ExternalEvent简介 事件 外部事件 实现步骤 外部事件的实现 实现IExternalEventHandler接口 Ex ...

  4. Revit二次开发—载入族并交互式放置

    文章目录 核心代码 问题一:按esc取消放置时报错 问题二:如何在放置一个族实例之后退出放置 问题三:已存在所载入族时,如何正常放置 参考资料 核心代码 using (Transaction tx = ...

  5. Revit二次开发教程提纲

    本文提供Revit二次开发教程提纲,教程内容包括下列部分 前言--BIM开发需要用到的技术 .NET及C#的基本介绍 1.1 基本语法 1.2 版本介绍 1.3 Visual Studio 1.4 C ...

  6. Revit二次开发从入门到精通学习之路, (含Revit二次开发教程下载)

    Revit二次开发从入门到精通学习之路 Autodesk Joe Ye叶雄进 2. 18 2014    yexiongjin@hotmail.com Revit在国内的应用越来越广泛, Revit ...

  7. Revit二次开发2、RevitAPI、RevitAPIUI及Revit开发三大利器

    Revit二次开发2.开发基础之--RevitAPI.RevitAPIUI及Revit开发三大利器 RevitAPI.dll RevitAPIUI.dll Revit开发三大利器 外部命令(IExte ...

  8. Revit二次开发之族库管理系统

    一.背景 很多小伙伴都想制作族库管理系统,但又不知从何下手,这里骑士给大家分享一下骑士做的族库管理系统,以及用到的一些技术点吧.感兴趣可以加入Q群711844216,有完整的族库开发教学. 二.技术点 ...

  9. C# Revit二次开发基础/核心编程--- Application\Document\Transaction

    一.本节课程 C# Revit二次开发基础/核心编程--- Application\Document\Transaction 二.本节要讲解的知识点 Application\Document\Tran ...

最新文章

  1. webservice mysql配置_Nginx配置WebService、MySQL、SQL Server、ORACLE等代理
  2. C语言运算符优先级和口诀(转)
  3. 蓝桥杯 2018年预赛C语言大学B组 C/C++
  4. linux环境变量的系统设置
  5. Jquery调用Web Service
  6. php项目推荐,php教程推荐:最值得推荐的10个php教程
  7. “Python小屋”1300篇历史文章分类速查表
  8. 阿帕奇服务器配置文件,阿帕奇服务器基本参数配置
  9. MySQL全文索引:中文语义分词检索
  10. Admob设置Android设备为测试设备(2020年5月7日亲测有效)
  11. mysql 按照年龄段分组查询
  12. Windows server 2016 Windows 10 离线下载与离线安装补丁教程 支持批量安装(其他win系统类似)
  13. MSSQL_8 操作结果集
  14. JAVA 编写一个员工类,成员变量和成员方法自拟,编写一个测试类
  15. 使用SC 修改服务启动账户
  16. 使用Camera X遇到的坑_OnPause时没有释放相机导致回来时黑屏
  17. 阿里云混合云重磅发布 全栈建云智能管云极致用云
  18. NAB展会BOSMA博冠8K全系8K摄像机产品惊艳亮相
  19. 网易云短信接口调入(java)
  20. Login 和 Logout

热门文章

  1. HbuilderX 自有证书生成
  2. 运放_电流互感器电流检测电路
  3. PDF电子签名申请与设置方法
  4. [附源码]JAVA+ssm计算机毕业设计餐饮管理系统(程序+Lw)
  5. 如何进行AI换脸,AI换脸从 “0“ 到 “1” 详细教程 ——从配置环境开始
  6. 链表分解单双数c语言代码,编写一程序,将带头结点的单链表拆成一个奇数链表和一个偶数链表...
  7. 三星健身服务器无响应 怎么办,三星携手UA健身APP、强化创新型可穿戴设备
  8. 周训练计划之(韦德分化训练法:胸、肩、背、腿、腹)
  9. anti-fraud-admin  反欺诈后台
  10. centos查询mysql端口被占用_centos查看端口占用情况