Revit事务的错误或警告信息处理

当我们提交一个事务的时候,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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值