Всем привет! Сегодня разберём интересный вопрос: как сделать так, чтобы при выполнении плагина пользователь мог выбрать только определённые элементы.
Выбор элементов в Revit API
За пользовательский выбор элементов в Revit API отвечают методы из библиотеки RevitAPI.UI:
Мы можем выбрать один элемент, несколько элементов, или выбрать элементы прямоугольной областью. Но как сделать так, чтобы, допустим, выделить только двери? Или элементы того же типа, что и выбранное изначально семейство? Как не дать пользователю ошибиться с выбором?
В этом нам поможет интерфейс ISelectionFilter — он входит в некоторые перегрузки вышеназванных методов.
Чтобы им воспользоваться, нам надо создать класс, который наследует данный интерфейс, и передать экземпляр данного класса в PickObject или другой метод.
При этом мы не обязаны ограничиваться только методами интерфейса: класс можно расширить так, как нам требуется.
Для более сложной реализации я модернизирую своё WPF-приложение, о котором рассказывал в предыдущих статьях (часть 1, часть 2).Сделаем такой алгоритм:
- Пользователь выбирает элемент.
- Появляется окно с настройками нумерации, пользователь заполняет их.
- Пользователь выбирает элементы для нумерации, но только той же категории, что и первоначальный элемент
То есть при первом выборе мы будем передавать элемент в наш класс, а затем при каждом выборе будет происходить сравнение первоначальной категории и выбранной нами.
Подробнее, как происходит процесс передачи, можете посмотреть в моём репозитории на GitHub.
AllowElement и AllowReference — в чём разница?
Тут всё просто: первый метод применяется тогда, когда мы выбираем элементы, а второй — когда выбираем их части (рёбра, грани, точки). То есть если вы не планируете, что будете выбирать не элементы, то просто пишите в AllowReference "return true;", и всё. Но разберём пример:
Допустим, мы хотим выбрать рёбра не ближе какого-то расстояния к первому выбору. Тогда наш класс будет выглядеть так:
Можете проверить — Revit не даст выбрать грани на отдалённых элементах.
А на этом на сегодня всё, до новых встреч! Не забывайте ставить лайки и звёзды на GitHub, и подписывайтесь на мой телеграм-канал о Revit API.