Params / geometry - primitive
Типы данных
В Grasshopper существует большое количество типов данных. В виду того, что Grasshopper является визуальным языком программирования, он наследовал типы данных из программирования, например такие как целые числа, булевые значения, числа типа float. В Grasshopper так же есть типы данных, наследованные от Rhino, например такие типы данных, как точки, линии, полилинии, поверхности, брепы и так далее. Начинающие осваивать Grasshopper (да и пользователи с опытом) постоянно путают типы данных и не до конца понимают их смысл. В этом уроке разбираемся в чём суть типов данных в Grasshopper и почему это очень важная тема, без понимания которой будет трудно двигаться самостоятельно.
Что такое типы данных если выразится более образно? Если провести аналогию со строительством, то это те материалы, из которых строится здание. То есть, например кирпич, или газобетонный блок, плита перекрытия это своего рода типы данных только в строительной области. Так же типами данных будут доски для стропильной системы, гвозди и саморезы. Надеемся с этой аналогией вам легче будет осознать абстрактность понятия типа данных.

И так, типы данных, представленные в Rhino и Grasshopper разделены на две группы. Одна из них представляет собой геометрические типы данных (Geometry), другая названа Primitive, иными словами это базовые типы данных, или примитивы. Все они в общем представляют собой изначальные параметры, которые в конечном итоге призваны управлять компонентами Grasshopper и алгоритмом в целом.

Оба подраздела с типами данных находятся в разделе параметров Grasshopper (Params - параметры):
Каковы основные функции геометрических типов данных и примитивов?
1) Ввод данных и их привязка;
2) Преобразование одних типов данных в другие.

Прежде чем начинать более предметно разбирать некоторые типы данных, рассмотрим основные функции типов данных в коротком видео:
Базовые примитивы
Базовыми примитивами мы будем считать такие типы данных, как Integer, Float, Boolean и Text. Они встречаются во всех языках программирования.
1. Boolean - булевые значения
Булевые значения (boolean) включают в себя только два значения: Истина (True) или Ложь (False). Эти значения встречаются во всех языках программирования

Булевые значения постоянно встречаются в работе Grasshopper, особенно в создании булевых паттернов. Булевые паттерны применяются для исключения или добавления элементов в списки или деревья данных.

1. В Grasshopper любое значение не равное нулю всегда равно True, а значение равное нулю, либо значения типа Null, Empty всегда равны False.
2. Integer - целые числа
Целые числа (Integer - читается как интиджэр на англ.)

Целые числа (далее Int) это множество целых чисел, точно таких же, о которых вы знаете из математики. Например числа 0,1,2,5,20,1000 это целые числа (тип Int). Так же и отрицательные целые числа относятся к Int.

Здесь стоит добавить, что в Grasshopper можно отдельно задавать четные (even numbers) и нечётные числа (odd numbers), что является полезным и необходимым в некоторых случаях.

Так же смотрите связанные темы:
1) Вводный параметр Number Slider;
2) Panel - средство ввода и просмотра структуры данных;
3. float - вещественные числа
Числа с плавающей точкой типа float это множество всех вещественных чисел.

Проще говоря числа типа float это все числа с некоторым количеством знаков после запятой. Например число 0.1 это float, так же число 0.001 это тоже float.

4. Text - строки, или текстовые данные
Текстовые данные (тип Str, сокращенное от String - строка) это совокупность всех символов, в том числе тип int, float и даже bool, рассмотренные нами выше. На первый взгляд это может путать, но стоит понять, что Str включает в себя вообще все символы, это всеобъемлющий тип данных.

Например следующая последовательность символов будет являться текстом: "qwerty123"

В Grasshopper текст обычно вводится при помощи панели (Panel).

Прежде чем продолжить дальше рассматривать типы данных, давайте разберёмся в том, какой может быть смысл в использовании данных примитивов.
Как не путать типы данных в Grasshopper?
У начинающих осваивать Grasshopper есть одна общая проблема: новички постоянно путают типы данных. Для того, чтобы не допускать подобные ошибки, рассмотрим каким образом узнать какие типы данных можно подавать во входы нодов, а какие нельзя.

Например пользователь строит какой-то алгоритм в Grasshopper. Рассмотрим простой пример построения цилиндра:
Обратите внимание, что у нода Cylinder есть три входа, а именно:
1. Base;
2. Radius;
3. Length.
Во входы Radius уже подано определенное числовое значение = 100, в Length подано значение 200. Это значит, что построенный цилиндр имеет радиус = 100, а его высота = 200. В окне Rhino можно визуально наблюдать результат. Данный пример очень простой и интуитивно понятно, что Radius это некое число, так же как и Length, однако что такое Base? И почему в Base ничего не подключено?

И так, каким образом понять какие именно типы данных можно и нужно подключать в указанные входы? Для этого есть два способа:
1. При помощи окна Help;
2. При помощи всплывающей подсказки при наведении на входе стрелки мыши.

И так, рассмотрим первый способ при помощи справки Help. Для этого нужно щёлкнуть правой кнопкой мыши на иконке нода (в данном случае Cylinder) и затем левой кнопкой мыши во всплывающем меню на Help:
После выбора Help появится следующее окошко:
Рассмотрим элементы окна Help:
1. Описание того, что именно делает данный нод. В данном случае написано: "Create a cylindrical surface", то есть - "Создание цилиндрической поверхности";
2. Base (Plane). Обратите внимание на то, что в скобках описывается тип данных - Plane (плейн). Base это некоторая база, в данном случае это базовая точка построения цилиндра в пространстве и она представляет из себя тип данных Plane. Подробно Plane рассматривается в геометрических типах данных.
3. Radius (Number). Радиус цилиндра представляет собой тип данных Number. Это значит, что он включает в себя как тип Int, так и тип float. То есть это значит, что в данный вход можно подать как целое число, тип Int, так и не целое число, тип float. Обратите внимание, что у многих нодов в некоторые входы можно подавать исключительно тип Int!;
4. Length (Number) высота цилиндра. Высота так же представляет собой Number, то есть общий тип данных, включающий в себя Int и float.

И в самом низу можно видеть Output parameters, то есть выходные данные. В данном случае это Cylinder (Surface). На выходе мы получаем тип данных Surface, поверхность. Поверхности бывают разными: бывают подрезанные поверхности, не подрезанные и так далее. Подробнее типы поверхностей разбираем в геометрических типах данных.

Далее рассмотрим следующий способ выяснить какие типы данных можно, а какие нельзя подавать: при помощи всплывающей подсказки при наведении на стрелки мыши.

Для этого достаточно навести стрелку мыши на том, или ином входе. Типы данных будут намного более наглядными, чем в окошке Help:
Обратите внимание, что при наведении стрелки мыши на тот, или иной вход нода сразу же всплывает информационное окошко. В данном случае мы навели стрелку мыши на вход "Base". Разберём элементы:
1. Base. Обратите внимание на иконку: это чёрный шестиугольник внутри которого нарисован символ Plane. Ту же самую иконку вы можете увидеть в разделе Params/Geometry. Это и есть тип данных, который можно подать в данный вход. Если вы не знаете графический символ, то его всегда можно посмотреть в разделе Params / Geometry, либо Params / Primitive:
Продолжим далее разбирать элементы:
2. Base plane - базовый плейн. Здесь так же дополнительно описывается тип данных Plane;
3. Обратите внимание на очень важный элемент: здесь указано то, какое текущее значение установлено, либо значение по умолчанию. Во вход Base не подключен никакой нод, т.е. не подан ни какой тип данных, но тем не менее нод выполняет свою работу всего лишь с двумя поданными во входы Radius и Length Number Slider. Давайте прочитаем что здесь написано, и так: "One Locally defined value... World XY". Переводим: "Одно локально определённое значение ... Мировые координаты XY". Это значит, что изначально установлен по умолчанию Plane, причём Plane в начале мировых координат XY, то есть в центре мировых координат. Данный факт можно обнаружит в окне графического отображения цилиндра Rhino:
1. Виджет указывающий ориентацию мировых векторов X,Y и Z;
2. Plane. Обратите внимание, что это небольшой квадрат с сеткой внутри. Plane всегда состоит из точки и двух векторов, направленных друг к другу перпендикулярно;
3. Визуализация вектора X плейна в виде зелёной линии;
4. Визуализация вектора Y плейна в виде красной линии.
Геометрические типы данных Rhinoceros
Мы уже рассмотрели общие типы данных. Они присутствуют во всех языках программирования. Однако в Rhino есть свои, специфические типы данных, разработанные специально для данной программы. Из данных "кирпичиков" строится любая геометрия, начиная от точки, заканчивая сложными поверхностями.
Геометрический параметр точка является одним из самых базовых и важных типов данных Rhinoceros.
Вид нода "параметр точка" и текстовое описание в панели
На основе точек строятся:
1) Линии:
Так же на основе точек строятся поверхности и меши.
На изображении выше можно видеть цифры рядом с точками. Они обозначают индексы, иначе говоря место в списке, или нумерацию точек. Обратите внимание на то, как панель визуализирует структуру данных, хранящихся в списке:
Точка с индексом 0 графически находится в левом нижнем углу, а в панели она находится первой в списке. Это значит, что данная точка является первой в структуре и именно с нее начинается работа нода Point и именно с нее начнётся любое действие. Далее действие будет совершаться с точкой с индексом 1 и так далее до конца списка. В качестве примера рассмотрим построение полилинии через данные точки (используем простой нод Polyline, строящий полилинию через точки):
Обратите внимание на геометрию полилинии: она начинает строится с точки с индексом 0, далее с индексом 1, далее с индексом 2. Таким образом полилиния строится исходя из порядка точек списка, начиная с самой верхней точки списка и заканчивая самой нижней. На изображении ниже последовательность дополнительно показана при помощи стрелок на участках полилинии:
Если же мы каким-либо образом перемешаем список, например при помощи нода Jitter (случайно перемешивает список), то результат может получится самым неожиданным:
Как можно видеть, при нарушении порядка списка (даже при помощи простого перемешивания), нарушается изначальный смысл геометрического построения, поэтому за списками и порядком в списке нужно следить и к построению подходить осмысленно.
Оцените этот урок и помогите тем самым сделать его лучше.