Revit二次开发之空闲事件与DocumentChanged事件解决方案

本文主要是介绍Revit二次开发之空闲事件与DocumentChanged事件解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

前段时间做Revit开发项目时遇到一个棘手的问题,我们都知道Revit运行环境是不允许多线程并发的,也就是说同一时刻只能有一个事务或操作运行,然后可以根据具体情况去触发不同的响应事件,如DocumentOpend,DocumentChanged等,那么问题是什么呢?问题是有时我们希望通过外部命令PostCommand调用Revit本身的命令,如调用绘制桥架命令,但是我们希望在此命令执行后去触发事件,后来经过测试发现PostCommand不会阻止线程的运行,而且还是外部命令运行完后才触发,那么我们就无法拿到PostCommand触发完成后的事件了,所以我们需要一个全局监控事件,来监控活动文档的改变,所以想到了DocumentChanged事件。但是发现在DocumentChanged事件里不能开始事务,也没用了,最后想到用Revit空闲事件和DocumentChanged事件相结合来做,首先我们在外部命令下注册这两个事件,由DocumentChanged事件触发空闲事件,在空闲事件里执行响应的事务,最后再注销两个事件,到此问题得到有效解决。当然除了Idling还可以用ExternalEvent来做配合!

 

本代码实现调用PostCommand命令放置一个门,然后触发相应的事件再删除此门,也可以扩展其他功能,本目的就是为了测试事务是否能成功开启

Revit二次开发之空闲事件与DocumentChanged事件解决方案
 

using Autodesk.Revit.UI;

using Autodesk.Revit.DB;

using Autodesk.Revit.Attributes;

using Autodesk.Revit.UI.Selection;

using Autodesk.Revit.DB.Plumbing;

using Autodesk.Revit.DB.Mechanical;

using System.Xml;

using Autodesk.Revit.UI.Events;

 

namespace HelloWorld

{

    [Transaction(TransactionMode.Manual)]

    [Regeneration(RegenerationOption.Manual)]

    public class Test : IExternalCommand

    {  //定义一个字段通过属性变化来触发空闲事件

        public static Boolean IdleFlag = false;

        //记录DocumentChanged事件发生改变的构件

        IList listId = new List();

       //定义一个全局UIApplication,用来注销指定事件

        UIApplication uiApp = null;

        public  Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)

        {

            uiApp = commandData.Application;

            UIDocument uiDoc = uiApp.ActiveUIDocument;

            Document Doc = uiDoc.Document;

           uiApp.PostCommand(RevitCommandId.LookupPostableCommandId(PostableCommand.Door));

            uiApp.Idling += new EventHandler(IdlingHandler);

            uiApp.Application.DocumentChanged += new EventHandler(DocumentChangedForSomething);

           

            return Result.Succeeded;

        }

       

        private void DocumentChangedForSomething(object sender,Autodesk.Revit.DB.Events.DocumentChangedEventArgs e)

        {

            listId.Clear();

            ICollection < ElementId > collection= e.GetAddedElementIds();

            listId.Add(collection.ElementAt(0));

            IdleFlag = true;

            uiApp.Application.DocumentChanged -= new EventHandler(DocumentChangedForSomething);

        }

        //Revit空闲事件

        public void IdlingHandler(object sender, IdlingEventArgs args)

        {

            UIApplication uiapp = sender as UIApplication;

            if (!IdleFlag)

            {

                return;

            }

            ExecuteIdlingHandler.Execute(uiapp, listId);

            IdleFlag = false;

            uiApp.Idling -= new EventHandler(IdlingHandler);

            

        }

    }

    public static class ExecuteIdlingHandler

    {

        public static void Execute(UIApplication uiapp,IList listId)

        {

            UIDocument uidoc = uiapp.ActiveUIDocument;

            if (uidoc != null)

            {

                Transaction ts = new Transaction(uidoc.Document, "delete");

                ts.Start();

                uidoc.Document.Delete(listId);

                ts.Commit();

               

            }

        }

 

    }

   

}

这篇关于Revit二次开发之空闲事件与DocumentChanged事件解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/229240

相关文章

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Spring Security常见问题及解决方案

《SpringSecurity常见问题及解决方案》SpringSecurity是Spring生态的安全框架,提供认证、授权及攻击防护,支持JWT、OAuth2集成,适用于保护Spring应用,需配置... 目录Spring Security 简介Spring Security 核心概念1. ​Securit

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决