Sinitsyns поднял ранее тему ноды дисэйблера для других link

Однажды в разговоре с Димой Широковым он сказал, что хочет отписать на форум другую версию
В разговоре он сказал, что удобнее было бы включать Ноды в наборы. Например устанавливая им флаги в лейблах
И это действительно так

Все знают, что Дима человек занятой, поэтому не стал дожидаться, пока мир узреет его творения и написал свой вариант решения поставленной задачи
Публикую

И так задача:
Кастомная Нода, позволяющая массово дисэйблить наборы дргуих нод
При этом ноды включаются в наборы путём добавления в поле label определённого флага
Флаг задаётся пользователем
может быть изменён
В одном скрипте может находится несколько работающих Нод Дисэйблеров, со своими флагами
При этом одна нода может быть помечена несколькими флагами, тогда на неё будет оказывать влияние сразу неколько дисэйблеров

Решение:
Берём обычный StickyNote
Я предлагаю создать юзерскую кнобу для ввода текста (правая кнопка в любом месте открытого окошка редактирования ноды, Manage User Knobs, кнопка Add)
Назовём её Flag
в неё мы будем вводить флаг, по которому производится поиск подвластных Дисэйблеру нод
и создадим так же Юзерские Кнопки со скриптами на Питоне
у меня получилось как-то так
[реклама вместо картинки]
Как можно догадаться кнопки EnableFlagedNodes и DisableFlagedNodes dключают и выключают ноды из набора
ToggleFlagedNodes инвертируют disable у нод из набора

Что касается самого скрипта
Выбираем кнопку DisableFlagedNodes жмём Edit
пишем код

Код:
allnodes = nuke.allNodes(group = nuke.root())
fl = nuke.thisNode().knob("flag").value()
for i in allnodes: 
    L = i.knob("label").value()
    if L.find(fl)>-1:
        i.knob("disable").setValue(1)

код до безобразного прост
Берём список всех нод в скрипте, пробегаемся по нему, ищем у кого в label присутствует флаг
у тех, что присутствует ставим в кнобу disable ставим 1

Для двух других кнопок код будет практически идентичен
Только для EnableFlagedNodes мы записываем 0 ( i.knob("disable").setValue(1))
А для ToggleFlageNode записываем инвертированное значение по отношению к текущему

Код:
v=i.knob("disable").value()
i.knob("disable").setValue(1-v)

Проверяем:
Назовём нашу ноду каким нибудь NodeDisabler1
Берём готовый скрипт, или создаём новый тестовый
В нужные ноды пишем в label dis (либо другой флаг, который разумеется так же прописываем в кнобе Flag нашего дисаблера)
Дальше кнопками можем дисаблить, енаблить, тоглить эти ноды )
всё работает

Разумеется, надо быть аккуратнее, если мы для иных целей используем поля label у нод
Думаю, это понятно
Флаги dis или там напирмер LightnesDisGroup будут автоматически показываться на поверхности помеченных нод в ДАГе (они же прописаны в label)
Что удобно

Исходник того, что получилось у меня:

Код:
set cut_paste_input [stack 0]
version 6.0 v1
StickyNote {
 inputs 0
 name NodeDisabler1
 tile_color 0x360f3cff
 gl_color 0x52cc80ff
 selected true
 xpos 367
 ypos -321
 addUserKnob {20 User}
 addUserKnob {1 flag l Flag}
 flag dis
 addUserKnob {22 DisableFlagedNodes T "allnodes = nuke.allNodes(group = nuke.root())\nfl = nuke.thisNode().knob(\"flag\").value()\nfor i in allnodes: \n    L = i.knob(\"label\").value()\n    if L.find(fl)>-1:\n        i.knob(\"disable\").setValue(1)" +STARTLINE}
 addUserKnob {22 EnableFlagedNodes -STARTLINE T "allnodes = nuke.allNodes(group = nuke.root()) \nfl = nuke.thisNode().knob(\"flag\").value()\nfor i in allnodes: \n    L = i.knob(\"label\").value()\n    if L.find(fl)>-1:\n        i.knob(\"disable\").setValue(0)"}
 addUserKnob {22 ToggleFlagedNodes -STARTLINE T "allnodes = nuke.allNodes(group = nuke.root()) \nfl = nuke.thisNode().knob(\"flag\").value()\nfor i in allnodes: \n    L = i.knob(\"label\").value()\n    if L.find(fl)>-1:\n        v=i.knob(\"disable\").value()\n        i.knob(\"disable\").setValue(1-v)"}
}

копируем, вставляем, пользуемся

Предложения? Замечания? Вопросы? - всегда рад
Надеюсь было полезно

Отредактировано jahamba (2010-06-10 23:49:13)