Сокращение
Last updated
Last updated
Существует несколько основных способов сокращенной записи команд в блоке кода, что существенно упрощает управление данными. Далее мы подробно рассмотрим, как использовать подобные сокращенные записи для создания и запроса данных.
Метод определения диапазонов и последовательностей можно заменить обычной сокращенной записью. Приведенное ниже изображение можно рассматривать как руководство по использованию синтаксиса «..» для определения списка числовых данных с помощью блока кода. Освоение этой системы записи позволит более эффективно формировать числовые данные.
В этом примере числовой диапазон заменяется элементарной синтаксической конструкцией узла 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.
Тип данных
Стандартный код Dynamo
Аналог в блоке кода
Числа
Строки
Последовательности
Диапазоны
Получение элемента по индексу
Создание списка
Объединение строк
Условные выражения
Узлы
Аналог в блоке кода
Примечание
Любой оператор (+, &&, >=, Not и т. д.)
+, &&, >=, ! и т. д.
Обратите внимание, что Not заменяется на «!», однако узел называется Not для отличия от Factorial.
Boolean True
true;
Все в нижнем регистре
Boolean False
false;
Все в нижнем регистре