Всем привет! В этой статье рассмотрим, как создать скрипт в Dynamo для Revit, автоматически строящий развертку семейства витражной системы, построенной по кривой траектории.
Процесс создания скрипта можно также посмотреть в этом видео:
1. Исходная геометрия в Revit
Скрипт будет работать с семейством категории «Витражная система». В качестве примера будем рассматривать витражную систему, построенную по сплайну. Профиль витражной системы сверху обрезан тоже по сплайну, а снизу имеет полукруглый проём. Витражная стена состоит только из панелей витража, без импостов. Эта витражная система построена по семейству формообразующей, представляющей собой поверхность.
2. Что будет делать скрипт и как работать
Задача скрипта – построить развертку данной витражной системы в виде линий на легенде.
Как можно реализовать данный скрипт? Для создания развертки нам надо получить контуры каждой панели в виде линий и перенести эти линии на одну плоскость. С помощью Dynamo мы можем получить контур каждой панели, но мы его получим в 3D пространстве. Поэтому контур каждой панели надо поместить (перенести и повернуть) в одну плоскость и правильно разложить в ней.
Сначала для каждой панели надо будет определить уникальную точку в той плоскости, в которой будет раскладка панелей. Потом уже для каждой панели надо найти угол поворота, чтобы все панели лежали в одной плоскости раскладки.
После этого мы сможем перенести эту геометрию из Dynamo на вид в Revit.
Основные этапы работы скрипта:
-Получаем из Revit нужную геометрию – форму, по которой построена витражная система и все панели, которые относятся к данной витражной системе.
-Получаем контур каждой панели и угловые точки, относительно этих точек будем перемещать контуры.
-Получаем координаты новых точек для раскладки всех панелей в одной плоскости.
-Перемещаем каждую панель в соответствующую точку
-Поворачиваем каждый перемещенный контур на определенный угол (между плоскостью панели и плоскости, в которой размещаем все панели).
-Строим линии на легенде по контурам панелей.
3. Создаём скрипт
Приступим к созданию скрипта.
Исходные данные
Первый шаг – получение исходных данных из Revit. Так как в этом проекте у меня нет другой геометрии, то я выбираю нужные семейства по категории. Если в проекте есть другая геометрия этих категорий, то можно использовать ноды Select Model Element и Select Model Elements или добавить фильтры.
Форма
Нам потребуется семейство категории «Формы», по которому построена витражная система и семейства панелей, которые относятся к этой витражной системе.
Из семейства формообразующей нам потребуется сама поверхность и её сечение в виде сплайна. Эту геометрию можно получить с помощью нода Element.Geometry. Но сплайн, полученный из этого нода, будет не цельный. Поэтому получим сплайн из поверхности с помощью нода Surface.GetIsoline.
Панели
Затем получаем контуры панелей в виде кривых. Сначала получаем общий контур каждой панели в виде PolyCurve, потом получаем каждую кривую Curve из этого контура.
Нод CurtainPanel.ByElement насчитал в витражной системе 224 панели, при этом панелей по факту было 184, скорее всего лишние панели это те, которые были изначально на месте проемов в витражной стене.
Эти лишние панели не обрабатывались нодом CurtainPanel.Boundaries, так как не имеют геометрии, поэтому для фильтрации этих лишних объектов был использованы ноды Object.IsNull и List.FilterByBoolMask.
Получение координат точек
Следующий шаг – получение координат UV угловых точек панелей по поверхности витражной системы. Зная координаты UV для точек, мы сможем точно определить последовательность расположения панелей на поверхности.
Сначала получим все угловые точки панелей и нодом Surface.UVParameterAtPoint получим координаты этих точек на поверхности, полученной нами из формы. Потом из этих координат возьмем нужные значения U (минимальное и максимальное) и V (минимальное).
Сортировка панелей
Теперь отсортируем панели и координаты V. В качестве ключей для сортировки будем использовать значения координат U, то есть будем идти по всем панелям слева направо по столбцам (изначально панели из Revit приходят в порядке расположения в пределах одного ряда)
Получения необходимых точек для перемещения панелей
После того, как мы получили нужную нам геометрию панелей, рассортировали их, нам надо получить точки для перемещения геометрии панелей. Для перемещения геометрии нам потребуется вектор, а этот вектор мы построим их двух точек. Первая точка – это правая нижняя точка каждой панели, вторая точка – это уже новая точка, координаты которой мы должны вычислить. Новые точки буду раскладываться в плоскости XZ. Координаты Z для точек не изменятся, а координаты X будем вычислять отдельно.
Для вычисления координат X потребуются точки пересечения вертикальных линий разрезки витражной системы и сплайн, полученный в начале. Потом для каждой соседней пары точек надо найти расстояние между ними с помощью нода Geometry.DistanceTo и с помощью небольшого Python скрипта надо создать список координат, соответствующий количеству панелей.
Также мы должны получить левую нижнюю точку каждой панели, что потом получить вектора в плоскости панелей.
Перемещение и поворот геометрии
После того, как все точки получены, можно переместить геометрию с помощью нода Geometry.Translate. Для перемещения создадим вектора из правых нижних точек панелей в новые точки.
Потом повернем каждую панель на нужный угол. Этот угол определим следующим образом: построим для каждой панели вектор по двум нижним точкам, затем найдем угол между этим вектором и вектором оси X.
Построение геометрии на виде Revit
Последний шаг поворот линий в плоскость XY и построение этих линий на виде в Revit.