我想知道是否有一种方法可以对以其他方法启动和提交的各种事务进行分组和同化。然后例如在我的伪代码中:
public class Main: IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, elementSet elements)
{
TransactionGroup transactiongroup = new TransactionGroup(document,"Combined Transactions");
transactiongroup.Start()
Parameterpass_method(commandData);
Sketch_method(commandData);
transcationgroup.Assimilate();
transactiongroup.Commit();
return Result.Succeeded;
}
private void Parameterpass_method(ExternalCommandData commandData)
{
Document document = commandData.Application.ActiveUIDocument.Document;
Transaction trans = new Transaction(document,"parameter pass");
trans.Start();
// Code for this method ie. whatever I want and works
trans.Commit();
}
private void Sketch_method(ExternalCommandData commandData)
{
Document document = commandData.Application.ActiveUIDocument.Document;
Transaction trans = new Transaction(document,"parameter pass");
trans.Start();
// Code for this method ie. whatever I want and works
trans.Commit();
}
}
通过尝试此方法,我没有收到任何错误,但是我没有向我的 Revit 系列提供任何输出。我想知道这是否是因为我的方法错误。
请阅读有关 TransactionGroup.Assimilate 和 TransactionGroup.Commit 的 Revit API 文档,并研究各自提供的示例代码。它清楚地表明您可以调用
Assimilate
或 Commit
,而不是同时调用两者,并且它们具有不同的效果。
核心问题是你同时调用了
transcationgroup.Assimilate()
和transactiongroup.Commit()
。如果您只调用这些方法之一,那么即使您的事务分布在多个类和方法中,但随后又汇总到一个中,事情也应该可以正常工作TransactionGroup
。
根据 API 文档:
提交小组有两种方式 -
和Commit
。通过提交,组内提交的所有事务保持原样,而通过同化,所有内部事务将合并为单个事务。Assimilate
我经常在命令的最顶层使用 TransactionGroup,并根据需要在整个过程中添加事务。这使我能够向用户呈现一笔交易,更重要的是一个撤消功能。
请注意,每个事务都会减慢您的命令,因为刷新和重新生成几何体需要一定量的开销,因此您希望将这些开销保持在最低限度 - 通常只是在 Revit 需要在执行之前将这些更改提交到文档的情况下你的下一步行动。
public Result Execute(ExternalCommandData commandData, ref string message, elementSet elements)
{
TransactionGroup transactiongroup = new TransactionGroup(document,"Combined Transactions");
transactiongroup.Start()
Parameterpass_method(commandData);
Sketch_method(commandData);
// all transactions rolled into one undo
transcationgroup.Assimilate();
// each transaction shows in undo
// transactiongroup.Commit();
return Result.Succeeded;
}