Как всегда, небольшая история, еще и про адаптивные семейства. Подробности под катом.
У меня на работе архитекторы постоянно занимаются облицовкой стен натуральным камнем — делают разрезку каждой стены, чертежи, спецификацию на камни. Сначала я им сделал несколько обычных семейств (прямоугольное, треугольное и тд), но они не очень удобны в работе.
Сейчас вот начал изучать адаптивные семейства и понял, что это — то, что надо. Можно схватить каждую из точек и тащить, куда надо.
Проблемы начинаются, когда надо определить габаритный размер панели. В зависимости от того, какая панель получилась, максимальный габарит может определяться разными точками:

Каждая из адаптивных точек имеет свой номер, и в первом случае нужный размер — между точками 1 и 4, во втором — 1 и 3, в третьем — 2 и 3.
Проставил внутри семейства параметры между каждой парой точек по ширине и высоте:

Теперь нужно определить высоту по максимальному из четырех параметров: 1_2, 1_3, 2_4, 3_4.
Первое, что приходит в голову — написать формулу: «Если 1_2 больше 1_3, и 1_2 больше 2_4, и 1_2 больше 3_4 — то 1_2; если 1_3 больше…», и так далее. Получилось что-то вот такое:
if(and([1_2] > [1_3], and([1_2] > [2_4], and([1_2] > [3_4]))), [1_2],
if(and([1_3] > [1_2], and([1_3] > [2_4], and([1_3] > [3_4]))), [1_3],
if(and([2_4] > [1_2], and([2_4] > [1_3], and([2_4] > [3_4]))), [2_4], [3_4])))
И все бы ничего, но есть еще панель с пятью точками… Добавить одно значение — нужно перелопачивать формулу заново.
Но можно записать проще.
Во первых, в формулах можно использовать такие конструкции:
F = C + if(A>B, 10, 20) + D
То есть оператор if можно использовать прямо в арифметических операциях — Revit сначала определит, какой результат выдает if, а затем использует это значение в формуле.
Во вторых, можно вспомнить программирование: для определения максимального числа не нужно сравнивать каждое из чисел со всеми другими. Достаточно взять пару чисел, сравнить их и выбрать максимальное; сравнить результат с третьим числом и снова выбрать максимальное, и так далее. Получается гораздо проще и быстрее.
Пишем:
if(1_2 > 1_3, 1_2, 1_3)
Копируем эту формулу, добавляем следующее значение:
if(2_4 > if(1_2 > 1_3, 1_2, 1_3), 2_4, if(1_2 > 1_3, 1_2, 1_3))
Желтым цветом выделил то, что вставил из скопированного.
Revit сначала определит максимальное из параметров 1_2 и 1_3, а затем сравнит его с 2_4.
Повторяем еще раз:
if(3_4 > if(2_4 > if(1_2 > 1_3, 1_2, 1_3), 2_4, if(1_2 > 1_3, 1_2, 1_3)), 3_4, if(2_4 > if(1_2 > 1_3, 1_2, 1_3), 2_4, if(1_2 > 1_3, 1_2, 1_3)))
Формула получилась короче, собирается быстрее, и её легко масштабировать на любое количество точек.
Кстати, в формуле не нужно использовать параметр типа «Больше или равно» — если параметры равны, то там не важно, какой из них пойдет в результат.
Ну и результат:

Успехов в освоении формул Ревита!