Узлы Code Block позволяют вставлять в график функции, к которым смогут обращаться другие компоненты программы Dynamo. При этом в параметрическом файле создается еще один слой управления, который можно рассматривать как текстовую версию пользовательского узла. При этом «родительский» узел Code Block легко доступен и может находиться в любом месте графика. И никаких проводов!
Первая строка содержит ключевое слово «def», затем название функции и наименования входных данных в скобках. Тело функции заключено в фигурные скобки. Значение возвращается с помощью оператора «return =». В узлах Code Block, определяющих функцию, отсутствуют порты ввода и вывода, так как они вызываются из других блоков кода.
Функцию можно вызвать с помощью другого узла Code Block в том же файле, указав имя и такое же число аргументов. Этот процесс аналогичен использованию готовых узлов из библиотеки.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
В этом упражнении мы создадим типовую программу, которая будет генерировать сферы на основе вводимого списка точек. Радиус сфер определяется свойством Z каждой точки.
Для начала зададим десять числовых значений в диапазоне от 0 до 100. Соединим этот узел с узлом Point.ByCoordinates для создания диагональной линии.
Создайте узел Code Block и введите определение.
Используйте следующие строки кода:
inputPt — это имя, заданное для точек, которые будут определять функцию. В настоящее время эта функция не выполняет никаких действий, но она будет дополнена по ходу работы.
Дополните функцию Code Block, разместив комментарий и переменную sphereRadius, которая запрашивает положение каждой точки по оси Z. Напомним, что метод inputPt.Z не нужно заключать в скобки. Это запрос свойств существующего элемента, поэтому указывать входные данные не требуется.
Вызовите функцию, созданную в другом узле Code Block. Если дважды щелкнуть в активном окне для создания нового узла Code Block и ввести sphereB, то вы увидите, что Dynamo предложит использовать созданную выше функцию sphereByZ. Функция была добавлена в библиотеку IntelliSense! Неплохо.
Теперь вызовем функцию и создадим переменную Pt, чтобы использовать созданные ранее точки.
Обратите внимание, что на выходе мы получили нулевые значения. Почему? При определении функции был задан расчет переменной sphereRadius, но не было указано, что именно функция должна возвращать в качестве выходных данных. Наших следующим шагом будет исправление этого упущения.
Это важный шаг: необходимо задать выходные данные функции, добавив строку
return = sphereRadius;
в функцию sphereByZ.Теперь Code Block выводит координаты Z каждой точки.
Создадим сферы, отредактировав родительскую функцию.
Сначала определите сферу с помощью строки кода:
sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);
.Теперь измените возвращаемое значение на sphere вместо sphereRadius:
return = sphere;
. В области предварительного просмотра Dynamo появятся гигантские сферы.
1. Чтобы уменьшить размер этих сфер, обновите значение sphereRadius, добавив разделитель:
sphereRadius = inputPt.Z/20;
. Теперь видно отдельные сферы, что позволяет понять взаимосвязь между радиусом и значением Z.
В узле Point.ByCoordinates измените режим переплетения с «Самый короткий список» на «Векторное произведение», в результате чего будет создана сетка точек. Функция sphereByZ все еще действует, поэтому все точки создают сферы с радиусами, основанными на значениях Z.
Для проверки соединим исходный список чисел с входным портом X узла Point.ByCoordinates. Мы получили куб из сфер.
Примечание. Если для расчета компьютеру требуется много времени, попробуйте уменьшить значение #10 и задать вместо него, например, #5.
Поскольку созданная нами функция sphereByZ является типовой, можно вызвать спираль из предыдущего урока и применить эту функцию к ней.
И последний шаг: настройка коэффициента радиуса с помощью пользовательских параметров. Для этого необходимо создать новый входной порт для функции и заменить делитель 20 параметром.
Изменим определение sphereByZ на следующее:
Обновите дочерние узлы Code Block, добавив переменную ratio к входным данным:
sphereByZ(Pt,ratio);
. Добавьте регулятор к только что созданному узлу Code Block. Теперь можно изменять размер радиусов на основе коэффициента.
Существует несколько основных способов сокращенной записи команд в блоке кода, что существенно упрощает управление данными. Далее мы подробно рассмотрим, как использовать подобные сокращенные записи для создания и запроса данных.
Метод определения диапазонов и последовательностей можно заменить обычной сокращенной записью. Приведенное ниже изображение можно рассматривать как руководство по использованию синтаксиса «..» для определения списка числовых данных с помощью блока кода. Освоение этой системы записи позволит более эффективно формировать числовые данные.
В этом примере числовой диапазон заменяется элементарной синтаксической конструкцией узла Code Block, определяющей
beginning..end..step-size;
. В числовом выражении получаем0..10..1;
.Обратите внимание, что синтаксис
0..10..1;
эквивалентен синтаксису0..10;
. Значение шага 1 является значением по умолчанию для сокращенного обозначения. Таким образом, значение0..10;
соответствует последовательности от 0 до 10 с шагом 1.Похожий пример наблюдаем с узлом Sequence. Единственное исключение — знак #, указывающий на список из 15 значений, а не на список с увеличением до 15. В данном случае мы определяем
beginning..#ofSteps..step-size:
. Фактический синтаксис для последовательности:0..#15..2
.Разместим символ # из предыдущего шага в компоненте размер шага синтаксической конструкции. Теперь есть диапазон чисел, идущий от начала к концу, а размер шага равномерно распределяет несколько значений между этими двумя точками:
beginning..end..#ofSteps
.
Создание дополнительных диапазонов упрощает работу со списками списков. В примерах ниже переменная изолируется от обозначений основного диапазона и создается другой диапазон этого списка.
1. При создании вложенных диапазонов сравните запись с символом # и без него. Действует тот же принцип, что и в случае с основными диапазонами, но в усложненном варианте.
2. Вложенный диапазон может находиться в любом месте основного диапазона. Обратите внимание на возможность наличия двух вложенных диапазонов.
3. Используя различные значения конца диапазона, можно создавать дополнительные диапазоны с разной длиной.
В качестве упражнения сравните две сокращенные записи на изображении выше и попытайтесь проанализировать, как вложенные диапазоны и символ # влияют на конечный результат.
С помощью сокращений можно не только создавать списки, но и делать это динамически. Эти списки могут содержать множество типов элементов и поддерживают запросы (помните, что списки — это объекты в объектах). Наконец, в узле Code Block для создания списков и запроса элементов из списка используются скобки ( «квадратные скобки»):
1. Быстрое создание списков с помощью строк и запрос содержимого списков с помощью индекса элементов.
2. Создание списков с переменными и запрос содержимого с помощью сокращенной записи диапазонов.
Аналогичным образом можно работать с вложенными списками. Учитывайте порядок расположения списков, а для вызова используйте несколько наборов квадратных скобок:
1. Определение списка списков.
2. Запрос содержимого списка с помощью одного набора квадратных скобок.
3. Запрос содержимого списка с помощью двух наборов квадратных скобок.
Скачайте файл с примером, щелкнув ссылку ниже.
Полный список файлов с примерами можно найти в приложении.
В этом упражнении мы применим навыки сокращенной записи для создания оригинальной яйцевидной поверхности, которая будет определяться диапазонами и формулами. При выполнении упражнения обратите внимание на одновременное использование блока кода и существующих узлов Dynamo. Блок кода используется для обработки больших данных, а узлы Dynamo для наглядности.
Начните с создания поверхности путем соединения узлов, представленных на изображении выше. Вместо использования узла Number для определения ширины и длины поверхности дважды щелкните в рабочей области, а в узле Code Block введите 100;
.
Создайте диапазон от 0 до 1 с 50 делениями. Для этого введите
0..1..#50
в узле Code Block.Соедините диапазон с узлом Surface.PointAtParameter, который извлекает значения u и v в диапазоне от 0 до 1 по всей поверхности. Не забудьте в качестве режима «Переплетение» выбрать «Векторное произведение», щелкнув правой кнопкой мыши узел Surface.PointAtParameter.
На этом этапе с помощью первой функции переместим сетку точек вверх по оси Z. Эта сетка будет управлять поверхностью на основе базовой функции. Добавьте новые узлы, как показано на изображении ниже.
Вместо узла Formula используйте узел Code Block и укажите в нем следующую строку:
(0..Math.Sin(x*360)..#50)*5;
. Для быстроты мы определяем диапазон с помощью формулы внутри него. Эта формула представляет собой функцию синуса. Функция синуса получает входные данные в градусах в Dynamo, поэтому для получения полной синусоиды необходимо умножить значения x (диапазон входных значений от 0 до 1) на 360. Далее необходимо получить количество делений, соответствующее количеству точек управляющей сетки для каждого ряда, поэтому зададим пятьдесят подразделов, введя #50. Наконец, с помощью множителя 5 просто увеличим амплитуду преобразования, чтобы увидеть результат в области предварительного просмотра Dynamo.
Несмотря на то, что предыдущие узлы Code Block работали нормально, процесс не был полностью параметрическим. Поскольку необходимо динамически изменять его параметры, замените строку из предыдущего шага на
(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;
. Это позволит задавать значения на основе входных данных.
Изменим положение регуляторов (в диапазоне от 0 до 10) и получим интересный результат.
Транспонируйте диапазон чисел, чтобы обратить направление волны:
transposeList = List.Transpose(sineList);
.
Добавьте элементы sineList и tranposeList, чтобы получить деформированную яйцевидную поверхность:
eggShellList = sineList+transposeList;
.
Измените значения регуляторов, указанные ниже, чтобы «усреднить значения» алгоритма.
Осталось запросить отдельные элементы данных с помощью узла Code Block. Чтобы сформировать поверхность с определенным диапазоном точек, добавим блок кода, который показан на изображении выше, между узлами Geometry.Translate и NurbsSurface.ByPoints. В нем содержится строка текста: sineStrips[0..15..1];
. С помощью нее будут выбраны первые 16 рядов точек (из 50). Если снова сгенерировать поверхность, можно увидеть, что была создана отдельная часть сетки точек.
Наконец, чтобы сделать узел Code Block более параметрическим, для запроса используйте регулятор с диапазоном от 0 до 1. Для этого примените следующую строку кода:
sineStrips[0..((List.Count(sineStrips)-1)*u)];
. Для большей ясности — данная строка кода позволяет представить длину списка в виде множителя с диапазоном от 0 до 1.
Значение 0.53
регулятора позволяет создать поверхность сразу за центром сетки.
Как и ожидалось, если с помощью регулятора указать значение 1
, поверхность будет создана из всей сетки точек.
На полученном графике можно выделить узлы Code Block и увидеть их функции.
1. Первый Code Block заменяет узел Number.
2. Второй Code Block заменяет узел Number Range.
3. Третий Code Block заменяет узел Formula (а также узлы List.Transpose, List.Count и Number Range).
4. Четвертый Code Block запрашивает элементы в списке списков, заменяя узел List.GetItemAtIndex.
Блоки кода (Code Block) — это уникальная функция Dynamo, обеспечивающая динамическую связь между визуальной и текстовой средами программирования. Блоки кода можно подключать ко всем узлам Dynamo, определяя с их помощью весь график в одном узле. Внимательно ознакомьтесь с этой главой, поскольку блок кода — это основополагающий компонент Dynamo.
Блоки кода — это своеобразные окна, позволяющие заглянуть в самую глубь языка DesignScript, лежащего в основе Dynamo. DesignScript — это язык программирования, созданный специально для использования в рамках рабочих процессов проектирования. Это понятный и удобный для чтения язык, который позволяет моментально получать обратную связь при работе с небольшими частями кода, а также поддерживает масштабирование для работы с большими и сложными функциями. Кроме того, DesignScript — это основа мощного вычислительного «мотора» Dynamo. Поскольку почти все функциональные возможности узлов и операций Dynamo имеют прямые аналоги в языке создания сценариев, пользователи получают уникальную возможность свободно переходить от работы с узлами к работе со сценарием.
Для удобства начинающих пользователей узлы можно автоматически преобразовать в текстовый синтаксис, чтобы упростить обучение работе с DesignScript или просто уменьшить слишком большие разделы графиков. Это можно сделать с помощью процедуры под названием «от узла к коду» (Node to Code), которая подробно описана в разделе . Опытные пользователи могут применять узлы Code Block для создания уникальных комбинаций существующих функций и пользовательских связей на основе разнообразных стандартных парадигм работы с кодом. Все без исключения пользователи, от начинающих до опытных, могут воспользоваться широким спектром упрощенных методов и фрагментов кода, позволяющих ускорить процесс проектирования. Хотя термин «блок кода» может вызывать робость у пользователей, не занимающихся программированием, на деле эта функция столь же проста в использовании, сколь и эффективна. Начинающий пользователь может работать с блоками кода, практически не прибегая к программированию, а опытный — задавать определения на основе сценариев для вызова из других разделов определения Dynamo.
Говоря простым языком, блоки кода — это интерфейс для текстовой работы со сценарием в среде визуального программирования. Эти блоки можно использовать для задания чисел, строк, формул и других типов данных. Поскольку блоки кода разработаны специально для использования в Dynamo, пользователи могут задавать переменные в блоках кода, и эти переменные будут автоматически добавлены к портам ввода узла.
При работе с блоками кода пользователю предоставляется возможность определить, каким образом будут заданы входные данные. Ниже приведены способы построения базовой точки с координатами (10, 5, 0):
По мере изучения различных функций, доступных в библиотеке, вы можете обнаружить, что ввести в поле поиска Point.ByCoordinates гораздо быстрее, чем искать нужный узел по разделам библиотеки вручную. Например, при вводе Point. в Dynamo отобразится список подходящих функций, которые можно применить к объекту Point. Это делает процесс работы со сценариями интуитивно понятным и упрощает использование функций в Dynamo.
Для доступа к блокам Code Block перейдите в раздел Core >Input >Actions >Code Block. Есть и более быстрый способ: просто дважды щелкните в рабочей области, и в ней появится блок кода. Поскольку этот узел используется крайне часто, его вызов привязан к двойному щелчку.
Блоки кода поддерживают использование разных типов данных. Пользователи могут быстро задавать числа, строки и формулы, а блок кода предоставит требуемый результат.
На изображении ниже представлен традиционный способ работы с узлами, который отнимает у пользователей больше времени: сначала нужно найти требуемый узел в библиотеке, затем добавить его в рабочую область и, наконец, ввести входные данные. В случае с блоками кода пользователям достаточно дважды щелкнуть в рабочей области и ввести в появившийся узел нужный тип данных с использованием базового синтаксиса.
Узлы number, string и formula можно привести в качестве примеров узлов Dynamo, которые являются устаревшими по сравнению с блоками кода.
Традиционные методы
Узлы Code Block
Тип данных
Стандартный код Dynamo
Аналог в блоке кода
Числа
Строки
Последовательности
Диапазоны
Получение элемента по индексу
Создание списка
Объединение строк
Условные выражения
Узлы
Аналог в блоке кода
Примечание
Любой оператор (+, &&, >=, Not и т. д.)
+, &&, >=, ! и т. д.
Обратите внимание, что Not заменяется на «!», однако узел называется Not для отличия от Factorial.
Boolean True
true;
Все в нижнем регистре
Boolean False
false;
Все в нижнем регистре
Возможно, вы уже заметили закономерность в именах узлов Dynamo: для каждого узла используется синтаксис "." без пробелов. Это связано с тем, что текст в верхней части каждого узла представляет собой фактический синтаксис для создания сценариев, а символ "." (или запись через точку) отделяет элемент от доступных методов, которые можно вызвать. Это позволяет легко переходить от визуальных сценариев к текстовым.
В качестве примера использования записи через точку рассмотрим возможные действия с параметрическим яблоком в Dynamo. Ниже представлены несколько методов, которые можно применить к яблоку, перед тем как съесть (разумеется, на самом деле этих методов в Dynamo не существует, не ищите).
На языке пользователя | Запись через точку | Вывод |
---|---|---|
Судя по данным в таблице выше, это очень вкусное яблоко. Я бы его с удовольствием Apple.eat().
Используя аналогию с яблоком, рассмотрим узел Point.ByCoordinates и процесс создания точки с помощью узла Code Block.
Синтаксис Point.ByCoordinates(0,10);
для Code Block позволяет получить тот же результат, что и узел Point.ByCoordinates в Dynamo, но его преимущество состоит в том, что для создания точки требуется лишь один узел. Это проще и эффективнее, чем соединять отдельный узел с портами ввода X и Y.
Используя синтаксис Point.ByCoordinates в узле Code Block, необходимо указать входные данные в том же порядке, что и в готовом узле (X,Y).
С помощью узла Code Block можно вызвать любой стандартный узел библиотеки, кроме узлов пользовательского интерфейса, обладающих особыми функциями для пользовательского интерфейса. Например, можно вызвать узел Circle.ByCenterPointRadius, а вот вызывать узел Watch 3D не стоит.
Стандартные узлы, которых в библиотеке большинство, делятся на три типа. Как вы видите, вся библиотека упорядочена с учетом этих категорий. Методы (или узлы) этих трех типов обрабатываются иначе при вызове с помощью Code Block.
Create — узлы, позволяющие создавать или конструировать что-либо.
Action — узлы для выполнения действий с чем-либо.
Query — узлы для получения свойства существующего объекта.
Категория Create позволяет создавать геометрию с нуля. Значения вводятся в Code Block слева направо. Они располагаются в том же порядке, что и порты ввода в узле (сверху вниз).
При сравнении узла Line.ByStartPointEndPoint и соответствующего синтаксиса в узле Code Block мы получаем один и тот же результат.
Действие — это операция, выполняемая с объектами определенного типа. Для применения действий к объектам в Dynamo используется запись через точку, что является распространенным принципом для многих языков программирования. Если у вас есть объект, введите его название, затем точку, а затем название действия, которое с этим объектом нужно выполнить. Входные данные для метода этого типа помещаются в скобки, как и при использовании методов Create, однако для него не требуется указывать первые входные данные, которые отображаются в соответствующем узле. Вместо этого требуется указать элемент, с которым будет выполняться действие:
Поскольку узел Point.Add представляет собой узел типа Action, его синтаксис работает несколько иначе.
Входные данные включают в себя (1) точку и (2) вектор, который требуется к ней добавить. В синтаксисе узла Code Block точка (объект) обозначена как pt. Чтобы добавить вектор (vec) к точке (pt), нужно ввести pt.Add(vec), то есть «объект, точка, действие». Для операции добавления используются все порты ввода узла Point.Add, кроме первого. Первый порт ввода узла Point.Add — это сама точка.
Методы типа Query позволяют получить свойство объекта. Указывать какие-либо входные данные в этом случае не требуется, так как входными данными является сам объект. Скобки также не нужны.
Переплетение при использовании узлов отличается от переплетения с помощью Code Block. В первом случае пользователь щелкает узлы правой кнопкой мыши и выбирает параметр переплетения, который требуется применить. При работе с Code Block у пользователя есть гораздо больше возможностей для управления структурой данных. При объединении нескольких одномерных списков в пары с помощью сокращенного метода Code Block используются руководства по репликации. Цифры в угловых скобках «<>» определяют уровень иерархии итогового вложенного списка: <1>, <2>, <3> и т. д.
В этом примере мы используем сокращенную запись для определения двух диапазонов (подробнее о сокращенном методе можно узнать в следующем разделе этой главы). Проще говоря,
0..1;
эквивалентно{0,1}
, а-3..-7
эквивалентно{-3,-4,-5,-6,-7}
. В результате мы получаем список из двух значений X и пяти значений Y. Если работать с этими несогласованными списками без руководств по репликации, то будет получен список, содержащий две точки, что соответствует длине кратчайшего списка. Использование руководств по репликации позволяет найти все возможные сочетания двух и пяти значений координат (а точнее, их векторное произведение).Синтаксис Point.ByCoordinates
(x_vals<1>,y_vals<2>);
позволяет получить два списка с пятью элементами в каждом.Синтаксис Point.ByCoordinates
(x_vals<2>,y_vals<1>);
позволяет получить пять списков с двумя элементами в каждом.
Такой способ записи позволяет указать, какой список будет основным: два списка из пяти элементов или пять списков из двух. В этом примере результат будет представлять собой список строк точек или список столбцов точек в сетке в зависимости от изменения порядка руководств по репликации.
Чтобы овладеть описанными выше методами работы с Code Block, требуется определенное время. Функция «Узел для кодировки» Dynamo значительно упрощает этот процесс. Чтобы использовать эту функцию, выберите массив узлов в графике Dynamo, щелкните правой кнопкой мыши в рабочей области и выберите «Узел для кодировки». Программа Dynamo объединяет эти узлы в единый узел Code Block, содержащий все входные и выходные данные. Это не только отличный инструмент для изучения принципов работы узлов Code Block, но также он позволяет создавать с более эффективные параметрические графики Dynamo. Рекомендуем выполнить упражнение ниже, так как в нем используется функция «Узел для кодировки».
Скачайте файл с примером, щелкнув ссылку ниже.
Полный список файлов с примерами можно найти в приложении.
Для демонстрации возможностей узла Code Block преобразуйте существующее определение поля притяжения в форму Code Block. Использование существующего определения позволяет продемонстрировать связь Code Block с визуальным программированием, а также помогает в изучении синтаксиса DesignScript.
Для начала повторно создайте определение, показанное на изображении выше (или просто откройте файл примера).
Обратите внимание, что для параметра переплетения узла Point.ByCoordinates задано значение Векторное произведение.
Каждая точка сетки перемещена вверх по оси Z в соответствии с расстоянием до опорной точки.
Поверхность создана повторно и утолщена, что создает прогиб в геометрии относительно расстояния до опорной точки.
Сначала определите опорную точку: Point.ByCoordinates
(x,y,0);
. Используйте синтаксис Point.ByCoordinates, указанный в верхней части узла опорной точки.Переменные x и y вставляются в Code Block, чтобы их можно было динамически обновлять с помощью регуляторов.
Присоедините регуляторы к портам ввода узла Code Block и задайте их значения в диапазоне от –50 до 50. Это позволит работать по всей сетке Dynamo по умолчанию.
Во второй строке Code Block определите сокращенную запись для замены узла порядкового номера:
coordsXY = (-50..50..#11);
. Мы рассмотрим это подробнее в следующем разделе. Обратите внимание, что такая сокращенная запись эквивалентна узлу визуального программирования Number Sequence.
Теперь нужно создать сетку из точек последовательности coordsXY. Для этого необходимо использовать синтаксис Point.ByCoordinates. Кроме того, требуется запустить векторное произведение списка так же, как вы это делали при визуальном программировании. Для этого введите следующую строку:
gridPts = Point.ByCoordinates(coordsXY<1>,coordsXY<2>,0);
. Угловые скобки обозначают векторное произведение.Обратите внимание на узел Watch3D, в котором отображается сетка точек на сетке Dynamo.
Теперь самое сложное: нужно переместить сетку точек вверх в соответствии с расстоянием до опорной точки. Для начала присвойте этому новому набору точек имя transPts. Так как выполняется преобразование уже существующего элемента, вместо узла
Geometry.Translate...
используйте узелgridPts.Translate
.Считывая данные из этого узла в рабочей области, мы видим, что он содержит три порта ввода. Преобразуемая геометрия уже определена, так как действие выполняется с текущим элементом (с использованием gridPts.Translate). Названия двух оставшихся портов (direction и distance) следует поместить в скобки функции.
Определить значение direction несложно, так как для перемещения по вертикали используется
Vector.ZAxis()
.Теперь необходимо рассчитать расстояние между опорной точкой и каждой точкой сетки. Выполните это действие с опорной точкой аналогичным образом:
refPt.DistanceTo(gridPts)
.Последняя строка кода содержит преобразованные точки:
transPts=gridPts.Translate(Vector.ZAxis(),refPt.DistanceTo(gridPts));
.
Теперь у вас есть сетка точек, структура данных которой позволяет создать поверхность NURBS. Поверхность создается с помощью
srf = NurbsSurface.ByControlPoints(transPts);
.
Чтобы придать поверхности глубину, создайте тело с помощью синтаксиса
solid = srf.Thicken(5);
. Данный код увеличивает толщину поверхности на пять единиц, однако толщину также можно сделать переменной (например, с именем thickness), а затем изменять ее значение с помощью регулятора.
Функция «Узел для кодировки» позволяет автоматизировать все действия, которые вы выполнили в предыдущем упражнении, и применять их одним нажатием кнопки. Этот мощный инструмент не только позволяет создавать пользовательские определения и узлы Code Block для многократного использования, но и помогает в изучении процесса создания сценариев в Dynamo.
Для начала откройте существующий визуальный сценарий из первого шага упражнения. Выберите все узлы, щелкните правой кнопкой мыши в рабочей области и выберите Узел для кодировки. Проще простого.
Приложение Dynamo позволяет автоматизировать текстовую версию визуального графика, включая переплетение и прочие операции. Поэкспериментируйте с использованием этой функции при работе с другими визуальными сценариями и ознакомьтесь со всеми возможностями Code Block.
Какого цвета яблоко?
Apple.color
Красный
Яблоко зрелое?
Apple.isRipe
true
Сколько весит это яблоко?
Apple.weight
170 г
Откуда взялось это яблоко?
Apple.parent
дерево
Что останется после яблока?
Apple.children
семена
Это яблоко выращено недалеко отсюда?
Apple.distanceFromOrchard
96,5 км