当我们提交一个事务的时候,Revit会弹出错误或警告提示框,而且该错误或警告无法使用try-catch捕获,这时候就要用到API的错误处理方法了。
错误捕获
public class FailuresPreProcessor : IFailuresPreprocessor
{
private string _failureMessage;
private bool _hasError;
public string FailureMessage
{
get { return _failureMessage; }
set { _failureMessage = value; }
}
public bool HasError
{
get { return _hasError; }
set { _hasError = value; }
}
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
//获取所有的失败信息
IList<FailureMessageAccessor> failures = failuresAccessor.GetFailureMessages();
if (failures.Count == 0)
return FailureProcessingResult.Continue;
foreach (FailureMessageAccessor failure in failures)
{
if (failure.GetSeverity() == FailureSeverity.Error)
{
//获取失败描述
_failureMessage = failure.GetDescriptionText();
_hasError = true;
return FailureProcessingResult.ProceedWithRollBack;
}
//如果是警告,则禁止弹框
if (failure.GetSeverity() == FailureSeverity.Warning)
{
failuresAccessor.DeleteWarning(failure);
}
}
return FailureProcessingResult.Continue;
}
}
错误预处理
public class FailuresPreProcessor : IFailuresPreprocessor
{
public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
{
//获取所有的失败信息
IList<FailureMessageAccessor> failures = failuresAccessor.GetFailureMessages();
if (failures .Count == 0)
return FailureProcessingResult.Continue;
foreach (FailureMessageAccessor failure in failures )
{
//如果是错误,则尝试解决
if (failure .GetSeverity() == FailureSeverity.Error)
{
//模拟手动单击"删除连接"按钮
if (failure .HasResolutions())
failuresAccessor.ResolveFailure(failure );
}
//如果是警告,则禁止弹框
if (failure .GetSeverity() == FailureSeverity.Warning)
{
failuresAccessor.DeleteWarning(failure );
}
}
return FailureProcessingResult.ProceedWithCommit;
}
}
通过PreprocessFailures方法我们可以捕获错误或者警告信息,然后进行我们需要的处理。
FailuresAccessor.GetFailureMessages() 获取所有的失败信息
FailureMessageAccessor.GetSeverity() 可以得知它是警告还是错误
FailureMessageAccessor.GetDescriptionText() 可以获取错误的文字
FailureMessageAccessor.GetFailureDefinitionId() 获取失败的定义
FailuresAccessor.DeleteWarning删除警告
FailuresAccessor.DeleteAllWarnings直接删除所有警告
用法
在Transaction类里边设置FailuresPreprocessor,使用FailureHandlingOptions options = transaction.GetFailureHandlingOptions()获取FailureHandlingOptions ,然后使用options.SetFailuresPreprocessor(IFailuresPreprocessor)来设置FailuresPreprocessor。
using(Transaction transaction=new Transaction(RevitDoc,"TransactionName"))
{
try
{
transaction.Start();
FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
FailuresPreProcessor failuresProcessor = new FailuresPreProcessor();
options.SetFailuresPreprocessor(failuresProcessor);
transaction.SetFailureHandlingOptions(options);
//...正常操作
var status = transaction.Commit();
if (status != TransactionStatus.Committed)
{
if (failuresProcessor.HasError)
{
TaskDialog.Show("ERROR", failuresProcessor.FailureMessage);
}
}
}
catch (Exception ex)
{
if (transaction.GetStatus() == TransactionStatus.Started)
transaction.RollBack();
}
}
也可以通过事件的方式处理
在Autodesk.Revit.ApplicationServices.Application中注册事件
public event EventHandler<Autodesk.Revit.DB.Events.FailuresProcessingEventArgs> FailuresProcessing