Согласитесь было бы удобно иметь инструмент, который бы мог вывалить все пути к ридам в текущем скрипте
При этом чтобы была возможность быстро переробить пути
Это полезно, когда мы носим скрипт на флешке, скидываем через инет, и в конце концов, когда кешируем сурс с сети на локал
Разумеется одним из решений для первых двух пунктов являются относительные пути. Об этом уже писали и обсуждали
Но это ведь надо следить за каждым ридом. А если мы не заморачивались. Теперь каждый скрипт открывать ручками. Искать путь файла. Перепробивать. Лениво - не так ли?
В общем имея подобные соображения, подкреплённые не только моими мыслями но и соображениями окружающих. Я решил попытаться сделать такой инструмент. Будем надеяться он будет удобен.
Честно. Сейчас нет огромного желания расписывать алгоритмы его создания. Кому интересно, Нюк открыт. В скрипте можно ковыряться
Если возникнут вопросы уже конкретные или предложения, буду с радостью общаться
Собственно привожу сам скрипт. Копируем, вставляем в Нюк как обычную ноду.
Тестим, смотрим, пишем отзывы. Какие пожелания, предложения. Будем считать, что это бета версия.
set cut_paste_input [stack 0] version 6.0 v1 StickyNote { inputs 0 name ReadChanger1 tile_color 0x260736ff label "\[knob name]" selected true xpos 1088 ypos -2138 addUserKnob {20 User l Changer} addUserKnob {22 LoadReads l "Load read paths" -STARTLINE T "sn = nuke.thisNode()\nallnodes = nuke.allNodes(group = nuke.root())\n\nfor ks in sn.knobs():\n if ks.find(\"rc_\")>-1:\n k = sn.knob(ks)\n sn.removeKnob(k)\n\n#k = nuke.Script_Knob(\"rc_ScriptB\",\"Update\")\n#sn.addKnob(k)\n\nb = 0\nfor node in allnodes:\n type = node.Class()\n if type == \"Read\":\n #str+=node.knob(\"file\").value()+\"\\n\"\n k = nuke.File_Knob(\"rc_\"+node.name(),node.name())\n k.setValue(node.knob(\"file\").value())\n k.setTooltip(node.knob(\"file\").value())\n sn.addKnob(k)\n b=1\nif b==1:\n sn.knob(\"Update\").setEnabled(True)\n sn.knob(\"Clear\").setEnabled(True)\nelse:\n sn.knob(\"Update\").setEnabled(False)\n sn.knob(\"Clear\").setEnabled(False)\n"} addUserKnob {22 Update l "Update paths" -STARTLINE +DISABLED T "allnodes = nuke.allNodes(group = nuke.root())\nsn = nuke.thisNode()\n\nfor node in allnodes:\n type = node.Class()\n if type == \"Read\":\n k = sn.knob(\"rc_\"+node.name())\n if k>-1:\t\n node.knob(\"file\").setValue(k.value())\n"} addUserKnob {22 Clear -STARTLINE +DISABLED T "sn = nuke.thisNode()\nfor ks in sn.knobs():\n if ks.find(\"rc_\")>-1:\n k = sn.knob(ks)\n sn.removeKnob(k)\n\nsn.knob(\"Update\").setEnabled(False)\nsn.knob(\"Clear\").setEnabled(False)"} addUserKnob {26 ""} addUserKnob {1 ReplaceFrom l Replace} addUserKnob {1 ReplaceTo l with -STARTLINE} addUserKnob {22 Replace -STARTLINE T "sn = nuke.thisNode()\nif len(sn.knob(\"ReplaceFrom\").value())>0:\n #allnodes = nuke.allNodes(group = nuke.root())\n fromS=sn.knob(\"ReplaceFrom\").value()\n toS=sn.knob(\"ReplaceTo\").value()\n for ks in sn.knobs():\n if ks.find(\"rc_\")>-1:\n k = sn.knob(ks)\n s = k.value()\n s=s.replace(fromS, toS)\n k.setValue(s)"} addUserKnob {26 ""} }
Что умеет:
- Собирать пути к файлам во всех ридах текущего скрипта (кноба Load read paths)
- Обновлять соответствующие пути из собранного списка в ридах (кноба Update paths)
- Очищать список (Clear)
- Заменять в списке строку на другую (заменяет именно в списке, а не в ридах. После замены, для обновления ридов необходимо нажать кнопку Update. Спомощью этого пакета удобно перепробивать во всех ридах, корневую папку проекта, заменять локал на сервер и прочее)
- Нода ReadChanger не связана с ридами никакими внутренними зависимостями. Апдэйт происходит исключительно в момент нажатия кнопки Update. Дальше риды всё так же продолжают жить своей независимой жизнью. Это позволяет нам не парится, удалять Рид ченжер. Это не приведёт к багам в скрипте. В общем минимум вмешательства.
Надеюсь, что будет полезно