From 569df95323db7c2d8d38393f7dc5790a3a5eaee1 Mon Sep 17 00:00:00 2001 From: Lawrence Schlosser Date: Thu, 5 Dec 2019 21:40:48 -0800 Subject: [PATCH 1/2] POC for Maya Conductor Module and conductor Menu This requires the user to set MAYA_MODULE_PATH=/maya_plugin --- conductor/lib/maya_utils.py | 118 +++++++++++++++++++++++++++++++ maya_plugin/conductor.mod | 1 + maya_plugin/icons | 1 + maya_plugin/scripts/conductor | 1 + maya_plugin/scripts/userSetup.py | 14 ++++ maya_shelf/shelf_Conductor.mel | 33 --------- 6 files changed, 135 insertions(+), 33 deletions(-) create mode 100644 maya_plugin/conductor.mod create mode 120000 maya_plugin/icons create mode 120000 maya_plugin/scripts/conductor create mode 100644 maya_plugin/scripts/userSetup.py delete mode 100644 maya_shelf/shelf_Conductor.mel diff --git a/conductor/lib/maya_utils.py b/conductor/lib/maya_utils.py index ef59ee6a..b79d0bd5 100644 --- a/conductor/lib/maya_utils.py +++ b/conductor/lib/maya_utils.py @@ -1373,6 +1373,124 @@ def get_node_by_type(node_type, must_exist=True, many=False): # Otherwise return an empty string return "" + +def build_conductor_menu(): + ''' + This is an encapsulated proof on concept of what a Conductor menu could look like. + + Build/inject Conductor's menu into maya's main window bar. Replace any existing instances of + the menu. + + +---------------------+ + | Submit | + | Clean Scene | + | ------------------- | + | Preferences > | + | Log Level > | + | ------------------- | + | About | + | Help | + +---------------------+ + + + Ignore below (scrap notes/code) + --------------------------------------------------------------------------- + https://ozh.github.io/ascii-tables/ + - header location: None + - Output style: ASCII (mysql style) + - Custome Separator: ~ + + Global vars of interest + $gMainWindowMenu + $gPreviousMenuMode + $gMainWindow + $gRenderingMenus + $gAnimationMenus + $gDynamicsMenus + $gMainRenderMenu + + + # MENU_SETS = ( + # "renderingMenuSet", + # "commonMenuSet", + # ) + # + # menu_sets = cmds.menuSet(allMenuSets=True) + # for menu_set in MENU_SETS: + # print "looking for %s menuset" % menu_set + # if menu_set in menu_sets: + # print "Found %s menuset" % menu_set + # break + # else: + # cmds.error("Failed to build conductor menu. Expected Menu Sets do not exist: %s", MENU_SETS) + # + # + # # cmds.menu(CONDUCTOR_MENU, label='Conductor', parent=MAYA_PARENT_WINDOW, tearOff=True) + # + # # Set the active menuset to the menuset we want to append to + # print "setting active menuset to %s" % menu_set + # cmds.setMenuMode(menu_set) + # cmds.menuSet(currentMenuSet=menu_set) + # + # print "adding menu to %s menuSet" % cmds.menuSet(q=True, currentMenuSet=True) + # cmds.menuSet(addMenu=CONDUCTOR_MENU) + ''' + + MAYA_PARENT_WINDOW = 'MayaWindow' + CONDUCTOR_MENU = 'ConductorMenu' + + if cmds.about(batch=True): + logger.debug("Batch mode detected. Aborting Conductor menu creation..") + return + + # Delete any existing instance of the menu + if cmds.menu(CONDUCTOR_MENU, q=True, exists=True): + cmds.menu(CONDUCTOR_MENU, e=True, deleteAllItems=True) + cmds.deleteUI(CONDUCTOR_MENU, ) + + cmds.menu(CONDUCTOR_MENU, label='Conductor', tearOff=True, parent=MAYA_PARENT_WINDOW) + cmds.menuItem( + label='Submit', + image="conductor_logo_white.png", + command="from conductor import submitter_maya;submitter_maya.MayaConductorSubmitter.runUi()", + parent=CONDUCTOR_MENU, + ) + + cmds.menuItem( + label='Clean Scene', + parent=CONDUCTOR_MENU, + ) + + # ------ Divider ---------------------------------------------------------- + cmds.menuItem(divider=True, parent=CONDUCTOR_MENU) + # ------------------------------------------------------------------------- + + cmds.menuItem( + label='Preferences', + subMenu=True, + parent=CONDUCTOR_MENU, + ) + cmds.menuItem( + label='Log Level', + subMenu=True, + parent=CONDUCTOR_MENU, + ) + + # ------ Divider ---------------------------------------------------------- + cmds.menuItem(divider=True, parent=CONDUCTOR_MENU) + # ------------------------------------------------------------------------- + + cmds.menuItem( + label='About', + parent=CONDUCTOR_MENU, + ) + + cmds.menuItem( + label='Help', + parent=CONDUCTOR_MENU, + ) + + # def get_plugins_info(): # plugins_info = [] # for PluginClass in PLUGIN_CLASSES: diff --git a/maya_plugin/conductor.mod b/maya_plugin/conductor.mod new file mode 100644 index 00000000..0bbd87e7 --- /dev/null +++ b/maya_plugin/conductor.mod @@ -0,0 +1 @@ ++ conductor any . diff --git a/maya_plugin/icons b/maya_plugin/icons new file mode 120000 index 00000000..db008688 --- /dev/null +++ b/maya_plugin/icons @@ -0,0 +1 @@ +../conductor/resources \ No newline at end of file diff --git a/maya_plugin/scripts/conductor b/maya_plugin/scripts/conductor new file mode 120000 index 00000000..712bbfcd --- /dev/null +++ b/maya_plugin/scripts/conductor @@ -0,0 +1 @@ +../../conductor \ No newline at end of file diff --git a/maya_plugin/scripts/userSetup.py b/maya_plugin/scripts/userSetup.py new file mode 100644 index 00000000..d680088b --- /dev/null +++ b/maya_plugin/scripts/userSetup.py @@ -0,0 +1,14 @@ + +import maya.cmds + +build_menu_cmd = ( + ''' +# Import full module path so not to conflict with user's other python packages (e.g. "maya_utils") +import conductor.lib.maya_utils + +# build/load Conductor's menu +conductor.lib.maya_utils.build_conductor_menu() +''' +) + +maya.cmds.evalDeferred(build_menu_cmd, lowestPriority=True) diff --git a/maya_shelf/shelf_Conductor.mel b/maya_shelf/shelf_Conductor.mel deleted file mode 100644 index 6de16076..00000000 --- a/maya_shelf/shelf_Conductor.mel +++ /dev/null @@ -1,33 +0,0 @@ -global proc shelf_Conductor () { - global string $gBuffStr; - global string $gBuffStr0; - global string $gBuffStr1; - - // Creates the actual shelf button - shelfButton - -enableCommandRepeat 1 - -enable 1 - -width 35 - -height 35 - -manage 1 - -visible 1 - -preventOverride 0 - -annotation "Load Conductor Submitter UI" - -enableBackground 0 - -align "center" - -label "Load UI" - -labelOffset 0 - -font "plainLabelFont" - -overlayLabelColor 0.8 0.8 0.8 - -overlayLabelBackColor 0 0 0 0.2 - -image "conductor_logo_white.png" - -image1 "conductor_logo_white.png" - -style "iconOnly" - -marginWidth 1 - -marginHeight 1 - -command "from conductor import submitter_maya\nsubmitter_maya.MayaConductorSubmitter.runUi()" - -sourceType "python" - -commandRepeatable 1 - -flat 1 - ; -} From 82253783c7b772bdffa080891627df7fd83eabcc Mon Sep 17 00:00:00 2001 From: Lawrence Schlosser Date: Fri, 6 Dec 2019 14:46:38 -0800 Subject: [PATCH 2/2] swapped out userSetup.py in favor of using maya's plugin registry. This has the benefit of giving customers greater control of whether they want conductor loaded or not. Note that this approach will NOT pollute the user's maya scene with Conductor dependencies/nodes (since conductor doesn't register any nodes/commands etc). --- conductor/lib/maya_utils.py | 79 +++++++++------------------ maya_plugin/conductor.mod | 1 - maya_plugin/conductorMaya.mod | 1 + maya_plugin/plug-ins/conductorMaya.py | 10 ++++ maya_plugin/scripts/userSetup.py | 14 ----- 5 files changed, 36 insertions(+), 69 deletions(-) delete mode 100644 maya_plugin/conductor.mod create mode 100644 maya_plugin/conductorMaya.mod create mode 100644 maya_plugin/plug-ins/conductorMaya.py delete mode 100644 maya_plugin/scripts/userSetup.py diff --git a/conductor/lib/maya_utils.py b/conductor/lib/maya_utils.py index b79d0bd5..a8558c31 100644 --- a/conductor/lib/maya_utils.py +++ b/conductor/lib/maya_utils.py @@ -13,6 +13,9 @@ # Conductor libs from conductor.lib import common, package_utils, file_utils +MAYA_PARENT_WINDOW = 'MayaWindow' +CONDUCTOR_MENU = 'ConductorMenu' + logger = logging.getLogger(__name__) @@ -1374,11 +1377,26 @@ def get_node_by_type(node_type, must_exist=True, many=False): return "" -def build_conductor_menu(): +def unload_conductor_menu(): + ''' + Remove/destroy the Conductor menu (if it exists) ''' - This is an encapsulated proof on concept of what a Conductor menu could look like. + if cmds.about(batch=True): + logger.debug("Batch mode detected. Aborting Conductor menu destruction..") + return + + # Delete any existing instance of the menu + if cmds.menu(CONDUCTOR_MENU, q=True, exists=True): + cmds.menu(CONDUCTOR_MENU, e=True, deleteAllItems=True) + cmds.deleteUI(CONDUCTOR_MENU, ) + logger.debug("Conductor menu destroyed") + - Build/inject Conductor's menu into maya's main window bar. Replace any existing instances of +def load_conductor_menu(): + ''' + This is a simple proof on concept of what a Conductor menu could look like. + + Build/inject Conductor's menu into maya's main window bar. Replace any existing instances of the menu. +---------------------+ @@ -1391,62 +1409,14 @@ def build_conductor_menu(): | About | | Help | +---------------------+ - - - Ignore below (scrap notes/code) - --------------------------------------------------------------------------- - https://ozh.github.io/ascii-tables/ - - header location: None - - Output style: ASCII (mysql style) - - Custome Separator: ~ - - Global vars of interest - $gMainWindowMenu - $gPreviousMenuMode - $gMainWindow - $gRenderingMenus - $gAnimationMenus - $gDynamicsMenus - $gMainRenderMenu - - - # MENU_SETS = ( - # "renderingMenuSet", - # "commonMenuSet", - # ) - # - # menu_sets = cmds.menuSet(allMenuSets=True) - # for menu_set in MENU_SETS: - # print "looking for %s menuset" % menu_set - # if menu_set in menu_sets: - # print "Found %s menuset" % menu_set - # break - # else: - # cmds.error("Failed to build conductor menu. Expected Menu Sets do not exist: %s", MENU_SETS) - # - # - # # cmds.menu(CONDUCTOR_MENU, label='Conductor', parent=MAYA_PARENT_WINDOW, tearOff=True) - # - # # Set the active menuset to the menuset we want to append to - # print "setting active menuset to %s" % menu_set - # cmds.setMenuMode(menu_set) - # cmds.menuSet(currentMenuSet=menu_set) - # - # print "adding menu to %s menuSet" % cmds.menuSet(q=True, currentMenuSet=True) - # cmds.menuSet(addMenu=CONDUCTOR_MENU) - ''' - - MAYA_PARENT_WINDOW = 'MayaWindow' - CONDUCTOR_MENU = 'ConductorMenu' + https://ozh.github.io/ascii-tables/ header location=None Output style=ASCII (mysql style) Custome Separator=~ + ''' if cmds.about(batch=True): logger.debug("Batch mode detected. Aborting Conductor menu creation..") return - # Delete any existing instance of the menu - if cmds.menu(CONDUCTOR_MENU, q=True, exists=True): - cmds.menu(CONDUCTOR_MENU, e=True, deleteAllItems=True) - cmds.deleteUI(CONDUCTOR_MENU, ) + unload_conductor_menu() cmds.menu(CONDUCTOR_MENU, label='Conductor', tearOff=True, parent=MAYA_PARENT_WINDOW) cmds.menuItem( @@ -1490,6 +1460,7 @@ def build_conductor_menu(): parent=CONDUCTOR_MENU, ) + logger.debug("Conductor menu created") # def get_plugins_info(): # plugins_info = [] diff --git a/maya_plugin/conductor.mod b/maya_plugin/conductor.mod deleted file mode 100644 index 0bbd87e7..00000000 --- a/maya_plugin/conductor.mod +++ /dev/null @@ -1 +0,0 @@ -+ conductor any . diff --git a/maya_plugin/conductorMaya.mod b/maya_plugin/conductorMaya.mod new file mode 100644 index 00000000..bc238ebc --- /dev/null +++ b/maya_plugin/conductorMaya.mod @@ -0,0 +1 @@ ++ conductorMaya any . diff --git a/maya_plugin/plug-ins/conductorMaya.py b/maya_plugin/plug-ins/conductorMaya.py new file mode 100644 index 00000000..53f1bf62 --- /dev/null +++ b/maya_plugin/plug-ins/conductorMaya.py @@ -0,0 +1,10 @@ + +from conductor.lib import maya_utils + + +def initializePlugin(plugin): + maya_utils.load_conductor_menu() + + +def uninitializePlugin(plugin): + maya_utils.unload_conductor_menu() diff --git a/maya_plugin/scripts/userSetup.py b/maya_plugin/scripts/userSetup.py deleted file mode 100644 index d680088b..00000000 --- a/maya_plugin/scripts/userSetup.py +++ /dev/null @@ -1,14 +0,0 @@ - -import maya.cmds - -build_menu_cmd = ( - ''' -# Import full module path so not to conflict with user's other python packages (e.g. "maya_utils") -import conductor.lib.maya_utils - -# build/load Conductor's menu -conductor.lib.maya_utils.build_conductor_menu() -''' -) - -maya.cmds.evalDeferred(build_menu_cmd, lowestPriority=True)