Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Olga от 27-04-2021, 15:08:57

Название: Подавление ошибок FailuresAccessor
Отправлено: Olga от 27-04-2021, 15:08:57
Доброго времени суток.
Мне необходимо подавить ошибку (т.е без раскрытия окна ошибки, как бы нажать кнопку "Отсоединить элементы")

использую такой класс:
Код - C# [Выбрать]
  1. public class FailureHandler : IFailuresPreprocessor
  2.     {
  3.         public FailureProcessingResult PreprocessFailures( FailuresAccessor failuresAccessor)
  4.         {
  5.             foreach (FailureMessageAccessor fma in failuresAccessor.GetFailureMessages())
  6.             {
  7.                 fma.SetCurrentResolutionType(FailureResolutionType...);
  8.             }
  9.             return FailureProcessingResult.Continue;
  10.         }
  11.  
  12.     }
  13.  

для FailureMessageAccessor можно записать  только итоговый тип  fma.SetCurrentResolutionType(FailureResolutionType...), но  что бы я туда ни записывала, отсоединение не происходит.
где может быть ошибка?

(https://i.ibb.co/jhy9xmh/error.jpg) (https://imgbb.com/)

Название: Re: Подавление ошибок FailuresAccessor
Отправлено: Александр Ривилис от 27-04-2021, 15:41:20
Olga,
Напоминаю о правиле форматирования кода на нашем форуме!
Название: Re: Подавление ошибок FailuresAccessor
Отправлено: Александр Игнатович от 27-04-2021, 18:19:43
У меня получилось вот так:
Код - C# [Выбрать]
  1. app.ControlledApplication.FailuresProcessing += OnFailuresProcessing;
  2. ...
  3. private void OnFailuresProcessing(object sender, FailuresProcessingEventArgs e)
  4. {
  5.         var failureAccessor = e.GetFailuresAccessor();
  6.  
  7.         var disjointFailures = failureAccessor
  8.                 .GetFailureMessages(FailureSeverity.Warning)
  9.                 .Where(x => x.GetFailureDefinitionId() == BuiltInFailures.JoinElementsFailures.JoiningDisjointWarn)
  10.                 .ToList();
  11.  
  12.         if (disjointFailures.Count == 0)
  13.                 return;
  14.  
  15.         foreach (var failure in disjointFailures)
  16.         {
  17.                 failure.SetCurrentResolutionType(FailureResolutionType.DetachElements);
  18.  
  19.                 failureAccessor.ResolveFailure(failure);
  20.         }
  21.  
  22.         e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit);
  23. }

Разница с твоим случаем - я здесь обрабатываю предупреждение, а не ошибку, на вскидку не вспомнил, что нужно сделать, чтобы выдавало именно ошибку, а не предупреждение.

Соответственно, GetFailureMessages(FailureSeverity.Warning) меняешь на FailureSeverity.Error, а BuiltInFailures.JoinElementsFailures.JoiningDisjointWarn на BuiltInFailures.JoinElementsFailures.JoiningDisjoint.

Дай знать по результатам, есть небольшое сомнение, что будет работать с Error-ом. По-хорошему, я бы ещё проверку добавил, что FailureMessage.HasResolutionOfType(FailureResolutionType.DetachElements) вернёт истину
Название: Re: Подавление ошибок FailuresAccessor
Отправлено: Olga от 29-04-2021, 15:29:43
ни у Application  ни у UIApplication  нет метода ControlledApplication. Как можно получить этот класс?
Название: Re: Подавление ошибок FailuresAccessor
Отправлено: Александр Игнатович от 29-04-2021, 15:34:31
Эмм...

(https://i.postimg.cc/06tdh77N/Screenshot-2021-04-29-153258.jpg) (https://postimg.cc/06tdh77N)

Ту же логику можно и в IFailuresPreprocessor реализовать.