Revit二次开发入门:第六章事务
本章内容
1.事务类型
在API中和事务有关的主要有三个类:
- Transaction(T):要修改Revit文档中的模型就需要一个Transaction。在同一时间,只有一个Transaction可以被打开,不允许嵌套。每个Transaction需要一个名字,当这个Transaction被成功提交后,这个名字会被显示在Undo菜单里。
- TransactionGroup(TG):用来将几个独立的事务分组,这样一个组可以同时处理许多事务。
- SubTransaction(ST):一个SubTransaction可以用来提交一组操作。子事务是可选项,不是必须的。SubTransaction必须在一个打开的Transaction中创建,在Transaction关闭(提交或撤销)前关闭(提交或撤销)。
说明:
- T仅在修改Document是需要,ST/TG不是必须的,只是为了更好的组织修改。
- 修改的唯一性:Transaction不可嵌套
- ST必须在T启动后启动,必须在T关闭前关闭
- TG启动后方可启动T,在所有T关闭后关闭
- ST和TG可嵌套但不可重合
- 注意检查函数返回值!
2.事务开始、提交、回滚
- 初始化:构造函数中
- Start-开始:在它实例化后开始,或者关闭后重启
- Commit-提交:当对象运行时,请求接收对模型的改动
- Rollback:当对象运行时,所有的模型改动将被有效地丢弃
方法 | 描述 |
---|---|
Assimilate | (仅限TG)提交一个被附上“同化”作用的TG事务。同化后的事务将被合并为一个,并将承担组名(它将出现在撤回菜单中) |
Commit | 提交变化的内容(在对象展开是进行) |
GetName | 获取名称(仅限T&TG) |
GetStatus | 获取当前事务对象的状态 |
HasEnded | 测试一个事务是否已关闭(提交或回滚) |
HasStarted | 测试一个事务是否已开始->除非这个方法已返回False,不然禁止再次开始 |
RollBack | 回滚有变化的事务操作(丢弃) |
SetName | 给对象设置一个名字(仅限T&TG.ST没有名字)。当事务提交后,事务名显示在撤回菜单 |
Start | 开始一个事务对象 |
3.事务容错处理
- FailureHandlingOptions
- IFailuresPreprocessor
- [TransactionMode]
- 2017已结删除Automatic
- ReadOnly用的比较少
- 强烈推荐使用Manual!
4.实例练习
-
TransactionGroup
- tg.Assimilate()。对事务进行编组,只能成组撤回
- tg.Commit()效果
-
Transaction-必须精通
-
SubTransaction
-
Open/Commit的使用
-
嵌套的意义
-
名字的意义
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
namespace Trans {
[TransactionAttribute(TransactionMode.Manual)]
[RegenerationAttribute(RegenerationOption.Manual)]
public class TranTest : IExternalCommand {
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) {
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;
TransactionGroup tg = new TransactionGroup(doc, "TG");
tg.Start();
Transaction t1 = new Transaction(doc, "T1");
t1.Start();
Wall.Create(doc, Line.CreateBound(new XYZ(), new XYZ(0, 10, 0)), Level.Create(doc, 0).Id, false);
t1.Commit();
TaskDialog.Show("T1", "已经产生第一道墙");
Transaction t2 = new Transaction(doc, "T2");
t2.Start();
Wall.Create(doc, Line.CreateBound(new XYZ(), new XYZ(10, 10, 0)), Level.Create(doc, 0).Id, false);
t2.Commit();
tg.Assimilate();
//tg.Commit();
Transaction tt = new Transaction(doc, "TT");
tt.Start();
SubTransaction st1 = new SubTransaction(doc);
st1.Start();
SubTransaction st2 = new SubTransaction(doc);
st2.Start();
st2.Commit();
TaskDialog.Show("ST2", "ST2已提交");
st1.Commit();
TaskDialog.Show("ST1", "ST1已提交");
tt.Commit();
return Result.Succeeded;
}
}
}