Revit错误或警告信息处理

本文详细介绍如何在Revit中使用自定义错误预处理器(IFailuresPreprocessor)来捕获并处理事务提交时出现的错误和警告。通过实现特定方法,可以自动解决错误或禁用警告弹窗,提高开发效率。

很多时候,当我们提交一个事务的时候,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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值