=========【更多高级应用请关注公众号】========
===================================
关于TransactionGroup 类
TransactionGroup用来将几个独立的事务分组,这样一个组可以同时处理许多事务。
当一个TransactionGroup撤销时,所有在这个组里的事务,哪怕已经成功提交的,都会被撤销。
如果一个TransactionGroup被提交,这个组里的事务保持原来状态(提交或撤销)。如果一个TransactionGroup被吸收(Assimilate),那么这个组里的所有事务将被合并成一个成功提交的事务,并使用这个组的名字显示在Undo菜单里。
一个TransactionGroup只能在没有事务打开的情况下启动,也必须在所有事务已经关闭的情况下关闭。
TransactionGroup可以被嵌套,但任何嵌套内的事务组必须在嵌套外的事务组关闭前关闭。事务组主要用来管理事务,不是必须使用的。
以下代码展示了如何使用TransactionGroup的Assimilate方法来组合两个独立的事务。运行结果将在Undo菜单里显示一个事务。
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();
}
}
}
}
private 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;
}
private 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;
}