Данные — это содержимое программы. Они передаются по проводам, предоставляя входные значения узлам, в которых затем обрабатываются и преобразуются в выходные данные новой формы. Давайте рассмотрим определение данных и их структуру, а затем начнем работу с данными в Dynamo.
Данные — это набор значений количественных и качественных переменных. Самая простая форма данных — это числа, например 0
, 3.14
и 17
. Однако существуют и другие типы данных: переменные, представляющие меняющиеся числа (height
); символы (myName
); геометрические объекты (Circle
); список элементов данных (1,2,3,5,8,13,...
).
В Dynamo данные добавляются (или передаются) в порты ввода узлов. Данные могут существовать без действий, однако они необходимы для обработки действий, которые представлены в форме узлов. Если узел добавлен в рабочее пространство, но не имеет входных данных, результатом будет функция, а не результат самого действия.
Простые данные
Данные и действие (узел), которое успешно выполняется.
Действие (узел) без входных данных возвращает типовую функцию.
Остерегайтесь значений null. Тип 'null'
указывает на отсутствие данных. Это абстрактное понятие, с которым можно, тем не менее, столкнуться при визуальном программировании. Если результат действия недопустим, узел возвращает нулевой объект.
Проверка наличия нулевых объектов и их удаление из структуры данных крайне важны для создания надежных программ.
При визуальном программировании можно очень быстро генерировать большие объемы данных, поэтому необходимы средства для управления их иерархией. Эту роль выполняют структуры данных — организационные схемы, в которых хранятся данные. Особенности структур данных и их использования зависят от языка программирования.
В Dynamo для построения иерархии данных используются списки. Они будут подробнее рассмотрены в следующих главах, пока же приведем только общие сведения.
Список — это набор элементов, размещенных в одной структуре данных:
У меня пять пальцев (элементы) на руке (список).
На моей улице (список) десять домов (элементы).
Узел Number Sequence определяет список чисел на основе входных данных start, amount и step. С помощью этих узлов было создано два отдельных списка из десяти чисел, один из которых охватывает диапазон 100–109, а другой — 0–9.
Узел List.GetItemAtIndex позволяет выбрать элемент в списке по определенному индексу. При выборе значения 0 будет получен первый элемент в списке (в данном случае — 100).
Та же процедура применительно ко второму списку дает значение 0 — первый элемент в списке.
Объединим оба списка в один с помощью узла List.Create. Обратите внимание, что узел создает список списков. Это меняет структуру данных.
При повторном использовании узла List.GetItemAtIndex с индексом 0 получаем первый список в списке списков. Это означает, что список рассматривается как элемент, в чем и состоит отличие от других языков программирования. В последующих главах операции со списками и структуры данных будут рассмотрены подробнее.
Главное, что следует помнить об иерархии данных в Dynamo — в случае со структурой данных списки рассматриваются как элементы. Другими словами, в Dynamo структура данных рассматривается сверху вниз. Что это означает? Рассмотрим пример.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
В первом примере создадим цилиндр с оболочкой, пройдя по ступеням геометрической иерархии, описанной в этом разделе.
1. Добавьте узел Point.ByCoordinates. После его добавления в рабочую область в начале координат сетки предварительного просмотра Dynamo появляется точка. Значения по умолчанию для выходных параметров x,y и z равны 0,0. В этом месте и была создана точка.
2. Plane.ByOriginNormal. Следующий шаг в построении геометрической иерархии — плоскость. Существует несколько способов построения плоскости. В этом случае в качестве входных данных используется начало координат и нормаль. Начало координат — это узел-точка, созданный на предыдущем шаге.
Vector.ZAxis. Это унифицированный вектор в направлении Z. Обратите внимание, что здесь входные данные отсутствуют, а есть только вектор со значением [0,0,1]. Он будет использоваться в качестве входных данных нормали для узла Plane.ByOriginNormal. В результате получается прямоугольная плоскость в области предварительного просмотра Dynamo.
3. Circle.ByPlaneRadius. Продвигаясь вверх по иерархии, создадим кривую из плоскости, полученной на предыдущем шаге. После соединения с узлом получаем окружность в начале координат. По умолчанию радиус в узле имеет значение 1.
4. Curve.Extrude. Теперь выполним выдавливание фигуры, задав глубину и двигаясь в третьем измерении. Этот узел создает поверхность из кривой путем выдавливания. По умолчанию расстояние в узле равно 1, а на видовом экране должен отображаться цилиндр.
5. Surface.Thicken. Этот узел создает замкнутое тело путем смещения поверхности на заданное расстояние и замыкания формы. По умолчанию значение толщины равно 1, а на видовом экране в соответствии с этими значениями отображается цилиндр с оболочкой.
6. Number Slider. Вместо использования значений по умолчанию для входных данных добавим в модель параметрические элементы управления.
Редактирование области. После добавления регулятора чисел в рабочую область щелкните значок в левом верхнем углу окна, чтобы отобразить параметры области.
Min/Max/Step. Задайте для параметров min, max и step значения 0, 2 и 0.01 соответственно. Это необходимо для управления размером всей геометрии.
7. Регуляторы чисел. Вместо входных значений по умолчанию скопируйте и вставьте этот регулятор чисел (выберите его, нажмите CTRL + C, затем CTRL + V) несколько раз, пока во всех входных параметрах со значениями по умолчанию не будут заданы регуляторы. Чтобы алгоритм действовал, некоторые значения регуляторов должны быть больше нуля (например, для увеличения толщины поверхности требуется глубина выдавливания).
8. В итоге с помощью регуляторов создан параметрический цилиндр с оболочкой. Попробуйте изменить некоторые из параметров, наблюдая за динамическим обновлением геометрических объектов на видовом экране Dynamo.
Регуляторы чисел. На следующем этапе мы добавили в рабочую область множество регуляторов, и теперь необходимо очистить интерфейс только что созданного инструмента. Щелкните один регулятор правой кнопкой мыши и выберите «Переименовать...». Замените имя каждого регулятора именем соответствующего параметра (толщина, радиус, высота и т. п.).
9. На данный момент создан цилиндр с толстыми стенками. Пока это только один объект. Теперь рассмотрим, как создать массив цилиндров, которые динамически связаны друг с другом. Для этого вместо одного объекта создадим список цилиндров.
Добавление (+). Наша цель — добавить ряд цилиндров возле уже имеющегося цилиндра. При вставке еще одного цилиндра рядом с текущим необходимо учитывать радиус цилиндра и толщину его оболочки. Это число можно получить, сложив два значения регуляторов.
10. Это более сложный шаг, поэтому рассмотрим его подробнее. Конечная цель — создать список чисел, определяющих местоположение каждого цилиндра в последовательности.
a. Умножение. Сначала умножим значение из предыдущего шага на 2. Это было значение радиуса, а цилиндр необходимо переместить на полный диаметр.
b. Number Sequence. С помощью этого узла создадим массив чисел. Сначала вставим узел умножения из предыдущего шага в качестве значения step. В качестве значения start можно указать 0.0, используя узел number.
c. Integer Slider. Чтобы задать значение amount, присоединим регулятор целых чисел. Он будет определять количество создаваемых цилиндров.
d. Выходные данные. В этом списке показано расстояние смещения каждого цилиндра в массиве, которое управляется параметрически с помощью первоначальных регуляторов.
11. Этот шаг достаточно прост: соедините последовательность из предыдущего шага с входным параметром x исходного узла Point.ByCoordinates. При этом регулятор pointX будет заменен, и его можно удалить. Теперь на видовом экране отображается массив цилиндров (убедитесь, что регулятор целых чисел имеет значение больше 0).
12. Цепь цилиндров по-прежнему динамически связана со всеми регуляторами. Перемещайте регуляторы, и вы увидите, как изменится картина.
Числа являются самой простой формой данных, а самым простым способом связать эти числа между собой является математика. Начиная от элементарных операторов, таких как деление, и заканчивая тригонометрическими функциями и более сложными формулами, математика — отличный способ начать знакомство с отношениями и закономерностями в мире чисел.
Оператор — это набор компонентов, в которых используются алгебраические функции с двумя входными числовыми значениями, результатом которых является одно выходное значение (сложение, вычитание, умножение, деление и т. д.). Они находятся в разделе «Операторы» > «Действия».
Значок | Имя (синтаксис) | Входные данные | Выходные данные |
---|
Скачайте файл с примером, щелкнув ссылку ниже.
Полный список файлов с примерами можно найти в приложении.
Объединяйте операторы и переменные для формирования более сложной связи с помощью формул. Используйте регуляторы для создания формулы, которой можно управлять с помощью входных параметров.
1. Создайте числовую последовательность, которая представляет собой «t» в параметрическом уравнении. Теперь нужен достаточно большой список для определения спирали.
Number Sequence. Определим последовательность чисел на основе трех входных параметров: start, amount и step.
2. На предыдущем шаге был создан список чисел для определения области параметрических компонентов. Создайте группу узлов, представляющих уравнение золотой спирали.
Золотая спираль определяется по следующей формуле:
На изображении ниже представлена золотая спираль в форме визуального программирования. Рассматривая группу узлов, обратите внимание на соответствие между визуальной программой и уравнением в записи.
a. Number Slider. Добавьте два регулятора чисел в рабочую область. Эти регуляторы будут задавать переменные a и b параметрического уравнения. Они представляют собой гибкую константу или параметры, которые можно настроить для получения желаемого результата.
b. Multiplication (*). Узел умножения обозначен звездочкой. Он будет часто использоваться для соединения умножаемых переменных
c. Math.RadiansToDegrees. Значения «t» необходимо преобразовать в градусы для их оценки в тригонометрических функциях. Следует помнить, что для оценки этих функций в Dynamo по умолчанию используются градусы.
d. Math.Pow. В качестве функции «t» и числа «e» этот узел создает последовательность Фибоначчи.
e. Math.Cos и Math.Sin. С помощью этих двух тригонометрических функций будут различаться координаты X и Y (соответственно) для каждой параметрической точки.
f. Watch. В качестве выходных данных отображается два списка, которые будут выступать в качестве координат x и y точек, используемых для формирования спирали.
Point.ByCoordinates. Соедините верхний узел умножения с входным параметром «x», а нижний — с входным параметром «y». На экране отобразится параметрическая спираль, проходящая через точки.
Polycurve.ByPoints. Соедините узел Point.ByCoordinates из предыдущего шага с входным параметром points. Параметр connectLastToFirst можно оставить без входных данных, поскольку мы не будем создавать замкнутую кривую. Таким образом, получаем спираль, которая проходит через каждую точку, заданную на предыдущем шаге.
Спираль Фибоначчи создана. Продолжим работу и выполним еще два упражнения, которые назовем «Наутилус» и «Подсолнух». Продемонстрируем два варианта использования спирали Фибоначчи на примере этих представителей естественных систем.
Circle.ByCenterPointRadius. Узел окружности будет иметь те же входные данные, что и на предыдущем шаге. Значение радиуса по умолчанию равно 1.0, поэтому окружности создаются сразу. Четко видно, каким образом точки отклоняются от начала координат.
Number Sequence. Это исходный массив элементов «t». Если соединить его со значением радиуса узла Circle.ByCenterPointRadius, центры окружностей будут по-прежнему отклоняться дальше от начального положения, но радиус окружностей будет увеличиваться, создавая необычный график спирали Фибоначчи.
3D-изображение этого объекта будет выглядеть замечательно.
Начнем с того же шага, что и в предыдущем упражнении: создадим массив точек спирали с помощью узла Point.ByCoordinates.
![](../images/5-3/2/math-part IV-01.jpg)
Далее выполните следующие небольшие действия, чтобы создать последовательность спиралей с различным вращением.
a. Geometry.Rotate. Существует несколько вариантов узла Geometry.Rotate. Убедитесь, что выбран узел с входными параметрами geometry, basePlane и degrees. Соедините узел Point.ByCoordinates с входным параметром «geometry». Щелкните правой кнопкой мыши этот узел и убедитесь, что для переплетения задано значение «Векторное произведение».
b. Plane.XY. Соедините узел с входным параметром basePlane. Вращение будет выполняться вокруг начала координат, которое совпадает с основанием спирали.
c. Number Range. Для входного параметра значений градусов необходимо создать несколько вращений. Это можно быстро сделать с помощью компонента Number Range. Соедините его с входным параметром degrees.
d. Number. Чтобы задать диапазон чисел, добавьте три узла Number в рабочую область в вертикальном порядке. В нисходящей последовательности назначьте значения 0.0,360.0 и 120.0 соответственно. Они будут определять вращение спирали. Обратите внимание на результаты вывода из узла Number Range после соединения с ним трех узлов Number.
Полученное изображение начинает напоминать водоворот. Скорректируйте некоторые параметры Number Range и посмотрите, как изменятся результаты.
Измените размер шага в узле Number Range, задав вместо значения 120.0 значение 36.0. Обратите внимание, что при этом генерируется больше вращений, и, следовательно, создается более плотная сетка.
Измените размер шага в узле Number Range, задав вместо значения 36.0 значение 3.6. Получится более плотная сетка, а у спирали будет отсутствовать направление. Итак, мы создали подсолнух.
Логика (а точнее условная логика) позволяет задать действие или набор действий в зависимости от результата проверки. После прохождения проверки выдается логическое значение True
или False
, которое можно использовать для управления ходом программы.
Числовые переменные могут хранить целый диапазон различных чисел. В логических переменных хранятся только два значения: «Истина» или «Ложь», да или нет, 1 или 0. Из-за ограниченной применимости логические операции можно не так часто встретить в расчетах.
Выражение «If» является ключевым для программирования. Если некое условие истинно, то происходит что-то одно; в противном случае происходит что-то другое. Действие, выполняемое после проверки с помощью данного выражения, зависит от логического значения. Существует несколько способов определения выражения If в Dynamo.
Значок | Имя (синтаксис) | Входные данные | Выходные данные |
---|
Рассмотрим краткий пример с каждым из этих трех узлов в действии, используя условное выражение If.
На этом изображении в узле boolean задано значение true. Это означает, что на выходе появится строка this is the result if true (это результат при истинном значении). Три узла, образующие выражение If, работают одинаково.
Напомним, что узлы работают одинаково. Если для boolean изменить значение на false, результатом будет число пи, как определено в исходном операторе If.
Скачайте файл с примером, щелкнув ссылку ниже.
Полный список файлов с примерами можно найти в приложении.
Используем логику, чтобы разделить список чисел на список четных и список нечетных чисел.
a. Number Range. Добавление диапазона чисел в рабочую область.
b. Numbers. Добавление трех узлов Number в рабочую область. Каждый узел Number должен иметь следующие значения: 0.0 для start, 10.0 для end и 1.0 для step
c. Output. На выходе получается список из 11 чисел в диапазоне от 0 до 10.
d. Modulo (%). Диапазон номеров в качестве входных данных для x и значение 2.0 в качестве входных данных для y. При этом рассчитывается остаток каждого числа в списке при делении на 2. На выходе из этого списка будет представлен список чередующихся значений 0 и 1.
e. Equality Test (==). Добавление в рабочую область проверки равенства. Соедините выходные данные modulo с входным параметром x, а значение 0.0 с входным параметром y.
f. Watch. В качестве выходных данных проверки равенства будет представлен список значений «Истина» (true) и «Ложь» (false). С помощью этих значений элементы будут разделяться в списке. 0 (или true) соответствует четным числам, а 1 (или false) — нечетным.
g. List.FilterByBoolMask. Этот узел отфильтровывает значения по двум разным спискам в зависимости от вводимого логического выражения. Соедините исходный диапазон чисел с входным параметром list, а выходной параметр проверки равенства с входным параметром mask. В выходных данных in представлены истинные значения, а в out — ложные.
h. Watch. В результате мы получили списки четных и нечетных чисел. Итак, с помощью логических операторов мы разделили списки по определенному признаку.
Применим логику из первого упражнения к моделированию.
2. За основу возьмем предыдущее упражнение с теми же узлами. Помимо изменения формата, единственными исключениями будут следующие.
a. Используйте узел Sequence с этими входными значениями.
b. Отсоединен входной параметр list от узла List.FilterByBoolMask. Эти узлы пока не нужны, но они потребуются позже.
3. Начнем с создания отдельной группы Graph, как показано на изображении выше. Эта группа узлов представляет собой параметрическое уравнение для определения линейной кривой. Примечания.
a. Первый регулятор Number Slider представляет частоту волны в диапазоне от 1 до 4 с шагом 0,01.
b. Второй регулятор Number Slider представляет амплитуду волны в диапазоне от 0 до 1 с шагом 0,01.
c. PolyCurve.ByPoints. Если скопировать приведенную выше схему узлов, на видовом экране предварительного просмотра Dynamo будет создана синусоидальная кривая.
При вводе данных используйте числовые узлы для более статических свойств и регуляторы чисел для более гибких свойств. Необходимо сохранить исходный диапазон чисел, который определяется в начале этого шага. Однако синусоидальная кривая, которую мы пытаемся создать, должна обладать определенной гибкостью. Перемещая регуляторы, можно видеть частотные и амплитудные изменения кривой.
4. Забежим немного вперед и посмотрим на конечный результат, чтобы представить, каким он должен быть. Первые два шага выполняются отдельно, теперь их нужно соединить. С помощью базовой синусоидальной кривой будет определяться местоположение компонентов молнии, а с помощью логики «истина/ложь» — элементы меньшего или большего размера.
a. Math.RemapRange. С помощью последовательности чисел, созданной на шаге 02, сформируем новую последовательность чисел, перенастроив диапазон. Исходные числа из шага 01 имеют диапазон от 0 до 100. С помощью входных параметров newMin и newMax диапазон значений изменяется на 0–1 соответственно.
5. Создайте узел Curve.PointAtParameter, а затем соедините выходной параметр Math.RemapRange из шага 04 с входным параметром param.
На этом шаге создаются точки вдоль кривой. Диапазон чисел был перенастроен на 0–1, так как входной параметр param ищет значения в этом диапазоне. Значение 0 соответствует начальной точке, а значение 1 — конечным точкам. Все промежуточные числа относятся к диапазону [0,1].
6. Соедините выходной параметр узла Curve.PointAtParameter с узлом List.FilterByBoolMask, чтобы разделить список четных и нечетных индексов.
a. List.FilterByBoolMask. Соедините узел Curve.PointAtParameter из предыдущего шага с входным параметром list.
b. Watch. Узел Watch для in и узел Watch для out показывают, что имеется два списка — c четными и нечетными индексами. Тот же самый порядок точек используется в кривой, что демонстрируется на следующем шаге.
7. Далее используйте результат вывода из узла List.FilterByBoolMask на шаге 05 для создания геометрий с размерами в соответствии с индексами.
Cuboid.ByLength. Для создания молнии вдоль синусоидальной кривой воспроизведите связи, представленные на изображении выше. В данном случае кубоид — это просто рамка, размер которой определяется в зависимости от точки кривой в центре рамки. Теперь логика деления «четные/нечетные» в модели должна быть понятной.
a. Список кубоидов с четными индексами.
b. Список кубоидов с нечетными индексами.
Готово! Вы только что запрограммировали процесс определения геометрических размеров в соответствии с логической операцией, показанной в этом упражнении.
Цвет — это тип данных, который помогает создавать наглядные визуальные представления, а также отражать различия в результатах визуального программирования. При работе с абстрактными данными и численными переменными бывает трудно определить, что именно изменилось и в какой степени. Для решения этой проблемы можно использовать цвета.
Цвета в Dynamo создаются с использованием входных данных ARGB, что является сокращенным обозначением комбинации альфа-канала (Alpha) с красным (Red), зеленым (Green) и синим (Blue) каналами. Альфа-канал служит для задания прозрачности цвета, а остальные три канала используются как основные цвета для создания всего цветового спектра.
Значок | Имя (синтаксис) | Входные данные | Выходные данные |
---|
Цвета в таблице ниже запрашивают свойства, использованные для настройки итогового цвета: альфа, красный цвет, зеленый цвет и синий цвет. Обратите внимание, что узел Color.Components включает все четыре свойства в качестве портов вывода, поэтому его удобнее всего использовать для запроса свойств цвета.
Значок | Имя (синтаксис) | Входные данные | Выходные данные |
---|
Цвета в таблице ниже соответствуют цветовому пространству HSB. Разделение цвета на такие составляющие, как оттенок, насыщенность и яркость, является более понятным и привычным с точки зрения интерпретации цвета. Какого оттенка должен быть цвет? Насколько ярким он должен быть? Насколько светлым или темным? Отвечая на эти вопросы, мы тем самым разбиваем цвет на составляющие, то есть на оттенок, насыщенность и яркость соответственно.
Значок | Имя (синтаксис) | Входные данные | Выходные данные |
---|
Цветовой диапазон аналогичен узлу Remap Range из упражнения : он повторно сопоставляет список чисел с другой областью. Однако вместо сопоставления с областью чисел цветовой диапазон выполняет сопоставление с цветовым градиентом в соответствии со входными значениями в диапазоне от 0 до 1.
Текущий узел хорошо выполняет свои функции, но с ним может быть трудно добиться нужных результатов с первого раза. Чтобы уверенно работать с цветовым градиентом, стоит несколько раз опробовать его на практике в интерактивном режиме. Выполните небольшое упражнение, чтобы узнать, как настроить градиент, так чтобы цвета на выходе соответствовали заданным числам.
Определите три цвета. С помощью узла Code Block определите красный, зеленый и синий цвета, назначив каждому из них соответствующие сочетания значений 0 и 255.
Создайте список. Объедините три цвета в один список.
Определите индексы. Создайте список для определения положения ручек каждого цвета (в диапазоне от 0 до 1). Обратите внимание, что для зеленого цвета задано значение 0,75. Это смещает зеленый цвет на 3/4 вдоль горизонтального градиента в регуляторе цветового диапазона.
Code Block. Введите значения (от 0 до 1), которые будут преобразованы в цвета.
Узел Display.ByGeometry позволяет раскрашивать геометрию на видовом экране Dynamo. Это позволяет наглядно показывать различные типы геометрии, демонстрировать параметрические концепции и задавать условные обозначения для расчета при моделировании. В качестве входных данных здесь требуются только геометрия и цвет. Для создания градиента, как на изображении выше, порт ввода Color соединяется с узлом Range.
Узел Display.BySurfaceColors позволяет использовать цвет для сопоставления данных на поверхности. Это дает нам широкие возможности для визуализации данных, полученных с помощью таких типов дискретного анализа, как расчеты инсоляции и энергопотребления, а также анализ близости. Применение цвета к поверхности в Dynamo аналогично применению текстуры к материалу в других средах САПР. Выполните небольшое упражнение ниже, чтобы ознакомиться с этим инструментом.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
В этом упражнении основное внимание уделяется параметрическому управлению цветом параллельно с геометрией. Геометрия — стандартная спираль, определение которой выполнено ниже с помощью узла Code Block. Это простой и быстрый способ создания параметрической функции. Так как на данном уроке рассматривается работа с цветом (а не с геометрией), то Code Block идеально подходит для быстрого создания спирали без загромождения рабочей области. Мы будем использовать Code Block все чаще и чаще по мере изучения более сложных процессов.
Code Block: создайте два узла Code Block, используя приведенные выше формулы. Это быстрый параметрический метод создания спирали.
Point.ByCoordinates: соедините порты координат этого узла с тремя портами вывода узла Code Block.
Отображается массив точек, которые образуют спираль. Далее необходимо создать кривую, проходящую через точки, чтобы получить изображение спирали.
PolyCurve.ByPoints: соедините порт вывода Point.ByCoordinates с портом ввода points этого узла. Отображается спиральная кривая.
Curve.PointAtParameter: соедините порт вывода PolyCurve.ByPoints с портом ввода curve. Это требуется, чтобы создать параметрическую точку притяжения, которая перемещается вдоль кривой. Так как кривая вычисляет положение точки с помощью параметра, необходимо задать значение param в диапазоне от 0 до 1.
Number Slider: добавьте этот узел в рабочую область и измените значение min на 0,0, значение max на 1.0, а значение step на .01. Соедините порт вывода регулятора с портом ввода param узла Curve.PointAtParameter. Появляется точка, которая перемещается вдоль спирали в соответствии с положением регулятора (0 — в начальной точке, 1 — в конечной).
Создав опорную точку, мы можем сравнить расстояние от нее до исходных точек, определяющих геометрию спирали. Данное расстояние будет определять геометрию и цвет.
Geometry.DistanceTo: соедините порт вывода узла Curve.PointAtParameter с портом input этого узла. Соедините узел Point.ByCoordinates с входным параметром «geometry».
Watch: в результате мы получаем список значений расстояния от каждой точки спирали до опорной точки, перемещающейся вдоль кривой.
Следующий шаг — определение параметров на основе списка расстояний между точками спирали и опорной точкой. Эти значения расстояний будут использованы для определения радиусов сфер, размещаемых вдоль кривой. Чтобы обеспечить подходящий размер сфер, необходимо повторно сопоставить значения расстояния.
Math.RemapRange: соедините порт вывода узла Geometry.DistanceTo с портом ввода numbers.
Code Block: соедините узел Code Block со значением 0,01 с портом ввода newMin, а узел Code Block со значением 1 с портом ввода newMax.
Watch: соедините порт вывода Math.RemapRange с одним узлом, а порт вывода Geometry.DistanceTo — с другим. Сравните результаты.
Выполнив этого шаг, мы получили повторно сопоставленный список расстояний меньшего диапазона. При необходимости можно задать другие значения newMin и newMax. Новые значения будут повторно сопоставлены и будут иметь одинаковый коэффициент распределения в пределах области.
Sphere.ByCenterPointRadius: соедините порт вывода узла Math.RemapRange с портом ввода radius, а порт вывода исходного узла Point.ByCoordinates — с портом ввода centerPoint.
Измените значение числового регулятора и посмотрите, как при этом изменится размер сфер. Теперь у нас есть параметрический шаблон.
Размер сфер является представлением параметрического массива, определяемого опорной точкой, перемещающейся вдоль кривой. Применим эту же концепцию к радиусу сфер, чтобы определить их цвет.
Color Range: добавьте в рабочую область этот узел. При наведении указателя мыши на порт ввода value обратите внимание, что запрашиваемые числа находятся в диапазоне от 0 до 1. Необходимо повторно сопоставить числа, указанные для порта вывода узла Geometry.DistanceTo, чтобы они были совместимы с этой областью.
Sphere.ByCenterPointRadius: временно отключите предварительный просмотр узла (щелкните правой кнопкой мыши, а затем выберите «Предварительный просмотр»).
Math.RemapRange: эта процедура должна быть вам уже знакома. Соедините порт вывода узла Geometry.DistanceTo с портом ввода numbers.
Code Block: аналогично шагу выше задайте значение 0 для порта ввода newMin и 1 для порта ввода newMax. Обратите внимание, что в данном случае мы задаем два порта вывода для одного узла Code Block.
Color Range: соедините порт вывода узла Math.RemapRange с портом ввода value.
Color.ByARGB: этот блок позволит нам создать два цвета. Хотя процесс может показаться не самым очевидным, по сути, это то же самое, что и работа с цветами RGB в другом программном обеспечении. Просто здесь мы используем возможности визуального программирования.
Code Block: создайте два значения — 0 и 255. Соедините два порта вывода с двумя портами ввода Color.ByARGB в соответствии с изображением выше (или создайте другие цвета на свой выбор).
Color Range: порт ввода colors запрашивает список цветов. Необходимо создать этот список из двух цветов, заданных на предыдущем шаге.
List.Create:: объедините два цвета в один список. Соедините порт вывода этого узла с портом ввода colors узла Color Range.
Display.ByGeometryColor: соедините узел Sphere.ByCenterPointRadius с портом ввода geometry, а узел Color Range — с портом ввода color. К области кривой применяется мягкий цветовой градиент.
Если изменить в определении значение узла Number Slider, который мы изучили ранее, то цвета и размеры геометрии будут обновлены. Цвета и размер радиуса в данном случае связаны напрямую, и теперь между этими двумя параметрами существует и визуальная связь.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
Сначала необходимо создать поверхность (или выбрать существующую поверхность в качестве опорной) для использования в качестве входных данных для узла Display.BySurfaceColors. В этом примере поверхность образуется путем лофтинга между синусоидой и косинусоидой.
Эта группа узлов создает точки вдоль оси Z с последующим смещением в соответствии с функциями синуса и косинуса. Затем два полученных списка точек используются для создания NURBS-кривых.
Surface.ByLoft: сформируйте интерполированную поверхность между NURBS-кривыми из списка.
File Path: выберите файл изображения, который будет использоваться в качестве образца для пиксельных данных на последующих этапах.
С помощью узла File.FromPath преобразуйте путь к файлу в файл, а затем передайте этот файл в узел Image.ReadFromFile, чтобы вывести изображение для использования в качестве образца.
Image.Pixels: используйте изображение в качестве входных данных и введите значение количества образцов, получаемых вдоль осей X и Y изображения.
Slider: задайте значения количества образцов для узла Image.Pixels.
Display.BySurfaceColors: сопоставьте массив значений цветов на поверхности со значениями по осями X и Y соответственно.
Просмотрите увеличенную предварительную версию итоговой поверхности с разрешением 400 x 300.
Чтобы углубиться в процесс разработки визуальных программ, нам потребуется более тонкое понимание того, что представляют собой компоновочные блоки программ. В этой главе описываются основные понятия, относящиеся к данным, проходящим по проводам программы Dynamo.
Значок | Имя/синтаксис | Входные данные | Выходные данные |
---|---|---|---|
Хотя набор узлов из предыдущего этапа будет выполнять поставленные задачи, этот процесс довольно трудоемкий. Для повышения эффективности работы ознакомьтесь с разделом , в котором показано, как в одном узле разместить строку выражений Dynamo. На последующих этапах рассмотрим использование параметрического уравнения для построения спирали Фибоначчи.
Массив. После создания раковины наутилуса перейдем к параметрическим сеткам. Используя основной угол вращения спирали Фибоначчи, создайте сетку Фибоначчи, а на ее основе — модель .
Object.IsNull
obj
bool
Цвет ARGB (Color.ByARGB) | A,R,G,B | color |
Альфа (Color.Alpha) | color | A |
Красный (Color.Red) | color | R |
Зеленый (Color.Green) | color | G |
Синий (Color.Blue) | color | B |
Компоненты (Color.Components) | color | A, R, G, B |
Оттенок (Color.Hue) | color | Hue |
Насыщенность (Color.Saturation) | color | Saturation |
Яркость (Color.Brightness) | color | Brightness |
Сложение (+) | var[]...[], var[]...[] | var[]...[] |
Вычитание (–) | var[]...[], var[]...[] | var[]...[] |
Умножение (*) | var[]...[], var[]...[] | var[]...[] |
Деление (/) | var[]...[], var[]...[] | var[]...[] |
If (If) | test, true, false | результат |
Formula (IF(x,y,z)) | x, y, z | результат |
Code Block ((x?y:z);) | X, Y, Z | результат |
Формально строка — это последовательность символов, представляющих литеральную константу или переменную определенного типа. Однако на сленге программистов строкой называется любой текст. Мы уже говорили о том, как можно управлять параметрами с помощью целых и десятичных чисел. Аналогичным образом можно работать и с текстом.
Строки применяются в разных ситуациях, в том числе при настройке пользовательских параметров, аннотировании документации и анализе текстовых наборов данных. Узел String находится в разделе Core > Input Category.
Примеры узлов выше являются строками. В виде строки может быть представлено число, буква или целый массив текста.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
С помощью запроса строк можно быстро анализировать большие объемы данных. Поговорим о некоторых основных операциях, которые могут ускорить рабочий процесс и обеспечить совместимость программного обеспечения.
На следующем изображении показана строка данных из внешней электронной таблицы. Строка представляет вершины прямоугольника в плоскости XY. Рассмотрим подробнее некоторые операции по разделению строк в небольшом упражнении.
В качестве разделителя вершин прямоугольника используется точка с запятой («;»). При этом создается список, содержащий 3 элемента для каждой вершины.
Если нажать знак «+» посредине узла, будет создан новый разделитель.
Добавьте строку «,» в рабочую область и соедините ее с новым входным параметром separator.
Получится список из десяти элементов. Сначала в качестве разделителя узла используется значение separator0, а затем — separator1.
Хотя элементы списка на изображении выше выглядят как числа, в Dynamo они все так же считаются отдельными строками. Для создания точек тип соответствующих данных необходимо преобразовать из строкового в числовой. Для этого используется узел String.ToNumber.
Этот узел достаточно прост. Соедините результаты String.Split с входным параметром. Кажется, что выходные данные не изменились, но теперь типом данных будет number, а не string.
Добавив несколько дополнительных операций, вы создали треугольник на основе исходных строковых входных данных в начале координат.
Так как строка является типовым текстовым объектом, у нее есть множество применений. Рассмотрим основные действия в разделе Core > String Category в Dynamo.
На изображении представлен метод объединения двух строк по порядку. Берется каждая литеральная строка в списке и создается одна объединенная строка.
На следующем изображении показана операция объединения трех строк.
Нажатием кнопок «+/-» в центре узла можно добавлять или удалять строки.
На выходе получается одна объединенная строка с пробелами и знаками препинания.
Метод соединения очень похож на метод объединения, но в нем есть дополнительный слой пунктуации.
Пользователям, работающим с Excel, могут быть знакомы файлы CSV. CSV расшифровывается как comma-separated values — значения, разделенные запятыми. Чтобы создать данные с аналогичной структурой, в узле String.Join в качестве разделителя можно использовать запятую (или в данном случае два дефиса).
На следующем изображении показано соединение двух строк.
Входной параметр separator позволяет создать строку, выступающую в качестве разделителя соединенных строк.
В этом упражнении с помощью методов запроса строк и операций со строками мы разберем последнее четверостишие стихотворения американского поэта Роберта Фроста Stopping By Woods on a Snowy Evening. Хотя это не самый практичный пример, он поможет понять, как выполнять основные операции со строками в связном тексте с размером и рифмой.
Начнем с разделения строк четверостишия. Прежде всего, обратим внимание на то, что в стихотворении используются запятые. С помощью них можно будет разделить каждую строчку на отдельные элементы.
Исходная строка вставляется в узел String.
Для указания разделителя используется еще один узел String. В данном случае разделителем будет запятая.
В рабочую область добавляется узел String.Split, который соединяется с двумя строками.
На выходе строчки разделены на отдельные элементы.
Перейдем к самой интересной части стихотворения: последним двум строчкам. Исходное четверостишие представляло собой один элемент данных. Сперва эти данные были разделены на отдельные элементы. Теперь необходимо найти нужный нам текст. Хотя это можно осуществить, выбрав два последних элемента списка, в случае с целой книгой не обязательно прочитывать ее всю и выделять элементы вручную.
Вместо того чтобы выполнять поиск вручную, используйте узел String.Contains для поиска набора символов. Это аналогично команде «Найти» в текстовом редакторе. В этом случае при обнаружении подстроки в элементе возвращается значение «Истина» или «Ложь».
Для входного параметра searchFor определите подстроку, которую необходимо найти в четверостишии. Воспользуйтесь узлом String с текстом «And miles».
На выходе получим список значений «Истина» и «Ложь». Воспользуемся этой логикой для фильтрации элементов на следующем этапе.
Для отбора значений True и False используйте узел List.FilterByBoolMask. Выходной параметр in возвращает выражения с входным значением mask, для которых действительно значение «Истина», а выходной параметр out — выражения, для которых действительно значение «Ложь».
Результат на выходном параметре in соответствует ожиданиям, то есть мы получаем две последние строки четверостишия.
Теперь необходимо воссоздать повтор, объединив две строки вместе. Если посмотреть на результаты выполнения предыдущего шага, можно заметить, что в списке присутствуют два элемента.
С помощью двух узлов List.GetItemAtIndex можно изолировать элементы, используя значения 0 и 1 в качестве входных данных индекса.
На выходе из каждого узла получаем последние две строки, расположенные по порядку.
Для объединения этих двух элементов в один используйте узел String.Join.
После добавления узла String.Join становится понятно, что требуется разделитель.
Для создания разделителя добавьте узел String в рабочую область и введите запятую.
Конечный результат — объединение двух последних элементов в один.
Изолирование двух последних строк может показаться довольно трудоемким процессом. Это действительно так — операции со строками часто требуют предварительной подготовки. Однако эти операции масштабируемы и могут сравнительно легко применяться к большим наборам данных. Если работа с электронными таблицами и настройка совместимости осуществляются на параметрической основе, обязательно помните об операциях со строками.