15. Revit API: Transaction(事务)与 Failures(故障处理)

前言

UI讲完,回到DB这块儿。在Document那篇,提到增删改查操作都是在Document上,是对Documet进行操作。
看到“增删改查”这四个,想到什么了没有?
数据库(DB)嘛~话说那本经典的红皮数据库的书叫啥来着?算了算了,数据库也忘得差不多了😶。
回到Revit API,“删”我们在Document那篇就讲过了,用Delete方法就行了。“查”就是过滤器,上篇的选择器也能沾一点儿边。还有“增”和“改”这俩个。
数据库中的“增”,是增加新的数据,对应Revit就是增加新模型、创建新实例,我们将会在涉及到Creation时讲。
数据库中的“改”,是对原有数据进行修改。在Revit中,就比较宽泛了,或许应该称之为“变化”,变化了就是改了。这块儿,体现在事件上,后面专门些一篇关于Events的,再提改这部分。
回到本篇。
在数据库中,有事务的概念,Revit 的这个功能上差不多,但没有那么细致。
这篇,涉及的主要类如下图
在这里插入图片描述


一、Transaction(事务)

其实在第一篇Namespace与Attributes中,就提到事务,只是那会儿没有展开。

  [Transaction(TransactionMode.Manual)]  // 开启事务

现在我们开始讲事务。
Revit的事务是做什么的,当我们要进行的操作会改变Document时,就必须在事务中进行,比如:删除元素,调整元素参数,设置元素显影。
Revit中,事务类有3个,分别是:

  • Transaction:事务
  • TransactionGroup:事务组,可以在事务组里创建新的事务
  • SubTransaction:子事务,必须在事务中,子事务可嵌套

1.1. 三种事务的对比

来看看方法对比

TransactionTransactionGroupSubTransaction
Start(..) x2Start(..) x2Start
Commit(..) x2Assimilate
Commite
Commite
RollBack(..) x2RollbackRollback
DisposeDisposeDispose
Get/SetNameGet/SetName
GetStatus
HasStarted
HasEnded
GetStatus
HasStarted
HasEnded
GetStatus
HasStarted
HasEnded
GetFailureHandlingOptions
SetFailureHandlingOptions
差异:事务名称,故障处理差异:事务组名称,打包提交

瞧,就这么丢丢的差异。

事务:可以在事务上添加故障处理程序。
事务组:可以将多个事务组织成一个事务提交(Assimilate),也可一次性提交(Commite)。
子事务:只能在事务中开启,本身可嵌套。没自己的名称。

1.2. 事务组的2种提交方式

事务组两种提交方式的区别。

在这里插入图片描述

对于下面的代码,将事务改为子事务,事务组改为事务,也是可以的。

public void TestTransactionGroup(UIDocument uIDoc)
{View view = uIDoc.ActiveView;List<ElementId> wallIds = this.GetElementByCategory(uIDoc.Document, BuiltInCategory.OST_Walls);wallIds = wallIds.Take(5).ToList();  // 取5个// 事务组using (TransactionGroup transactionGroup = new TransactionGroup(uIDoc.Document, "TransactionGroup-隐藏-所有墙体")){transactionGroup.Start();foreach (ElementId wallId in wallIds){// 事务using (Transaction transaction = new Transaction(uIDoc.Document, $"Transaction-隐藏-{wallId.IntegerValue}")){transaction.Start();view.HideElements([wallId]);transaction.Commit();}}//transactionGroup.Assimilate();  // 将5个事务打包成一个,提交transactionGroup.Commit();  // 5个事务一次性提交,还是5个}
}

1.3. 子事务

上面说了,子事务必须要在事务中才能创建,不然就会报错。
在这里插入图片描述

子事务一般在什么时候使用呢?一般是作为独立的小的操作步骤,插入到有具体业务的事务的逻辑中。
但有时我们需要进行一些操作了,却不能确定当前是否在事务中呢?
这个问题是有意义的,因为事务是不可嵌套的,我们无法在一个事务中开启另一个事务,又无法在非事务中创建子事务,所以需要根据当前的状态,来选择性处理。
还记Document的IsModified属性吗,True表示文档正处于修改中,也就是已开启了事务。

使用document.IsModified来判断当前事务环境。
根据环境不同,来决定是创建 事务 还是 子事务

二、Failures(故障处理)

事务执行失败了怎么办?我们可以回滚Rollback
不想回滚呢?那就try-catch处理问题吧。
但这里的说的故障处理可不是程序上的错误,而是Revit发出的问题。
Revit里有许多的约束,当文档变化时,就会进行校验,判断是否允许更改,常见的问题有“不满足约束”“无法剪切图元”等,在遇到这些问题时,Revit会有弹框,并暂定程序的执行,待用户选择操作后才会继续处理。
这种由Revit发出的警告或错误,是无法通过try-catch处理的,得提供专门的故障处理方式,即实现IFailuresPreprocessor接口,并将其提供给事务。

2.1. IFailuresPreprocessor

IFailuresPreprocessor需要实现一个方法,也只有这个方法。

public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)

方法有个参数FailuresAccessor,文档中是这么介绍的:“是获取文档故障信息的唯一可以接口,虽然可以在故障处理期间读取文档,但在处理期间修改文档的唯一方法是通过此类提供的方法”。
但在我的测试中,拿到Document进行一些操作,没有效果也不报错,不明白🙃。
甚至只要我在故障处理方法力稍稍做些事儿,错误弹框就无法被跳过,还是会弹出来。

类成员,就不列了。

2.2. 取消Revit 警告/错误 弹框

注意,错误不应该直接ResolveFailure,Revit可能会采用删除的方式处理。

internal class MyFailuresPreprocessor : IFailuresPreprocessor
{public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor){IList<FailureMessageAccessor> failures = failuresAccessor.GetFailureMessages();foreach (FailureMessageAccessor failure in failures){//ICollection<ElementId> additionalElements = failure.GetAdditionalElementIds();  // 获取与问题相关的其他元素//ICollection<ElementId> failingElementIds = failure.GetFailingElementIds();  // 获取引起问题的元素FailureSeverity failureSeverity = failure.GetSeverity();  // 获取失败的严重程度if (failureSeverity == FailureSeverity.Warning){failuresAccessor.DeleteWarning(failure); // 删除警告}else if (failureSeverity == FailureSeverity.DocumentCorruption){return FailureProcessingResult.ProceedWithRollBack;  // 文档损坏,回滚}else if (failureSeverity == FailureSeverity.Error){//FailureDefinitionId failureId = failure.GetFailureDefinitionId();  // 获取失败的定义ID//if (failureId == BuiltInFailures.CutFailures.CannotCutInstanceOut)  // 如果问题是无法剪切实例//{//    failure.SetCurrentResolutionType(FailureResolutionType.MoveElements);  // 尝试采用移动物体的方式处理//}failuresAccessor.ResolveFailure(failure);  // 解决错误}}return FailureProcessingResult.ProceedWithCommit;  // 提交  // 可能会删除部分模型//return FailureProcessingResult.Continue;}
}

上面的代码,会不显示所有的警告弹框。对于下面的错误弹框,也会消失。
当然,这不意味着就可以剪切了,具体的效果就是取消了剪切。
在这里插入图片描述


三、通过代码进行历史操作回退

在Revit左上角快捷栏里,有事务历史,我们当然可以通过交互的方式快速回退到之前的文档。其实这个操作也是可以通过代码进行的。
我们需要引入库UIFrameworkServices.dll,其中有类QuickAccessToolBarService

// 找到历史操作记录
public static ObservableCollection<string> collectUndoRedoItems(bool bForUndo);// 回退或前进,步数
public static void performMultipleUndoRedoOperations(bool bForUndo, int iNumOperations)

总结

写到这儿,一看最上方的导图,好像还有个事件,算了,不写了🙄。

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

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

相关文章

网络安全----防御----防火墙安全策略组网

防火墙组网 要求&#xff1a; 1&#xff0c;DMz区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问。 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3&#xff0c;办公区设备10.0.…

计算机网络之广域网

广域网特点: 主要提供面向通信的服务&#xff0c;支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远&#xff0c;需要考虑的因素增多&#xff0c; 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护&#xff0c;并向全社会…

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板

导读 维持实时视频系统软硬件的长期成本效益&#xff0c;是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题&#xff0c;提供高带宽且高可靠性的端到端网络链接&#xff0c;有效降低了开发成本、复杂性和时间。 引言 虽然实…

DDoS攻击详解

DDoS 攻击&#xff0c;其本质是通过操控大量的傀儡主机或者被其掌控的网络设备&#xff0c;向目标系统如潮水般地发送海量的请求或数据。这种行为的目的在于竭尽全力地耗尽目标系统的网络带宽、系统资源以及服务能力&#xff0c;从而致使目标系统无法正常地为合法用户提供其所应…

leetcode--从前序与中序遍历序列构造二叉树

leetcode地址&#xff1a;从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,…

vue学习day05-watch侦听器(监视器)、Vue生命周期和生命周期的四个阶段、、工程化开发和脚手架Vue cli

13、watch侦听器&#xff08;监视器&#xff09; &#xff08;1&#xff09;作用&#xff1a;监视数据变化&#xff0c;执行一些业务逻辑或异步操作 &#xff08;2&#xff09;语法&#xff1a; 1&#xff09;简写语法——简单数据类型&#xff0c;直接监视 ① Watch:{ 数…

[Flink]二、Flink1.13

7. 处理函数 之前所介绍的流处理 API,无论是基本的转换、聚合,还是更为复杂的窗口操作,其实都是基于 DataStream 进行转换的;所以可以统称为 DataStream API ,这也是 Flink 编程的核心。而我们知道,为了让代码有更强大的表现力和易用性, Flink 本身提供了多…

一文入门【NestJs】Controllers 控制器

Nest学习系列 ✈️一文带你入门【NestJS】 ✈️前言 流程图 Controllers 控制器主要负责处理传入请求&#xff0c;并向客户端返回响应&#xff0c;控制器可以通过路由机制来控制接收那些请求&#xff0c;通常一个Controllers种会有多个匹配路由&#xff0c;不同的路由可以知…

Spring源码二十一:Bean实例化流程四

上一篇Spring源码二十&#xff1a;Bean实例化流程三中&#xff0c;我们主要讨论了单例Bean创建对象的主要方法getSingleton的内部方法createBean&#xff0c;createBean方法中的resolveBeanClase方法与prepareMethodOverrides方法处理了lookup-method属性与repliace-method配置…

MT3046 愤怒的象棚

思路&#xff1a; a[]存愤怒值&#xff1b;b[i]存以i结尾的&#xff0c;窗口里的最大值&#xff1b;c[i]存以i结尾的&#xff0c;窗口里面包含✳的最大值。 &#xff08;✳为新大象的位置&#xff09; 例&#xff1a;1 2 3 4 ✳ 5 6 7 8 9 则ans的计算公式b3b4c4c5c6b7b8b9…

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法&#xff1a;newcommand2 标号圆圈数字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法&#xff1a;插入点相对位移标号node3.1 第一张图&#xff1a;插入点相对位移3.2 第二张图&#xff1…

【MindSpore学习打卡】应用实践-LLM原理和实践-基于MindSpore实现BERT对话情绪识别

在当今的自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;情绪识别是一个非常重要的应用场景。无论是在智能客服、社交媒体分析&#xff0c;还是在情感计算领域&#xff0c;准确地识别用户的情绪都能够极大地提升用户体验和系统的智能化水平。BERT&#xff08;Bidirec…

imx6ull/linux应用编程学习(12)CAN应用编程基础

关于裸机的can通信&#xff0c;会在其他文章发&#xff0c;这里主要讲讲linux上的can通信。 与I2C,SPI等同步通讯方式不同&#xff0c;CAN通讯是异步通讯&#xff0c;也就是没有时钟信号线来保持信号接收同步&#xff0c;也就是所说的半双工&#xff0c;无法同时发送与接收&…

C++基础篇(1)

目录 前言 1.第一个C程序 2.命名空间 2.1概念理解 2.2namespace 的价值 2.3 namespace的定义 3.命名空间的使用 4.C的输入输出 结束语 前言 本节我们将正式进入C基础的学习&#xff0c;话不多说&#xff0c;直接上货&#xff01;&#xff01;&#xff01; 1.第一个C程…

【Linux进阶】文件系统8——硬链接和符号连接:ln

在Linux下面的链接文件有两种&#xff0c; 一种是类似Windows的快捷方式功能的文件&#xff0c;可以让你快速地链接到目标文件&#xff08;或目录)&#xff1b;另一种则是通过文件系统的inode 链接来产生新文件名&#xff0c;而不是产生新文件&#xff0c;这种称为硬链接&…

base SAS programming学习笔记10(combine data)

1.一对一合并 基本格式如下&#xff1a; data output-data-set; set data-set1; set data-set2;(data-set1和data-set2可以是相同的数据集&#xff0c;可以添加多个set 语句来实现上述的一对一合并) run; 输出数据集结果如下&#xff1a; a.会包含所有输入数据的变量名&#x…

小米手机永久删除的照片怎么找回?这两个方法千万不要错过!

小米手机永久删除的照片怎么找回&#xff1f;身为米粉发烧党的小编又双叒叕手残了&#xff01;本来想在手机回收站中恢复一张照片&#xff0c;结果一个稀里糊涂就把照片点成了“永久删除”。于是乎难得的休班假期&#xff0c;就变成了小编恢复永久删除照片的漫漫之路。以下是小…

org.springframework.boot.autoconfigure.EnableAutoConfiguration=XXXXX的作用是什么?

org.springframework.boot.autoconfigure.EnableAutoConfigurationXXXXXXX 这一配置项在 Spring Boot 项目中的作用如下&#xff1a; 自动配置类的指定&#xff1a; 这一配置将 EnableAutoConfiguration 设置为 cn.geek.javadatamanage.config.DataManageAutoConfiguration&…

【2024_CUMCM】TOPSIS法(优劣解距离法)

目录 引入 层次分析法的局限性 简介 例子 想法1 想法2 运用实际分数进行处理 想法3 问题 扩展问题&#xff1a;增加指标个数 极大型指标与极小型指标 统一指标类型-指标正向化 标准化处理 计算公式 计算得分 对原公式进行变化 升级到m个指标和n个对象 代码 …

系统分析师-基础知识

基础知识 一、计算机组成与结构1、计算机系统基础知识1.1 计算机硬件组成1.2 中央处理单元&#xff08;CPU&#xff09;1.3 数据表示1.3.1 R进制转十进制&#xff1a;1.3.2 十进制转R进制&#xff1a; 1.4 校验码&#xff08;3种校验码&#xff09;1.4.1 基本知识1.4.2 奇偶校验…