# Сокращение

### Сокращение

Существует несколько основных способов сокращенной записи команд в блоке кода, что *существенно* упрощает управление данными. Далее мы подробно рассмотрим, как использовать подобные сокращенные записи для создания и запроса данных.

| **Тип данных**                | **Стандартный код Dynamo** | **Аналог в блоке кода** |
| ----------------------------- | -------------------------- | ----------------------- |
| Числа                         | !                          | !                       |
| Строки                        | !                          | !                       |
| Последовательности            | !                          | !                       |
| Диапазоны                     | !                          | !                       |
| Получение элемента по индексу | !                          | !                       |
| Создание списка               | !                          | !                       |
| Объединение строк             | !                          | !                       |
| Условные выражения            | !                          | !                       |

### Дополнительный синтаксис

|                                         |                         |                                                                                                    |
| --------------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------- |
| **Узлы**                                | **Аналог в блоке кода** | **Примечание**                                                                                     |
| Любой оператор (+, &&, >=, Not и т. д.) | +, &&, >=, ! и т. д.    | Обратите внимание, что Not заменяется на «!», однако узел называется Not для отличия от Factorial. |
| Boolean True                            | true;                   | Все в нижнем регистре                                                                              |
| Boolean False                           | false;                  | Все в нижнем регистре                                                                              |

### Диапазоны и последовательности

Метод определения диапазонов и последовательностей можно заменить обычной сокращенной записью. Приведенное ниже изображение можно рассматривать как руководство по использованию синтаксиса «..» для определения списка числовых данных с помощью блока кода. Освоение этой системы записи позволит более эффективно формировать числовые данные.

!

> 1. В этом примере числовой диапазон заменяется элементарной синтаксической конструкцией узла **Code Block**, определяющей `beginning..end..step-size;`. В числовом выражении получаем `0..10..1;`.
> 2. Обратите внимание, что синтаксис `0..10..1;` эквивалентен синтаксису `0..10;`. Значение шага 1 является значением по умолчанию для сокращенного обозначения. Таким образом, значение `0..10;` соответствует последовательности от 0 до 10 с шагом 1.
> 3. Похожий пример наблюдаем с узлом *Sequence*. Единственное исключение — знак #, указывающий на список из 15 значений, а не на список с увеличением до 15. В данном случае мы определяем `beginning..#ofSteps..step-size:`. Фактический синтаксис для последовательности: `0..#15..2`.
> 4. Разместим символ *#* из предыдущего шага в компоненте *размер шага* синтаксической конструкции. Теперь есть *диапазон чисел*, идущий от *начала* к *концу*, а *размер шага* равномерно распределяет несколько значений между этими двумя точками: `beginning..end..#ofSteps`.

### Дополнительные диапазоны

Создание дополнительных диапазонов упрощает работу со списками списков. В примерах ниже переменная изолируется от обозначений основного диапазона и создается другой диапазон этого списка.

!

> 1\. При создании вложенных диапазонов сравните запись с символом # и без него. Действует тот же принцип, что и в случае с основными диапазонами, но в усложненном варианте.
>
> 2\. Вложенный диапазон может находиться в любом месте основного диапазона. Обратите внимание на возможность наличия двух вложенных диапазонов.
>
> 3\. Используя различные значения конца диапазона, можно создавать дополнительные диапазоны с разной длиной.

В качестве упражнения сравните две сокращенные записи на изображении выше и попытайтесь проанализировать, как *вложенные диапазоны* и символ *#* влияют на конечный результат.

!

### Создание списков и получение элементов из списка

С помощью сокращений можно не только создавать списки, но и делать это динамически. Эти списки могут содержать множество типов элементов и поддерживают запросы (помните, что списки — это объекты в объектах). Наконец, в узле Code Block для создания списков и запроса элементов из списка используются скобки ( «квадратные скобки»):

!

> 1\. Быстрое создание списков с помощью строк и запрос содержимого списков с помощью индекса элементов.
>
> 2\. Создание списков с переменными и запрос содержимого с помощью сокращенной записи диапазонов.

Аналогичным образом можно работать с вложенными списками. Учитывайте порядок расположения списков, а для вызова используйте несколько наборов квадратных скобок:

!

> 1\. Определение списка списков.
>
> 2\. Запрос содержимого списка с помощью одного набора квадратных скобок.
>
> 3\. Запрос содержимого списка с помощью двух наборов квадратных скобок.

## Упражнение «Синусоидальная поверхность»

> Скачайте файл с примером, щелкнув ссылку ниже.
>
> Полный список файлов примеров можно найти в приложении.

{% file src="<https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-8832668bb8fcaa9a2d5df0efb880148286b3312b%2FObsolete-Nodes_Sine-Surface.dyn?alt=media>" %}

В этом упражнении мы применим навыки сокращенной записи для создания оригинальной яйцевидной поверхности, которая будет определяться диапазонами и формулами. При выполнении упражнения обратите внимание на одновременное использование блока кода и существующих узлов Dynamo. Блок кода используется для обработки больших данных, а узлы Dynamo для наглядности.

Начните с создания поверхности путем соединения узлов, представленных на изображении выше. Вместо использования узла Number для определения ширины и длины поверхности дважды щелкните в рабочей области, а в узле Code Block введите `100;`.

!

!

> 1. Создайте диапазон от 0 до 1 с 50 делениями. Для этого введите `0..1..#50` в узле **Code Block**.
> 2. Соедините диапазон с узлом **Surface.PointAtParameter**, который извлекает значения u и v в диапазоне от 0 до 1 по всей поверхности. Не забудьте в качестве режима «Переплетение» выбрать «Векторное произведение», щелкнув правой кнопкой мыши узел **Surface.PointAtParameter**.

На этом этапе с помощью первой функции переместим сетку точек вверх по оси Z. Эта сетка будет управлять поверхностью на основе базовой функции. Добавьте новые узлы, как показано на изображении ниже.

!

> 1. В строке `(0..Math.Sin(x*360)..#50)*5;` используем **Code Block**. Для быстроты мы определяем диапазон с помощью формулы внутри него. Эта формула представляет собой функцию синуса. Функция синуса получает входные данные в градусах в Dynamo, поэтому для получения полной синусоиды необходимо умножить значения x (диапазон входных значений от 0 до 1) на 360. Далее необходимо получить количество делений, соответствующее количеству точек управляющей сетки для каждого ряда, поэтому зададим пятьдесят подразделов, введя #50. Наконец, с помощью множителя 5 просто увеличим амплитуду преобразования, чтобы увидеть результат в области предварительного просмотра Dynamo.

!

> 1. Несмотря на то, что предыдущие узлы **Code Block** работали нормально, процесс не был полностью параметрическим. Поскольку необходимо динамически изменять его параметры, замените строку из предыдущего шага на `(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;`. Это позволит задавать значения на основе входных данных.

Изменим положение регуляторов (в диапазоне от 0 до 10) и получим интересный результат.

!

!

> 1. Транспонируйте диапазон чисел, чтобы обратить направление волны: `transposeList = List.Transpose(sineList);`.

!

> 1. Добавьте элементы sineList и transposeList, чтобы получить деформированную яйцевидную поверхность: `eggShellList = sineList+transposeList;`.

Измените значения регуляторов, указанные ниже, чтобы «усреднить значения» алгоритма.

!

Осталось запросить отдельные элементы данных с помощью узла Code Block. Чтобы сформировать поверхность с определенным диапазоном точек, добавим блок кода, который показан на изображении выше, между узлами **Geometry.Translate** и **NurbsSurface.ByPoints**. В нем содержится строка текста: `sineStrips[0..15..1];`. С помощью нее будут выбраны первые 16 рядов точек (из 50). Если снова сгенерировать поверхность, можно увидеть, что была создана отдельная часть сетки точек.

!

!

> 1. Наконец, чтобы сделать узел **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** заменяет узлы **List.Transpose**, **List.Count** и **Number Range**.
>
> 4\. Четвертый **Code Block** запрашивает элементы в списке списков, заменяя узел **List.GetItemAtIndex**.
