Сокращение
Сокращение
Существует несколько основных способов сокращенной записи команд в блоке кода, что существенно упрощает управление данными. Далее мы подробно рассмотрим, как использовать подобные сокращенные записи для создания и запроса данных.
Тип данных
Стандартный код Dynamo
Аналог в блоке кода
Числа
!
!
Строки
!
!
Последовательности
!
!
Диапазоны
!
!
Получение элемента по индексу
!
!
Создание списка
!
!
Объединение строк
!
!
Условные выражения
!
!
Дополнительный синтаксис
Узлы
Аналог в блоке кода
Примечание
Любой оператор (+, &&, >=, Not и т. д.)
+, &&, >=, ! и т. д.
Обратите внимание, что Not заменяется на «!», однако узел называется Not для отличия от Factorial.
Boolean True
true;
Все в нижнем регистре
Boolean False
false;
Все в нижнем регистре
Диапазоны и последовательности
Метод определения диапазонов и последовательностей можно заменить обычной сокращенной записью. Приведенное ниже изображение можно рассматривать как руководство по использованию синтаксиса «..» для определения списка числовых данных с помощью блока кода. Освоение этой системы записи позволит более эффективно формировать числовые данные.
!
В этом примере числовой диапазон заменяется элементарной синтаксической конструкцией узла 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. Эта сетка будет управлять поверхностью на основе базовой функции. Добавьте новые узлы, как показано на изображении ниже.
!
В строке
(0..Math.Sin(x*360)..#50)*5;используем Code Block. Для быстроты мы определяем диапазон с помощью формулы внутри него. Эта формула представляет собой функцию синуса. Функция синуса получает входные данные в градусах в 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 и transposeList, чтобы получить деформированную яйцевидную поверхность:
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 заменяет узлы List.Transpose, List.Count и Number Range.
4. Четвертый Code Block запрашивает элементы в списке списков, заменяя узел List.GetItemAtIndex.
Last updated