В прошлой статье мы разбирались, как поставить себе AutoHotKey и сделать распознавание нажатия клавиш на второй клавиатуре. Теперь же время пришло для конкретных примеров использования AutoHotKey при работе в Nuke.

Прежде всего я сделал возможность добавлять ноды при нажатии на определенную клавишу на дополнительной клавиатуре. И да, я знаю, что в нюке уже есть готовые клавиши, к которым привязаны ноды — grade, write, copy и тд. Но что, если мне этого мало? Что, если я хочу не просто ноду добавлять, я целые связки/пресеты нод? С этим нам и поможет AutoHotKey.

Глобально, можно грубо разделить ноды в нюке на два типа:

  1. Контекстно зависимые (их параметры зависят от ноды, к которой мы их добавляем. Например, Transform, в котором якорь, относительно которого будет применяться трансформация, определяется, исходя из разрешения ноды, к которой мы добавляем Transform)

  2. Контекстно НЕзависимые (все остальное, например 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
Пример команды на нажатие 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 и не только.

Комментарии (0)