Trim tree упрощает сложность дерева данных посредством объединения внешних веток. Образно говоря Trim tree удаляет (срезает) внешние уровни путей в дереве данных.
У нода Trim Tree два входных разъёма, один выходной. 1) В Tree - подаётся дерево данных для подрезки; 2) В Depth - подаётся число (Integer) с количеством путей, которые нужно удалить. По умолчанию уже стоит значение равное 1.
На выходе вы получаете "подрезанное" дерево, то есть дерево с одним или несколькими удалёнными уровнями в путях. Нод не удаляет элементы, а лишь изменяет структуру. Поэтому под удалением не стоит понимать, что удаляются некие объекты.
В чём смысл работы нода Trim tree?
1) Иногда при взаимодействии двух структур в виде дерева данных (и списка) необходимо следить за тем, чтобы пути (длины списков) были идентичными, поэтому дерево одной из структур приходится привести в необходимый вид при помощи подрезки дерева; 2) После работы некоторых нодов происходит углубление дерева, поэтому необходима своего рода постобработка в виде упрощения его структуры; 3) При необходимости упрощения структуры дерева в сложных скриптах целесообразно пользоваться нодом Trim tree.
На изображении ниже приведён небольшой пример: в структуре дерева данных находятся 9 объектов Closed Brep. Они сгруппированы по 3 в каждой ветке. Пути веток описываются как {0;0;0}.
После того как мы подключим Trim Tree к панели, чтобы посмотреть каков результат подрезки, то можно увидеть следующее:
Во-первых всё слилось в один список: группировка по три Closed Brep удалилась и во-вторых изменился путь с вида {0;0;0} на {0;0}. Был убран один уровень дерева и структура хранения была изменена с более сложной на более простую. В итоге мы получили список, однако имеющий путь {0;0}, что в некоторых случаях не очень хорошо.
Как было сказано в начале, во входном разъёме Depth по умолчанию установлено значение = 1. Это значит, что удаляется один уровень. Если же установить значение = 2, к примеру при помощи нода Number Slider, то вы получите удаление ещё одного уровня дерева:
Обратите внимание на изменение написания пути. Теперь он описывается видом {0}. Изначально путь записывался как {0;0;0}, после первой подрезки он стал {0;0} и после второй {0}. Далее подрезать смысла никакого нет, так как нод выдаст ошибку. Обратите внимание на гифке ниже при выборе в Number Slider значения 3 нод Trim tree подсвечивается оранжевым цветом, что говорит о некорректной работе.
Далее мы рассмотрим пример работы нода Trim tree.
Пример
Давайте рассмотрим пример, в котором не обойтись без нода Trim tree. Представим себе простую ситуацию, в которой есть две группы кривых квадратного очертания.
Синие кривые это нижняя группа кривых, бирюзовая это верхняя группа. Кривые размещаются друг над другом. В результате необходимо построить между ними поверхности методом Loft, соединив кривые друг с другом как на изображении ниже:
В данном примере используется нод Ruled Surface, который строит ту же самую поверхность методом Loft (как и нод Loft), просто данный нод представлен в более упрощённом виде. И так, давайте рассмотрим алгоритм в окне Grasshopper; что нам необходимо сделать, чтобы получить нужный результат:
В нашем распоряжении имеется группа кривых 1, это нижние кривые синего цвета, группа кривых 2 это верхние кривые бирюзового цвета. Очевидным действием будет подключить ноды кривых к разъёмам Curve A и Curve B нода Ruled Surface. Давайте так и поступим:
На первый взгляд может показаться, что всё впорядке: нод не выдаёт ошибок (цвет нода не красный и не оранжевый, что может говорить об ошибке). Однако если взглянуть на результат в окне Rhino, то получится следующее:
На изображении ясно видно, что получилось совсем не то, что мы ожидали. Причина в том, что нами не была просмотрена структура хранения кривых. Давайте визуализируем структуру дерева данных при помощи панели:
При помощи панели ясно видно, что у двух взаимодействующих групп кривых разные глубины путей. Обратите внимание, что у группы кривых 1 путь имеет вид {0;0;0}, а у группы кривых 2 {0;0;0;0;0}. В данном случае у второй группы два лишних уровня, которые необходимо "подрезать" при помощи Trim tree:
После подрезки двух лишних уровней пути дерева данных структура обоих групп кривых стала идентичной. В данном случае мы можем рассчитывать на корректный результат:
Таким образом, нод Trim tree нам помогает убирать лишние пути в дереве данных. Двигайтесь дальше по шагам в этом уроке.
В следующем шаге вас ждёт задача, которую необходимо решить самостоятельно. При необходимости вы можете посмотреть видео-ответ в конце урока.
Задача
Вам необходимо скачать файл gh и "починить" его. Кажется, в нём что-то сломалось. На изображении ниже можно увидеть проблему (она аналогична, в показанном примере в шаге 1 данного урока):
Результат должен быть следующий:
Доработайте скрипт так, чтобы результат был корректен. В файле Grasshopper дополнительно дана усложнённая задача. При необходимости обратитесь к видео ответу в следующем шаге.