пятница, 10 октября 2014 г.

Определение максимального из нескольких чисел

Как всегда, небольшая история, еще и про адаптивные семейства. Подробности под катом.





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

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

Каждая из адаптивных точек имеет свой номер, и в первом случае нужный размер - между точками 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)))

Формула получилась короче, собирается быстрее, и её легко масштабировать на любое количество точек.

Кстати, в формуле не нужно использовать параметр типа "Больше или равно" - если параметры равны, то там не важно, какой из них пойдет в результат.

Ну и результат:


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






Комментариев нет:

Отправить комментарий