【Revit二次开发】事务和事务处理(Transaction and FailureHandlingOptions)

news/2024/4/26 16:54:17/文章来源:https://blog.csdn.net/weixin_44037272/article/details/126411837

事务

  • 事务基础
    • Transaction类
    • FailureHandlingOptions
  • 编写代码

事务基础

事务是将一系列修改Revit模型的操作提交至文档的这样一种对象。 任何一个对文档修改的操作都需要包含在-一个打开的属于该文档的事务中,否则就会有异常抛出。任何修改都要在事务提交后才写人文档。在一个事务中进行的所有修改都能被撤销。在任何时候,一个文档当前只能有一个打开的事务,但在一个事务中可以有一个或多个修改模型的操作。
事务是将一系列修改Revit模型的操作提交到文档的一种对象。任何一个对文档修改的操作都要包含在一个打开的属于该文档的食物中。

和事务有关的主要有三个类:

  • Transaction事务
  • SubTransaction子事务
  • TransactionGroup事务组

注意:
①用于IExternalCommand 的TransactionMode属性会影响该命令在被执行时Revi对事务的处理。
②如果一个事务从其他线程或在模态对话框之外启动会导致异常发生。事务只能从API支持的环境中启动,比如外部命令、事件等。

通用事务方法

方法描述
Start启动事务
Commit结束事务并提交所有的修改到文档中
RollBack结束事务并撤销对文档所做的所有的修改
GetStatus返回当前事务状态

Transaction类

要修改Revil 文档中的模型就需要一个Transaction。 在同一时间,只有一个Transaction可以被打开,不允许嵌套。每个Transaction需要一个名字,当这个Transaction被成功提交后,这个名字会被显示在Undo菜单里。

FailureHandlingOptions

控制在事务结束时如何处理故障(如果在事务期间发生了任何故障)的选项。

编写代码

using System;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;namespace HelloRevitTransaction
{[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]public class RevitTransactionCmd : IExternalCommand{public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){try{//获取文档Document doc = commandData.Application.ActiveUIDocument.Document;//会修改Revit文档模型的操作需要事务//创建transaction来执行命令// 任何Transaction要放在 “using”中创建来保证它被正确的结束,而不会影响到其他地方using (Transaction transaction = new Transaction(doc)){if (transaction.Start("事务") == TransactionStatus.Started){Line line = Line.CreateBound(XYZ.Zero, XYZ.BasisX);Wall wall = Wall.Create(doc, line, new ElementId(311), false);//提交//由于种种原因,如果修改或创建的模型不正确,//这个Transaction可能不会被正确提交//如果一个Transaction失败了或被用户取消了,//那么返回的状态就是RolledBack,而不是Committed。try{TaskDialog taskDialog = new TaskDialog("Revit");taskDialog.MainContent = "Click either [OK] to Commit, or [Cancel] to Roll back the transaction.";TaskDialogCommonButtons buttons = TaskDialogCommonButtons.Ok | TaskDialogCommonButtons.Cancel;taskDialog.CommonButtons = buttons;if (TaskDialogResult.Ok == taskDialog.Show()){if (TransactionStatus.Committed != transaction.Commit()){TaskDialog.Show("事务入门", "提交失败!");}}}//回滚catch{transaction.RollBack();}}}return Autodesk.Revit.UI.Result.Succeeded;}catch (Exception ex){message = ex.Message;return Autodesk.Revit.UI.Result.Failed;}}}
}

事务提交后,Revit会管理事务中发生的错误和警告。当错误发生时,事务将会抛出异常。当警告发生时,Revit的故障处理程序将会以默认的方式处理警告。

public void CompoundOperation(Autodesk.Revit.DB.Document document)
{// 所有TransactionGroup要用“using”来创建来保证它的正确结束using (TransactionGroup transGroup = new TransactionGroup(document, "Level and Grid")){if (transGroup.Start() == TransactionStatus.Started){// 我们打算调用两个函数,每个都有一个独立的事务// 我们打算这个组合操作要么成功,要么失败// 只要其中有一个失败,我们就撤销所有操作if (CreateLevel(document, 25.0) && CreateGrid(document, new XYZ(0, 0, 0), new XYZ(10, 0, 0))){// Assimilate函数会将这两个事务合并成一个,并只显示TransactionGroup的名字// 在Undo菜单里transGroup.Assimilate();}else{// 如果有一个操作失败了,我们撤销在这个事务组里的所有操作transGroup.RollBack();}}}
}public bool CreateLevel(Autodesk.Revit.DB.Document document, double elevation)
{using (Transaction transaction = new Transaction(document, "Creating Level")){// 必须启动事务来修改文档if (TransactionStatus.Started == transaction.Start()){if (null != document.Create.NewLevel(elevation)){return (TransactionStatus.Committed == transaction.Commit());}// 如果不能创建层,撤销这个事务transaction.RollBack();}}return false;
}public bool CreateGrid(Autodesk.Revit.DB.Document document, XYZ p1, XYZ p2)
{using (Transaction transaction = new Transaction(document, "Creating Grid")){if (TransactionStatus.Started == transaction.Start()){Line gridLine = Line.CreateBound(p1, p2);if ((null != gridLine) && (null != document.Create.NewGrid(gridLine))){if (TransactionStatus.Committed == transaction.Commit()){return true;}}// 如果不能创建网格,撤销这个事务transaction.RollBack();}}return false;
}

TransactionHandleCmd类功能为在同一位置绘制三堵墙,并在事务中使用自定义的故障处理选项,自定义的方式是把SameElementProcessor作为故障预处理器Set到故障处理选项中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using TransactionHandleDemo;namespace TransactionHandleCmd
{[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]public class Class1 : IExternalCommand{//TransactionHandleCmd类功能为在同一位置绘制三堵墙,并在事务中使用自定义的故障处理选项//自定义的方式是把SameElementProcessor作为故障预处理器Set到故障处理选项中public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){try{Document doc = commandData.Application.ActiveUIDocument.Document;Transaction tran = new Transaction(doc);tran.Start("创建同名标高");//Returns the current failure handling options. FailureHandlingOptions failureOptions = tran.GetFailureHandlingOptions();//Sets options for handling failures to be used when the transaction is being committed or rolled back. failureOptions.SetFailuresPreprocessor(new SameElementProcessor());tran.SetFailureHandlingOptions(failureOptions);Line line = Line.CreateBound(XYZ.Zero, XYZ.BasisX * 5);Level level = getLevel(doc);Wall.Create(doc, line, level.Id, false);Wall.Create(doc, line, level.Id, false);Wall.Create(doc, line, level.Id, false);tran.Commit();return Autodesk.Revit.UI.Result.Succeeded;}catch (Exception ex){message = ex.Message;return Autodesk.Revit.UI.Result.Failed;}}private Level getLevel(Document doc){return (Level)new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Levels).OfClass(typeof(Level)).FirstElement();}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
namespace TransactionHandleDemo
{//如果提供了该接口,则在事务结束时发现故障时调用该接口。可以在事务对象的失败处理选项中设置此接口的实例。public class SameElementProcessor : IFailuresPreprocessor{public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor){failuresAccessor.DeleteAllWarnings();return FailureProcessingResult.Continue;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_411642.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IR信息检索前沿梳理

1. 检索预训练 1.1 PROP: Pre-training with Representative Words Prediction for Ad-hoc Retrieval three types of pre-training tasks have been proposed including: Inverse Cloze Task (ICT): The query is a sentence randomly drawn from the passage and the docu…

全志F1C芯片参数对比,供查阅

F1C600特性介绍 组合32M DDR1,QFN编解码模式,生产音频核心板(CPUNORWIFI)在WIFI站下播放的功率约0.5W组合I2S、SPDIF、CODEC等多功能接口支持全格式音频解码芯片 F1C600参数介绍 中央处理器 ARM926EJ-S 内存 SIP DDR1 SD2.0…

月入18000,0基础转行软件测试,实现薪资翻倍我只用了135天

在没做测试之前,我一直是个没自信的人,因为工作不稳定,收入也不高。 大学毕业做了2年酒店管理,月入4000提成,还经常上夜班,熬人又伤身体,于是不想再做服务行业,就转行做了电销。这之…

本地数据库IndexedDB - 学员管理系统之列表管理(二)

IndexedDB是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB允许存储大量数据,提供查找接口,还能建立索引。这些都是LocalStorage或Cookie不具备的。就数据库类型而言,IndexedDB不属于关系型数据库(不支…

使用VMware16克隆功能快速准备CentOS 7.9操作系统集群

记录:305 场景:使用VMware16克隆功能快速准备CentOS 7.9操作系统集群,主要内容:VMware16克隆功能功能使用、CentOS 7.9操作系统常用指令使用、制作本地yum源、安装JDK、配置集群NTP时间同步等。 版本: 虚拟机工具&a…

数据结构-难点突破(C++/Java详解实现串匹配算法KMP,next数组求法,KMP算法优化nextval数组)

文章目录1. 暴力匹配算法BF2. KMP算法next数组求法Java代码:C代码:KMP算法优化nextval数组1. 暴力匹配算法BF 在了解KMP算法前,就必须介绍串的暴力匹配算法(BF算法) BF算法,即暴力(Brute Force)算法&…

大赛征集令|首届“万应杯”低代码应用开发大赛报名开启啦!

探索,寻觅低码边界。 创新,做成未曾有人做过的事。 首届“万应杯”低代码应用开发大赛 报名正式启动啦! 万元现金奖杯/证书项目转售收益 丰厚奖励,邀你来战! 大赛时间 低码掘金,就在此时! …

MySQL高级SQL语句(一)

MySQL高级SQL语句(一)MySQL高级SQL语句(一)一、高级SQL语句(进阶查询)1.1 select1.2 distinct1.3 where1.4 and 、or1.5 in1.6 between1.7 通配符1.8 like1.9 order by二、函数2.1 数学函数2.2 聚合函数2.3…

MSDC 4.3 接口规范(26)

MSDC 4.3 接口规范(26)7.4 组呼业务管理7.4.1 服务状态7.4.2 启动组呼业务7.4.2.1 接口函数7.4.2.2 先决条件7.4.2.3 说明7.4.2.4 调用流程7.4.2.4.1 启动组呼业务7.4.2.4.2 无法启动服务7.4.3 停止组呼服务7.4.3.1 接口函数7.4.3.2 先决条件7.4.3.3 说明…

SH-SSS丨《端到端音视频说话人日志网络》论文线上分享

SH Symposium Series on Speech (SH SSS 2022) SH SSS 是由语音之家打造的AI语音技术相关的前沿论文成果分享平台。 来自AI语音技术领域的优秀论文作者、专家学者,用最精炼的表达来解读最新的高质量论文。 分享的论文成果来自国内外顶级会议收录的优秀文章、前沿…

系统kafka不消费-topic问题

测试告诉说kafka的topic列表里面新加入了一个topic,然后就不消费数据了; 自己验证了一下,确实这样,如果去掉新的topic,数据就可以正常消费; 然后我查看定义发现,topicA是1个分区; …

段页式内存管理

文章目录分页、分段的优缺点分析段页式管理分段分页段页式管理的逻辑地址结构段页式存储的段表、页表的地址变换分页、分段的优缺点分析 分页管理它的缺点就是不方便按照逻辑块实现信息的共享和保护而分段管理,如果段长过大,为其分配很大的连续空间会很不…

WebDAV之葫芦儿·派盘+纸间书摘

纸间书摘 支持webdav方式连接葫芦儿派盘。 是专为喜欢做读书笔记的小伙伴量身打造的专属书摘app,不仅仅可以从别的app中导入图书,并且还能来帮助你选择性复制可以来轻松的搞定哦 所有功能完全免费,没有广告,不限制识别次数。 多种备份,本地备份和基于WebDAV协议的云端…

python基于PHP+MySQL的药店药品进销存管理系统

随着科技的发展,针对不同疾病的药品越来越多,不同的药品有不同的属性,用法用量等内容,如何让药店和医药公司更好的对药品进行管理,是很多人都在研究的问题,本系统就是在这样的一个基础上开发出来的 PHP药店药品进销存管理系统通过PHp:MySQL进行开发,主要完成了药店基…

狂神说java基础——面向对象编程

面向对象编程(oop) 1、什么是面向对象(00)面向过程:线性思维 面向对象:分类思维​ 本质:以类的方式组织代码,以对象的形式阻止(封装)数据三大特性:封装,继承,多态2、回顾方法的定义 方法的定义修饰符 返回值类型/** 修饰符 返回值类型 方法名(...){* 方法体* re…

Dropzone V4.5.1 for Mac 文件拖拽工具使用教程

简介 Dropzone 是一款Mac上的文件拖拽操作增强工具,这款软件可以让我们把大部分工作都通过拖拽来完成,比如保存文本、发送邮件、FTP上传、打开应用等等,只需要将文件拖拽到菜单栏上的窗口中即可,并且我们完全可以定制化这些操作&a…

移动测试Appium安装

移动测试Appium安装 一、环境搭建 1.Java sdk安装 并配置JAVA_HOME和PATH 2.Android SDK安装 (1)解压 (2)配置ANDROID_HOME和PATH 见教程:AndroidSDK下载及安装 Android SDK 下载安装及配置 3.虚拟机安装 这里下载的…

UnityShader34:非真实感水体渲染

一、水体渲染方案 1.1 水体动画 既然是动画,必然推导公式会和时间相关联,如果不追求表现,可以使用最无脑的 sin 函数: 其中 y 值 振幅*sin(频率*(x值-相对偏移)),感觉目前手机端非真实感渲染的话感觉这一套就够了&a…

Centos下部署CodiMD

Centos下部署CodiMD安装docker安装docker-compose安装git部署CodiMDCodiMD是HackMD的自由软件版本,由HackMD团队开发并开源,具有简化功能(无需书本模式),您可以在社区中使用CodiMD,并拥有所有数据。支持浏览…