From c14b8323dbc40cc4bf41712c52642e75ae391546 Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Fri, 6 May 2022 17:06:32 +0200 Subject: [PATCH 01/18] Add menu quad in hiero --- .../defaults/project_settings/hiero.json | 32 +++++++++++++++++++ .../projects_schema/schema_project_hiero.json | 4 +++ .../common/scriptsmenu/launchfornuke.py | 2 +- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/openpype/settings/defaults/project_settings/hiero.json b/openpype/settings/defaults/project_settings/hiero.json index 1dff3aac518..eb75aff6c09 100644 --- a/openpype/settings/defaults/project_settings/hiero.json +++ b/openpype/settings/defaults/project_settings/hiero.json @@ -1,4 +1,36 @@ { + "ext_mapping": { + "model": "hrox", + "mayaAscii": "hrox", + "camera": "hrox", + "rig": "hrox", + "workfile": "hrox", + "yetiRig": "hrox" + }, + "heiro-dirmap": { + "enabled": false, + "paths": { + "source-path": [], + "destination-path": [] + } + }, + "scriptsmenu": { + "name": "OpenPype Tools", + "definition": [ + { + "type": "action", + "command": "import openpype.hosts.hiero.api.commands as hiero; hiero.edit_shader_definitions()", + "sourcetype": "python", + "title": "Edit shader name definitions", + "tooltip": "Edit shader name definitions used in validation and renaming.", + "tags": [ + "pipeline", + "shader" + ] + } + ] + }, + "create": { "CreateShotClip": { "hierarchy": "{folder}/{sequence}", diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_hiero.json b/openpype/settings/entities/schemas/projects_schema/schema_project_hiero.json index f717eff7dd7..39721c641a0 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_hiero.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_hiero.json @@ -206,6 +206,10 @@ { "type": "schema", "name": "schema_publish_gui_filter" + }, + { + "type": "schema", + "name": "schema_maya_scriptsmenu" } ] } diff --git a/openpype/vendor/python/common/scriptsmenu/launchfornuke.py b/openpype/vendor/python/common/scriptsmenu/launchfornuke.py index 72302a79a61..4f65a8e3ae8 100644 --- a/openpype/vendor/python/common/scriptsmenu/launchfornuke.py +++ b/openpype/vendor/python/common/scriptsmenu/launchfornuke.py @@ -6,7 +6,7 @@ def _nuke_main_window(): """Return Nuke's main window""" for obj in QtWidgets.QApplication.topLevelWidgets(): if (obj.inherits('QMainWindow') and - obj.metaObject().className() == 'Foundry::UI::DockMainWindow'): + obj.metaObject().className() == 'Foundry::UI::DockMainWindow'): return obj raise RuntimeError('Could not find Nuke MainWindow instance') From 174c04a7f26dbe3c41c8c459222f97135fb4268d Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Fri, 6 May 2022 17:16:12 +0200 Subject: [PATCH 02/18] menu hiero --- .../common/scriptsmenu/launchforhiero.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 openpype/vendor/python/common/scriptsmenu/launchforhiero.py diff --git a/openpype/vendor/python/common/scriptsmenu/launchforhiero.py b/openpype/vendor/python/common/scriptsmenu/launchforhiero.py new file mode 100644 index 00000000000..8c3aa351264 --- /dev/null +++ b/openpype/vendor/python/common/scriptsmenu/launchforhiero.py @@ -0,0 +1,84 @@ +import logging + +import scriptsmenu +from .vendor.Qt import QtWidgets + +log = logging.getLogger(__name__) + + +def _hiero_main_window(): + """Return Nuke's main window""" + for obj in QtWidgets.QApplication.topLevelWidgets(): + if (obj.inherits('QMainWindow') and + obj.metaObject().className() == 'Foundry::UI::DockMainWindow'): + return obj + raise RuntimeError('Could not find HieroWindow instance') + + +def _hiero_main_menubar(): + """Retrieve the main menubar of the Nuke window""" + hiero_window = _hiero_main_window() + menubar = [i for i in hiero_window.children() if isinstance( + i, + QtWidgets.QMenuBar + )] + + assert len(menubar) == 1, "Error, could not find menu bar!" + return menubar[0] + + +def find_scripts_menu(title, parent): + """ + Check if the menu exists with the given title in the parent + + Args: + title (str): the title name of the scripts menu + + parent (QtWidgets.QMenuBar): the menubar to check + + Returns: + QtWidgets.QMenu or None + + """ + + menu = None + search = [i for i in parent.children() if + isinstance(i, scriptsmenu.ScriptsMenu) + and i.title() == title] + if search: + assert len(search) < 2, ("Multiple instances of menu '{}' " + "in menu bar".format(title)) + menu = search[0] + + return menu + + +def main(title="Scripts", parent=None, objectName=None): + """Build the main scripts menu in Maya + + Args: + title (str): name of the menu in the application + + parent (QtWidgets.QtMenuBar): the parent object for the menu + + objectName (str): custom objectName for scripts menu + + Returns: + scriptsmenu.ScriptsMenu instance + + """ + hieromainbar = parent or _hiero_main_menubar() + try: + # check menu already exists + menu = find_scripts_menu(title, hieromainbar) + if not menu: + log.info("Attempting to build menu ...") + object_name = objectName or title.lower() + menu = scriptsmenu.ScriptsMenu(title=title, + parent=hieromainbar, + objectName=object_name) + except Exception as e: + log.error(e) + return + + return menu From 3ea514f029085653a104b37dcae8b6d2cd6bf9cc Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Mon, 23 May 2022 15:11:56 +0200 Subject: [PATCH 03/18] add script menu --- openpype/hosts/hiero/api/menu.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/openpype/hosts/hiero/api/menu.py b/openpype/hosts/hiero/api/menu.py index e262abec001..d4e62c9e8ac 100644 --- a/openpype/hosts/hiero/api/menu.py +++ b/openpype/hosts/hiero/api/menu.py @@ -9,6 +9,7 @@ from openpype.tools.utils import host_tools from . import tags +from openpype.settings import get_project_settings log = Logger.get_logger(__name__) @@ -41,6 +42,7 @@ def menu_install(): Installing menu into Hiero """ + print("YOLOOOOOOOOOOOOOOOOOO") from Qt import QtGui from . import ( publish, launch_workfiles_app, reload_config, @@ -138,3 +140,32 @@ def menu_install(): exeprimental_action.triggered.connect( lambda: host_tools.show_experimental_tools_dialog(parent=main_window) ) + + +def add_scripts_menu(): + try: + from scriptsmenu import launchforhiero + except ImportError: + log.warning( + "Skipping studio.menu install, because " + "'scriptsmenu' module seems unavailable." + ) + return + + # load configuration of custom menu + project_settings = get_project_settings(os.getenv("AVALON_PROJECT")) + config = project_settings["hiero"]["scriptsmenu"]["definition"] + _menu = project_settings["hiero"]["scriptsmenu"]["name"] + + if not config: + log.warning("Skipping studio menu, no definition found.") + return + + # run the launcher for Maya menu + studio_menu = launchforhiero.main(title=_menu.title()) + + # apply configuration + studio_menu.build_from_configuration(studio_menu, config) + + +add_scripts_menu() From 4c9cd18f1cce331d4e434c531775450cab5b0b71 Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Mon, 23 May 2022 15:13:36 +0200 Subject: [PATCH 04/18] clen print --- openpype/hosts/hiero/api/menu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/hiero/api/menu.py b/openpype/hosts/hiero/api/menu.py index d4e62c9e8ac..9e999da2f67 100644 --- a/openpype/hosts/hiero/api/menu.py +++ b/openpype/hosts/hiero/api/menu.py @@ -42,7 +42,7 @@ def menu_install(): Installing menu into Hiero """ - print("YOLOOOOOOOOOOOOOOOOOO") + from Qt import QtGui from . import ( publish, launch_workfiles_app, reload_config, From 0e3607805925eaa1fc7ad9bc0e17f0144081a71d Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Mon, 23 May 2022 15:47:29 +0200 Subject: [PATCH 05/18] nothing change --- openpype/settings/defaults/project_settings/hiero.json | 2 +- openpype/vendor/python/common/scriptsmenu/launchforhiero.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/settings/defaults/project_settings/hiero.json b/openpype/settings/defaults/project_settings/hiero.json index eb75aff6c09..cec4bca8fd2 100644 --- a/openpype/settings/defaults/project_settings/hiero.json +++ b/openpype/settings/defaults/project_settings/hiero.json @@ -7,7 +7,7 @@ "workfile": "hrox", "yetiRig": "hrox" }, - "heiro-dirmap": { + "hiero-dirmap": { "enabled": false, "paths": { "source-path": [], diff --git a/openpype/vendor/python/common/scriptsmenu/launchforhiero.py b/openpype/vendor/python/common/scriptsmenu/launchforhiero.py index 8c3aa351264..3f8e726083b 100644 --- a/openpype/vendor/python/common/scriptsmenu/launchforhiero.py +++ b/openpype/vendor/python/common/scriptsmenu/launchforhiero.py @@ -7,6 +7,7 @@ def _hiero_main_window(): + print("YEAAAAAAAAAAAAAAAAAAAH") """Return Nuke's main window""" for obj in QtWidgets.QApplication.topLevelWidgets(): if (obj.inherits('QMainWindow') and From 6ee781c8a6b4701f6166a877eda4e43b9a76e454 Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Tue, 7 Jun 2022 17:00:53 +0200 Subject: [PATCH 06/18] change launcher for api folder --- openpype/hosts/hiero/api/launchforhiero.py | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 openpype/hosts/hiero/api/launchforhiero.py diff --git a/openpype/hosts/hiero/api/launchforhiero.py b/openpype/hosts/hiero/api/launchforhiero.py new file mode 100644 index 00000000000..3f8e726083b --- /dev/null +++ b/openpype/hosts/hiero/api/launchforhiero.py @@ -0,0 +1,85 @@ +import logging + +import scriptsmenu +from .vendor.Qt import QtWidgets + +log = logging.getLogger(__name__) + + +def _hiero_main_window(): + print("YEAAAAAAAAAAAAAAAAAAAH") + """Return Nuke's main window""" + for obj in QtWidgets.QApplication.topLevelWidgets(): + if (obj.inherits('QMainWindow') and + obj.metaObject().className() == 'Foundry::UI::DockMainWindow'): + return obj + raise RuntimeError('Could not find HieroWindow instance') + + +def _hiero_main_menubar(): + """Retrieve the main menubar of the Nuke window""" + hiero_window = _hiero_main_window() + menubar = [i for i in hiero_window.children() if isinstance( + i, + QtWidgets.QMenuBar + )] + + assert len(menubar) == 1, "Error, could not find menu bar!" + return menubar[0] + + +def find_scripts_menu(title, parent): + """ + Check if the menu exists with the given title in the parent + + Args: + title (str): the title name of the scripts menu + + parent (QtWidgets.QMenuBar): the menubar to check + + Returns: + QtWidgets.QMenu or None + + """ + + menu = None + search = [i for i in parent.children() if + isinstance(i, scriptsmenu.ScriptsMenu) + and i.title() == title] + if search: + assert len(search) < 2, ("Multiple instances of menu '{}' " + "in menu bar".format(title)) + menu = search[0] + + return menu + + +def main(title="Scripts", parent=None, objectName=None): + """Build the main scripts menu in Maya + + Args: + title (str): name of the menu in the application + + parent (QtWidgets.QtMenuBar): the parent object for the menu + + objectName (str): custom objectName for scripts menu + + Returns: + scriptsmenu.ScriptsMenu instance + + """ + hieromainbar = parent or _hiero_main_menubar() + try: + # check menu already exists + menu = find_scripts_menu(title, hieromainbar) + if not menu: + log.info("Attempting to build menu ...") + object_name = objectName or title.lower() + menu = scriptsmenu.ScriptsMenu(title=title, + parent=hieromainbar, + objectName=object_name) + except Exception as e: + log.error(e) + return + + return menu From 35a2c7dd13ddd3f0d780c60c0e492de676e92dcc Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Tue, 7 Jun 2022 17:27:33 +0200 Subject: [PATCH 07/18] revert vendor files --- .../common/scriptsmenu/launchforhiero.py | 85 ------------------- 1 file changed, 85 deletions(-) delete mode 100644 openpype/vendor/python/common/scriptsmenu/launchforhiero.py diff --git a/openpype/vendor/python/common/scriptsmenu/launchforhiero.py b/openpype/vendor/python/common/scriptsmenu/launchforhiero.py deleted file mode 100644 index 3f8e726083b..00000000000 --- a/openpype/vendor/python/common/scriptsmenu/launchforhiero.py +++ /dev/null @@ -1,85 +0,0 @@ -import logging - -import scriptsmenu -from .vendor.Qt import QtWidgets - -log = logging.getLogger(__name__) - - -def _hiero_main_window(): - print("YEAAAAAAAAAAAAAAAAAAAH") - """Return Nuke's main window""" - for obj in QtWidgets.QApplication.topLevelWidgets(): - if (obj.inherits('QMainWindow') and - obj.metaObject().className() == 'Foundry::UI::DockMainWindow'): - return obj - raise RuntimeError('Could not find HieroWindow instance') - - -def _hiero_main_menubar(): - """Retrieve the main menubar of the Nuke window""" - hiero_window = _hiero_main_window() - menubar = [i for i in hiero_window.children() if isinstance( - i, - QtWidgets.QMenuBar - )] - - assert len(menubar) == 1, "Error, could not find menu bar!" - return menubar[0] - - -def find_scripts_menu(title, parent): - """ - Check if the menu exists with the given title in the parent - - Args: - title (str): the title name of the scripts menu - - parent (QtWidgets.QMenuBar): the menubar to check - - Returns: - QtWidgets.QMenu or None - - """ - - menu = None - search = [i for i in parent.children() if - isinstance(i, scriptsmenu.ScriptsMenu) - and i.title() == title] - if search: - assert len(search) < 2, ("Multiple instances of menu '{}' " - "in menu bar".format(title)) - menu = search[0] - - return menu - - -def main(title="Scripts", parent=None, objectName=None): - """Build the main scripts menu in Maya - - Args: - title (str): name of the menu in the application - - parent (QtWidgets.QtMenuBar): the parent object for the menu - - objectName (str): custom objectName for scripts menu - - Returns: - scriptsmenu.ScriptsMenu instance - - """ - hieromainbar = parent or _hiero_main_menubar() - try: - # check menu already exists - menu = find_scripts_menu(title, hieromainbar) - if not menu: - log.info("Attempting to build menu ...") - object_name = objectName or title.lower() - menu = scriptsmenu.ScriptsMenu(title=title, - parent=hieromainbar, - objectName=object_name) - except Exception as e: - log.error(e) - return - - return menu From 4cf1edc3c39603be582d4e3a5013687d24718bf2 Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Tue, 7 Jun 2022 17:31:00 +0200 Subject: [PATCH 08/18] revert vendor files --- openpype/vendor/python/common/scriptsmenu/launchfornuke.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/vendor/python/common/scriptsmenu/launchfornuke.py b/openpype/vendor/python/common/scriptsmenu/launchfornuke.py index 4f65a8e3ae8..72302a79a61 100644 --- a/openpype/vendor/python/common/scriptsmenu/launchfornuke.py +++ b/openpype/vendor/python/common/scriptsmenu/launchfornuke.py @@ -6,7 +6,7 @@ def _nuke_main_window(): """Return Nuke's main window""" for obj in QtWidgets.QApplication.topLevelWidgets(): if (obj.inherits('QMainWindow') and - obj.metaObject().className() == 'Foundry::UI::DockMainWindow'): + obj.metaObject().className() == 'Foundry::UI::DockMainWindow'): return obj raise RuntimeError('Could not find Nuke MainWindow instance') From 5b83675a9b0684517d5bf0c0e5b47365bb1e2e67 Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Tue, 7 Jun 2022 17:54:18 +0200 Subject: [PATCH 09/18] change import in launch script --- openpype/hosts/hiero/api/launchforhiero.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/hiero/api/launchforhiero.py b/openpype/hosts/hiero/api/launchforhiero.py index 3f8e726083b..3d9328dc344 100644 --- a/openpype/hosts/hiero/api/launchforhiero.py +++ b/openpype/hosts/hiero/api/launchforhiero.py @@ -1,14 +1,13 @@ import logging import scriptsmenu -from .vendor.Qt import QtWidgets +from .api.Qt import QtWidgets log = logging.getLogger(__name__) def _hiero_main_window(): - print("YEAAAAAAAAAAAAAAAAAAAH") - """Return Nuke's main window""" + """Return Hiero's main window""" for obj in QtWidgets.QApplication.topLevelWidgets(): if (obj.inherits('QMainWindow') and obj.metaObject().className() == 'Foundry::UI::DockMainWindow'): @@ -17,7 +16,7 @@ def _hiero_main_window(): def _hiero_main_menubar(): - """Retrieve the main menubar of the Nuke window""" + """Retrieve the main menubar of the Hiero window""" hiero_window = _hiero_main_window() menubar = [i for i in hiero_window.children() if isinstance( i, @@ -55,7 +54,7 @@ def find_scripts_menu(title, parent): def main(title="Scripts", parent=None, objectName=None): - """Build the main scripts menu in Maya + """Build the main scripts menu in Hiero Args: title (str): name of the menu in the application From 6cd20e110f6613b1f8c246eb0b489852f3d9507e Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Tue, 7 Jun 2022 18:03:05 +0200 Subject: [PATCH 10/18] change path launch script --- openpype/hosts/hiero/api/launchforhiero.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/hiero/api/launchforhiero.py b/openpype/hosts/hiero/api/launchforhiero.py index 3d9328dc344..8b63b47c10e 100644 --- a/openpype/hosts/hiero/api/launchforhiero.py +++ b/openpype/hosts/hiero/api/launchforhiero.py @@ -1,7 +1,7 @@ import logging import scriptsmenu -from .api.Qt import QtWidgets +from .openpype.vendor.python.common.scriptsmenu.vendor.Qt import QtWidgets log = logging.getLogger(__name__) From 6741b9e6336eb4a1b5d1fc837f021c4d45942b5d Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Wed, 8 Jun 2022 17:33:10 +0200 Subject: [PATCH 11/18] modif launch menu hiero --- openpype/hosts/hiero/api/launchforhiero.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/hiero/api/launchforhiero.py b/openpype/hosts/hiero/api/launchforhiero.py index 8b63b47c10e..5c230eb9fed 100644 --- a/openpype/hosts/hiero/api/launchforhiero.py +++ b/openpype/hosts/hiero/api/launchforhiero.py @@ -1,7 +1,8 @@ import logging -import scriptsmenu -from .openpype.vendor.python.common.scriptsmenu.vendor.Qt import QtWidgets +from openpype.vendor.python.common.scriptsmenu import scriptsmenu +from openpype.vendor.python.common.scriptsmenu.vendor.Qt import QtWidgets + log = logging.getLogger(__name__) From 373524b9dfd40592be4904694681c2ab508b5653 Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Wed, 8 Jun 2022 17:33:40 +0200 Subject: [PATCH 12/18] modif menu hiero --- openpype/hosts/hiero/api/menu.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/hiero/api/menu.py b/openpype/hosts/hiero/api/menu.py index 9e999da2f67..412f08272e5 100644 --- a/openpype/hosts/hiero/api/menu.py +++ b/openpype/hosts/hiero/api/menu.py @@ -144,8 +144,9 @@ def menu_install(): def add_scripts_menu(): try: - from scriptsmenu import launchforhiero + from . import launchforhiero except ImportError: + log.warning( "Skipping studio.menu install, because " "'scriptsmenu' module seems unavailable." From 1eb3a55cc3610e7f12b1fa28e61deb942ee57cf4 Mon Sep 17 00:00:00 2001 From: Ophelie Abbonato Date: Wed, 15 Jun 2022 09:58:56 +0200 Subject: [PATCH 13/18] change name string --- .../entities/schemas/projects_schema/schema_project_hiero.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_hiero.json b/openpype/settings/entities/schemas/projects_schema/schema_project_hiero.json index 39721c641a0..3108d2197eb 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_hiero.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_hiero.json @@ -209,7 +209,7 @@ }, { "type": "schema", - "name": "schema_maya_scriptsmenu" + "name": "schema_scriptsmenu" } ] } From 05e709ec065e7b7fe422e49225f5c2866028162b Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Tue, 28 Jun 2022 16:41:13 +0200 Subject: [PATCH 14/18] create default action in custom menu redirecting to openpype hiero doc --- openpype/settings/defaults/project_settings/hiero.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/openpype/settings/defaults/project_settings/hiero.json b/openpype/settings/defaults/project_settings/hiero.json index cec4bca8fd2..3b0127c24a0 100644 --- a/openpype/settings/defaults/project_settings/hiero.json +++ b/openpype/settings/defaults/project_settings/hiero.json @@ -19,14 +19,10 @@ "definition": [ { "type": "action", - "command": "import openpype.hosts.hiero.api.commands as hiero; hiero.edit_shader_definitions()", "sourcetype": "python", - "title": "Edit shader name definitions", - "tooltip": "Edit shader name definitions used in validation and renaming.", - "tags": [ - "pipeline", - "shader" - ] + "title": "OpenPype Docs", + "command": "import webbrowser;webbrowser.open(url='https://openpype.io/docs/artist_hosts_hiero')", + "tooltip": "Open the OpenPype Hiero user doc page" } ] }, From 397a3f7fc4ebfe02ca033f775208301432e9db38 Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Tue, 28 Jun 2022 17:21:09 +0200 Subject: [PATCH 15/18] add docs for hiero custom menu --- website/docs/admin_hosts_hiero.md | 9 +++++++++ website/docs/assets/hiero-admin_scriptsmenu.png | Bin 0 -> 23368 bytes website/sidebars.js | 1 + 3 files changed, 10 insertions(+) create mode 100644 website/docs/admin_hosts_hiero.md create mode 100644 website/docs/assets/hiero-admin_scriptsmenu.png diff --git a/website/docs/admin_hosts_hiero.md b/website/docs/admin_hosts_hiero.md new file mode 100644 index 00000000000..b75d8dee7df --- /dev/null +++ b/website/docs/admin_hosts_hiero.md @@ -0,0 +1,9 @@ +--- +id: admin_hosts_hiero +title: Hiero +sidebar_label: Hiero +--- + +## Custom Menu +You can add your custom tools menu into Hiero by extending definitions in **Hiero -> Scripts Menu Definition**. +![Custom menu definition](assets/hiero-admin_scriptsmenu.png) diff --git a/website/docs/assets/hiero-admin_scriptsmenu.png b/website/docs/assets/hiero-admin_scriptsmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..6de136a434e19f78fe871be147a8e5580f3af552 GIT binary patch literal 23368 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 J3MGrM{{f4=o! Date: Tue, 28 Jun 2022 17:26:54 +0200 Subject: [PATCH 16/18] refactor imports --- openpype/hosts/hiero/api/launchforhiero.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/hiero/api/launchforhiero.py b/openpype/hosts/hiero/api/launchforhiero.py index 5c230eb9fed..5f7dbe23c9e 100644 --- a/openpype/hosts/hiero/api/launchforhiero.py +++ b/openpype/hosts/hiero/api/launchforhiero.py @@ -1,7 +1,7 @@ import logging -from openpype.vendor.python.common.scriptsmenu import scriptsmenu -from openpype.vendor.python.common.scriptsmenu.vendor.Qt import QtWidgets +from scriptsmenu import scriptsmenu +from Qt import QtWidgets log = logging.getLogger(__name__) From 4781fc56b48b6f66dc33803c35ee7d9be56729ec Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Mon, 4 Jul 2022 12:50:39 +0200 Subject: [PATCH 17/18] remove the global scope add_scripts_menu call from menu.py and add it in the install function of pipeline.py --- openpype/hosts/hiero/api/menu.py | 5 +---- openpype/hosts/hiero/api/pipeline.py | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/hiero/api/menu.py b/openpype/hosts/hiero/api/menu.py index 412f08272e5..541a1f1f92f 100644 --- a/openpype/hosts/hiero/api/menu.py +++ b/openpype/hosts/hiero/api/menu.py @@ -162,11 +162,8 @@ def add_scripts_menu(): log.warning("Skipping studio menu, no definition found.") return - # run the launcher for Maya menu + # run the launcher for Hiero menu studio_menu = launchforhiero.main(title=_menu.title()) # apply configuration studio_menu.build_from_configuration(studio_menu, config) - - -add_scripts_menu() diff --git a/openpype/hosts/hiero/api/pipeline.py b/openpype/hosts/hiero/api/pipeline.py index 9b628ec70bc..b243a38b068 100644 --- a/openpype/hosts/hiero/api/pipeline.py +++ b/openpype/hosts/hiero/api/pipeline.py @@ -48,6 +48,7 @@ def install(): # install menu menu.menu_install() + menu.add_scripts_menu() # register hiero events events.register_hiero_events() From 6c658f7da3fdf9bf716d8adfaf17f69641e78d87 Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Mon, 4 Jul 2022 14:24:07 +0200 Subject: [PATCH 18/18] fix default json project_settings by setting defaults through run_settings UI --- .../defaults/project_settings/hiero.json | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/openpype/settings/defaults/project_settings/hiero.json b/openpype/settings/defaults/project_settings/hiero.json index 3b0127c24a0..e9e71993301 100644 --- a/openpype/settings/defaults/project_settings/hiero.json +++ b/openpype/settings/defaults/project_settings/hiero.json @@ -1,32 +1,4 @@ { - "ext_mapping": { - "model": "hrox", - "mayaAscii": "hrox", - "camera": "hrox", - "rig": "hrox", - "workfile": "hrox", - "yetiRig": "hrox" - }, - "hiero-dirmap": { - "enabled": false, - "paths": { - "source-path": [], - "destination-path": [] - } - }, - "scriptsmenu": { - "name": "OpenPype Tools", - "definition": [ - { - "type": "action", - "sourcetype": "python", - "title": "OpenPype Docs", - "command": "import webbrowser;webbrowser.open(url='https://openpype.io/docs/artist_hosts_hiero')", - "tooltip": "Open the OpenPype Hiero user doc page" - } - ] - }, - "create": { "CreateShotClip": { "hierarchy": "{folder}/{sequence}", @@ -79,5 +51,17 @@ ] } }, - "filters": {} + "filters": {}, + "scriptsmenu": { + "name": "OpenPype Tools", + "definition": [ + { + "type": "action", + "sourcetype": "python", + "title": "OpenPype Docs", + "command": "import webbrowser;webbrowser.open(url='https://openpype.io/docs/artist_hosts_hiero')", + "tooltip": "Open the OpenPype Hiero user doc page" + } + ] + } } \ No newline at end of file