githubEdit

Сокращение

Сокращение

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

Тип данных

Стандартный код 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. Запрос содержимого списка с помощью двух наборов квадратных скобок.

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

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

Полный список файлов примеров можно найти в приложении.

В этом упражнении мы применим навыки сокращенной записи для создания оригинальной яйцевидной поверхности, которая будет определяться диапазонами и формулами. При выполнении упражнения обратите внимание на одновременное использование блока кода и существующих узлов 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.

Last updated