Ссылки, выражения и экспорт
Выражение тянет, экспорт толкает, 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*') обходит сеть при каждом пересчёте выражения, а если
выражение зависит от времени, то каждый кадр. Ищут один раз в скрипте,
результат кладут в таблицу — Оптимизация.
Нашли в статье ошибку, устаревшее или непонятное место?