Расскажу, как сделать выпадающий список со значениями в загружаемых семействах.

Сценарии использования

Первый сценарий — фиксированные значения. Например, есть изделие, у которого заводские размеры 750, 800, 900, 1000, 1200. Можно дать пользователю самому вбивать длину, но при этом значения ограничить нельзя.

Второй сценарий — галочки видимости. Если брать предыдущий пример, то можно налепить 5 галочек на каждый размер. Но тогда, если нужно выбрать длину 900, нужно следить, чтобы не было галочек на остальных длинах.

Решения, которое просто возьмёт и само отключит ненужные галочки нет, так как формулы будут блокировать параметры с галочками, и переключить их уже не получится. Для двух вариантов галочки — хороший способ, но если их больше, то интерфейс становится перегруженным.

Выход — сделать выпадающий список, в котором пользователь выберет нужную длину и благодаря этому не сможет вбить своё значение или ещё как-то закосячить. Иногда ограничения напротив добавляют удобство.

Создание

Метод основан на возможности управлять типоразмерами вложенных семейств. В итоге у нас будет два семейства: родительское, в котором будет список, и вложенное, в котором будут позиции для списка.

Создаю пустое родительское семейство. Тут же создаю ещё одно, оно станет вложенным, поменяю в нём категорию на «Антураж». Добавляю во вложенное типоразмеры, давайте возьму варианты из примера в начале статьи. Итого мне нужно создать 5 типоразмеров с названиями 750, 800, 900, 1000, 1200 и загрузить вложенное в родительское.

Создаю типоразмеры
Создаю типоразмеры
Загрузил семейство в родительское
Загрузил семейство в родительское

Теперь у меня в родительском есть вложенное со списком типоразмеров, однако не хватает типоразмера 1200. Специально сделал так, потому что создавать типоразмеры можно прямо в родительском семействе. Для этого просто копирую тип в Диспетчере проектов у вложенного семейства и переименовываю его.

Копирую существующий тип и переименовываю его
Копирую существующий тип и переименовываю его
Получаю требуемое количество вариантов
Получаю требуемое количество вариантов

Теперь нужно создать параметр с выпадающим списком. Для этого захожу в окно типоразмеров и создаю новый параметр с типом данных «Типоразмер из семейства», категорией «Антураж» и сразу отправляю в группу «Зависимости».

Создаю новый параметр с типом «Типоразмер из семейства...»
Выбираю категорию, она должна быть такой же, как у вложенного семейства
Параметр готов, нажимаю ОК
Теперь в параметре можно выбрать типоразмер

Выбираю категорию «Антураж» по нескольким причинам:

  1. Эта категория не используется в инженерных моделях.
  2. Название категорий одно из самых коротких, короче только «Окна» и «Двери», но они всё же чаще встречаются, поэтому их не использую. Ещё как вариант категория «Генплан», тоже короткое название.
  3. Категории идут по алфавиту, Антураж — самая первая. В этом списке можно пользоваться быстрой навигацией с помощью клавиатуру. Нажимаете первые буквы категории и перескакиваете к ней.

Указатель категории в имени параметра будет отображаться и в проекте, поэтому и предпочитаю категорию с коротким названием. Имя вложенного семейства, в примере это «Список», так же будет отображаться, поэтому вложенное я тоже переименовываю покороче. Использую для этого карточные масти из таблицы символов, буби — вполне нейтральные.

Ревитчики — козырные ребята
Ревитчики — козырные ребята
Получается вот так
Получается вот так

Список готов. Но этого мало, так как сам по себе он ничем не управляет. Теперь надо сделать так, чтобы выбранный типоразмер менял реальную длину.

Для этого придётся добавить столько параметров, сколько вариантов. В примере это 5 штук. Нужно создать 5 точно таких же параметров с типоразмерами из семейства, но сделать их по типу. А первый параметр сделать по экземпляру — его будет менять пользователь. Создаю параметры и назначаю каждому их варианты.

У каждого параметра выставляем его вариант, они будут неизменны в дальнейшем. Если добавятся ещё варианты, для них нужно добавить свои параметры
У каждого параметра выставляем его вариант, они будут неизменны в дальнейшем. Если добавятся ещё варианты, для них нужно добавить свои параметры

Настало время писать формулу условия. Логика такая: мы не можем приравнять параметр к его значению, так как тут значение не число, а типоразмер из вложенного, зато мы можем приравнивать параметры друг к другу. Если значение в параметре «Длина» будет равно значению в параметре «Длина750», значит, сейчас у нас длина должна быть 750. Если равно значению из «Длина800», то длина должна быть 800 и т. д.

Формула выглядит так:

if(Длина = Длина750, 750, if(Длина = Длина800, 800, if(Длина = Длина900, 900, if(Длина = Длина1000, 1000, if(Длина = Длина1200, 1200, 700)))))

Рекомендую пользоваться текстовыми редакторами для программистов, например Notepad++ — в нём можно подсвечивать синтаксис и не высчитывать скобочки самому, а ориентироваться на подсветку.

Вот так я написал эту формулу в Ноутпаде++, прямо так можно вставлять в Ревит
Вот так я написал эту формулу в Ноутпаде++, прямо так можно вставлять в Ревит

Теперь длина будет меняться в зависимости от выбранного значения в выпадающем списке. Если я выбираю 750, то формула подставляет значение в 750 мм, если выбираю 800, то 800 мм. И так далее, логику вы поняли.

Выбрал 750, длина подставилась сама
Выбрал 750, длина подставилась сама
Выбрал 900 в списке — заменилась на 900
Выбрал 900 в списке — заменилась на 900

Вот так это и работает. То же самое можно было бы реализовать не с длинами, а с галочками видимости. Тогда бы это выглядело так:

Выбираю 900 — галочки нет, так как условие равенства не соблюдается
Выбираю 900 — галочки нет, так как условие равенства не соблюдается
Выбираю 750 — галочка появилась, так как условие выполнено
Выбираю 750 — галочка появилась, так как условие выполнено

Ну а дальше — только ваши фантазия и изобретательность.

Альтернатива

Всё это можно не городить, а делать переключение по номеру. Если у нас есть 4 варианта, то можно вставить числовой параметр, куда пользователь будет вводить целое число от 1 до 4, и каждому числу будет назначаться длина. В подсказку к параметру ввести информацию о том, какой номер какой длине соответствует.

Вот так выглядит этот метод, при 0 галочки нет, при 1 — есть, всё зависит только от того, что вы внесёте в формулу
Вот так выглядит этот метод, при 0 галочки нет, при 1 — есть, всё зависит только от того, что вы внесёте в формулу

Это неплохой метод с точки зрения экономии места и упрощения семейства. Однако у него есть интерфейсные минусы. Во-первых, так мы неявно ограничиваем варианты. А если человек вобьёт 5? Или 10? Конечно, семейство не изменится из-за этого или даже выдаст ошибку, но в любом случае: чтобы разобраться, надо обратиться к подсказке, надо знать, что она есть, или разбираться экспериментом.

Вариант с выпадающим списком действительно сложнее и тяжелее, однако он более дружественен пользователю и чётко ограничивает допустимые варианты. Надеюсь, когда-нибудь Ревит будет порхать как бабочка и на не самых мощных машинах, тогда можно будет не переживать о производительности и больше заботиться об удобстве интерфейса. Сейчас есть явные ограничения.

Видеокурс по семействам трубопроводных фитингов. Подробный 10-часовой курс, в котором научу создавать семейства и поделюсь лайфхаками.

Обновления статей удобно получать в Телеграм-канале «Блог Муратова про Revit MEP». Подписывайтесь и приглашайте коллег. Можно обсудить статью и задать вопросы в специальном чате канала.

Отблагодарить автора

Я много времени уделяю блогу. Если хотите отблагодарить меня, то можете сделать небольшой подарок (именно подарок, такой перевод не облагается налогом).