Revit二次开发入门:第六章事务

本章内容

1.事务类型

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

说明:

2.事务开始、提交、回滚

方法 描述
Assimilate (仅限TG)提交一个被附上“同化”作用的TG事务。同化后的事务将被合并为一个,并将承担组名(它将出现在撤回菜单中)
Commit 提交变化的内容(在对象展开是进行)
GetName 获取名称(仅限T&TG)
GetStatus 获取当前事务对象的状态
HasEnded 测试一个事务是否已关闭(提交或回滚)
HasStarted 测试一个事务是否已开始->除非这个方法已返回False,不然禁止再次开始
RollBack 回滚有变化的事务操作(丢弃)
SetName 给对象设置一个名字(仅限T&TG.ST没有名字)。当事务提交后,事务名显示在撤回菜单
Start 开始一个事务对象

3.事务容错处理

4.实例练习

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;
        }
    }
}