Репликатор и генерация сети
Replicator COMP размножает мастер по числу или по таблице, но копии становятся клонами, только если мастер клон сам себе. Колбэки, генерация скриптом и почему не во время шоу.
Двадцать одинаковых блоков, собранных руками, — это двадцать мест, где правку забудут. Нужен один мастер и механизм, который его размножит.
Replicator COMP
Это цикл for для операторов: копии мастера по числу или по строкам
таблицы, и удаление лишних, когда таблица меняется. На странице
Replicator Replication Method выбирает By Number с Number of Replicants или By Table, где строка таблицы — копия. Таблицу задаёт
Template DAT Table, а Ignore First Row пропускает заголовки.
Master Operator — что копировать, и это может быть не только компонент,
но любой узел, хоть Movie File In TOP. Имена копий складываются из
Operator Prefix и номера строки или значения из столбца
(Name from Table), Destination решает, куда их класть, Layout —
как расставить.
Сами по себе копии не клоны, и правка мастера на уже созданные не влияет.
Чтобы они шли за мастером, мастер делают клоном самого себя — в его
Clone Master пишут его же путь, — и тогда все копии становятся
клонами.
Свои данные у копии
Через колбэки из Callbacks DAT:
def onReplicate(comp, allOps, newOps, template, master):
for c in newOps:
row = template.row(c.digits) # или по имени
c.par.Universe = int(row[1].val)
c.par.Address = int(row[2].val)
return
def onRemoveReplicant(comp, replicant):
replicant.destroy()
return
onRemoveReplicant вызывается, когда копия больше не нужна — скажем, строку
убрали из таблицы. Можно и без колбэка: выражение внутри мастера берёт
строку по номеру в имени, op('table1')[parent().digits, 'address'] —
Ссылки.
| Что | Таблица описывает |
|---|---|
| Экраны и выходы | Разрешение, положение, монитор |
| Слои композиции | Источник, режим наложения, прозрачность |
| Приборы света | Юниверс, адрес, тип — Патч |
| Сцены шоу | Файл, длительность, переход |
| Панели интерфейса | Подпись, диапазон, адрес параметра |
Структура проекта описана данными, и новый экран — это строка в CSV, а не полчаса в сетевом редакторе.
Скриптом
gen = parent().op('gen')
for c in gen.children: # аккуратно: удаляет всё внутри gen
c.destroy()
for i, row in enumerate(op('table1').rows()[1:]):
n = gen.copy(op('master'), name=f'unit_{row[0].val}')
n.nodeY = -150 * i
n.par.Address = int(row[2].val)
Генерируют в отдельный контейнер, чтобы очистка не снесла лишнего,
запускают кнопкой, а не каждый кадр, и помнят, что сгенерированная сеть
сохранится в .toe и на площадке пересобираться не будет.
Создание и удаление узлов может занять десятки кадров. Строят заранее, при загрузке, а не когда зритель смотрит.
Из одной таблицы собираются экраны, приборы и сцены, и на вопрос «сколько у нас выходов» отвечает файл, а не память разработчика.
Нашли в статье ошибку, устаревшее или непонятное место?