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

DAT: таблицы и текст

Таблицы, текст, код и обмен с внешним миром. Главный приём — держать всё, что описывается списком, в таблице, а не в параметрах.

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

DAT хранит текст — таблицей с ячейками или сплошной строкой. В DAT же пишут скрипты и колбэки, через DAT идёт и обмен с внешним миром.

Оператор Что делает
Table Таблица, которую правят руками или скриптом
Text Произвольный текст; здесь же пишут Python и шейдеры
File In Читает файл с диска: CSV, txt и другие текстовые форматы
Folder Список файлов в папке — основа плейлистов
Evaluate Выражение по каждой ячейке входной таблицы
Select Выбор строк и столбцов по имени или шаблону
Merge Склейка таблиц
Sort / Reorder Сортировка и перестановка строк и столбцов
JSON Фильтр JSON по запросу JSONPath: из большого ответа сервера оставляет нужное
Web Client HTTP-запрос наружу — Веб
Web Server Приём HTTP и WebSocket
OSC In / Out Сообщения OSC как текст
Execute, DAT Execute, CHOP Execute, Parameter Execute, Panel Execute Колбэки на события — Скрипты

Таблица вместо параметров

Патч приборов, раскладка экранов, список сцен, какая кнопка что делает — всё, что описывается списком, держите в таблице:

name      universe  address  channels
wash_1    1         1        8
wash_2    1         9        8
beam_sl   2         1        22

Её правят в Excel, сохраняют в CSV рядом с проектом и читают File In DAT. Тогда проект не зависит от памяти того, кто его собирал, и легко переносится на другую площадку. Как это устроено в свете — Патч и маршрутизация.

op('table1')[0, 'name']         # строка 0, столбец name
op('table1')[1, 2]              # строка 1, столбец 2
op('table1').numRows
op('table1').row('wash_1')      # строка, у которой первая ячейка — wash_1
op('table1').col('address')     # столбец по заголовку
op('table1').appendRow(['beam_sr', 2, 23, 22])

Ячейка — объект, текст в ней лежит в .val. В выражении параметра она сама становится числом или строкой: op('table1')[me.digits, 'address'].

JSON

Длинный ответ сервера подают на вход JSON DAT, и тот оставляет нужное по запросу JSONPath в Filter, например $.weather[0].temp. На выходе снова JSON-текст, а из Python результат берут как op('json1').result — первый найденный — или op('json1').results — все.

Код

Text DAT по сути файл: в нём пишут модули с функциями, GLSL-шейдеры для GLSL TOP и тела колбэков. Функцию из модуля вызывают так: mod.utils.myFunc() для DAT с именем utils в той же сети или mod('/project1/scripts/utils').myFunc() по пути. С File и включённым Sync to File код хранится во внешнем .py, изменения ходят в обе стороны, и его можно версионировать и править в любом редакторе — Файл проекта.

Плейлист из папки

Folder DAT даёт таблицу файлов, выражение в Movie File In берёт из неё строку по индексу — и плейлист меняется добавлением файла в папку, без правки проекта. Готовый вариант с переходами — moviePlaylist в палитре.

DAT считается на CPU

Если таблицу на десятки тысяч строк пересобирать каждый кадр, кадры начнут пропадать. Читайте файл один раз и держите результат. Таблица, у которой меняются только значения, пересчитывается быстрее той, где строки добавляются и удаляются.

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

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