项目场景:
Transaction类是在Revit二次开发中,执行更改、变更的常用类。在使用它的时候,有时候会出现一些我们不希望看到的问题。
问题描述
例如:我们在做完某一处参数的更改时,由于建模或者其他的原因产生了一些不能忽略的错误,必须要手动操作,点击一些按钮(如“取消”、“删除约束”),才会执行接下来的程序,如下图所示。类似的问题还有“线太短”、“偏离参考平面”等等。并且这类错误还不能用普通的try catch块捕获。
原因分析:
关于这类错误,Revit中有专门的接口来处理该类情况。接口为:IFailuresPreprocessor。
解决方案:
1、新建一个专门用于处理此错误的类,该类继承IFailuresPreprocessor。
2、在transaction开启后,利用此类对transaction的执行方式进行设置。
具体代码如下。
Transaction t = new Transaction(doc, "示例");
t.Start();
FailureHandlingOptions options = t.GetFailureHandlingOptions();
options.SetFailuresPreprocessor(new SetParameters_FailuresPreprocessor());
t.SetFailureHandlingOptions(options);
try
{
// do something
t.Commit();
}
catch (Exception e)
{
// do something
t.RollBack();
}
finally
{
t.Dispose();
}
public class SetParameters_FailuresPreprocessor : IFailuresPreprocessor
{
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
IList<FailureMessageAccessor> failureMessageAccessors = new List<FailureMessageAccessor>();
failureMessageAccessors = failuresAccessor.GetFailureMessages();
foreach (var fma in failureMessageAccessors)
{
if (fma.GetSeverity() == FailureSeverity.Error)
{
failuresAccessor.ResolveFailure(fma); // 似乎可以解决所有的FailureSeverity
failuresAccessor.DeleteWarning(fma); // 只能解决FailureSeverity.Warning
return FailureProcessingResult.ProceedWithRollBack; // 回滚了,不保留更改
//return FailureProcessingResult.ProceedWithCommit; // 不回滚,坚持提交,这样可能会删除一些导致错误产生的元素
}
}
return FailureProcessingResult.Continue;
}
}
注意事项:
1、failuresAccessor.DeleteWarning()只能解决FailureSeverity.Warning,像我们今天探讨的FailureSeverity.Error它是解决不了的,用了failuresAccessor.DeleteWarning()之后,不能忽略的对话框还是会弹出来。
2、return FailureProcessingResult.ProceedWithRollBack;以后不保留更改,而return FailureProcessingResult.ProceedWithCommit;会保留更改,坚持提交,并且它能成功提交的原因是删除了一些产生error错误的元素,如你画的墙,参照线,参照平面等等。因此我很不建议用return FailureProcessingResult.ProceedWithCommit;除非确实想要删除这些产生error的元素。