zoukankan      html  css  js  c++  java
  • Revit二次开发——非模态窗口的事件处理

    一.起因   

           自己在写revit二开时,有一个Winform窗体按钮点击事件需要 触发调用事务进行处理,结果出现“异常“Starting a transaction from an external application running outside of API context is not allowe“”

           其实这是 上面异常是Revit的一种保护机制,创建的非模态对话框Form1后,在Form1未关闭的状态下,Revit认为是处于非API的上下文环境,所以异常弹出来了。

           在非模态对话框打开的状态下,调用Transaction必须通过Idling或者ExternalEvent API进行相关代码调用;在SDK Sample安装包下面,有个例子程序叫ModelessDialog详细介绍了Idling及ExternalEvent的调用机制。

           在Revit 2014之前的版本,当非模态对话框打开的状态,调用Transaction是可以的,但是从Revit 2014之后因为考虑安全等方面被禁止了。

    二.解决办法与代码

           非模态窗口有一个好处,就是可以一直停留在程序之前,然后持续完成操作。但是在Revit二次开发中,非模态窗口也有几个注意事项。

                  1、需要在文档关闭的时候,把非模态窗口也关闭掉,不然会导致文档关闭,窗口还在这样奇怪的Bug。

                  2、非模态的窗口的事件需要在IExternalCommand里注册。

                  3、每个操作必须在外部事件里进行。

          2.1 第一步:注册外部事件

                                 

                  2.2 第二步:Form内使用

                             

                   在Form构造函数或者Load事件内:

                              

                   我Form窗体内有一个TreeList控件,控件鼠标点击事件触发 外部事件:

                                

                GetSelectedDistributionProLevel()为获取当前TreeList鼠标选中的Node信息,DistributionProjectLevelData为自己定义的Class

                m_elecGridLayingOpe.SetGridLineElementSelected(app, node.LevelUniqueID)里面的代码如下:

                

                 其中UniqueId为Element的UniqueId.

    三.焦点(关键点)          

           在Revit二次开发中,如果使用了非模态窗体,设置好参数输入后,点击按钮命令后,Revit没有立刻进入到激活状态,当前的窗体仍然是非模态窗体。以前我会在点击按钮中加入一句:this.Close(),直接关闭非模态窗体,这种方式太粗暴

           究其原因:在做的非模态窗体在执行相应命令后,窗体并没有关闭或是隐藏,就一直处于激活状态,导致Rveit不能立刻激活或者取到焦点。解决办法:使用WindowsAPI下的两个函数 GetActiveWindow(),SetActiveWindow(IntPtr hwnd),一个是获得当前系统获得焦点的窗体句柄,一个是设置当前系统某个窗体获得焦点。

           为获得Rveit的窗体句柄,需要添加引用:AdWIndows.dll

          代码如下:

                   

         在Form构造函数内:

                   

         在TreeList鼠标点击事件函数内:

                      

  • 相关阅读:
    spring 使用 context:property-placeholder 加载 多个 properties
    Spring自动注入Bean
    正则查询符合条件的字符串
    csv测试类。用起来,就是那么简单。每个单元格都是以逗号分隔
    eclipse 设置字体高亮
    订单生成类,个人经验总结!
    java 导出Excel 大数据量,自己经验总结!
    Oracle的数据恢复——Flashback用法汇总
    org.apache.log4j.Logger详解
    Date、String和Timestamp类型转换
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/13492082.html
Copyright © 2011-2022 走看看