很多时候,当我们提交一个事务的时候,Revit会弹出错误框或者警告框,而该错误或警告无法使用Try-Catch捕获,这个时候就要用到API的错误处理方法了,首先定义一个错误预处理器继承自IFailuresPreprocessor。
代码如下:
/// <summary>
/// 错误预处理器
/// </summary>
public class FailuresPreprocessor : IFailuresPreprocessor
{
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
// 获取所有的失败信息
IList<FailureMessageAccessor> listFma = failuresAccessor.GetFailureMessages();
if (listFma.Count == 0)
return FailureProcessingResult.Continue;
foreach (FailureMessageAccessor fma in listFma)
{
// 如果是错误,则尝试解决
if (fma.GetSeverity() == FailureSeverity.Error)
{
// 模拟手动单击"删除连接"按钮
if (fma.HasResolutions())
failuresAccessor.ResolveFailure(fma);
}
// 如果是警告,则禁止弹框
if (fma.GetSeverity() == FailureSeverity.Warning)
{
failuresAccessor.DeleteWarning(fma);
}
}
return FailureProcessingResult.ProceedWithCommit;
}
}
用法如下:
using (Transaction transaction = new Transaction(RevitDoc))
{
try
{
transaction.Start("DoSomething");
FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
FailuresPreprocessor failureProcessor = new FailuresPreprocessor();
options.SetFailuresPreprocessor(failureProcessor);
transaction.SetFailureHandlingOptions(options);
// ...正常操作
var status = transaction.Commit();
if (status != TransactionStatus.Committed)
{
if (failureProcessor.HasError)
{
TaskDialog.Show("ERROR", failureProcessor.FailureMessage);
}
}
}
catch (Exception ex)
{
if (transaction.GetStatus() == TransactionStatus.Started)
transaction.RollBack();
}
}
通过PreprocessFailures方法我们就可以捕获错误或者警告,然后进行我们想要的处理。
FailuresAccessor.GetFailureMessages() 获取所有的失败信息
FailureMessageAccessor.GetSeverity() 可以得知它是警告还是错误
FailureMessageAccessor.GetDescriptionText() 可以获取错误的文字
FailureMessageAccessor.GetFailureDefinitionId() 获取失败的定义
FailuresAccessor.DeleteWarning删除警告,或者FailuresAccessor.DeleteAllWarnings直接删除所有警告
也可以通过事件的方式处理
在Autodesk.Revit.ApplicationServices.Application中注册如下事件
public event EventHandler<Autodesk.Revit.DB.Events.FailuresProcessingEventArgs> FailuresProcessing
其中,FailuresProcessingEventArgs可用方法如下
public FailuresAccessor GetFailuresAccessor()
public FailureProcessingResult GetProcessingResult()
public void SetProcessingResult(FailureProcessingResult result)
本文详细介绍如何在Revit中使用自定义错误预处理器(IFailuresPreprocessor)来捕获并处理事务提交时出现的错误和警告。通过实现特定方法,可以自动解决错误或禁用警告弹窗,提高开发效率。
1078

被折叠的 条评论
为什么被折叠?



