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

Скрипты и колбэки

Семейство Execute DAT вызывает ваш код, когда что-то случилось: канал включился, параметр поменялся, проект стартовал. Имена функций, нужные переключатели и как не уронить кадр.

Ветка вашего пульта:1 фрагмент статьи для версий новее вашей1 фрагмент статьи для версий новее вашей
Быстрый выбор:

Колбэк — функция, которую 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 · в вашей версии этого нет

С ветки 2025.30000 у DAT Execute всё делает onTableChange, а четыре прежних колбэка — onRowChange, onColChange, onCellChange, onSizeChange — устарели. В старых проектах подсказки в шаблоне остались прежними, свежую заготовку даёт новый DAT Execute.

Осторожно

Колбэк выполняется внутри кадра, и всё долгое в нём — пропущенный кадр. Правка структуры сети из колбэка бывает опасна, её откладывают run(..., delayFrames=1). Рискованное заворачивают в try/except с записью в лог: ошибку колбэка видно в Textport и на DAT, а шоу идёт дальше, и легко не заметить, что реакция перестала работать.

Тонкий колбэк

Лучше, если колбэк только переводит событие в вызов метода компонента (Extensions) — логику тогда можно проверить и переиспользовать отдельно.

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

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