Макросы для Nuke через AutoHotKey | Ноды и связки нод по нажатию одной кнопки | Работаем в Nuke быстрее
В прошлой статье мы разбирались, как поставить себе AutoHotKey и сделать распознавание нажатия клавиш на второй клавиатуре. Теперь же время пришло для конкретных примеров использования AutoHotKey при работе в Nuke.
Прежде всего я сделал возможность добавлять ноды при нажатии на определенную клавишу на дополнительной клавиатуре. И да, я знаю, что в нюке уже есть готовые клавиши, к которым привязаны ноды — grade, write, copy и тд. Но что, если мне этого мало? Что, если я хочу не просто ноду добавлять, я целые связки/пресеты нод? С этим нам и поможет AutoHotKey.
Глобально, можно грубо разделить ноды в нюке на два типа:
Контекстно зависимые (их параметры зависят от ноды, к которой мы их добавляем. Например, Transform, в котором якорь, относительно которого будет применяться трансформация, определяется, исходя из разрешения ноды, к которой мы добавляем Transform)
Контекстно НЕзависимые (все остальное, например Blur, Grade)
Учитывая это, метод добавления нод будет разным. Для контекстно зависимых — мы будет посылать последовательность нажатий {Tab}«название ноды»{Enter}. Для контекстно НЕзависимых мы сделаем файл .txt, в содержимое которого вставим python код нужной ноды/связки нод. Далее, по нажатию клавиши, программа будет обращаться к содержимому нужного .txt файла, копировать его в буфер обмена и вставлять. Почему для таких нод не сделать добавление через нажатие последовательности клавиш? Потому что так будет куда быстрее и приятнее. Приступим!
Шапка скрипта будет выглядеть так:
#SingleInstance force
#Persistent
#include Lib\AutoHotInterception.ahk
global Script_Path := "C:\Presets\"
AHI := new AutoHotInterception()
id1 := AHI.GetKeyboardId(0x1C4F, 0x0002)
cm1 := AHI.CreateContextManager(id1)
return
#if cm1.IsActive
Обращаем внимание на переменную Script_Path := "C:\Presets\"
— она нам понадобится, но позже.
В AutoHotKey, чтобы что-то случилось при нажатии кнопки, нужно прописать условие так:
"кнопка":: "тело скрипта"
return
Чтобы послать команду нажатия клавиш, добавляем Send, «что нужно напечатать без скобок»
Нажатие клавиш Enter или Tab записываются в скобках {}
Пример:
q::
Send, {Tab}Transform [Transform]{Enter}
return
При нажатии на кнопку q программа последовательно нажмет Tab, введет буквы «Transform [Transform]» и нажмет Enter.
Если хотим делать макрос через сочетание клавиш, добавляем эти знаки:
! — Alt
^ — Ctrl
+ — Shift
Пример команды на нажатие alt + z
Отлично, половина работы сделана. Осталось самое веселое — контекстно НЕзависимые ноды.
В нюке добавляем ноду, которую хотим добавлять через макрос, выделяем ее и копируем (Ctrl+c). В какой угодно папке (которая записывается в переменную Script_Path — на которую я обращал внимание в самом начале) создаем текстовый файл с названием скопированной ноды, и вставляем в его содержимое скопированный текст. Вот пример:
Пресет для ноды блюр
Фигачим таким образом все ноды, какие хотите. Или связки нод :) У меня, например, на комбинацию клавиш забито добавление целого пресета для кея. Не забываем прописать свой путь до этой папки в файле с макросами в переменную Script_Path! То есть, у меня на диске С в папке Presets лежат все txt:
Теперь, чтобы все это дело добавлялось по нажатию на кнопку, прописываем это:
9::
Node_name := "Keymix.txt"
global Script_Path
FilePath := Script_Path . Node_name
FileRead, FileContent, %FilePath%
Clipboard := FileContent
Send, ^v
return
Разберем все команды:
Node_name := "Keymix.txt"
— Записываем в переменную имя файла с нодой, которую будем добавлять макросом. Эта переменная будет далее объединяться с общим путем до папки с txt файлами
global Script_Path
— приписываем global к переменной, хранящей путь до общей папки с txt файлами, так как она у нас объявлена один раз за пределами этого скрипта. Иначе скрипт ее просто не увидит
FilePath := Script_Path . Node_name
— объединяем две переменные в одну. В данном случае знак ».» с пробелами слева и справа как раз отвечает за это Глобально все это нужно, чтобы каждый человек один раз прописал себе свой собственный путь, и все остальное подтягивалось автоматически. Можно, конечно, на каждую ноду прописывать абсолютный путь, но тогда при смене ПК придется везде переписывать пути.
FileRead, FileContent, %FilePath%
— считываем содержимое файла по указанному пути
Clipboard := FileContent
— копируем содержимое в буфер обмена
Send, ^v
— посылаем команду на вставку Ctrl+v
return
— конец скрипта
Вот, собственно, и все. Делаем такой скрипт на каждую ноду, меняя только название txt файла в переменной Node_name. Получится примерно такое:
Но можно пойти чуть дальше. Есть ноды с разными режимами работы: Merge (over, plus, mask), ChannelMerge (union, stencil, multiply). Для таких нод можно сделать выпадающее меню, в котором перед добавлением ноды, мы сможем выбрать режим работы. Для этого необходимо сделать некое подобие функций:
ChannelMerge_Union:
Node_name := "ChannelMerge_Union.txt"
global Script_Path
FilePath := Script_Path . Node_name
FileRead, FileContent, %FilePath%
Clipboard := FileContent
Send, ^v
return
В целом очень похоже на то, что мы делали выше, с тем лишь отличием, что в самом начале идет имя функции и один знак »:»
Делаем такие функции на каждый режим работы
И да, у нас 3 txt файла, в которых python код для ноды с определенным режимом работы. делаем их точно так же — добавляем в нюке нужную ноду, выставляем нужный режим, копируем, вставляем в txt файл.
Теперь, при нажатии на какую-то кнопку, сделаем выпадающее меню:
0::
Menu, MainMenu_2, Add, Union, ChannelMerge_Union
Menu, MainMenu_2, Add, Stencil, ChannelMerge_Stencil
Menu, MainMenu_2, Add, Multiply, ChannelMerge_Multiply
Menu, MainMenu_2, Show
return
Разберем, что к чему:
Menu
— команда создания меню
MainMenu_2
— имя меню. Каждое меню у разны нод должно отличаться между собой именем!
Add
— добавляем пункт в меню
Union
— название пункта
ChannelMerge_Union
— функция, которая должна выполниться, при выборе пункта
Все вместе получится так:
Тыкаем на »0», получаем:
Выбрав, например, Union, получим ноду:
Меню, кстати, появляется там, где находится курсор мыши — удобно!
Прикладываю свой скрипт и папку с txt файлами для удобства. В следующий раз рассмотрим некоторые способы взаимодействия уже с Windows, которые упрощают и ускоряют мою работу. Не прощаюсь :)
Мой телеграмм канал с полезными инструментами для работы в Nuke и не только:
https://t.me/STD_VFX