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粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

Linux(centos7)虚拟机没有IP问题及解决方案

《Linux(centos7)虚拟机没有IP问题及解决方案》文章介绍了在CentOS7中配置虚拟机网络并使用Xshell连接虚拟机的步骤,首先,检查并配置网卡ens33的ONBOOT属性为yes,然后... 目录输入查看ZFhrxIP命令:ip addr查看,没有虚拟机IP修改ens33配置文件重启网络Xh

Java编译错误java.lang.NoSuchFieldError的解决方案详析

《Java编译错误java.lang.NoSuchFieldError的解决方案详析》java.lang.NoSuchFieldError是Java中的一种运行时错误,:本文主要介绍Java编译错... 目录前言解决方案1. 统一JDK版本环境2. 优化maven-compiler-plugin配置3. 清

Navicat连接Mysql8.0.11出现1251错误的解决方案

《Navicat连接Mysql8.0.11出现1251错误的解决方案》在重装电脑并安装最新版MySQL后,Navicat和Sqlyog连接MySQL时遇到的1251和2058错误,通过将MySQL用户... 目录Navicat连接mysql8.0.11出现1251错误原因分析解决问题方法有两种总结Navic

tomcat日志中文乱码问题及解决方案

《tomcat日志中文乱码问题及解决方案》文章主要介绍了在使用Tomcat时遇到的乱码问题及其解决方法,页面输出乱码可能由于server.xml配置、HTML标签、编程输出编码不一致引起,解决方法包括... 目录一、页面输出乱码1.server.XML配置未注明编码格式2.catalina.bawww.cp

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏