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

30/01/2019

Руководство по Design Automation для Revit: 7. Обработка ошибок и предупреждений

Содержание

1. Преобразуем код десктопного Revit addin в код для сервиса Design Automation

2. Создание приложения Forge и авторизация

3. Создание nickname приложения Forge

4. Публикация Design Automation appbundle

5. Публикация activity

6. Запуск workitem

7. Обработка ошибок и предупреждений

Handling Revit Failures (Beta)

Обычно ошибки и предупреждения (failures) обрабатываются стандартным механизмом с помощью пользовательского интерфейса при завершении транзакции, когда вызывается Transaction.Commit() или Transaction.Rollback(). Пользователю показывается информация и возможные пути обработки ошибок.

Если операция (или перечень операций) над моделью требуют какой-либо специальной обработки Revit addin-ом, существует специальный механизм failure handling, который может быть кастомизирован:

- для конкретной транзакции с помощью интерфейса IFailuresPreprocessor

- для всех возможных ошибок - с помощью подписки на событие FailuresProcessing.

Также API предлагает полностью заменить стандартную обработку ошибок (которая производится с помощью UI) реализацией интерфейса IFailuresProcessor. Первые 2 метода обработки ошибок достаточны для большинства случаев, последний вариант предназначен для особых случаев для улучшения UI обработки ошибок (UI не доступен в Design Automation для Revit) или когда приложение используется как front-end поверх Revit.

Обзор Failure Processing-а

Важно понимать, что между вызовом Trnasaction.Commit() и обработкой ошибок выполняется множество вещей (авто-соединения, проверки наложений, групп, возможности редактирования рабочих наборов и многое-многое другое). Эти проверки и изменения, вносимые в модель могут привести к тому, что некоторые предупреждения или ошибки будут устранены, или, что более вероятно, приведут к тому, что будут добавлены новые. Соответственно, обычно, нельзя сделать вывод о том, что будут выданы те или иные ошибки и предупреждения при вызове Transaction.Commit(). Чтобы обработать их корректно, требуется использовать специальный механизм.

К началу процесса обработки ошибок и предупреждений, предполагается, что все изменения уже внесены в модель и все ошибки и предупреждения уже определены и готовы к обработке. Поэтому на данном этапе невозможны произвольные изменения в модели, но существуют ограниченные возможности разрешения ошибок и предупреждений с помощью интерфейса, предоставляемого FailureAccessor-ом. При использовании таких возможностей, все проверки и обработка ошибок должны быть выполнены заново. Поэтому может быть несколько циклов обработки ошибок и предупреждений в конце транзакции.

Каждый цикл обработки ошибок и предупреждений включает в себя 3 шага:

  1. Предобработка ошибок и предупреждений (FailuresPreprocessor)
  2. Вызов событий обработки ошибок и предупреждений (FailuresProcessing event)
  3. Финальная обработка (FailuresProcessor)

На каждом из этих 3 шагов можно контролировать, что должно быть выполнено далее с помощью возврата результата операции FailureProcessingResult:

  • Continue - не оказывает влияния на дальнейшую обработку. Если FailuresProcessor (3, последний этап обработки) возвращает “Continue” с необработанными ошибками, Revit посчитает результат операции как если бы результатом операции был “ProceedWithRollBack”.
  • ProceedWithCommit - немедленно прерывает дальнейшую обработку ошибок и запускает новый цикл проверок ошибок и предупреждений, выполняемых при завершении транзакции. Должно возвращаться после попыток разрешить ошибки и предупреждения. Можно легко добиться бесконечного цикла, если возвращать данное значения без успешной обработки ошибок и предупреждений. Не может быть возвращён, если транзакция была отменена, в этом случае будет считаться, что был возвращен “ProceedWithRollBack” в таком случае.
  • ProceedWithRollback - продолжает обработку ошибок и предупреждений, но в этом случае транзакция будет отмена, даже в том случае, если вызывающий код запросил Transaction.Commit(). Если в FailureHandlingOptions транзакции был вызван метод SetClearAfterRollback(true), то дальнейшая обработка не будет выполняться, все ошибки и предупреждения будут удалены и транзакция будет отменена. В противном случае, обработка ошибок и предупреждений будет продолжена, несмотря на то, что в конечном счёте, транзакция будет отменена.

В зависимости от уровня severity ошибок и предупреждений и того, что запросил вызывающий код - Commit() или RollBack() транзакции, на каждом из 3 вышеприведенных шагов существуют несколько возможностей разрешения ошибок и предупреждений. Вся информация об ошибках и предупреждениях и возможности выполнения операций для их разрешения предоставляется в API с помощью FailuresAccessor. Document может быть использован для получения дополнительной информации, но изменения не могут вноситься в него напрямую, а только с использованием возможностей FailuresAccessor.

Обработка ошибок по умолчанию

В DesignAutomationBridge существует обработчик ошибок и предупреждений, используемый по умолчанию. Он будет подавлять все предупреждения, а в случае ошибок, пытаться разрешить их автоматически. В случае успешной обработки, возвращать ProceedWithCommit за исключением случая, когда разрешение ошибки по умолчанию заключается в удалении элементов, в этом случае будет возвращаться ProceedWithRollback.

Собственный механизм обработки ошибок

Вы можете написать свой собственный обработчик ошибок и предупреждений, переопределяющий обработку ошибок по умолчанию с помощью метода HandleDesignAutomationReadyEvent() и установить severity и resolution type. Для того, чтобы зарегистрировать обработчик, реализуйте интерфейс IFailuresProcessor и зарегистрируйте его с помощью метода Application.RegisterFailuresProcessor(). Фрагмент кода для его регистрации:

Код - C#: [Выделить]
  1. public void HandleDesignAutomationReadyEvent(object sender, DesignAutomationReadyEventArgs e)
  2. {
  3. // Подключаем обработчик ошибок и предупреждений CustomFailureHandling
  4. Application.RegisterFailuresProcessor(new CustomFailureHandlingProcessor());
  5.  
  6. // Запускаем основную логику приложения.
  7. SketchItFunc(e.DesignAutomationData);
  8.  
  9. e.Succeeded = true;
  10. }

FailuresProcessor

IFailuresProcessor получает управление в последнюю очередь после обработки события FailuresProcessing. Существует всего лишь один активный IFailuresProcessor в сессии Revit. Если существовал прежде зарегистрированный обработчик ошибок и предупреждений, он будет отменен. Если addin не предоставляет собственный обработчик ошибок и предупреждений, используется обработчик ошибок Design Automation для Revit по умолчанию. Вы можете деактировать его, передав null аргументом метода RegisterFailuresProcessor(). В этом случае Revit будет обрабатывать ошибки и предупреждения, используя метод их разрешения по умолчанию.

Предупреждение: Метод IFailuresProcessor.ProcessFailures() может вернуть WaitForUserInput, который оставляет транзакцию в статусе "ожидание", так что FailuresProcessor может показать пользовательский интерфейс, ожидающий какого-либо пользовательского ввода до обработки ошибок. Не используйте WaitForUserInput в Design Automation для Revit, поскольку на сервере нет пользовательского интерфейса в Design Automation для Revit.

Код обработчика ошибок в Design Automation для Revit: FailureProcessor.cs.

Код реализует интерфейс IFailuresProcessor и подавляет все предупреждения. В случае ошибок, код отменяет транзакцию. Если Вам необходимо другое поведение, вы можете модифицировать этот код для того, чтобы он удовлетворял Вашим потребностям.

Назад к запуску workitem.

Источник: https://forge.autodesk.com/en/docs/design-automation/v3/tutorials/revit/handling-failures/

 

 

 

Автор перевода: Александр Игнатович

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 30.01.2019