RevitAPI之TransactionGroup和Assimilate方法【比目鱼原创】

=========【更多高级应用请关注公众号】========


===================================

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


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值