Скрипты и колбэки
Семейство Execute DAT вызывает ваш код, когда что-то случилось: канал включился, параметр поменялся, проект стартовал. Имена функций, нужные переключатели и как не уронить кадр.
Колбэк — функция, которую TouchDesigner вызывает сам, когда что-то случилось. Так отвечают на события вместо опроса в каждом кадре.
| DAT | Реагирует на |
|---|---|
| Execute | Старт проекта, создание узла, выход, начало и конец кадра, смену режима воспроизведения, подключение и отключение устройств |
| CHOP Execute | Переход канала через ноль в обе стороны, удержание, любое изменение значения |
| Parameter Execute | Изменение значения, нажатие pulse-кнопки, смену выражения, экспорта, режима |
| Panel Execute | События панели: клик, наведение, изменение значения |
| DAT Execute | Изменение содержимого таблицы |
| OP Execute | Кук, удаление, переименование, смену флагов и проводов у операторов |
| Keyboard In / MIDI In / OSC In DAT | Внешние события |
Вызываются только функции, включённые переключателями на первой странице DAT; написанная, но не включённая не вызывается.
CHOP Execute
def onValueChange(channel, sampleIndex, val, prev):
if channel.name == 'kick' and val > 0.5:
op('scene').par.Next.pulse()
return
def onOffToOn(channel, sampleIndex, val, prev):
debug('нажали', channel.name)
return
Переключатели — Off to On, While On, On to Off, While Off,
Value Change; «включено» значит больше нуля. Для While On и While Off
параметр While Off/On Frequency выбирает, звать функцию на каждый сэмпл
или раз в кадр. Каналы ограничивают параметром Channel, иначе колбэк
дёргается на всех.
Звук идёт с частотой 48 000 сэмплов в секунду, и колбэк на таком канале может вызывать Python тысячи раз за кадр. Сначала сведите сигнал к одному значению на кадр — Сглаживание.
Execute и Parameter Execute
def onStart():
op('logger').Log('проект запущен')
return
def onFrameStart(frame):
return
def onExit():
op('dmx').par.active = 0
return
onStart и onExit — место для подготовки и аккуратного выхода: погасить
свет, закрыть порты, записать в лог. onDeviceChange срабатывает, когда
устройство подключили или выдернули, и позволяет переподключиться к камере
или MIDI-контроллеру. onFrameStart по возможности не трогают —
Python в TouchDesigner.
Parameter Execute слушает параметры операторов из OPs и имена из
Parameters, в том числе собственные параметры компонента, и так кнопка
на панели начинает что-то делать:
def onPulse(par):
if par.name == 'Reset':
op('feedback1').par.resetpulse.pulse()
return
def onValueChange(par, prev):
debug(par.name, prev, '→', par.eval())
return
С ветки 2025.30000 у DAT Execute всё делает onTableChange, а четыре
прежних колбэка — onRowChange, onColChange, onCellChange,
onSizeChange — устарели. В старых проектах подсказки в шаблоне остались
прежними, свежую заготовку даёт новый DAT Execute.
Осторожно
Колбэк выполняется внутри кадра, и всё долгое в нём — пропущенный кадр.
Правка структуры сети из колбэка бывает опасна, её откладывают
run(..., delayFrames=1). Рискованное заворачивают в try/except
с записью в лог: ошибку колбэка видно в Textport и на DAT, а шоу идёт
дальше, и легко не заметить, что реакция перестала работать.
Лучше, если колбэк только переводит событие в вызов метода компонента (Extensions) — логику тогда можно проверить и переиспользовать отдельно.
Нашли в статье ошибку, устаревшее или непонятное место?