Revit SDK 介绍:Error Handling 错误处理

前言

Revit API 的错误处理,内容没太大的趣味性,但却是软件不可或缺的部分。

Warning

定义一个 Warning

用户可以自定义错误,如下:

// 定义一个自己的 Warn
FailureDefinitionId m_idWarning;
FailureDefinition m_fdWarning;
// 给它一个唯一的GUID
Guid guid1 = new Guid("0C3F66B5-3E26-4d24-A228-7A8358C76D39");
m_idWarning = new FailureDefinitionId(guid1);
// 给出严重性定义
m_fdWarning = FailureDefinition.CreateFailureDefinition(m_idWarning, FailureSeverity.Warning, "I am the warning.");
// 定义错误处理方式
m_fdWarning.AddResolutionType(FailureResolutionType.MoveElements, "MoveElements", typeof(DeleteElements));
m_fdWarning.AddResolutionType(FailureResolutionType.DeleteElements, "DeleteElements", typeof(DeleteElements));
m_fdWarning.SetDefaultResolutionType(FailureResolutionType.DeleteElements);

使用自定义的 Warning

这里的逻辑是在 Transaction 里面抛出一个我们自定义的 warning,并且用 preproccessor 来处理它。

//
// Post a warning and resolve it in FailurePreproccessor
try
{
   Transaction transaction = new Transaction(m_doc, "Warning_FailurePreproccessor");
   FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
   FailurePreproccessor preproccessor = new FailurePreproccessor();
   options.SetFailuresPreprocessor(preproccessor);
   transaction.SetFailureHandlingOptions(options);
   transaction.Start();
   FailureMessage fm = new FailureMessage(m_idWarning);
   m_doc.PostFailure(fm);
   transaction.Commit();
}
catch (System.Exception)
{
   message = "Failed to commit transaction Warning_FailurePreproccessor";
   return Result.Failed;
}

处理自定义的 Warning

SDK 的例子是把这个 Warning 删除, failuresAccessor.DeleteWarning(fma)

String transactionName = failuresAccessor.GetTransactionName();
if (transactionName.Equals("Warning_FailurePreproccessor"))
{
   foreach (FailureMessageAccessor fma in fmas)
   {
      FailureDefinitionId id = fma.GetFailureDefinitionId();
      if (id == Command.m_idWarning)
      {
         failuresAccessor.DeleteWarning(fma);
      }
   }

   return FailureProcessingResult.ProceedWithCommit;
}

Error

除了和上面这个同样的处理方式以外,还有两种处理方式。

定义一个 Error

用户可以自定义错误,如下:

// 定义一个自己的 Error
FailureDefinitionId m_idError;
FailureDefinition m_fdError;
// 给它一个唯一的GUID
Guid guid2 = new Guid("93382A45-89A9-4cfe-8B94-E0B0D9542D34");
m_idError = new FailureDefinitionId(guid2);
// 给出严重性定义
m_fdError = FailureDefinition.CreateFailureDefinition(m_idError, FailureSeverity.Error, "I am the error");
// 定义错误处理方式
m_fdError.AddResolutionType(FailureResolutionType.DetachElements, "DetachElements", typeof(DeleteElements));
m_fdError.AddResolutionType(FailureResolutionType.DeleteElements, "DeleteElements", typeof(DeleteElements));
m_fdError.SetDefaultResolutionType(FailureResolutionType.DeleteElements);

使用自定义的 Error 并用 FailuresProcessingEvent 来处理

关键点:

  1. 实现失败处理事件, m_revitApp.FailuresProcessing += new EventHandler<Autodesk.Revit.DB.Events.FailuresProcessingEventArgs>(FailuresProcessing);
  2. 抛出失败, m_doc.PostFailure(fm)
try
{
   m_revitApp.FailuresProcessing += new EventHandler<Autodesk.Revit.DB.Events.FailuresProcessingEventArgs>(FailuresProcessing);
   Transaction transaction = new Transaction(m_doc, "Error_FailuresProcessingEvent");
   transaction.Start();

   Line line = Line.CreateBound(new XYZ(0, 10, 0), new XYZ(20, 10, 0));
   Wall wall = Wall.Create(m_doc, line, level1.Id, false);
   m_doc.Regenerate();

   FailureMessage fm = new FailureMessage(m_idError);
   FailureResolution fr = DeleteElements.Create(m_doc, wall.Id);
   fm.AddResolution(FailureResolutionType.DeleteElements, fr);
   m_doc.PostFailure(fm);
   transaction.Commit();
}
catch (System.Exception)
{
   message = "Failed to commit transaction Error_FailuresProcessingEvent";
   return Result.Failed;
}

FailuresProcessing 中处理错误:

if (transactionName.Equals("Error_FailuresProcessingEvent"))
{
   foreach (FailureMessageAccessor fma in fmas)
   {
      FailureDefinitionId id = fma.GetFailureDefinitionId();
      if (id == Command.m_idError)
      {
         failuresAccessor.ResolveFailure(fma);
      }
   }

   e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit);
   return;
}

使用自定义的 Error 并用 FailuresProcessor 来处理

关键点:

  1. 注册错误处理程序,Application.RegisterFailuresProcessor(processor)
  2. 抛出失败, m_doc.PostFailure(fm)
try
{
   FailuresProcessor processor = new FailuresProcessor();
   Application.RegisterFailuresProcessor(processor);
   Transaction transaction = new Transaction(m_doc, "Error_FailuresProcessor");
   transaction.Start();

   Line line = Line.CreateBound(new XYZ(0, 20, 0), new XYZ(20, 20, 0));
   Wall wall = Wall.Create(m_doc, line, level1.Id, false);
   m_doc.Regenerate();

   FailureMessage fm = new FailureMessage(m_idError);
   FailureResolution fr = DeleteElements.Create(m_doc, wall.Id);
   fm.AddResolution(FailureResolutionType.DeleteElements, fr);
   m_doc.PostFailure(fm);
   transaction.Commit();
}
catch (System.Exception)
{
   message = "Failed to commit transaction Error_FailuresProcessor";
   return Result.Failed;
}

实现错误处理程序:

public class FailuresProcessor : IFailuresProcessor
{
   public void Dismiss(Document document)
   {
   }
   public FailureProcessingResult ProcessFailures(FailuresAccessor failuresAccessor)
   {
      IList<FailureMessageAccessor> fmas = failuresAccessor.GetFailureMessages();
      if (fmas.Count == 0)
      {
         return FailureProcessingResult.Continue;
      }

      String transactionName = failuresAccessor.GetTransactionName();
      if (transactionName.Equals("Error_FailuresProcessor"))
      {
         foreach (FailureMessageAccessor fma in fmas)
         {
            FailureDefinitionId id = fma.GetFailureDefinitionId();
            if (id == Command.m_idError)
            {
               failuresAccessor.ResolveFailure(fma);
            }
         }
         return FailureProcessingResult.ProceedWithCommit;
      }
      else
      {
         return FailureProcessingResult.Continue;
      }
   }
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值