事务

  • 事务基础
    • 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;}}
}

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

  1. Revit 二次开发 HOF 方式调用transaction

    再看<C#函数式编程>一书的时候看到HOF的概念,感觉在日常开发的过程中可以使用此方式整理一个拓展方法,实现程序的快速调用. Transaction函数继承自IDisposable 我们平 ...

  2. C# Revit二次开发基础/核心编程--- Application\Document\Transaction

    一.本节课程 C# Revit二次开发基础/核心编程--- Application\Document\Transaction 二.本节要讲解的知识点 Application\Document\Tran ...

  3. revit二次开发之多线程的正确使用

    欢迎加入BIM行业开发交流1群 群号:711844216(满),二群群号:1016453207 一.背景 小伙伴们为了加快revit程序运行速度, 可能会考虑使用多线程,但是我们必须首先搞清楚一个问题 ...

  4. Revit二次开发—载入族并交互式放置

    文章目录 核心代码 问题一:按esc取消放置时报错 问题二:如何在放置一个族实例之后退出放置 问题三:已存在所载入族时,如何正常放置 参考资料 核心代码 using (Transaction tx = ...

  5. Revit二次开发案例一(第1讲)

    这期起,将为大家带来二次开发的小案例讲解,通过借助Revit建模与二次开发,帮助大家快速提高开发水平,快快参加吧!!! 族实例是通过族类型创建的,而创建族实例是Revit二次开发尤其重要的,因此小伙伴 ...

  6. Revit二次开发2、RevitAPI、RevitAPIUI及Revit开发三大利器

    Revit二次开发2.开发基础之--RevitAPI.RevitAPIUI及Revit开发三大利器 RevitAPI.dll RevitAPIUI.dll Revit开发三大利器 外部命令(IExte ...

  7. Revit二次开发——扩展存储

    Revit二次开发--扩展存储 ​  在revitAPI中,提供了Extensible Storage framework,可以使开发者将需要存储的数据存到Revit的rvt文件中, 扩展的数据始终跟 ...

  8. Revit二次开发学习笔记

    Revit二次开发学习笔记1 20220314: 概念:Application与Document 接口函数:IExternalCommand.ActiveView与Selection 20220316 ...

  9. Revit二次开发之批量修改族名称及族类型名称

    昨天是参加工作整一年的好日子,在这一年中逐步开始接触C#和Revit二次开发,困扰和BUG伴随着整个学习过程.由于Revit二次开发的资料和课程不多,很多情况下都是依靠博客.技术贴和QQ群里的大神等方 ...

最新文章

  1. R语言ggplot2可视化分面图(facet_grid)、自定义设置分面图标签栏的背景色(默认背景色为灰色)
  2. 字节跳动 算法全四面 详细面经
  3. android root 挂载分区,adb — adb disable-verity, adb remount 实现重新挂载system分区为可读写分区...
  4. python程序写诗_用Python作诗,生活仍有诗和远方
  5. Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表中:
  6. 美商务部再禁6项新兴技术,包括光刻软件和5nm生产技术
  7. 浏览器构造页面的原理
  8. MySQL之数据库基本操作语句
  9. Buffer对象与JSON对象相互转换
  10. dictionary new一个实例_超全的Python 字典(Dictionary)介绍
  11. JAVA 编程练习题
  12. 最难学的5种编程语言排行
  13. 红黑树插入修正和删除修正详解
  14. 微信小程序语音搜索功能
  15. 2021年全球与中国飞机导航镜行业市场规模现状及企业市场份额分析
  16. 神经网络算法和人工智能,神经网络的算法有哪些
  17. 如何用python画一个美队盾牌
  18. Java 基础 —— Lambda 表达式
  19. Django实现小程序的登录验证功能,并维护登录态
  20. ug绘图中如何把曲面变成实体?

热门文章

  1. Springboot中的context-path (url前缀)
  2. KD tree and Bbf
  3. 送给Mickey的礼物
  4. SQL之case when then用法简介
  5. java编程实现素数环_回溯法解决素数环
  6. 大数据开发系列(一)----Hadoop集群环境配置
  7. 还在为清理库存烦恼吗?三步搞定库存!
  8. Mysql进阶—二进制安装、联合查询、破解与备份
  9. 图像分割中的一些术语,pixel-wise,patch-wise,image-wise
  10. 游戏跟计算机不兼容,Win7 64位旗舰版系统下游戏延迟和游戏不兼容如何解决【图】...