Руководство по Design Automation для Revit: 7. Обработка ошибок и предупреждений
Содержание
1. Преобразуем код десктопного Revit addin в код для сервиса Design Automation
2. Создание приложения Forge и авторизация
3. Создание nickname приложения Forge
4. Публикация Design Automation appbundle
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 шага:
- Предобработка ошибок и предупреждений (FailuresPreprocessor)
- Вызов событий обработки ошибок и предупреждений (FailuresProcessing event)
- Финальная обработка (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(). Фрагмент кода для его регистрации:
- public void HandleDesignAutomationReadyEvent(object sender, DesignAutomationReadyEventArgs e)
- {
- // Подключаем обработчик ошибок и предупреждений CustomFailureHandling
- Application.RegisterFailuresProcessor(new CustomFailureHandlingProcessor());
- // Запускаем основную логику приложения.
- SketchItFunc(e.DesignAutomationData);
- e.Succeeded = true;
- }
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