четверг, 21 августа 2014 г.

Семейства Revit. Настраиваем массив "как импосты в витражах". Часть 2

Как и обещал, продолжение поста про параметризацию массива.
Задача: сделать в одном семействе все варианты компоновки (раскладки) массива, рассмотренные в первой части. А это ни много, ни мало, а 12 вариантов в одном семействе! Причем сделать это максимально удобным способом.
В результате урока у нас должно получиться примерно так:
Поехали!
В общем очевидно, что нужно применять формулу с условием (if). Проще всего сделать это на чекбоксах, т.е. создать несколько параметров типа Да/Нет (это те, в которых можно ставить "галочки"). Но по факту это неудобно, потому как если таких параметров больше двух, то не исключен вариант, когда пользователь включит не одну галочку, а несколько, и это приведет к ошибке.
Мы используем совершенно другой способ. Если вы работали с вложенными семействами, то знаете, что к вложенному семейству можно добавить параметр, позволяющий выбирать типоразмер вложенного семейства из выпадающего списка. Используем эту особенность!

1. Чтобы сформировать "выпадающие списки", нужны вложенные семейства. Создадим 7 семейств. Пустых, т.е. в них не должно быть геометрии. Просто создаете семейство на основе шаблона "типовая модель", меняете у него категорию и сохраняем под нужным именем.
Должно получиться так:
Семейства не должны быть "Общими"!!!
2. Загружаем все семейства в семейство массива, созданное в первой части урока.
3. Идем в Типоразмеры в семействе и добавляем 7 параметров с такими настройками (все параметры - для типа!):
Должно получиться так:
4. Добавляем еще 2 параметра, "Выравнивание" и "Раскладка" (тут уже параметры экземпляра!). Именно с помощью этих параметров будем управлять семейством. Настройки:
5. И, наконец, надо добавить еще 3 параметра: "Отступ" (это будет параметр, в который мы будем вписывать желаемый отступ), "Интервал" (нужен, чтобы запараметризовать шаг массива) и "Количество" (чтобы запараметризовать количество элементов массива). Заодно наведем порядок: все вспомогательные параметры уберем в "Прочее":

Я хочу управлять массивом, выбирая из списка параметра "Выравнивание" варианты "Центр", "Конец", "Начало". Однако, напрямую это не сделаешь, поскольку мы не можем написать формулу, типа:
IF (ПАРАМЕТР = НАЗВАНИЕ ТИПОРАЗМЕРА, Х, Y) 
Revit просто не понимает таких формул.
Именно поэтому мы создали 7 дополнительных параметров и указали для них все варианты выбора. Теперь я не буду приравнивать параметр к типоразмеру, я буду сравнивать значения параметров, т.е. формула примет понятный Revit вид:
IF (ПАРАМЕТР = ПАРАМЕТР, Х, Y) 

6. Приступим к параметризации. для начала, удалите формулы с параметров "Массив.Количество" и "Массив.Длина", а в "Интервал" и "Отступ" впишите значения, отличные от нуля, например - 200 и 150 соответственно.
Далее, начнем с отступов. Вот какие у нас есть варианты:
- Если "Раскладка" = "Фиксированное число", то отступы определяются всегда по остаточному принципу, т.е. длину делим на равный шаг, а все остальное - это отступы.
- Если "Раскладка" ≠ "Фиксированное число", то будем приравнивать отступы к параметру "Отступ". 
Вот что получается для параметра "Отступ.Начало":
if(and(Раскладка = Фиксированный интервал, Выравнивание = Конец), (Длина - Массив.Длина), if(and(Раскладка = Фиксированный интервал, Выравнивание = Центр), (Длина - Массив.Длина) / 2, if(and(not(Раскладка = Фиксированный интервал), Выравнивание = Конец), Отступ, if(and(not(Раскладка = Фиксированный интервал), Выравнивание = Центр), Отступ / 2, 0 мм))))
И для "Отступ.Конец":
if(and(Раскладка = Фиксированный интервал, Выравнивание = Начало), (Длина - Массив.Длина), if(and(Раскладка = Фиксированный интервал, Выравнивание = Центр), (Длина - Массив.Длина) / 2, if(and(not(Раскладка = Фиксированный интервал), Выравнивание = Начало), Отступ, if(and(not(Раскладка = Фиксированный интервал), Выравнивание = Центр), Отступ / 2, 0 мм))))

Теперь переходим к параметру "Массив.Длина". Тут надо не забыть заменить в формулах из прошлого урока параметр "Шаг" на "Интервал", "Массив.Количество" на "Количество" "Отступ.Начало" и "Отступ.Конец" на "Отступ". Тогда все будет хорошо!
if(Раскладка = Фиксированный интервал, (Интервал * rounddown(Длина / Интервал)), (Длина - Отступ))
Далее следует "Массив.Количество"
if(Раскладка = Фиксированный интервал, (rounddown(Длина / Интервал) + 1), if(Раскладка = Минимальное расстояние, rounddown(Массив.Длина / Интервал + 1), if(Раскладка = Максимальное расстояние, roundup(Массив.Длина / Интервал + 1), Количество)))

Осталось параметризовать "Шаг":
if(Раскладка = Фиксированное число, (Массив.Длина / (Количество - 1)), Интервал)

Уф..... вроде все! Как это работает в проекте, показано на самом первом скриншоте. 

Так можно, например, сделать собственное, очень гибкое, семейство ограждения.
А сам способ работы с вариантами через списки, а не чекбоксы, очень удобный и универсальный, и может быть использован для решения большого круга задач.

В завершение хочу выразить благодарность Артуру Куракову, который придумал такой способ параметризации (через введение дополнительных параметров для сравнения) еще в 2012 году, а также Александру Зурилину (это мой коллега, и я горжусь тем, какие специалисты работают рядом со мной!), который на днях повторно "переоткрыл" этот способ с моей подачи.

Кому интересно посмотреть про вложенные семейства, напоследок видео. Там есть и про "параметризацию списка выбора", где-то с 16 минуты: