К содержанию
fohbookбета/ TouchDesigner

Ссылки, выражения и экспорт

Выражение тянет, экспорт толкает, Bind держит два параметра одинаковыми. Плюс ярлыки parent.Имя и op.Имя, с которыми пути перестают ломаться.

Ветка вашего пульта:
Быстрый выбор:

Провода несут данные, а управление чаще идёт в обход: параметр одного узла берёт значение у другого. Делается это выражением, экспортом или привязкой.

op('noise1')                 # узел в этой же сети
op('../audio/analysis')      # относительный путь вверх и вниз
op('/project1/scene/cam1')   # абсолютный путь
me                           # сам узел, где написано выражение
me.par.Speed                 # свой параметр
me.parent()                  # компонент, внутри которого он лежит
parent().par.Intensity       # параметр родителя — самая частая связка
parent(2)                    # на два уровня вверх

Компонент, внутри которого всё написано через parent() и относительные пути, можно копировать, клонировать и сохранять в .tox, и ничего не сломается. С абсолютными путями он ломается при первом копировании.

Ярлыки

На странице Common у компонента три поля, после которых пути почти не нужны:

Поле Как обращаться Откуда видно
Parent Shortcut parent.Effect Из любого узла внутри компонента, на любой глубине
Global OP Shortcut op.Settings Из любого места проекта
Internal OP iop.Cam Изнутри компонента: ярлык на узел внутри него; ищется вверх по иерархии

У /project1 ярлык родителя уже стоит: parent.Project изнутри ведёт к нему. Ярлык продолжает работать и после переименования, и после переноса компонента на три уровня в сторону. Двум компонентам один Global OP Shortcut дать нельзя — это ошибка.

Что достаётся

op('lfo1')['chan1']              # канал: значение в текущий момент
op('lfo1')['chan1'].eval()       # то же явно
op('lfo1')['chan1'].eval(10)     # значение в сэмпле 10
op('table1')[2, 'name']          # ячейка таблицы
op('moviefilein1').width         # свойство оператора
op('moviefilein1').par.file      # параметр как объект
op('geo1').par.tx.eval()         # вычисленное значение параметра
op('audio1').numSamples
me.time.frame                    # кадр таймлайна своего компонента
absTime.seconds                  # секунды с запуска, не зависит от таймлайна
me.digits                        # число в конце имени узла: null7 → 7

digits — приём для клонов: двадцать одинаковых компонентов, одно выражение op('table1')[parent().digits, 'file'], и каждый берёт свою строку таблицы.

Экспорт

Включите у CHOP Viewer Active, перетащите канал на параметр и выберите Export CHOP. Массово — через имена каналов вида путь_узла:параметр и Export Method = Channel Name is Path:Parameter на странице Common; флаг Export на CHOP выключает всё разом. Из DAT в параметр уходит текст, так управляют путями файлов и строками вроде текста в Text TOP.

Expression Export
Кто инициирует Параметр тянет CHOP толкает
Где видно В параметре В CHOP и по зелёному цвету параметра
Массово Неудобно Удобно: сотни параметров по именам каналов
Гибкость Любая логика: op('null1')[0] * 2 - 1, выбор источника по условию Только значение канала
Переименовали канал Ссылка ломается Экспорт ломается
Переставили каналы Ссылка по имени работает Экспорт обычно ломается
Скорость С 2017 года одинаковая С 2017 года одинаковая

Bind

Два параметра, которые всегда равны: тронули любой — поменялись оба. Значение хранит один, master; у остальных в поле фиолетовое выражение вроде op('pattern1').par.numcycles. Так ручку на панели управления связывают с настоящим параметром глубоко в сети.

Пути, которые не ломаются

Внутри компонента пишите относительные пути и parent.Имя. Снаружи внутрь не лезьте: компонент отдаёт данные через Out, а принимает своими параметрами. Общее для проекта держите в одном компоненте с Global OP Shortcut. И не пишите в путь имя, которое собираетесь менять.

Поиск по сети в выражении

ops('*/render*') обходит сеть при каждом пересчёте выражения, а если выражение зависит от времени, то каждый кадр. Ищут один раз в скрипте, результат кладут в таблицу — Оптимизация.

Нашли в статье ошибку, устаревшее или непонятное место?

рядом по смыслу