понедельник, 18 августа 2014 г.

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

Наверняка все работали с витражами. У витража при выборе принципа раскладки импостов есть 4 варианта:
  • фиксированный интервал (импосты раскладываются с точно заданным шагом, чаще всего последний отрезок меньше, чем этот шаг),
  • максимальное расстояние (все импосты раскладываются с равным шагом, не большим, чем указанный, но близким к нему),
  • минимальное расстояние (все импосты раскладываются с равным шагом, не меньшим, чем указанный, но близким к нему),
  • фиксированное число (вы задаете количество импостов, они раскладываются с равным шагом, при этом шаг подбирается по факту).

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

Но для начала вспомним 2 варианта построения массива:

  1. Расстояние между элементами (параметризуем шаг)
  2. Общая длина массива (параметризуем длину массива)


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

1. Создайте семейство на шаблоне "Типовая модель на основе линии". Параметризуйте, как на картинке ниже.

2. Постройте массив по общей длине массива. В качестве элемента массива можно использовать все, что угодно, например - линию модели. Привяжите зависимостями первый и последний элементы массива к опорным плоскостям (!)

3. Добавьте параметр экземпляра "Массив.Количество" к массиву.
4. Добавьте параметр "Шаг", не вынося его в модель.
5. Добавьте параметр "Массив.Длина", не вынося его в модель. Естественно, оба параметра с типом данных "Длина".

Все, приготовления закончены.
Еще одно лирическое отступление: для параметризации массива по максимальному / минимальному расстоянию необходимо использовать функцию round (x).
В обычном состоянии, round просто округляет число до целого по общим правилам: 
5.46 округлит до 5
5.52 округлит до 6
Второй вариант, roundup, округлит вверх, т.е.
5.46 округлит до 6
5.52 округлит до 6
Третий вариант, rounddown, округлит вниз, т.е.
5.46 округлит до 5
5.52 округлит до 5

Теперь напишем формулы для каждого состояния:

I. Если шаг фиксирован: 
Отступ.Начало = (задается)
Шаг = (задается)
Массив.Количество = (Длина - Отступ.Начало) / Шаг + 1
Массив.Длина = Шаг * (Массив.Количество - 1)
Отступ.Конец = (Длина - Отступ.Начало) - Массив.Длина
II. Если нужен минимальный шаг (т.е. фактический шаг массива не должен быть меньше указанного):
Отступ.Начало = (задается)
Отступ.Конец = (задается)
Шаг = (задается)
Массив.Длина = Длина - Отступ.Начало - Отступ.Конец
Массив.Количество = rounddown (Массив.Длина / Шаг + 1)
Например:
Если Длина = 1050, Шаг = 200, Отступы = 0
1050 / 200 =5.25, округляем вниз до 5. Шаг = 1050 / 5 = 210 > 200.
Если Длина = 1190, Шаг = 200
1190 / 200 =5.95, округляем вниз до 5. Шаг = 1190 / 5 = 238 > 200.
III. Если нужен максимальный шаг (все наоборот: шаг массива не должен быть больше указанного):
Отступ.Начало = (задается)
Отступ.Конец = (задается)
Шаг = (задается)
Массив.Длина = Длина - Отступ.Начало - Отступ.Конец
Массив.Количество = roundup (Массив.Длина / Шаг + 1)
Например:
Если Длина = 1050, Шаг = 200, Отступы = 0
1050 / 200 =5.25, округляем вверх до 6. Шаг = 1050 / 6 = 175 < 200.
Если Длина = 1190, Шаг = 200
1190 / 200 =5.95, округляем вверх до 6. Шаг = 1190 / 6 = 198,(3) < 200.
IV. Если фиксировано количество:
Отступ.Начало = (задается)
Отступ.Конец = (задается)
Массив.Количество = (задается)
Массив.Длина = Длина - Отступ.Начало - Отступ.Конец
Шаг = Массив.Длина / (Массив.Количество - 1) - в построении массива не участвует, можно не учитывать...

Во второй части посмотрим, как можно элегантно объединить все эти варианты в одном семействе ;)