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

news2024/9/22 1:08:58

前言

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.coloradmin.cn/o/1915866.html

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

相关文章

Python学习笔记34:进阶篇(二十三)pygame的使用之颜色与字体

前言 基础模块的知识通过这么长时间的学习已经有所了解&#xff0c;更加深入的话需要通过完成各种项目&#xff0c;在这个过程中逐渐学习&#xff0c;成长。 我们的下一步目标是完成python crash course中的外星人入侵项目&#xff0c;这是一个2D游戏项目。在这之前&#xff…

算法训练营day28--134. 加油站 +135. 分发糖果+860.柠檬水找零+406.根据身高重建队列

一、 134. 加油站 题目链接&#xff1a;https://leetcode.cn/problems/gas-station/ 文章讲解&#xff1a;https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1jA411r7WX 1.1 初见思路 得模拟分析出…

【Python实战因果推断】19_线性回归的不合理效果9

目录 De-Meaning and Fixed Effects Omitted Variable Bias: Confounding Through the Lens of Regression De-Meaning and Fixed Effects 您刚刚看到了如何在模型中加入虚拟变量来解释不同组间的不同干预分配。但是&#xff0c;FWL 定理真正的亮点在于虚拟变量。如果您有大量…

鸿蒙架构之AOP

零、主要内容 AOP 简介ArkTs AOP 实现原理 JS 原型链AOP实现原理 AOP的应用场景 统计类&#xff1a; 方法调用次数统计、方法时长统计防御式编程&#xff1a;参数校验代理模式实现 AOP的注意事项 一、AOP简介 对于Android、Java Web 开发者来说&#xff0c; AOP编程思想并不…

【前端】包管理器:npm、Yarn 和 pnpm 的全面比较

前端开发中的包管理器&#xff1a;npm、Yarn 和 pnpm 的全面比较 在现代前端开发中&#xff0c;包管理器是开发者必不可少的工具。它们不仅能帮我们管理项目的依赖&#xff0c;还能极大地提高开发效率。本文将详细介绍三种主流的前端包管理器&#xff1a;npm、Yarn 和 pnpm&am…

错位情缘悬疑升级

✨&#x1f525;【错位情缘&#xff0c;悬疑升级&#xff01;关芝芝与黄牡丹的惊世婚约】&#x1f525;✨在这个迷雾重重的剧场&#xff0c;一场前所未有的错位大戏正悄然上演&#xff01;&#x1f440; 你没看错&#xff0c;昔日兄弟的前女友关芝芝&#xff0c;竟摇身一变成了…

axios使用sm2加密数据后请求参数多了双引号解决方法

axios使用sm2加密数据后请求参数多了双引号解决 背景问题描述解决过程 背景 因项目安全要求&#xff0c;需对传给后端的入参加密&#xff0c;将请求参数加密后再传给后端 前期将axios降低到1.6.7后解决了问题&#xff0c;但最近axios有漏洞&#xff0c;安全要求对版本升级&…

通过电压差判定无源晶振是否起振正确吗?

在电子工程中&#xff0c;无源晶振作为许多数字电路的基础组件&#xff0c;其是否成功起振对于系统的正常运行至关重要。然而&#xff0c;通过简单检测晶振两端的电压差来判断晶振是否工作&#xff0c;这一方法存在一定的误区&#xff0c;晶发电子将深入探讨这一话题&#xff0…

【AIGC】一、本地docker启动私有大模型

本地docker启动私有大模型 一、最终效果中英文对话生成代码 二、资源配置三、搭建步骤启动docker容器登录页面首次登录请注册登录后的效果 配置模型尝试使用选择模型选项下载模型选择适合的模型开始下载 试用效果返回首页选择模型中英文对话生成代码 四、附录资源监控 五、参考…

浮点类型使用陷阱

引言 当我们进行条件判断时,经常会遇到两个数是否相等的情况,但如果在程序中进行判断一个可以除尽的小数和数学上除出来所得的数是否相等时,就会神奇的发型居然不相等??! 遇到问题 看如下代码 double num5 2.7;//2.7double num6 8.1 / 3;//接近2.7System.out.println(n…

NAS免费用,鲁大师 AiNAS正式发布,「专业版」年卡仅需264元

7月10日&#xff0c;鲁大师召开新品发布会&#xff0c;正式发布旗下以“提供本地Ai部署和使用能力以及在线NAS功能”并行的复合软件产品&#xff1a;鲁大师 AiNAS。 全新的鲁大师 AiNAS将持续满足现如今大众对于数字化生活的全新需求&#xff0c;将“云存储”的便捷与NAS的大容…

学圣学最终的目的是:达到思无邪的状态( 纯粹、思想纯正、积极向上 )

学圣学最终的目的是&#xff1a;达到思无邪的状态&#xff08; 纯粹、思想纯正、积极向上 &#xff09; 中华民族&#xff0c;一直以来&#xff0c;教学都是以追随圣学为目标&#xff0c;所以中华文化也叫圣学文化&#xff0c;是最高深的上等学问&#xff1b; 圣人那颗心根本…

如何配置yolov10环境?

本文介绍如何快速搭建起yolov10环境&#xff0c;用于后续项目推理、模型训练。教程适用win、linux系统 yolo10是基于yolo8&#xff08;ultralytics&#xff09;的改进&#xff0c;环境配置跟yolo8几乎一模一样。 目录 第1章节&#xff1a;创建虚拟环境 第2章节&#xff1a;…

tesla p100显卡显示资源不足,api调用失败

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

数据结构JAVA

1.数据结构之栈和队列 栈结构 先进后出 队列结构 先进先出 队列 2.数据结构之数组和链表 数组结构 查询快、增删慢 队列结构 查询慢、增删快 链表的每一个元素我们叫结点 每一个结点都是独立的对象

浅谈“不要卷模型,要卷应用”

目录 1.概述 2.AI技术应用场景探索 3.避免超级应用陷阱的策略 3.1.追求DAU的弊端 3.2.平衡用户活跃度与应用实用性的策略 4.个性化智能体开发 4.1. 用户需求分析与数据收集 4.2. 技术选择与开发 4.3. 个性化算法设计 4.4. 安全性与隐私保护 4.5. 多渠道集成与响应机…

《昇思25天学习打卡营第14天|计算机视觉-ShuffleNet图像分类》

FCN图像语义分割&ResNet50迁移学习&ResNet50图像分类 当前案例不支持在GPU设备上静态图模式运行&#xff0c;其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端…

GraphGNSSLib Series[2]:在CLion中不同Node间进行debug

CLion实现Node debug 步骤&#xff1a; 我了解到的node&#xff0c;大多是通过终端运行&#xff0c;但是使用clion不断debug断点进行调试一直使我很苦恼&#xff0c;所以此次记录一下如何通过clion实现node节点之间通过publisher以及subscriber进行节点话题间的发布与通信&…

App H5+ 实现下载、查看功能 前后端实现(SpringBoot)

<!doctype html><html><head><meta charset"utf-8"><title>维修指南</title><meta name"viewport" content"widthdevice-width, initial-scale1.0, minimum-scale0, maximum-scale0.85, user-scalableyes&quo…

TotalSegmentator---针对CT/MRI数据的自动分割

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 公众号&#xff1a;VTK忠粉 前言 本文分享开源软件TotalSegmentator&#xff0c;该开源项目针对CT/MRI数据类型&#xff0c;对主要的解剖学结构进行自动分割&#xff0c;并且被集成到MITK中。希望对各…