Наша новая игра 8 сентября в раннем доступе на steam



как назначит hotkey на кнопку скрипта

Представьте ситуацию, когда вы написали скрипт (или у вас уже есть чей-то скачанный скрипт) как на рисунке выше и вам нужно очень часто нажимать кнопку Do something cool with objects list или Export objects list. Я бы захотел назначить горячую клавишу на эти кнопки.

Внимание! Делаю акцент: hotkey должен нажимать кнопку именно в этом плавающем окошке, а не вызывать это окошко заново и жать кнопку автоматически.

Решение

Логика решения такова: создать ещё один скрипт, на который мы повесим горячую клавишу и этот второй скрипт будет нажимать на нашу кнопку. Осталось только сделать так, чтобы второй скрипт смог найти нужную нам кнопку запущенного окошка Awesome script.

Первым делом, нужно сделать так, чтобы у нас всегда была запущена только одна копия Awesome script. Иначе вы не будете знать для какой копии сработает shortcut:

try(closeRolloutFloater awesomeScriptFloater) catch() 
global awesomeScriptFloater = newRolloutFloater "Awesome script" 300 230

Поскольку мы будем обращаться к кнопке, расположенной на Awesome rollout 2, то нужно сделать этот rollout видимым для другого скрипта (т.е. глобальным):

global awesomeRollout2

Далее делаем так, чтобы после закрытия плавающего окошка, эта глобальная переменная удалялась (чтобы мы не могли больше обращаться горячей клавишей к кнопке на уже закрытом окне). Да и вообще насильно запускаем garbage collection (gc), чтобы освободить занятые скриптом ресурсы:

on awesomeRollout2 close do
(
     globalvars.remove "awesomeRollout2"
     gc light:true
)

На всякий случай добавлю сюда код кнопки (обычный, стандартный код кнопки), которую мы будем нажимать из другого скрипта:

button exportObjectsList "Export objects list"

На стороне Awesome script мы сделали всё.

Теперь приступим ко второму скрипту (на котором будет горячая клавиша, и который будет нажимать кнопку в плавающем окошке).

Первым делом, мы проверим, запущен ли Awesome rollout 2. Для этого просто сравним значение глобальной переменной awesomeRollout2 со значением undefined. Если скрипт не запущен (переменная не определена), то выведем сообщение: "Сначала нужно запустить скрипт". Если переменная определена (не равняется undefined), то это значит, что плавающее окошко запущено и мы можем нажимать нашу кнопку:

if awesomeRollout2 == undefined then
(
    messageBox "Launch Awesome script first"
)
else
(
    awesomeRollout2.exportObjectsList.pressed()
)

Последняя строчка расшифровывается так: найти глобальную переменную awesomeRollout2 (которая хранит наш свиток с кнопкой), обратиться к кнопке exportObjectsList и вызвать метод кнопки с именем pressed() (который отвечает за то, чтобы нажать эту кнопку).

Точки в этом случае указывают на то, что awesomeRollout2 является родителем для exportObjectsList. А exportObjectsList, в свою очередь, является родителем для функции pressed().

Вот и всё. О том как назначать shortcuts на скрипт читайте тут.



Подпишитесь на обновление блога (вот 3 причины для этого).
Введите ваш e-mail:





Вам понравилась статья? Хотите отблагодарить автора? Расскажите о ней друзьям.
Или подпишитесь на обновление блога по E-Mail.

Введите ваш e-mail (используется только для отправления обновлений блога):

Один комментарий к статье “#30. Секреты 3ds Max: как назначить горячую клавишу на кнопку плавающего окошка вашего скрипта”

  1. Можно и чужой даже если не знаем, как названы кнопки в коде (mse, — encripted maxscript).
    Код страшненький, за полчасика набросал, но работает:

    (
    — this is macros u click usally
    category = «ASKR»
    macrosName = «testScript»
    — if we need found something we need to know how it’s call
    wndHeader = «One Click Happy»
    btnText = «Make Me Happy»
    ——————————
    scriptHWND = undefined
    scriptBtnHWND = undefined
    — start third party script
    macros.run category macrosName
    — collect all other max window
    popups = UIAccessor.GetPopupDialogs()
    — iterate to find our patient
    for p in popups do (
    if (UIAccessor.GetWindowText p) == wndHeader then (
    scriptHWND = p
    exit
    )
    )
    — collect all sub-windows
    buttons = UIAccessor.GetChildWindows scriptHWND
    — iterate to find button we need
    for b in buttons do (
    if (UIAccessor.GetWindowText b) == btnText then (
    scriptBtnHWND = b
    exit
    )
    )
    — press it
    UIAccessor.PressButton scriptBtnHWND
    )

Извините, в данный момент комметарии закрыты.

© 2008 - 2018 3dyuriki.com
Для связи со мной 3dyuriki@gmail.com