Update
This commit is contained in:
200
2023/scripts/rigging_tools/ngskintools2/ui/hotkeys_setup.py
Normal file
200
2023/scripts/rigging_tools/ngskintools2/ui/hotkeys_setup.py
Normal file
@@ -0,0 +1,200 @@
|
||||
"""
|
||||
Maya internals dissection, comments are ours. similar example available in "command|hotkey code", see "Here's an example
|
||||
of how to create runtimeCommand with a certain hotkey context"
|
||||
|
||||
|
||||
```
|
||||
|
||||
// add new hotkey ctx
|
||||
// t: Specifies the context type. It's used together with the other flags such as "currentClient", "addClient",
|
||||
// "removeClient" and so on.
|
||||
// ac: Associates a client to the given hotkey context type. This flag needs to be used with the flag "type" which
|
||||
// specifies the context type.
|
||||
hotkeyCtx -t "Tool" -ac "sculptMeshCache";
|
||||
|
||||
// create new runtime command, associate with created context
|
||||
runTimeCommand -default true
|
||||
-annotation (uiRes("m_defaultRunTimeCommands.kModifySizePressAnnot"))
|
||||
-category ("Other items.Brush Tools")
|
||||
-command ("if ( `contextInfo -ex sculptMeshCacheContext`) sculptMeshCacheCtx -e -adjustSize 1 sculptMeshCacheContext;")
|
||||
-hotkeyCtx ("sculptMeshCache")
|
||||
SculptMeshActivateBrushSize;
|
||||
|
||||
// create named command for the runtime command
|
||||
nameCommand
|
||||
-annotation "Start adjust size"
|
||||
-command ("SculptMeshActivateBrushSize")
|
||||
SculptMeshActivateBrushSizeNameCommand;
|
||||
|
||||
// assign hotkey for name command
|
||||
hotkey -keyShortcut "b" -name ("SculptMeshActivateBrushSizeNameCommand") -releaseName ("SculptMeshDeactivateBrushSizeNameCommand");
|
||||
```
|
||||
|
||||
"""
|
||||
|
||||
from maya import cmds
|
||||
|
||||
from ngSkinTools2.api.log import getLogger
|
||||
from ngSkinTools2.api.python_compatibility import is_string
|
||||
|
||||
from . import hotkeys
|
||||
|
||||
hotkeySetName = 'ngSkinTools2'
|
||||
context = 'ngst2PaintContext'
|
||||
command_prefix = "ngskintools_2_" # maya breaks command name on capital letters and before numbers, so this will ensure that all command names start with "ngskintools 2 "
|
||||
|
||||
log = getLogger("hotkeys setup")
|
||||
|
||||
|
||||
def uninstall_hotkeys():
|
||||
if cmds.hotkeySet(hotkeySetName, q=True, exists=True):
|
||||
cmds.hotkeySet(hotkeySetName, e=True, delete=True)
|
||||
|
||||
|
||||
def setup_named_commands():
|
||||
# "default" mode will force a read-only behavior for runTimCommands
|
||||
# only turn this on for production mode
|
||||
import ngSkinTools2
|
||||
|
||||
append_only_mode = not ngSkinTools2.DEBUG_MODE
|
||||
|
||||
def add_command(name, annotation, command, context=None):
|
||||
if not is_string(command):
|
||||
command = function_link(command)
|
||||
|
||||
runtime_command_name = command_prefix + name
|
||||
|
||||
# delete (if exists) and recreate runtime command
|
||||
if not append_only_mode and cmds.runTimeCommand(runtime_command_name, q=True, exists=True):
|
||||
cmds.runTimeCommand(runtime_command_name, e=True, delete=True)
|
||||
|
||||
if not cmds.runTimeCommand(runtime_command_name, q=True, exists=True):
|
||||
additional_args = {}
|
||||
if context is not None:
|
||||
additional_args['hotkeyCtx'] = context
|
||||
|
||||
cmds.runTimeCommand(
|
||||
runtime_command_name,
|
||||
category="Other items.ngSkinTools2",
|
||||
default=append_only_mode,
|
||||
annotation=annotation,
|
||||
command=command,
|
||||
commandLanguage="python",
|
||||
**additional_args
|
||||
)
|
||||
|
||||
cmds.nameCommand(
|
||||
command_prefix + name + "NameCommand",
|
||||
annotation=annotation + "-",
|
||||
sourceType="python",
|
||||
default=append_only_mode,
|
||||
command=runtime_command_name,
|
||||
)
|
||||
|
||||
def add_toggle(name, annotation, command_on, command_off, context=None):
|
||||
add_command(name + 'On', annotation=annotation, command=command_on, context=context)
|
||||
add_command(name + 'Off', annotation=annotation + "(release)", command=command_off, context=context)
|
||||
|
||||
add_toggle(
|
||||
'BrushSize',
|
||||
annotation='Toggle brush size mode',
|
||||
command_on=hotkeys.paint_tool_brush_size,
|
||||
command_off=hotkeys.paint_tool_brush_size_release,
|
||||
context=context,
|
||||
)
|
||||
|
||||
add_command('ToggleHelp', annotation='toggle help', command=hotkeys.paint_tool_toggle_help, context=context)
|
||||
add_command('ViewFitInfluence', annotation='fit influence in view', command=hotkeys.paint_tool_focus_current_influence, context=context)
|
||||
add_toggle(
|
||||
'SampleInfluence',
|
||||
annotation='Sample influence',
|
||||
command_on=hotkeys.paint_tool_sample_influence,
|
||||
command_off=hotkeys.paint_tool_sample_influence_release,
|
||||
context=context,
|
||||
)
|
||||
|
||||
add_command("SetBrushIntensity", annotation="set brush intensity", command=hotkeys.select_paint_brush_intensity, context=context)
|
||||
add_command("PaintFlood", annotation="apply current brush to all vertices", command=hotkeys.paint_tool_flood, context=context)
|
||||
|
||||
add_command("Paint", annotation="start paint tool", command=hotkeys.paint_tool_start)
|
||||
add_command(
|
||||
"ToggleOriginalMesh",
|
||||
annotation="toggle between weights display and original mesh while painting",
|
||||
command=hotkeys.paint_tool_toggle_original_mesh,
|
||||
)
|
||||
add_command(
|
||||
"CycleWeightsDisplayMode",
|
||||
annotation='Cycle weights display mode "all influences" -> "current influence" -> "current influence colored"',
|
||||
command=hotkeys.paint_tool_cycle_weights_display_mode,
|
||||
)
|
||||
|
||||
|
||||
def define_hotkeys():
|
||||
setup_named_commands()
|
||||
|
||||
def nc(name_command_short_name):
|
||||
return command_prefix + name_command_short_name + "NameCommand"
|
||||
|
||||
# cmds.hotkey(k="b", name=nc("BrushSizeOn"), releaseName=nc("BrushSizeOff"))
|
||||
cmds.hotkey(keyShortcut="b", name=nc("BrushSizeOn"), releaseName=nc("BrushSizeOff"))
|
||||
cmds.hotkey(keyShortcut="i", name=nc("SetBrushIntensity"))
|
||||
cmds.hotkey(keyShortcut="f", ctrlModifier=True, name=nc("PaintFlood"))
|
||||
cmds.hotkey(keyShortcut="f", name=nc("ViewFitInfluence"))
|
||||
cmds.hotkey(keyShortcut="h", name=nc("ToggleHelp"))
|
||||
|
||||
cmds.hotkey(keyShortcut="s", name=nc("SampleInfluenceOn"), releaseName=nc("SampleInfluenceOff"))
|
||||
cmds.hotkey(keyShortcut="d", name=nc("CycleWeightsDisplayMode"))
|
||||
cmds.hotkey(keyShortcut="t", name=nc("ToggleOriginalMesh"))
|
||||
|
||||
|
||||
def install_hotkeys():
|
||||
uninstall_hotkeys()
|
||||
|
||||
__hotkey_set_handler.remember()
|
||||
try:
|
||||
if cmds.hotkeySet(hotkeySetName, q=True, exists=True):
|
||||
cmds.hotkeySet(hotkeySetName, e=True, current=True)
|
||||
else:
|
||||
cmds.hotkeySet(hotkeySetName, current=True)
|
||||
|
||||
cmds.hotkeyCtx(addClient=context, type='Tool')
|
||||
|
||||
define_hotkeys()
|
||||
finally:
|
||||
__hotkey_set_handler.restore()
|
||||
|
||||
|
||||
def function_link(fun):
|
||||
return "import {module}; {module}.{fn}()".format(module=fun.__module__, fn=fun.__name__)
|
||||
|
||||
|
||||
class HotkeySetHandler:
|
||||
def __init__(self):
|
||||
log.info("initializing new hotkey set handler")
|
||||
self.prev_hotkey_set = None
|
||||
|
||||
def remember(self):
|
||||
if self.prev_hotkey_set is not None:
|
||||
return
|
||||
|
||||
log.info("remembering current hotkey set")
|
||||
self.prev_hotkey_set = cmds.hotkeySet(q=True, current=True)
|
||||
|
||||
def restore(self):
|
||||
if self.prev_hotkey_set is None:
|
||||
return
|
||||
|
||||
log.info("restoring previous hotkey set")
|
||||
cmds.hotkeySet(self.prev_hotkey_set, e=True, current=True)
|
||||
self.prev_hotkey_set = None
|
||||
|
||||
|
||||
__hotkey_set_handler = HotkeySetHandler()
|
||||
|
||||
|
||||
def toggle_paint_hotkey_set(enabled):
|
||||
if enabled:
|
||||
__hotkey_set_handler.remember()
|
||||
cmds.hotkeySet(hotkeySetName, e=True, current=True)
|
||||
else:
|
||||
__hotkey_set_handler.restore()
|
||||
Reference in New Issue
Block a user