Довольно часто при работе в Ревите мы сталкиваемся с ошибками и предупреждениями. Это те самые окна, которые всплывают в левом нижнем углу или по центру экрана. Предупреждение можно пропустить, а ошибка мешает работе — как правило, приходится отменять действия и переделывать всё заново (хотя в некоторых случаях можно нажать, например, "Отсоединить элементы").
Большая проблема ошибок и предупреждений в том, что нельзя просто так взять и отловить их с помощью try-catch. Дело в том, что при таких ошибках исключений не возникает — возникают экземпляры класса BuiltInFailures. И сами по себе они не исчезнут: иногда их надо прощёлкивать руками, особенно если они возникают в цикле.
Однако, иногда избежать таких ошибок при выполнении плагина невозможно. То есть нам надо их обрабатывать. И RevitAPI предоставляет нам такую возможность: интерфейс IFailurePreprocessor.
Пропуск предупреждений
Реализуем этот интерфейс в режиме пропуска предупреждений:
Что тут происходит:
- Из него мы получаем сообщения об ошибках.
- Проверяем тип сообщения, и, если это предупреждение, удаляем его.
Обработка ошибок
Создадим ещё одну реализацию IFailurePreprocessor, которая будет отлавливать ошибки, где есть решение "Отсоединить элементы", и применять это решение автоматически:
На 17 строке мы проверяем, что такое решение есть.
- На 19 строке назначаем его как текущее.
Подключение обработчика ошибок к плагину
Сам по себе обработчик ошибок нам не поможет, его нужно подключить к транзакции. Как это сделать:
Код занимает всего 3 строки, но чтобы не воспроизводить его каждый раз, я вынес его в отдельный статический класс:
Далее просто в коде сразу после начала транзакции вызовите этот статический метод и передайте ему эту транзакцию. Готово!
Заключение
Поскольку в ранее написанных в этом блоге плагинах вероятность такой ошибки при выполнении маловероятна, я просто написал эти классы и выложил код в свой репозиторий на GitHub, но не подключал их к транзакциям.
Скорее всего, в своих плагинах вы не сможете использовать всё это в чистом виде, но сможете легко сделать всё по аналогии, применяя методы отладки в случае проблем.
А на этом всё на сегодня. Не забывайте ставить лайки здесь и звёздочки на GitHub, а так же подписывайтесь на мой телеграм-канал о Revit API. До новых встреч!