среда, 25 июня 2014 г.

Семейства Revit. "Уклон или градус? И то и другое, или ни в чем себе не отказывайте!"

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

Это семейство понадобилось одному моему ученику, и мы сделали его на курсе минут за 20~30.
Основная его фишка не в том, что оно строится по уклону, а в том, что я могу задать, что именно буду указывать: градус или высоту на окончании (уклон).
Вот про это и поговорим.
Любое семейство, которое строится по двум точкам (как балка) следует делать на основе шаблона "Метрическая система, типовая модель на основе линий.rft"
Внутри шаблона - вспомогательная линия, именно на ней "сидит" параметр "Длина", который отвечает за общую длину семейства.
Сначала разберемся с принципом.
Нам нужно построить геометрию с контролируемым уклоном. Значит, нужно нарисовать вспомогательную линию, заблокированную в начальной точке, и запараметризовать ее уклон. А потом по этой линии строить всю геометрию.
Приступим:
  1. Переходим на фасад СПЕРЕДИ. Скрываем все ненужное, оставляем только вспомогательную линию. Рисуем еще 2 вспомогательные линии, чтобы получился треугольник. При построении блокируем зависимости.
  2. Добавляем параметр Высота. С его помощью потом будет задавать высоту на конце. Для этого выделим катет треугольника (вспомогательную линию), и преобразуем появившийся временный размер в постоянный. Потом добавим к нему параметр.

  3. Проверяем:
  4. Теперь немного тригонометрии. Мы уже сделали заготовку семейства по двум точкам с указанием высоты на конце. Теперь нужно сделать так, чтобы можно было задавать уклон в градусах. Пока уклоном у нас управляет высота катета, значит, выразим ее через тангенс угла и длину:
    Высота = Tan(Угла) * Длина
  5. Держим эту формулу в уме, и подумаем вот над чем: как сделать переключатель между высотой на конце и углом? Правильный ответ: используя параметр типа "Да/Нет" и формулу с условием.
    Логика такая: если выбран тип "По углу", то высота вычисляется по формуле с тангенсом, а если нет - то задается в параметре. Реализуем:
  6. Добавим параметр "По углу", чтобы переключать им метод построения:
  7. Добавим параметр "Высота на конце", им будем управлять высотой на конце (уклоном):
  8. Добавим параметр "Угол", им будем управлять углом уклона:
  9. Перенесем параметр "Высота" в раздел "Прочее" (просто для красоты)

    и напишем формулу для переключения методов расчета:
    if(По углу, tan(Угол) * Длина, Высота на конце)
    Это значит: если для параметра "По углу" галка стоит, то Высота считается по углу, а если галка не стоит, то приравнивается к параметру "Высота на конце".
  10. Проверяем:

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



  12. Как-то так.
Но у именно такого способа построения есть один минус: если я хочу нарисовать горизонтальный участок (вообще без уклона), у меня не получится: катет с параметром "Высота" превратится в 0 и будет ошибка. Что делать? Строить по-другому, снова позвав тригонометрию.
Рассуждения такие: нам не нужна дальняя линия, но без нее нормально не привяжешь наклонную... или привяжешь, если будешь управлять ее длиной и углом?
  1. Скроем объемное тело.
  2. Удалим катет с параметром "Высота", чтобы не было ошибок при нулевом уклоне. Вместо него добавим 2 параметра: угол и длину гипотенузы.
  1. А теперь запараметризуем новые параметры. Для гипотенузы напишем формулу по длине катетов, из школьного курса. Для угла более сложную формулу, с условием: если вычисление по углу, то угол задается вручную (приравнивается к параметру "Угол"), а если по высоте, то угол высчитывается по формуле, через арктангенс.
Собственно, все. Новое семейство работает еще лучше, у него нет ограничений по "горизонтальности".

Скачать, если кому надо, можно тут.