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
в палитре.
Если таблицу на десятки тысяч строк пересобирать каждый кадр, кадры начнут пропадать. Читайте файл один раз и держите результат. Таблица, у которой меняются только значения, пересчитывается быстрее той, где строки добавляются и удаляются.
Нашли в статье ошибку, устаревшее или непонятное место?