From 0bf351c55596adc2e69359d65036f5269c244690 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 22 Dec 2020 19:14:24 +0100 Subject: [PATCH 001/113] remove get_colorspace_preset --- pype/hosts/nuke/lib.py | 5 ++--- pype/hosts/nuke/presets.py | 9 ++------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/pype/hosts/nuke/lib.py b/pype/hosts/nuke/lib.py index 50b9697d8e..ce504e19de 100644 --- a/pype/hosts/nuke/lib.py +++ b/pype/hosts/nuke/lib.py @@ -12,7 +12,6 @@ import nuke from .presets import ( - get_colorspace_preset, get_node_dataflow_preset, get_node_colorspace_preset, get_anatomy @@ -734,7 +733,7 @@ class WorkfileSettings(object): continue # load nuke presets for Read's colorspace - read_clrs_presets = get_colorspace_preset().get( + read_clrs_presets = config.get_init_presets()["colorspace"].get( "nuke", {}).get("read", {}) # check if any colorspace presets for read is mathing @@ -775,7 +774,7 @@ class WorkfileSettings(object): def set_colorspace(self): ''' Setting colorpace following presets ''' - nuke_colorspace = get_colorspace_preset().get("nuke", None) + nuke_colorspace = config.get_init_presets()["colorspace"].get("nuke", None) try: self.set_root_colorspace(nuke_colorspace["root"]) diff --git a/pype/hosts/nuke/presets.py b/pype/hosts/nuke/presets.py index 2a296afc88..8015f8db64 100644 --- a/pype/hosts/nuke/presets.py +++ b/pype/hosts/nuke/presets.py @@ -11,12 +11,7 @@ def get_anatomy(**kwarg): def get_dataflow_preset(): presets = config.get_init_presets() return presets["dataflow"] - - -def get_colorspace_preset(): - presets = config.get_init_presets() - return presets["colorspace"] - + def get_node_dataflow_preset(**kwarg): ''' Get preset data for dataflow (fileType, compression, bitDepth) @@ -60,7 +55,7 @@ def get_node_colorspace_preset(**kwarg): log.error(msg) nuke.message(msg) - nuke_colorspace = get_colorspace_preset().get(str(host), None) + nuke_colorspace = config.get_init_presets()["colorspace"].get(str(host), None) nuke_colorspace_node = nuke_colorspace.get(str(cls), None) if preset: # omit < 2.0.0v From 4b1699f334f8d097aaceb598f58043df936615c8 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 22 Dec 2020 19:14:53 +0100 Subject: [PATCH 002/113] get anatomy directly in the nuke.lib --- pype/hosts/nuke/lib.py | 16 +++++++++++----- pype/hosts/nuke/presets.py | 4 ---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/pype/hosts/nuke/lib.py b/pype/hosts/nuke/lib.py index ce504e19de..920141bf37 100644 --- a/pype/hosts/nuke/lib.py +++ b/pype/hosts/nuke/lib.py @@ -6,20 +6,26 @@ from collections import OrderedDict from avalon import api, io, lib import avalon.nuke from avalon.nuke import lib as anlib -import pype.api as pype +from pype.api import ( + Logger, + get_version_from_path, + get_hierarchy, + get_asset, + Anatomy, + config +) import nuke from .presets import ( get_node_dataflow_preset, - get_node_colorspace_preset, - get_anatomy + get_node_colorspace_preset ) from .utils import set_context_favorites -log = pype.Logger().get_logger(__name__, "nuke") +log = pype.api.Logger().get_logger(__name__, "nuke") self = sys.modules[__name__] self._project = None @@ -170,7 +176,7 @@ def format_anatomy(data): ''' # TODO: perhaps should be nonPublic - anatomy = get_anatomy() + anatomy = Anatomy() log.debug("__ anatomy.templates: {}".format(anatomy.templates)) try: diff --git a/pype/hosts/nuke/presets.py b/pype/hosts/nuke/presets.py index 8015f8db64..dd780ff99e 100644 --- a/pype/hosts/nuke/presets.py +++ b/pype/hosts/nuke/presets.py @@ -4,10 +4,6 @@ import nuke log = Logger().get_logger(__name__, "nuke") -def get_anatomy(**kwarg): - return Anatomy() - - def get_dataflow_preset(): presets = config.get_init_presets() return presets["dataflow"] From 502833ccbe55dfda768d68e2c38af08d174ff2c6 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 22 Dec 2020 19:16:48 +0100 Subject: [PATCH 003/113] import explicitly from pype.api into nuke.lib --- pype/hosts/nuke/lib.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pype/hosts/nuke/lib.py b/pype/hosts/nuke/lib.py index 920141bf37..63cbd038d4 100644 --- a/pype/hosts/nuke/lib.py +++ b/pype/hosts/nuke/lib.py @@ -25,7 +25,7 @@ from .presets import ( from .utils import set_context_favorites -log = pype.api.Logger().get_logger(__name__, "nuke") +log = Logger().get_logger(__name__, "nuke") self = sys.modules[__name__] self._project = None @@ -93,7 +93,7 @@ def writes_version_sync(): ''' Callback synchronizing version of publishable write nodes ''' try: - rootVersion = pype.get_version_from_path(nuke.root().name()) + rootVersion = get_version_from_path(nuke.root().name()) padding = len(rootVersion) new_version = "v" + str("{" + ":0>{}".format(padding) + "}").format( int(rootVersion) @@ -118,7 +118,7 @@ def writes_version_sync(): node_file = each['file'].value() - node_version = "v" + pype.get_version_from_path(node_file) + node_version = "v" + get_version_from_path(node_file) log.debug("node_version: {}".format(node_version)) node_new_file = node_file.replace(node_version, new_version) @@ -199,7 +199,7 @@ def format_anatomy(data): version = data.get("version", None) if not version: file = script_name() - data["version"] = pype.get_version_from_path(file) + data["version"] = get_version_from_path(file) project_document = io.find_one({"type": "project"}) data.update({ "subset": data["avalon"]["subset"], @@ -210,7 +210,7 @@ def format_anatomy(data): "code": project_document["data"].get("code", '')}, "representation": data["nuke_dataflow_writes"]["file_type"], "app": data["application"]["application_dir"], - "hierarchy": pype.get_hierarchy(), + "hierarchy": get_hierarchy(), "frame": "#" * padding, }) return anatomy.format(data) @@ -547,7 +547,7 @@ class WorkfileSettings(object): self._project = kwargs.get( "project") or io.find_one({"type": "project"}) self._asset = kwargs.get("asset_name") or api.Session["AVALON_ASSET"] - self._asset_entity = pype.get_asset(self._asset) + self._asset_entity = get_asset(self._asset) self._root_node = root_node or nuke.root() self._nodes = self.get_nodes(nodes=nodes) @@ -980,7 +980,7 @@ class WorkfileSettings(object): # replace reset resolution from avalon core to pype's self.reset_frame_range_handles() # add colorspace menu item - self.set_colorspace() + # self.set_colorspace() def set_favorites(self): work_dir = os.getenv("AVALON_WORKDIR") From edc55874fb5a4414ea95f88bfd3e44b5c58cae78 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 22 Dec 2020 19:17:59 +0100 Subject: [PATCH 004/113] remove get_dataflow_preset --- pype/hosts/nuke/presets.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pype/hosts/nuke/presets.py b/pype/hosts/nuke/presets.py index dd780ff99e..a836327496 100644 --- a/pype/hosts/nuke/presets.py +++ b/pype/hosts/nuke/presets.py @@ -4,11 +4,6 @@ import nuke log = Logger().get_logger(__name__, "nuke") -def get_dataflow_preset(): - presets = config.get_init_presets() - return presets["dataflow"] - - def get_node_dataflow_preset(**kwarg): ''' Get preset data for dataflow (fileType, compression, bitDepth) ''' @@ -21,7 +16,7 @@ def get_node_dataflow_preset(**kwarg): assert any([host, cls]), nuke.message( "`{}`: Missing mandatory kwargs `host`, `cls`".format(__file__)) - nuke_dataflow = get_dataflow_preset().get(str(host), None) + nuke_dataflow = config.get_init_presets()["dataflow"].get(str(host), None) nuke_dataflow_nodes = nuke_dataflow.get('nodes', None) nuke_dataflow_node = nuke_dataflow_nodes.get(str(cls), None) From c89964d8bd6e69273ffdd24ece194c839455d42f Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 22 Dec 2020 19:38:55 +0100 Subject: [PATCH 005/113] remove presets.py and unify data and colour into imageio --- pype/hosts/nuke/lib.py | 59 ++++++++++++++++++++---------------- pype/hosts/nuke/presets.py | 61 -------------------------------------- 2 files changed, 33 insertions(+), 87 deletions(-) delete mode 100644 pype/hosts/nuke/presets.py diff --git a/pype/hosts/nuke/lib.py b/pype/hosts/nuke/lib.py index 63cbd038d4..e915ba0df9 100644 --- a/pype/hosts/nuke/lib.py +++ b/pype/hosts/nuke/lib.py @@ -9,6 +9,7 @@ from avalon.nuke import lib as anlib from pype.api import ( Logger, get_version_from_path, + get_anatomy_settings, get_hierarchy, get_asset, Anatomy, @@ -17,12 +18,6 @@ from pype.api import ( import nuke - -from .presets import ( - get_node_dataflow_preset, - get_node_colorspace_preset -) - from .utils import set_context_favorites log = Logger().get_logger(__name__, "nuke") @@ -31,6 +26,30 @@ self = sys.modules[__name__] self._project = None +def get_node_imageio_setting(**kwarg): + ''' Get preset data for dataflow (fileType, compression, bitDepth) + ''' + log.info(kwarg) + host = kwarg.get("host", "nuke") + class_name = kwarg.get("class", None) + families = kwarg.get("families", []) + project_name = os.getenv("AVALON_PROJECT") + + assert any([host, class_name]), nuke.message( + "`{}`: Missing mandatory kwargs `host`, `cls`".format(__file__)) + + nuke_imageio = get_anatomy_settings(project_name)["imageio"].get(str(host), None) + nuke_imageio_nodes = nuke_imageio.get('nodes', None) + nuke_imageio_node = nuke_imageio_nodes.get(str(class_name), None) + + if families: + for family in families: + nuke_imageio_node = nuke_imageio_node.get(str(family), None) + + log.info("Dataflow: {}".format(nuke_imageio_node)) + return nuke_imageio_node + + def on_script_load(): ''' Callback for ffmpeg support ''' @@ -151,14 +170,12 @@ def get_render_path(node): "preset": data['avalon']['families'] } - nuke_dataflow_writes = get_node_dataflow_preset(**data_preset) - nuke_colorspace_writes = get_node_colorspace_preset(**data_preset) + nuke_imageio_writes = get_node_imageio_setting(**data_preset) application = lib.get_application(os.environ["AVALON_APP_NAME"]) data.update({ "application": application, - "nuke_dataflow_writes": nuke_dataflow_writes, - "nuke_colorspace_writes": nuke_colorspace_writes + "nuke_imageio_writes": nuke_imageio_writes }) anatomy_filled = format_anatomy(data) @@ -261,15 +278,13 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): node (obj): group node with avalon data as Knobs ''' - nuke_dataflow_writes = get_node_dataflow_preset(**data) - nuke_colorspace_writes = get_node_colorspace_preset(**data) + nuke_imageio_writes = get_node_imageio_setting(**data) application = lib.get_application(os.environ["AVALON_APP_NAME"]) try: data.update({ "application": application, - "nuke_dataflow_writes": nuke_dataflow_writes, - "nuke_colorspace_writes": nuke_colorspace_writes + "nuke_imageio_writes": nuke_imageio_writes }) anatomy_filled = format_anatomy(data) @@ -283,7 +298,7 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): fpath = data["fpath_template"].format( work=fpath, version=data["version"], subset=data["subset"], frame=data["frame"], - ext=data["nuke_dataflow_writes"]["file_type"] + ext=data["nuke_imageio_writes"]["file_type"] ) # create directory @@ -301,10 +316,6 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): for k, v in nuke_dataflow_writes.items() if k not in ["_id", "_previous"]} - # adding colorspace template - log.debug("nuke_colorspace_writes: `{}`".format(nuke_colorspace_writes)) - {_data.update({k: v}) - for k, v in nuke_colorspace_writes.items()} _data = avalon.nuke.lib.fix_data_for_node_create(_data) @@ -1049,22 +1060,18 @@ def get_write_node_template_attr(node): } # get template data - nuke_dataflow_writes = get_node_dataflow_preset(**data_preset) - nuke_colorspace_writes = get_node_colorspace_preset(**data_preset) + nuke_imageio_writes = get_node_imageio_setting(**data_preset) # collecting correct data correct_data = OrderedDict({ "file": get_render_path(node) }) - # adding dataflow template + # adding imageio template {correct_data.update({k: v}) - for k, v in nuke_dataflow_writes.items() + for k, v in nuke_imageio_writes.items() if k not in ["_id", "_previous"]} - # adding colorspace template - {correct_data.update({k: v}) - for k, v in nuke_colorspace_writes.items()} # fix badly encoded data return avalon.nuke.lib.fix_data_for_node_create(correct_data) diff --git a/pype/hosts/nuke/presets.py b/pype/hosts/nuke/presets.py deleted file mode 100644 index a836327496..0000000000 --- a/pype/hosts/nuke/presets.py +++ /dev/null @@ -1,61 +0,0 @@ -from pype.api import Anatomy, config, Logger -import nuke - -log = Logger().get_logger(__name__, "nuke") - - -def get_node_dataflow_preset(**kwarg): - ''' Get preset data for dataflow (fileType, compression, bitDepth) - ''' - log.info(kwarg) - host = kwarg.get("host", "nuke") - cls = kwarg.get("class", None) - families = kwarg.get("families", []) - preset = kwarg.get("preset", None) # omit < 2.0.0v - - assert any([host, cls]), nuke.message( - "`{}`: Missing mandatory kwargs `host`, `cls`".format(__file__)) - - nuke_dataflow = config.get_init_presets()["dataflow"].get(str(host), None) - nuke_dataflow_nodes = nuke_dataflow.get('nodes', None) - nuke_dataflow_node = nuke_dataflow_nodes.get(str(cls), None) - - if preset: # omit < 2.0.0v - nuke_dataflow_node = nuke_dataflow_node.get(str(preset), None) - # omit < 2.0.0v - - if families: - for family in families: - nuke_dataflow_node = nuke_dataflow_node.get(str(family), None) - - log.info("Dataflow: {}".format(nuke_dataflow_node)) - return nuke_dataflow_node - - -def get_node_colorspace_preset(**kwarg): - ''' Get preset data for colorspace - ''' - log.info(kwarg) - host = kwarg.get("host", "nuke") - cls = kwarg.get("class", None) - families = kwarg.get("families", []) - preset = kwarg.get("preset", None) # omit < 2.0.0v - - if not any([host, cls]): - msg = "`{}`: Missing mandatory kwargs `host`, `cls`".format(__file__) - log.error(msg) - nuke.message(msg) - - nuke_colorspace = config.get_init_presets()["colorspace"].get(str(host), None) - nuke_colorspace_node = nuke_colorspace.get(str(cls), None) - - if preset: # omit < 2.0.0v - nuke_colorspace_node = nuke_colorspace_node.get(str(preset), None) - # omit < 2.0.0v - - if families: - for family in families: - nuke_colorspace_node = nuke_colorspace_node.get(str(family), None) - - log.info("Colorspace: {}".format(nuke_colorspace_node)) - return nuke_colorspace_node From 1f0b9ac2f0241f996105c037eee44ab38e64cc65 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 12:41:29 +0100 Subject: [PATCH 006/113] pass creator name to create data --- .../plugins/nuke/create/create_write_prerender.py | 15 +++++++++------ pype/plugins/nuke/create/create_write_render.py | 13 +++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/pype/plugins/nuke/create/create_write_prerender.py b/pype/plugins/nuke/create/create_write_prerender.py index 2243ba8b5c..44b01f4bcd 100644 --- a/pype/plugins/nuke/create/create_write_prerender.py +++ b/pype/plugins/nuke/create/create_write_prerender.py @@ -1,7 +1,7 @@ from collections import OrderedDict -from pype.hosts.nuke import ( +from pype.hosts.nuke.api import ( plugin, - lib as pnlib) + lib) import nuke @@ -10,7 +10,7 @@ class CreateWritePrerender(plugin.PypeCreator): name = "WritePrerender" label = "Create Write Prerender" hosts = ["nuke"] - n_class = "write" + n_class = "Write" family = "prerender" icon = "sign-out" defaults = ["Key01", "Bg01", "Fg01", "Branch01", "Part01"] @@ -75,9 +75,10 @@ class CreateWritePrerender(plugin.PypeCreator): # recreate new write_data = { - "class": self.n_class, + "nodeclass": self.n_class, "families": [self.family], - "avalon": self.data + "avalon": self.data, + "creator": self.__class__.__name__ } if self.presets.get('fpath_template'): @@ -90,8 +91,10 @@ class CreateWritePrerender(plugin.PypeCreator): write_data.update({ "fpath_template": ("{work}/prerenders/nuke/{subset}" "/{subset}.{frame}.{ext}")}) + + self.log.info("write_data: {}".format(write_data)) - write_node = pnlib.create_write_node( + write_node = lib.create_write_node( self.data["subset"], write_data, input=selected_node, diff --git a/pype/plugins/nuke/create/create_write_render.py b/pype/plugins/nuke/create/create_write_render.py index 5a6bf57197..3876ba5806 100644 --- a/pype/plugins/nuke/create/create_write_render.py +++ b/pype/plugins/nuke/create/create_write_render.py @@ -1,7 +1,7 @@ from collections import OrderedDict -from pype.hosts.nuke import ( +from pype.hosts.nuke.api import ( plugin, - lib as pnlib) + lib) import nuke @@ -10,7 +10,7 @@ class CreateWriteRender(plugin.PypeCreator): name = "WriteRender" label = "Create Write Render" hosts = ["nuke"] - n_class = "write" + n_class = "Write" family = "render" icon = "sign-out" defaults = ["Main", "Mask"] @@ -76,9 +76,10 @@ class CreateWriteRender(plugin.PypeCreator): # recreate new write_data = { - "class": self.n_class, + "nodeclass": self.n_class, "families": [self.family], - "avalon": self.data + "avalon": self.data, + "creator": self.__class__.__name__ } if self.presets.get('fpath_template'): @@ -92,7 +93,7 @@ class CreateWriteRender(plugin.PypeCreator): "fpath_template": ("{work}/renders/nuke/{subset}" "/{subset}.{frame}.{ext}")}) - write_node = pnlib.create_write_node( + write_node = lib.create_write_node( self.data["subset"], write_data, input=selected_node) From 22dece8e0be6c17af770ff9d2d79bf7c21dc1c77 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 12:42:00 +0100 Subject: [PATCH 007/113] fix read node creator --- pype/plugins/nuke/create/create_read.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pype/plugins/nuke/create/create_read.py b/pype/plugins/nuke/create/create_read.py index 70db580a7e..072d234b32 100644 --- a/pype/plugins/nuke/create/create_read.py +++ b/pype/plugins/nuke/create/create_read.py @@ -44,7 +44,8 @@ class CrateRead(avalon.nuke.Creator): continue avalon_data = self.data avalon_data['subset'] = "{}".format(self.name) - self.change_read_node(self.data["subset"], node, avalon_data) + avalon.nuke.lib.imprint(node, avalon_data) + node['tile_color'].setValue(16744935) count_reads += 1 if count_reads < 1: @@ -52,7 +53,3 @@ class CrateRead(avalon.nuke.Creator): self.log.error(msg) nuke.message(msg) return - - def change_read_node(self, name, node, data): - node = avalon.nuke.lib.imprint(node, data) - node['tile_color'].setValue(16744935) From 9a31f38e36ef3fe6f77bcbec011d4a1cda9fff7f Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 12:42:40 +0100 Subject: [PATCH 008/113] move nuke to hosts.nuke.api --- pype/api.py | 12 ++- pype/hosts/nuke/api/__init__.py | 142 ++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 pype/hosts/nuke/api/__init__.py diff --git a/pype/api.py b/pype/api.py index a2b4f22e72..e0cc8d4ab5 100644 --- a/pype/api.py +++ b/pype/api.py @@ -9,7 +9,7 @@ from .lib import ( PypeLogger, Anatomy, config, - execute + execute, ) from .lib.mongo import ( @@ -18,6 +18,14 @@ from .lib.mongo import ( get_default_components ) +from .lib.applications import ( + ApplicationManager +) + +from .lib.avalon_context import ( + BuildWorkfile +) + from . import resources from .plugin import ( @@ -68,6 +76,8 @@ __all__ = [ "decompose_url", "compose_url", "get_default_components", + "ApplicationManager", + "BuildWorkfile", # Resources "resources", diff --git a/pype/hosts/nuke/api/__init__.py b/pype/hosts/nuke/api/__init__.py new file mode 100644 index 0000000000..87c3e190e2 --- /dev/null +++ b/pype/hosts/nuke/api/__init__.py @@ -0,0 +1,142 @@ +import os +import sys +import logging + +import nuke + +from avalon import api as avalon +from avalon.tools import workfiles +from pyblish import api as pyblish +from pype.api import Logger +from pype import PLUGINS_DIR +from . import lib, menu + + +self = sys.modules[__name__] +self.workfiles_launched = False +log = Logger().get_logger(__name__, "nuke") + +AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") + +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "nuke", "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "nuke", "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "nuke", "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "nuke", "inventory") + + +# registering pyblish gui regarding settings in presets +if os.getenv("PYBLISH_GUI", None): + pyblish.register_gui(os.getenv("PYBLISH_GUI", None)) + + +def reload_config(): + """Attempt to reload pipeline at run-time. + + CAUTION: This is primarily for development and debugging purposes. + + """ + + import importlib + + for module in ( + "{}.api".format(AVALON_CONFIG), + "{}.hosts.nuke.actions".format(AVALON_CONFIG), + "{}.hosts.nuke.menu".format(AVALON_CONFIG), + "{}.hosts.nuke.plugin".format(AVALON_CONFIG), + "{}.hosts.nuke.lib".format(AVALON_CONFIG), + ): + log.info("Reloading module: {}...".format(module)) + + module = importlib.import_module(module) + + try: + importlib.reload(module) + except AttributeError as e: + log.warning("Cannot reload module: {}".format(e)) + reload(module) + + +def install(): + ''' Installing all requarements for Nuke host + ''' + + log.info("Registering Nuke plug-ins..") + pyblish.register_plugin_path(PUBLISH_PATH) + avalon.register_plugin_path(avalon.Loader, LOAD_PATH) + avalon.register_plugin_path(avalon.Creator, CREATE_PATH) + avalon.register_plugin_path(avalon.InventoryAction, INVENTORY_PATH) + + # Register Avalon event for workfiles loading. + # avalon.on("workio.open_file", lib.check_inventory_versions) + + # pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) + workfile_settings = lib.WorkfileSettings() + # Disable all families except for the ones we explicitly want to see + family_states = [ + "write", + "review", + "nukenodes" + "gizmo" + ] + + avalon.data["familiesStateDefault"] = False + avalon.data["familiesStateToggled"] = family_states + + # Workfiles. + launch_workfiles = os.environ.get("WORKFILES_STARTUP") + + if launch_workfiles: + nuke.addOnCreate(launch_workfiles_app, nodeClass="Root") + + # Set context settings. + # nuke.addOnCreate(workfile_settings.set_context_settings, nodeClass="Root") + # nuke.addOnCreate(workfile_settings.set_favorites, nodeClass="Root") + + menu.install() + + +def launch_workfiles_app(): + '''Function letting start workfiles after start of host + ''' + if not self.workfiles_launched: + self.workfiles_launched = True + workfiles.show(os.environ["AVALON_WORKDIR"]) + + +def uninstall(): + '''Uninstalling host's integration + ''' + log.info("Deregistering Nuke plug-ins..") + pyblish.deregister_plugin_path(PUBLISH_PATH) + avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) + avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) + + pyblish.deregister_callback("instanceToggled", on_pyblish_instance_toggled) + + + reload_config() + menu.uninstall() + + +def on_pyblish_instance_toggled(instance, old_value, new_value): + """Toggle node passthrough states on instance toggles.""" + + log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( + instance, old_value, new_value)) + + from avalon.nuke import ( + viewer_update_and_undo_stop, + add_publish_knob + ) + + # Whether instances should be passthrough based on new value + + with viewer_update_and_undo_stop(): + n = instance[0] + try: + n["publish"].value() + except ValueError: + n = add_publish_knob(n) + log.info(" `Publish` knob was added to write node..") + + n["publish"].setValue(new_value) From a18aab0dd166100e3dabdb111849850becaab454 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 12:42:54 +0100 Subject: [PATCH 009/113] make nuke into module --- pype/hosts/nuke/__init__.py | 144 ------------------------------------ 1 file changed, 144 deletions(-) diff --git a/pype/hosts/nuke/__init__.py b/pype/hosts/nuke/__init__.py index 787f69f635..e69de29bb2 100644 --- a/pype/hosts/nuke/__init__.py +++ b/pype/hosts/nuke/__init__.py @@ -1,144 +0,0 @@ -import os -import sys -import logging - -import nuke - -from avalon import api as avalon -from avalon.tools import workfiles -from pyblish import api as pyblish -from pype.hosts.nuke import menu -from pype.api import Logger -from pype import PLUGINS_DIR -from . import lib - - -self = sys.modules[__name__] -self.workfiles_launched = False -log = Logger().get_logger(__name__, "nuke") - -AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") - -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "nuke", "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "nuke", "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "nuke", "create") -INVENTORY_PATH = os.path.join(PLUGINS_DIR, "nuke", "inventory") - - -# registering pyblish gui regarding settings in presets -if os.getenv("PYBLISH_GUI", None): - pyblish.register_gui(os.getenv("PYBLISH_GUI", None)) - - -def reload_config(): - """Attempt to reload pipeline at run-time. - - CAUTION: This is primarily for development and debugging purposes. - - """ - - import importlib - - for module in ( - "{}.api".format(AVALON_CONFIG), - "{}.hosts.nuke.actions".format(AVALON_CONFIG), - "{}.hosts.nuke.presets".format(AVALON_CONFIG), - "{}.hosts.nuke.menu".format(AVALON_CONFIG), - "{}.hosts.nuke.plugin".format(AVALON_CONFIG), - "{}.hosts.nuke.lib".format(AVALON_CONFIG), - ): - log.info("Reloading module: {}...".format(module)) - - module = importlib.import_module(module) - - try: - importlib.reload(module) - except AttributeError as e: - log.warning("Cannot reload module: {}".format(e)) - reload(module) - - -def install(): - ''' Installing all requarements for Nuke host - ''' - - log.info("Registering Nuke plug-ins..") - pyblish.register_plugin_path(PUBLISH_PATH) - avalon.register_plugin_path(avalon.Loader, LOAD_PATH) - avalon.register_plugin_path(avalon.Creator, CREATE_PATH) - avalon.register_plugin_path(avalon.InventoryAction, INVENTORY_PATH) - - # Register Avalon event for workfiles loading. - avalon.on("workio.open_file", lib.check_inventory_versions) - - pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) - workfile_settings = lib.WorkfileSettings() - # Disable all families except for the ones we explicitly want to see - family_states = [ - "write", - "review", - "nukenodes" - "gizmo" - ] - - avalon.data["familiesStateDefault"] = False - avalon.data["familiesStateToggled"] = family_states - - # Workfiles. - launch_workfiles = os.environ.get("WORKFILES_STARTUP") - - if launch_workfiles: - nuke.addOnCreate(launch_workfiles_app, nodeClass="Root") - - # Set context settings. - nuke.addOnCreate(workfile_settings.set_context_settings, nodeClass="Root") - nuke.addOnCreate(workfile_settings.set_favorites, nodeClass="Root") - - menu.install() - - -def launch_workfiles_app(): - '''Function letting start workfiles after start of host - ''' - if not self.workfiles_launched: - self.workfiles_launched = True - workfiles.show(os.environ["AVALON_WORKDIR"]) - - -def uninstall(): - '''Uninstalling host's integration - ''' - log.info("Deregistering Nuke plug-ins..") - pyblish.deregister_plugin_path(PUBLISH_PATH) - avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) - avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) - - pyblish.deregister_callback("instanceToggled", on_pyblish_instance_toggled) - - - reload_config() - menu.uninstall() - - -def on_pyblish_instance_toggled(instance, old_value, new_value): - """Toggle node passthrough states on instance toggles.""" - - log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( - instance, old_value, new_value)) - - from avalon.nuke import ( - viewer_update_and_undo_stop, - add_publish_knob - ) - - # Whether instances should be passthrough based on new value - - with viewer_update_and_undo_stop(): - n = instance[0] - try: - n["publish"].value() - except ValueError: - n = add_publish_knob(n) - log.info(" `Publish` knob was added to write node..") - - n["publish"].setValue(new_value) From 97171eba213c3ab05524043cbb87a28ec50277cc Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 12:44:58 +0100 Subject: [PATCH 010/113] create writes with new avalon core --- pype/hosts/nuke/{ => api}/lib.py | 99 +++++++++++++++++++++----------- pype/hosts/nuke/api/plugin.py | 27 +++++++++ pype/hosts/nuke/plugin.py | 13 ----- 3 files changed, 91 insertions(+), 48 deletions(-) rename pype/hosts/nuke/{ => api}/lib.py (95%) create mode 100644 pype/hosts/nuke/api/plugin.py delete mode 100644 pype/hosts/nuke/plugin.py diff --git a/pype/hosts/nuke/lib.py b/pype/hosts/nuke/api/lib.py similarity index 95% rename from pype/hosts/nuke/lib.py rename to pype/hosts/nuke/api/lib.py index e915ba0df9..a42f27226e 100644 --- a/pype/hosts/nuke/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -5,17 +5,19 @@ from collections import OrderedDict from avalon import api, io, lib import avalon.nuke +import acre from avalon.nuke import lib as anlib from pype.api import ( Logger, + Anatomy, get_version_from_path, get_anatomy_settings, get_hierarchy, get_asset, - Anatomy, - config + config, + ApplicationManager ) - + import nuke from .utils import set_context_favorites @@ -30,24 +32,29 @@ def get_node_imageio_setting(**kwarg): ''' Get preset data for dataflow (fileType, compression, bitDepth) ''' log.info(kwarg) - host = kwarg.get("host", "nuke") - class_name = kwarg.get("class", None) - families = kwarg.get("families", []) + host = str(kwarg.get("host", "nuke")) + nodeclass = kwarg.get("nodeclass", None) + creator = kwarg.get("creator", None) project_name = os.getenv("AVALON_PROJECT") - assert any([host, class_name]), nuke.message( + assert any([host, nodeclass]), nuke.message( "`{}`: Missing mandatory kwargs `host`, `cls`".format(__file__)) - nuke_imageio = get_anatomy_settings(project_name)["imageio"].get(str(host), None) - nuke_imageio_nodes = nuke_imageio.get('nodes', None) - nuke_imageio_node = nuke_imageio_nodes.get(str(class_name), None) + imageio_nodes = (get_anatomy_settings(project_name) + ["imageio"] + .get(host, None) + ["nodes"] + ["requiredNodes"] + ) - if families: - for family in families: - nuke_imageio_node = nuke_imageio_node.get(str(family), None) + for node in imageio_nodes: + log.info(node) + if node["nukeNodeClass"] == nodeclass: + if creator in node["plugins"]: + imageio_node = node - log.info("Dataflow: {}".format(nuke_imageio_node)) - return nuke_imageio_node + log.info("ImageIO node: {}".format(imageio_node)) + return imageio_node def on_script_load(): @@ -77,7 +84,7 @@ def check_inventory_versions(): if container: node = container["_node"] - avalon_knob_data = avalon.nuke.get_avalon_knob_data( + avalon_knob_data = avalon.nuke.read( node, ['avalon:', 'ak:']) # get representation from io @@ -127,7 +134,7 @@ def writes_version_sync(): if "AvalonTab" not in each.knobs(): continue - avalon_knob_data = avalon.nuke.get_avalon_knob_data( + avalon_knob_data = avalon.nuke.read( each, ['avalon:', 'ak:']) try: @@ -158,11 +165,27 @@ def version_up_script(): nukescripts.script_and_write_nodes_version_up() +def check_subsetname_exists(nodes, subset_name): + """ + Checking if node is not already created to secure there is no duplicity + + Arguments: + nodes (list): list of nuke.Node objects + subset_name (str): name we try to find + + Returns: + bool: True of False + """ + result = next((True for n in nodes + if subset_name in avalon.nuke.read(n).get("subset", "")), False) + return result + + def get_render_path(node): ''' Generate Render path from presets regarding avalon knob data ''' data = dict() - data['avalon'] = avalon.nuke.get_avalon_knob_data( + data['avalon'] = avalon.nuke.read( node, ['avalon:', 'ak:']) data_preset = { @@ -212,7 +235,7 @@ def format_anatomy(data): log.error(msg) nuke.message(msg) - + version = data.get("version", None) if not version: file = script_name() @@ -221,12 +244,10 @@ def format_anatomy(data): data.update({ "subset": data["avalon"]["subset"], "asset": data["avalon"]["asset"], - "task": api.Session["AVALON_TASK"], + "task": os.environ["AVALON_TASK"], "family": data["avalon"]["family"], "project": {"name": project_document["name"], "code": project_document["data"].get("code", '')}, - "representation": data["nuke_dataflow_writes"]["file_type"], - "app": data["application"]["application_dir"], "hierarchy": get_hierarchy(), "frame": "#" * padding, }) @@ -278,18 +299,26 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): node (obj): group node with avalon data as Knobs ''' - nuke_imageio_writes = get_node_imageio_setting(**data) - application = lib.get_application(os.environ["AVALON_APP_NAME"]) + imageio_writes = get_node_imageio_setting(**data) + app_manager = ApplicationManager() + app_name = os.environ.get("AVALON_APP_NAME") + if app_name: + app = app_manager.applications.get(app_name) + + for knob in imageio_writes["knobs"]: + if knob["name"] == "file_type": + representation = knob["value"] try: data.update({ - "application": application, - "nuke_imageio_writes": nuke_imageio_writes + "app": app.host_name, + "imageio_writes": imageio_writes, + "representation": representation, }) anatomy_filled = format_anatomy(data) except Exception as e: - msg = "problem with resolving anatomy tepmlate: {}".format(e) + msg = "problem with resolving anatomy template: {}".format(e) log.error(msg) nuke.message(msg) @@ -298,7 +327,7 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): fpath = data["fpath_template"].format( work=fpath, version=data["version"], subset=data["subset"], frame=data["frame"], - ext=data["nuke_imageio_writes"]["file_type"] + ext=representation ) # create directory @@ -311,10 +340,10 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): }) # adding dataflow template - log.debug("nuke_dataflow_writes: `{}`".format(nuke_dataflow_writes)) - {_data.update({k: v}) - for k, v in nuke_dataflow_writes.items() - if k not in ["_id", "_previous"]} + log.debug("imageio_writes: `{}`".format(imageio_writes)) + for knob in imageio_writes["knobs"]: + if knob["name"] not in ["_id", "_previous"]: + _data.update({knob["name"]: knob["value"]}) _data = avalon.nuke.lib.fix_data_for_node_create(_data) @@ -694,7 +723,7 @@ class WorkfileSettings(object): log.error(msg) return - from avalon.nuke import get_avalon_knob_data + from avalon.nuke import read for node in nuke.allNodes(): @@ -702,7 +731,7 @@ class WorkfileSettings(object): continue # get data from avalon knob - avalon_knob_data = get_avalon_knob_data(node, ["avalon:", "ak:"]) + avalon_knob_data = read(node, ["avalon:", "ak:"]) if not avalon_knob_data: continue @@ -1051,7 +1080,7 @@ def get_write_node_template_attr(node): ''' # get avalon data from node data = dict() - data['avalon'] = avalon.nuke.get_avalon_knob_data( + data['avalon'] = avalon.nuke.read( node, ['avalon:', 'ak:']) data_preset = { "class": data['avalon']['family'], diff --git a/pype/hosts/nuke/api/plugin.py b/pype/hosts/nuke/api/plugin.py new file mode 100644 index 0000000000..1d8d137156 --- /dev/null +++ b/pype/hosts/nuke/api/plugin.py @@ -0,0 +1,27 @@ +import re +import avalon.api +import avalon.nuke +from pype.api import get_current_project_settings +from .lib import check_subsetname_exists + +import nuke + +class PypeCreator(avalon.nuke.pipeline.Creator): + """Pype Nuke Creator class wrapper + """ + def __init__(self, *args, **kwargs): + super(PypeCreator, self).__init__(*args, **kwargs) + self.presets = get_current_project_settings()["nuke"]["create"].get( + self.__class__.__name__, {} + ) + if check_subsetname_exists( + nuke.allNodes(), + self.data["subset"]): + msg = "The subset name `{0}` is already used on a node in" \ + "this workfile.".format(self.data["subset"]) + self.log.error(msg + '\n\nPlease use other subset name!') + raise NameError("`{0}: {1}".format(__name__, msg)) + return + + + diff --git a/pype/hosts/nuke/plugin.py b/pype/hosts/nuke/plugin.py deleted file mode 100644 index 5d00b19ec5..0000000000 --- a/pype/hosts/nuke/plugin.py +++ /dev/null @@ -1,13 +0,0 @@ -import re -import avalon.api -import avalon.nuke -from pype.api import get_current_project_settings - -class PypeCreator(avalon.nuke.pipeline.Creator): - """Pype Nuke Creator class wrapper - """ - def __init__(self, *args, **kwargs): - super(PypeCreator, self).__init__(*args, **kwargs) - self.presets = get_current_project_settings()["nuke"]["create"].get( - self.__class__.__name__, {} - ) From 8ae983d06aad7e204f1bbb6705689431e01e6a40 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 12:45:28 +0100 Subject: [PATCH 011/113] move nuke to nuke.api --- pype/hosts/nuke/{ => api}/actions.py | 2 +- pype/hosts/nuke/{ => api}/menu.py | 14 ++++++-------- pype/hosts/nuke/{ => api}/utils.py | 0 3 files changed, 7 insertions(+), 9 deletions(-) rename pype/hosts/nuke/{ => api}/actions.py (96%) rename pype/hosts/nuke/{ => api}/menu.py (83%) rename pype/hosts/nuke/{ => api}/utils.py (100%) diff --git a/pype/hosts/nuke/actions.py b/pype/hosts/nuke/api/actions.py similarity index 96% rename from pype/hosts/nuke/actions.py rename to pype/hosts/nuke/api/actions.py index 23242262c8..f5d5ffb143 100644 --- a/pype/hosts/nuke/actions.py +++ b/pype/hosts/nuke/api/actions.py @@ -5,7 +5,7 @@ from avalon.nuke.lib import ( select_nodes ) -from ...action import get_errored_instances_from_context +from pype.api import get_errored_instances_from_context class SelectInvalidAction(pyblish.api.Action): diff --git a/pype/hosts/nuke/menu.py b/pype/hosts/nuke/api/menu.py similarity index 83% rename from pype/hosts/nuke/menu.py rename to pype/hosts/nuke/api/menu.py index b1ef7f47c4..7bebbeeefc 100644 --- a/pype/hosts/nuke/menu.py +++ b/pype/hosts/nuke/api/menu.py @@ -1,9 +1,8 @@ import nuke from avalon.api import Session -from pype.hosts.nuke import lib -from ...lib import BuildWorkfile -from pype.api import Logger +from .lib import WorkfileSettings +from pype.api import Logger, BuildWorkfile log = Logger().get_logger(__name__, "nuke") @@ -11,7 +10,6 @@ log = Logger().get_logger(__name__, "nuke") def install(): menubar = nuke.menu("Nuke") menu = menubar.findItem(Session["AVALON_LABEL"]) - workfile_settings = lib.WorkfileSettings # replace reset resolution from avalon core to pype's name = "Reset Resolution" new_name = "Set Resolution" @@ -24,7 +22,7 @@ def install(): menu.removeItem(rm_item[1].name()) menu.addCommand( new_name, - lambda: workfile_settings().reset_resolution(), + lambda: WorkfileSettings().reset_resolution(), index=(rm_item[0]) ) @@ -39,14 +37,14 @@ def install(): menu.removeItem(rm_item[1].name()) menu.addCommand( new_name, - lambda: workfile_settings().reset_frame_range_handles(), + lambda: WorkfileSettings().reset_frame_range_handles(), index=(rm_item[0]) ) # add colorspace menu item name = "Set Colorspace" menu.addCommand( - name, lambda: workfile_settings().set_colorspace(), + name, lambda: WorkfileSettings().set_colorspace(), index=(rm_item[0] + 2) ) log.debug("Adding menu item: {}".format(name)) @@ -63,7 +61,7 @@ def install(): name = "Apply All Settings" menu.addCommand( name, - lambda: workfile_settings().set_context_settings(), + lambda: WorkfileSettings().set_context_settings(), index=(rm_item[0] + 3) ) log.debug("Adding menu item: {}".format(name)) diff --git a/pype/hosts/nuke/utils.py b/pype/hosts/nuke/api/utils.py similarity index 100% rename from pype/hosts/nuke/utils.py rename to pype/hosts/nuke/api/utils.py From e76fb5e8979ff65bf029e344c45e6f31f8ab20ce Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 12:46:15 +0100 Subject: [PATCH 012/113] temporarily point avalon-core to wip branch --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index 67270d7430..c78e83d4b8 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 67270d74304cf2dc86c9ea67b50c5524c259b019 +Subproject commit c78e83d4b8e6b409dbe5aafe5a7ec7725cb88145 From 367b0649f0203c6ca1483fd1538d81d7b1ca3f0c Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 12:47:12 +0100 Subject: [PATCH 013/113] move nuke to nuke.api and temp disable onscript callbacks --- setup/nuke/nuke_path/menu.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/setup/nuke/nuke_path/menu.py b/setup/nuke/nuke_path/menu.py index d9341045a9..3cfae8c7b1 100644 --- a/setup/nuke/nuke_path/menu.py +++ b/setup/nuke/nuke_path/menu.py @@ -2,7 +2,7 @@ import os import sys import KnobScripter -from pype.hosts.nuke.lib import ( +from pype.hosts.nuke.api.lib import ( writes_version_sync, on_script_load, check_inventory_versions @@ -14,10 +14,10 @@ from pype.api import Logger log = Logger().get_logger(__name__, "nuke") -# nuke.addOnScriptSave(writes_version_sync) -nuke.addOnScriptSave(on_script_load) -nuke.addOnScriptLoad(check_inventory_versions) -nuke.addOnScriptSave(check_inventory_versions) -# nuke.addOnScriptSave(writes_version_sync) +# nuke.addOnScriptSave(lib.writes_version_sync) +# nuke.addOnScriptSave(lib.on_script_load) +# nuke.addOnScriptLoad(lib.check_inventory_versions) +# nuke.addOnScriptSave(lib.check_inventory_versions) +# nuke.addOnScriptSave(lib.writes_version_sync) log.info('Automatic syncing of write file knob to script version') From fa6d0c395ae427d800fa96a74cb96db7074379da Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 14:25:27 +0100 Subject: [PATCH 014/113] load colorspace from anatomy settings --- pype/hosts/nuke/api/lib.py | 18 ++++++++++ pype/plugins/nuke/load/load_image.py | 15 +++------ pype/plugins/nuke/load/load_luts_ip.py | 2 +- pype/plugins/nuke/load/load_mov.py | 44 +++++++++++-------------- pype/plugins/nuke/load/load_sequence.py | 16 ++++----- 5 files changed, 49 insertions(+), 46 deletions(-) diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index a42f27226e..67f51daad5 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -57,6 +57,24 @@ def get_node_imageio_setting(**kwarg): return imageio_node +def get_imageio_input_colorspace(filename): + ''' Get input file colorspace based on regex in settings. + ''' + imageio_regex_inputs = (get_anatomy_settings(os.getenv("AVALON_PROJECT")) + ["imageio"] + ["nuke"] + ["regexInputs"] + ["inputs"] + ) + + preset_clrsp = None + for regexInput in imageio_regex_inputs: + if bool(re.search(regexInput["regex"], filename)): + preset_clrsp = str(regexInput["colorspace"]) + + return preset_clrsp + + def on_script_load(): ''' Callback for ffmpeg support ''' diff --git a/pype/plugins/nuke/load/load_image.py b/pype/plugins/nuke/load/load_image.py index 377d52aa14..ac54a90bc0 100644 --- a/pype/plugins/nuke/load/load_image.py +++ b/pype/plugins/nuke/load/load_image.py @@ -4,7 +4,9 @@ import nuke from avalon.vendor import qargparse from avalon import api, io -from pype.hosts.nuke import presets +from pype.hosts.nuke.api.lib import ( + get_imageio_input_colorspace +) class LoadImage(api.Loader): @@ -90,17 +92,10 @@ class LoadImage(api.Loader): if colorspace: r["colorspace"].setValue(str(colorspace)) - # load nuke presets for Read's colorspace - read_clrs_presets = presets.get_colorspace_preset().get( - "nuke", {}).get("read", {}) + preset_clrsp = get_imageio_input_colorspace(file) - # check if any colorspace presets for read is mathing - preset_clrsp = next((read_clrs_presets[k] - for k in read_clrs_presets - if bool(re.search(k, file))), - None) if preset_clrsp is not None: - r["colorspace"].setValue(str(preset_clrsp)) + r["colorspace"].setValue(preset_clrsp) r["origfirst"].setValue(first) r["first"].setValue(first) diff --git a/pype/plugins/nuke/load/load_luts_ip.py b/pype/plugins/nuke/load/load_luts_ip.py index 241e077659..1e2469055f 100644 --- a/pype/plugins/nuke/load/load_luts_ip.py +++ b/pype/plugins/nuke/load/load_luts_ip.py @@ -2,7 +2,7 @@ from avalon import api, style, io import nuke import json from collections import OrderedDict -from pype.hosts.nuke import lib +from pype.hosts.nuke.api import lib class LoadLutsInputProcess(api.Loader): diff --git a/pype/plugins/nuke/load/load_mov.py b/pype/plugins/nuke/load/load_mov.py index 104f59d5be..95bd780896 100644 --- a/pype/plugins/nuke/load/load_mov.py +++ b/pype/plugins/nuke/load/load_mov.py @@ -3,8 +3,11 @@ import nuke import contextlib from avalon import api, io -from pype.hosts.nuke import presets -from pype.api import get_project_settings +from pype.api import get_current_project_settings +from pype.hosts.nuke.api.lib import ( + get_imageio_input_colorspace +) + @contextlib.contextmanager @@ -73,12 +76,17 @@ def add_review_presets_config(): "families": list(), "representations": list() } - settings = get_project_settings(io.Session["AVALON_PROJECT"]) - review_presets = settings["global"]["publish"].get( - "ExtractReview", {}) + settings = get_current_project_settings() + review_profiles = (settings["global"] + ["publish"] + ["ExtractReview"] + ["profiles"] + ) - outputs = review_presets.get("outputs", {}) - # + outputs = {} + for profile in review_profiles: + outputs.update(profile.get("outputs", {})) + for output, properities in outputs.items(): returning["representations"].append(output) returning["families"] += properities.get("families", []) @@ -175,17 +183,10 @@ class LoadMov(api.Loader): if colorspace: read_node["colorspace"].setValue(str(colorspace)) - # load nuke presets for Read's colorspace - read_clrs_presets = presets.get_colorspace_preset().get( - "nuke", {}).get("read", {}) + preset_clrsp = get_imageio_input_colorspace(file) - # check if any colorspace presets for read is mathing - preset_clrsp = next((read_clrs_presets[k] - for k in read_clrs_presets - if bool(re.search(k, file))), - None) if preset_clrsp is not None: - read_node["colorspace"].setValue(str(preset_clrsp)) + read_node["colorspace"].setValue(preset_clrsp) # add additional metadata from the version to imprint Avalon knob add_keys = [ @@ -309,17 +310,10 @@ class LoadMov(api.Loader): if colorspace: node["colorspace"].setValue(str(colorspace)) - # load nuke presets for Read's colorspace - read_clrs_presets = presets.get_colorspace_preset().get( - "nuke", {}).get("read", {}) + preset_clrsp = get_imageio_input_colorspace(file) - # check if any colorspace presets for read is mathing - preset_clrsp = next((read_clrs_presets[k] - for k in read_clrs_presets - if bool(re.search(k, file))), - None) if preset_clrsp is not None: - node["colorspace"].setValue(str(preset_clrsp)) + r["colorspace"].setValue(preset_clrsp) updated_dict = {} updated_dict.update({ diff --git a/pype/plugins/nuke/load/load_sequence.py b/pype/plugins/nuke/load/load_sequence.py index 411aec6ad6..e3c0202395 100644 --- a/pype/plugins/nuke/load/load_sequence.py +++ b/pype/plugins/nuke/load/load_sequence.py @@ -1,9 +1,12 @@ import re +import os import nuke import contextlib from avalon import api, io -from pype.hosts.nuke import presets +from pype.hosts.nuke.api.lib import ( + get_imageio_input_colorspace +) @contextlib.contextmanager @@ -142,17 +145,10 @@ class LoadSequence(api.Loader): if colorspace: r["colorspace"].setValue(str(colorspace)) - # load nuke presets for Read's colorspace - read_clrs_presets = presets.get_colorspace_preset().get( - "nuke", {}).get("read", {}) + preset_clrsp = get_imageio_input_colorspace(file) - # check if any colorspace presets for read is mathing - preset_clrsp = next((read_clrs_presets[k] - for k in read_clrs_presets - if bool(re.search(k, file))), - None) if preset_clrsp is not None: - r["colorspace"].setValue(str(preset_clrsp)) + r["colorspace"].setValue(preset_clrsp) loader_shift(r, first, relative=True) r["origfirst"].setValue(int(first)) From 061cd28ee3b382e1411ca814dda17f52a795fd74 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 16:54:22 +0100 Subject: [PATCH 015/113] consolidate nuke host to a single host folder --- pype/hosts/nuke/api/__init__.py | 19 +++++++++++-------- .../nuke/plugins}/create/create_backdrop.py | 0 .../nuke/plugins}/create/create_camera.py | 0 .../nuke/plugins}/create/create_gizmo.py | 0 .../nuke/plugins}/create/create_read.py | 0 .../plugins}/create/create_write_prerender.py | 0 .../plugins}/create/create_write_render.py | 0 .../plugins}/inventory/select_containers.py | 0 .../nuke/plugins}/inventory/set_tool_color.py | 0 .../nuke/plugins}/load/actions.py | 0 .../nuke/plugins}/load/load_backdrop.py | 0 .../nuke/plugins}/load/load_camera_abc.py | 0 .../nuke/plugins}/load/load_gizmo.py | 0 .../nuke/plugins}/load/load_gizmo_ip.py | 0 .../nuke/plugins}/load/load_image.py | 0 .../nuke/plugins}/load/load_luts.py | 0 .../nuke/plugins}/load/load_luts_ip.py | 0 .../nuke/plugins}/load/load_matchmove.py | 0 .../nuke/plugins}/load/load_mov.py | 0 .../nuke/plugins}/load/load_script_precomp.py | 0 .../nuke/plugins}/load/load_sequence.py | 0 .../nuke/plugins}/publish/collect_backdrop.py | 0 .../plugins}/publish/collect_current_file.py | 0 .../plugins}/publish/collect_framerate.py | 0 .../nuke/plugins}/publish/collect_gizmo.py | 0 .../nuke/plugins}/publish/collect_host.py | 0 .../plugins}/publish/collect_host_version.py | 0 .../plugins}/publish/collect_instances.py | 0 .../plugins}/publish/collect_legacy_read.py | 0 .../nuke/plugins}/publish/collect_reads.py | 0 .../nuke/plugins}/publish/collect_review.py | 0 .../plugins}/publish/collect_selection.py | 0 .../plugins}/publish/collect_slate_node.py | 0 .../nuke/plugins}/publish/collect_workfile.py | 0 .../nuke/plugins}/publish/collect_writes.py | 0 .../nuke/plugins}/publish/extract_backdrop.py | 0 .../nuke/plugins}/publish/extract_camera.py | 0 .../nuke/plugins}/publish/extract_gizmo.py | 0 .../plugins}/publish/extract_ouput_node.py | 0 .../publish/extract_output_directory.py | 0 .../plugins}/publish/extract_render_local.py | 0 .../publish/extract_review_data_lut.py | 0 .../publish/extract_review_data_mov.py | 0 .../plugins}/publish/extract_script_save.py | 0 .../plugins}/publish/extract_slate_frame.py | 0 .../plugins}/publish/extract_thumbnail.py | 0 .../publish/increment_script_version.py | 0 .../plugins}/publish/remove_ouput_node.py | 0 .../plugins}/publish/submit_nuke_deadline.py | 0 .../plugins}/publish/validate_backdrop.py | 0 .../nuke/plugins}/publish/validate_gizmo.py | 0 .../nuke/plugins}/publish/validate_knobs.py | 0 .../publish/validate_output_resolution.py | 0 .../plugins}/publish/validate_read_legacy.py | 0 .../publish/validate_rendered_frames.py | 0 .../nuke/plugins}/publish/validate_script.py | 0 .../publish/validate_write_bounding_box.py | 0 .../publish/validate_write_deadline_tab.py | 0 .../plugins}/publish/validate_write_legacy.py | 0 .../plugins}/publish/validate_write_nodes.py | 0 60 files changed, 11 insertions(+), 8 deletions(-) rename pype/{plugins/nuke => hosts/nuke/plugins}/create/create_backdrop.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/create/create_camera.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/create/create_gizmo.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/create/create_read.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/create/create_write_prerender.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/create/create_write_render.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/inventory/select_containers.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/inventory/set_tool_color.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/actions.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_backdrop.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_camera_abc.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_gizmo.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_gizmo_ip.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_image.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_luts.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_luts_ip.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_matchmove.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_mov.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_script_precomp.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/load/load_sequence.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_backdrop.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_current_file.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_framerate.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_gizmo.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_host.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_host_version.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_instances.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_legacy_read.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_reads.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_review.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_selection.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_slate_node.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_workfile.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/collect_writes.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_backdrop.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_camera.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_gizmo.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_ouput_node.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_output_directory.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_render_local.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_review_data_lut.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_review_data_mov.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_script_save.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_slate_frame.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/extract_thumbnail.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/increment_script_version.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/remove_ouput_node.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/submit_nuke_deadline.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_backdrop.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_gizmo.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_knobs.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_output_resolution.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_read_legacy.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_rendered_frames.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_script.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_write_bounding_box.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_write_deadline_tab.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_write_legacy.py (100%) rename pype/{plugins/nuke => hosts/nuke/plugins}/publish/validate_write_nodes.py (100%) diff --git a/pype/hosts/nuke/api/__init__.py b/pype/hosts/nuke/api/__init__.py index 87c3e190e2..22085af37c 100644 --- a/pype/hosts/nuke/api/__init__.py +++ b/pype/hosts/nuke/api/__init__.py @@ -8,6 +8,7 @@ from avalon import api as avalon from avalon.tools import workfiles from pyblish import api as pyblish from pype.api import Logger +from pype.hosts import nuke from pype import PLUGINS_DIR from . import lib, menu @@ -18,10 +19,12 @@ log = Logger().get_logger(__name__, "nuke") AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "nuke", "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "nuke", "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "nuke", "create") -INVENTORY_PATH = os.path.join(PLUGINS_DIR, "nuke", "inventory") +HOST_DIR = os.path.dirname(os.path.abspath(nuke.__file__)) +PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") # registering pyblish gui regarding settings in presets @@ -40,10 +43,10 @@ def reload_config(): for module in ( "{}.api".format(AVALON_CONFIG), - "{}.hosts.nuke.actions".format(AVALON_CONFIG), - "{}.hosts.nuke.menu".format(AVALON_CONFIG), - "{}.hosts.nuke.plugin".format(AVALON_CONFIG), - "{}.hosts.nuke.lib".format(AVALON_CONFIG), + "{}.hosts.nuke.api.actions".format(AVALON_CONFIG), + "{}.hosts.nuke.api.menu".format(AVALON_CONFIG), + "{}.hosts.nuke.api.plugin".format(AVALON_CONFIG), + "{}.hosts.nuke.api.lib".format(AVALON_CONFIG), ): log.info("Reloading module: {}...".format(module)) diff --git a/pype/plugins/nuke/create/create_backdrop.py b/pype/hosts/nuke/plugins/create/create_backdrop.py similarity index 100% rename from pype/plugins/nuke/create/create_backdrop.py rename to pype/hosts/nuke/plugins/create/create_backdrop.py diff --git a/pype/plugins/nuke/create/create_camera.py b/pype/hosts/nuke/plugins/create/create_camera.py similarity index 100% rename from pype/plugins/nuke/create/create_camera.py rename to pype/hosts/nuke/plugins/create/create_camera.py diff --git a/pype/plugins/nuke/create/create_gizmo.py b/pype/hosts/nuke/plugins/create/create_gizmo.py similarity index 100% rename from pype/plugins/nuke/create/create_gizmo.py rename to pype/hosts/nuke/plugins/create/create_gizmo.py diff --git a/pype/plugins/nuke/create/create_read.py b/pype/hosts/nuke/plugins/create/create_read.py similarity index 100% rename from pype/plugins/nuke/create/create_read.py rename to pype/hosts/nuke/plugins/create/create_read.py diff --git a/pype/plugins/nuke/create/create_write_prerender.py b/pype/hosts/nuke/plugins/create/create_write_prerender.py similarity index 100% rename from pype/plugins/nuke/create/create_write_prerender.py rename to pype/hosts/nuke/plugins/create/create_write_prerender.py diff --git a/pype/plugins/nuke/create/create_write_render.py b/pype/hosts/nuke/plugins/create/create_write_render.py similarity index 100% rename from pype/plugins/nuke/create/create_write_render.py rename to pype/hosts/nuke/plugins/create/create_write_render.py diff --git a/pype/plugins/nuke/inventory/select_containers.py b/pype/hosts/nuke/plugins/inventory/select_containers.py similarity index 100% rename from pype/plugins/nuke/inventory/select_containers.py rename to pype/hosts/nuke/plugins/inventory/select_containers.py diff --git a/pype/plugins/nuke/inventory/set_tool_color.py b/pype/hosts/nuke/plugins/inventory/set_tool_color.py similarity index 100% rename from pype/plugins/nuke/inventory/set_tool_color.py rename to pype/hosts/nuke/plugins/inventory/set_tool_color.py diff --git a/pype/plugins/nuke/load/actions.py b/pype/hosts/nuke/plugins/load/actions.py similarity index 100% rename from pype/plugins/nuke/load/actions.py rename to pype/hosts/nuke/plugins/load/actions.py diff --git a/pype/plugins/nuke/load/load_backdrop.py b/pype/hosts/nuke/plugins/load/load_backdrop.py similarity index 100% rename from pype/plugins/nuke/load/load_backdrop.py rename to pype/hosts/nuke/plugins/load/load_backdrop.py diff --git a/pype/plugins/nuke/load/load_camera_abc.py b/pype/hosts/nuke/plugins/load/load_camera_abc.py similarity index 100% rename from pype/plugins/nuke/load/load_camera_abc.py rename to pype/hosts/nuke/plugins/load/load_camera_abc.py diff --git a/pype/plugins/nuke/load/load_gizmo.py b/pype/hosts/nuke/plugins/load/load_gizmo.py similarity index 100% rename from pype/plugins/nuke/load/load_gizmo.py rename to pype/hosts/nuke/plugins/load/load_gizmo.py diff --git a/pype/plugins/nuke/load/load_gizmo_ip.py b/pype/hosts/nuke/plugins/load/load_gizmo_ip.py similarity index 100% rename from pype/plugins/nuke/load/load_gizmo_ip.py rename to pype/hosts/nuke/plugins/load/load_gizmo_ip.py diff --git a/pype/plugins/nuke/load/load_image.py b/pype/hosts/nuke/plugins/load/load_image.py similarity index 100% rename from pype/plugins/nuke/load/load_image.py rename to pype/hosts/nuke/plugins/load/load_image.py diff --git a/pype/plugins/nuke/load/load_luts.py b/pype/hosts/nuke/plugins/load/load_luts.py similarity index 100% rename from pype/plugins/nuke/load/load_luts.py rename to pype/hosts/nuke/plugins/load/load_luts.py diff --git a/pype/plugins/nuke/load/load_luts_ip.py b/pype/hosts/nuke/plugins/load/load_luts_ip.py similarity index 100% rename from pype/plugins/nuke/load/load_luts_ip.py rename to pype/hosts/nuke/plugins/load/load_luts_ip.py diff --git a/pype/plugins/nuke/load/load_matchmove.py b/pype/hosts/nuke/plugins/load/load_matchmove.py similarity index 100% rename from pype/plugins/nuke/load/load_matchmove.py rename to pype/hosts/nuke/plugins/load/load_matchmove.py diff --git a/pype/plugins/nuke/load/load_mov.py b/pype/hosts/nuke/plugins/load/load_mov.py similarity index 100% rename from pype/plugins/nuke/load/load_mov.py rename to pype/hosts/nuke/plugins/load/load_mov.py diff --git a/pype/plugins/nuke/load/load_script_precomp.py b/pype/hosts/nuke/plugins/load/load_script_precomp.py similarity index 100% rename from pype/plugins/nuke/load/load_script_precomp.py rename to pype/hosts/nuke/plugins/load/load_script_precomp.py diff --git a/pype/plugins/nuke/load/load_sequence.py b/pype/hosts/nuke/plugins/load/load_sequence.py similarity index 100% rename from pype/plugins/nuke/load/load_sequence.py rename to pype/hosts/nuke/plugins/load/load_sequence.py diff --git a/pype/plugins/nuke/publish/collect_backdrop.py b/pype/hosts/nuke/plugins/publish/collect_backdrop.py similarity index 100% rename from pype/plugins/nuke/publish/collect_backdrop.py rename to pype/hosts/nuke/plugins/publish/collect_backdrop.py diff --git a/pype/plugins/nuke/publish/collect_current_file.py b/pype/hosts/nuke/plugins/publish/collect_current_file.py similarity index 100% rename from pype/plugins/nuke/publish/collect_current_file.py rename to pype/hosts/nuke/plugins/publish/collect_current_file.py diff --git a/pype/plugins/nuke/publish/collect_framerate.py b/pype/hosts/nuke/plugins/publish/collect_framerate.py similarity index 100% rename from pype/plugins/nuke/publish/collect_framerate.py rename to pype/hosts/nuke/plugins/publish/collect_framerate.py diff --git a/pype/plugins/nuke/publish/collect_gizmo.py b/pype/hosts/nuke/plugins/publish/collect_gizmo.py similarity index 100% rename from pype/plugins/nuke/publish/collect_gizmo.py rename to pype/hosts/nuke/plugins/publish/collect_gizmo.py diff --git a/pype/plugins/nuke/publish/collect_host.py b/pype/hosts/nuke/plugins/publish/collect_host.py similarity index 100% rename from pype/plugins/nuke/publish/collect_host.py rename to pype/hosts/nuke/plugins/publish/collect_host.py diff --git a/pype/plugins/nuke/publish/collect_host_version.py b/pype/hosts/nuke/plugins/publish/collect_host_version.py similarity index 100% rename from pype/plugins/nuke/publish/collect_host_version.py rename to pype/hosts/nuke/plugins/publish/collect_host_version.py diff --git a/pype/plugins/nuke/publish/collect_instances.py b/pype/hosts/nuke/plugins/publish/collect_instances.py similarity index 100% rename from pype/plugins/nuke/publish/collect_instances.py rename to pype/hosts/nuke/plugins/publish/collect_instances.py diff --git a/pype/plugins/nuke/publish/collect_legacy_read.py b/pype/hosts/nuke/plugins/publish/collect_legacy_read.py similarity index 100% rename from pype/plugins/nuke/publish/collect_legacy_read.py rename to pype/hosts/nuke/plugins/publish/collect_legacy_read.py diff --git a/pype/plugins/nuke/publish/collect_reads.py b/pype/hosts/nuke/plugins/publish/collect_reads.py similarity index 100% rename from pype/plugins/nuke/publish/collect_reads.py rename to pype/hosts/nuke/plugins/publish/collect_reads.py diff --git a/pype/plugins/nuke/publish/collect_review.py b/pype/hosts/nuke/plugins/publish/collect_review.py similarity index 100% rename from pype/plugins/nuke/publish/collect_review.py rename to pype/hosts/nuke/plugins/publish/collect_review.py diff --git a/pype/plugins/nuke/publish/collect_selection.py b/pype/hosts/nuke/plugins/publish/collect_selection.py similarity index 100% rename from pype/plugins/nuke/publish/collect_selection.py rename to pype/hosts/nuke/plugins/publish/collect_selection.py diff --git a/pype/plugins/nuke/publish/collect_slate_node.py b/pype/hosts/nuke/plugins/publish/collect_slate_node.py similarity index 100% rename from pype/plugins/nuke/publish/collect_slate_node.py rename to pype/hosts/nuke/plugins/publish/collect_slate_node.py diff --git a/pype/plugins/nuke/publish/collect_workfile.py b/pype/hosts/nuke/plugins/publish/collect_workfile.py similarity index 100% rename from pype/plugins/nuke/publish/collect_workfile.py rename to pype/hosts/nuke/plugins/publish/collect_workfile.py diff --git a/pype/plugins/nuke/publish/collect_writes.py b/pype/hosts/nuke/plugins/publish/collect_writes.py similarity index 100% rename from pype/plugins/nuke/publish/collect_writes.py rename to pype/hosts/nuke/plugins/publish/collect_writes.py diff --git a/pype/plugins/nuke/publish/extract_backdrop.py b/pype/hosts/nuke/plugins/publish/extract_backdrop.py similarity index 100% rename from pype/plugins/nuke/publish/extract_backdrop.py rename to pype/hosts/nuke/plugins/publish/extract_backdrop.py diff --git a/pype/plugins/nuke/publish/extract_camera.py b/pype/hosts/nuke/plugins/publish/extract_camera.py similarity index 100% rename from pype/plugins/nuke/publish/extract_camera.py rename to pype/hosts/nuke/plugins/publish/extract_camera.py diff --git a/pype/plugins/nuke/publish/extract_gizmo.py b/pype/hosts/nuke/plugins/publish/extract_gizmo.py similarity index 100% rename from pype/plugins/nuke/publish/extract_gizmo.py rename to pype/hosts/nuke/plugins/publish/extract_gizmo.py diff --git a/pype/plugins/nuke/publish/extract_ouput_node.py b/pype/hosts/nuke/plugins/publish/extract_ouput_node.py similarity index 100% rename from pype/plugins/nuke/publish/extract_ouput_node.py rename to pype/hosts/nuke/plugins/publish/extract_ouput_node.py diff --git a/pype/plugins/nuke/publish/extract_output_directory.py b/pype/hosts/nuke/plugins/publish/extract_output_directory.py similarity index 100% rename from pype/plugins/nuke/publish/extract_output_directory.py rename to pype/hosts/nuke/plugins/publish/extract_output_directory.py diff --git a/pype/plugins/nuke/publish/extract_render_local.py b/pype/hosts/nuke/plugins/publish/extract_render_local.py similarity index 100% rename from pype/plugins/nuke/publish/extract_render_local.py rename to pype/hosts/nuke/plugins/publish/extract_render_local.py diff --git a/pype/plugins/nuke/publish/extract_review_data_lut.py b/pype/hosts/nuke/plugins/publish/extract_review_data_lut.py similarity index 100% rename from pype/plugins/nuke/publish/extract_review_data_lut.py rename to pype/hosts/nuke/plugins/publish/extract_review_data_lut.py diff --git a/pype/plugins/nuke/publish/extract_review_data_mov.py b/pype/hosts/nuke/plugins/publish/extract_review_data_mov.py similarity index 100% rename from pype/plugins/nuke/publish/extract_review_data_mov.py rename to pype/hosts/nuke/plugins/publish/extract_review_data_mov.py diff --git a/pype/plugins/nuke/publish/extract_script_save.py b/pype/hosts/nuke/plugins/publish/extract_script_save.py similarity index 100% rename from pype/plugins/nuke/publish/extract_script_save.py rename to pype/hosts/nuke/plugins/publish/extract_script_save.py diff --git a/pype/plugins/nuke/publish/extract_slate_frame.py b/pype/hosts/nuke/plugins/publish/extract_slate_frame.py similarity index 100% rename from pype/plugins/nuke/publish/extract_slate_frame.py rename to pype/hosts/nuke/plugins/publish/extract_slate_frame.py diff --git a/pype/plugins/nuke/publish/extract_thumbnail.py b/pype/hosts/nuke/plugins/publish/extract_thumbnail.py similarity index 100% rename from pype/plugins/nuke/publish/extract_thumbnail.py rename to pype/hosts/nuke/plugins/publish/extract_thumbnail.py diff --git a/pype/plugins/nuke/publish/increment_script_version.py b/pype/hosts/nuke/plugins/publish/increment_script_version.py similarity index 100% rename from pype/plugins/nuke/publish/increment_script_version.py rename to pype/hosts/nuke/plugins/publish/increment_script_version.py diff --git a/pype/plugins/nuke/publish/remove_ouput_node.py b/pype/hosts/nuke/plugins/publish/remove_ouput_node.py similarity index 100% rename from pype/plugins/nuke/publish/remove_ouput_node.py rename to pype/hosts/nuke/plugins/publish/remove_ouput_node.py diff --git a/pype/plugins/nuke/publish/submit_nuke_deadline.py b/pype/hosts/nuke/plugins/publish/submit_nuke_deadline.py similarity index 100% rename from pype/plugins/nuke/publish/submit_nuke_deadline.py rename to pype/hosts/nuke/plugins/publish/submit_nuke_deadline.py diff --git a/pype/plugins/nuke/publish/validate_backdrop.py b/pype/hosts/nuke/plugins/publish/validate_backdrop.py similarity index 100% rename from pype/plugins/nuke/publish/validate_backdrop.py rename to pype/hosts/nuke/plugins/publish/validate_backdrop.py diff --git a/pype/plugins/nuke/publish/validate_gizmo.py b/pype/hosts/nuke/plugins/publish/validate_gizmo.py similarity index 100% rename from pype/plugins/nuke/publish/validate_gizmo.py rename to pype/hosts/nuke/plugins/publish/validate_gizmo.py diff --git a/pype/plugins/nuke/publish/validate_knobs.py b/pype/hosts/nuke/plugins/publish/validate_knobs.py similarity index 100% rename from pype/plugins/nuke/publish/validate_knobs.py rename to pype/hosts/nuke/plugins/publish/validate_knobs.py diff --git a/pype/plugins/nuke/publish/validate_output_resolution.py b/pype/hosts/nuke/plugins/publish/validate_output_resolution.py similarity index 100% rename from pype/plugins/nuke/publish/validate_output_resolution.py rename to pype/hosts/nuke/plugins/publish/validate_output_resolution.py diff --git a/pype/plugins/nuke/publish/validate_read_legacy.py b/pype/hosts/nuke/plugins/publish/validate_read_legacy.py similarity index 100% rename from pype/plugins/nuke/publish/validate_read_legacy.py rename to pype/hosts/nuke/plugins/publish/validate_read_legacy.py diff --git a/pype/plugins/nuke/publish/validate_rendered_frames.py b/pype/hosts/nuke/plugins/publish/validate_rendered_frames.py similarity index 100% rename from pype/plugins/nuke/publish/validate_rendered_frames.py rename to pype/hosts/nuke/plugins/publish/validate_rendered_frames.py diff --git a/pype/plugins/nuke/publish/validate_script.py b/pype/hosts/nuke/plugins/publish/validate_script.py similarity index 100% rename from pype/plugins/nuke/publish/validate_script.py rename to pype/hosts/nuke/plugins/publish/validate_script.py diff --git a/pype/plugins/nuke/publish/validate_write_bounding_box.py b/pype/hosts/nuke/plugins/publish/validate_write_bounding_box.py similarity index 100% rename from pype/plugins/nuke/publish/validate_write_bounding_box.py rename to pype/hosts/nuke/plugins/publish/validate_write_bounding_box.py diff --git a/pype/plugins/nuke/publish/validate_write_deadline_tab.py b/pype/hosts/nuke/plugins/publish/validate_write_deadline_tab.py similarity index 100% rename from pype/plugins/nuke/publish/validate_write_deadline_tab.py rename to pype/hosts/nuke/plugins/publish/validate_write_deadline_tab.py diff --git a/pype/plugins/nuke/publish/validate_write_legacy.py b/pype/hosts/nuke/plugins/publish/validate_write_legacy.py similarity index 100% rename from pype/plugins/nuke/publish/validate_write_legacy.py rename to pype/hosts/nuke/plugins/publish/validate_write_legacy.py diff --git a/pype/plugins/nuke/publish/validate_write_nodes.py b/pype/hosts/nuke/plugins/publish/validate_write_nodes.py similarity index 100% rename from pype/plugins/nuke/publish/validate_write_nodes.py rename to pype/hosts/nuke/plugins/publish/validate_write_nodes.py From 694a90c6892d89a978013c9abdf834d3113b5963 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 17:02:53 +0100 Subject: [PATCH 016/113] move nuke setup to host --- .../hosts/nuke/startup}/KnobScripter/__init__.py | 0 .../KnobScripter/icons/icon_clearConsole.png | Bin .../startup}/KnobScripter/icons/icon_download.png | Bin .../startup}/KnobScripter/icons/icon_exitnode.png | Bin .../nuke/startup}/KnobScripter/icons/icon_pick.png | Bin .../nuke/startup}/KnobScripter/icons/icon_prefs.png | Bin .../startup}/KnobScripter/icons/icon_prefs2.png | Bin .../startup}/KnobScripter/icons/icon_refresh.png | Bin .../nuke/startup}/KnobScripter/icons/icon_run.png | Bin .../nuke/startup}/KnobScripter/icons/icon_save.png | Bin .../startup}/KnobScripter/icons/icon_search.png | Bin .../startup}/KnobScripter/icons/icon_snippets.png | Bin .../nuke/startup}/KnobScripter/knob_scripter.py | 0 .../nuke_path => pype/hosts/nuke/startup}/init.py | 0 .../nuke_path => pype/hosts/nuke/startup}/menu.py | 0 .../hosts/nuke/startup}/write_to_read.py | 0 .../defaults/system_settings/applications.json | 4 ++-- pype/settings/defaults/system_settings/modules.json | 2 +- 18 files changed, 3 insertions(+), 3 deletions(-) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/__init__.py (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_clearConsole.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_download.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_exitnode.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_pick.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_prefs.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_prefs2.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_refresh.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_run.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_save.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_search.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/icons/icon_snippets.png (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/KnobScripter/knob_scripter.py (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/init.py (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/menu.py (100%) rename {setup/nuke/nuke_path => pype/hosts/nuke/startup}/write_to_read.py (100%) diff --git a/setup/nuke/nuke_path/KnobScripter/__init__.py b/pype/hosts/nuke/startup/KnobScripter/__init__.py similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/__init__.py rename to pype/hosts/nuke/startup/KnobScripter/__init__.py diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_clearConsole.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_clearConsole.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_clearConsole.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_clearConsole.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_download.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_download.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_download.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_download.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_exitnode.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_exitnode.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_exitnode.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_exitnode.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_pick.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_pick.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_pick.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_pick.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_prefs.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_prefs.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_prefs.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_prefs.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_prefs2.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_prefs2.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_prefs2.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_prefs2.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_refresh.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_refresh.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_refresh.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_refresh.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_run.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_run.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_run.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_run.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_save.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_save.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_save.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_save.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_search.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_search.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_search.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_search.png diff --git a/setup/nuke/nuke_path/KnobScripter/icons/icon_snippets.png b/pype/hosts/nuke/startup/KnobScripter/icons/icon_snippets.png similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/icons/icon_snippets.png rename to pype/hosts/nuke/startup/KnobScripter/icons/icon_snippets.png diff --git a/setup/nuke/nuke_path/KnobScripter/knob_scripter.py b/pype/hosts/nuke/startup/KnobScripter/knob_scripter.py similarity index 100% rename from setup/nuke/nuke_path/KnobScripter/knob_scripter.py rename to pype/hosts/nuke/startup/KnobScripter/knob_scripter.py diff --git a/setup/nuke/nuke_path/init.py b/pype/hosts/nuke/startup/init.py similarity index 100% rename from setup/nuke/nuke_path/init.py rename to pype/hosts/nuke/startup/init.py diff --git a/setup/nuke/nuke_path/menu.py b/pype/hosts/nuke/startup/menu.py similarity index 100% rename from setup/nuke/nuke_path/menu.py rename to pype/hosts/nuke/startup/menu.py diff --git a/setup/nuke/nuke_path/write_to_read.py b/pype/hosts/nuke/startup/write_to_read.py similarity index 100% rename from setup/nuke/nuke_path/write_to_read.py rename to pype/hosts/nuke/startup/write_to_read.py diff --git a/pype/settings/defaults/system_settings/applications.json b/pype/settings/defaults/system_settings/applications.json index 79d39c94f9..e9f6d17480 100644 --- a/pype/settings/defaults/system_settings/applications.json +++ b/pype/settings/defaults/system_settings/applications.json @@ -241,8 +241,8 @@ ] }, "NUKE_PATH": [ - "{PYPE_MODULE_ROOT}/repos/avalon-core/setup/nuke/nuke_path", - "{PYPE_MODULE_ROOT}/setup/nuke/nuke_path", + "{PYPE_ROOT}/repos/avalon-core/setup/nuke/nuke_path", + "{PYPE_ROOT}/hosts/nuke/startup", "{PYPE_STUDIO_PLUGINS}/nuke" ], "PATH": { diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index 0f4b0b37f3..488cb91827 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -153,4 +153,4 @@ "idle_manager": { "enabled": true } -} +} \ No newline at end of file From f6787c5d0bdb261298ce453f6faa60626e1634d0 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 17:58:18 +0100 Subject: [PATCH 017/113] fix nuke callbacks in 3.0 --- pype/hosts/nuke/api/__init__.py | 8 ++++---- pype/hosts/nuke/api/lib.py | 12 ++++++------ pype/hosts/nuke/startup/menu.py | 9 ++++----- .../defaults/system_settings/applications.json | 2 +- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/pype/hosts/nuke/api/__init__.py b/pype/hosts/nuke/api/__init__.py index 22085af37c..b60f79d910 100644 --- a/pype/hosts/nuke/api/__init__.py +++ b/pype/hosts/nuke/api/__init__.py @@ -8,7 +8,7 @@ from avalon import api as avalon from avalon.tools import workfiles from pyblish import api as pyblish from pype.api import Logger -from pype.hosts import nuke +import pype.hosts.nuke from pype import PLUGINS_DIR from . import lib, menu @@ -19,7 +19,7 @@ log = Logger().get_logger(__name__, "nuke") AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") -HOST_DIR = os.path.dirname(os.path.abspath(nuke.__file__)) +HOST_DIR = os.path.dirname(os.path.abspath(pype.hosts.nuke.__file__)) PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") LOAD_PATH = os.path.join(PLUGINS_DIR, "load") @@ -70,7 +70,7 @@ def install(): avalon.register_plugin_path(avalon.InventoryAction, INVENTORY_PATH) # Register Avalon event for workfiles loading. - # avalon.on("workio.open_file", lib.check_inventory_versions) + avalon.on("workio.open_file", lib.check_inventory_versions) # pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) workfile_settings = lib.WorkfileSettings() @@ -92,7 +92,7 @@ def install(): nuke.addOnCreate(launch_workfiles_app, nodeClass="Root") # Set context settings. - # nuke.addOnCreate(workfile_settings.set_context_settings, nodeClass="Root") + nuke.addOnCreate(workfile_settings.set_context_settings, nodeClass="Root") # nuke.addOnCreate(workfile_settings.set_favorites, nodeClass="Root") menu.install() diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index 67f51daad5..c51fd7cbe4 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -88,7 +88,7 @@ def on_script_load(): def check_inventory_versions(): """ - Actiual version idetifier of Loaded containers + Actual version idetifier of Loaded containers Any time this function is run it will check all nodes and filter only Loader nodes for its version. It will get all versions from database @@ -103,7 +103,7 @@ def check_inventory_versions(): if container: node = container["_node"] avalon_knob_data = avalon.nuke.read( - node, ['avalon:', 'ak:']) + node) # get representation from io representation = io.find_one({ @@ -153,7 +153,7 @@ def writes_version_sync(): continue avalon_knob_data = avalon.nuke.read( - each, ['avalon:', 'ak:']) + each) try: if avalon_knob_data['families'] not in ["render"]: @@ -204,7 +204,7 @@ def get_render_path(node): ''' data = dict() data['avalon'] = avalon.nuke.read( - node, ['avalon:', 'ak:']) + node) data_preset = { "class": data['avalon']['family'], @@ -749,7 +749,7 @@ class WorkfileSettings(object): continue # get data from avalon knob - avalon_knob_data = read(node, ["avalon:", "ak:"]) + avalon_knob_data = read(node) if not avalon_knob_data: continue @@ -1099,7 +1099,7 @@ def get_write_node_template_attr(node): # get avalon data from node data = dict() data['avalon'] = avalon.nuke.read( - node, ['avalon:', 'ak:']) + node) data_preset = { "class": data['avalon']['family'], "families": data['avalon']['families'], diff --git a/pype/hosts/nuke/startup/menu.py b/pype/hosts/nuke/startup/menu.py index 3cfae8c7b1..eb3b88c6cc 100644 --- a/pype/hosts/nuke/startup/menu.py +++ b/pype/hosts/nuke/startup/menu.py @@ -1,6 +1,5 @@ import os import sys -import KnobScripter from pype.hosts.nuke.api.lib import ( writes_version_sync, @@ -14,10 +13,10 @@ from pype.api import Logger log = Logger().get_logger(__name__, "nuke") -# nuke.addOnScriptSave(lib.writes_version_sync) -# nuke.addOnScriptSave(lib.on_script_load) -# nuke.addOnScriptLoad(lib.check_inventory_versions) -# nuke.addOnScriptSave(lib.check_inventory_versions) +# nuke.addOnScriptSave(writes_version_sync) +nuke.addOnScriptSave(on_script_load) +nuke.addOnScriptLoad(check_inventory_versions) +nuke.addOnScriptSave(check_inventory_versions) # nuke.addOnScriptSave(lib.writes_version_sync) log.info('Automatic syncing of write file knob to script version') diff --git a/pype/settings/defaults/system_settings/applications.json b/pype/settings/defaults/system_settings/applications.json index e9f6d17480..f0e68aefd2 100644 --- a/pype/settings/defaults/system_settings/applications.json +++ b/pype/settings/defaults/system_settings/applications.json @@ -242,7 +242,7 @@ }, "NUKE_PATH": [ "{PYPE_ROOT}/repos/avalon-core/setup/nuke/nuke_path", - "{PYPE_ROOT}/hosts/nuke/startup", + "{PYPE_ROOT}/pype/hosts/nuke/startup", "{PYPE_STUDIO_PLUGINS}/nuke" ], "PATH": { From 1962f51a9ba2c137db169088ba5b0cc4aa029b68 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 19:04:24 +0100 Subject: [PATCH 018/113] fix checking for the latest version and fix updatting --- pype/hosts/nuke/api/lib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index c51fd7cbe4..a30ef5ae76 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -101,7 +101,7 @@ def check_inventory_versions(): container = avalon.nuke.parse_container(each) if container: - node = container["_node"] + node = nuke.toNode(container["objectName"]) avalon_knob_data = avalon.nuke.read( node) From ca1d29ec9cb21aa4665ca56bcba76f1dcceaf029 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 23 Dec 2020 19:14:11 +0100 Subject: [PATCH 019/113] return set_avalon_knob_data --- pype/hosts/nuke/api/lib.py | 4 ++-- pype/hosts/nuke/plugins/create/create_backdrop.py | 4 ++-- pype/hosts/nuke/plugins/create/create_camera.py | 4 ++-- pype/hosts/nuke/plugins/create/create_gizmo.py | 6 +++--- pype/hosts/nuke/plugins/create/create_read.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index a30ef5ae76..1f3c34fe31 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -450,7 +450,7 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): now_node.setInput(0, prev_node) # imprinting group node - avalon.nuke.imprint(GN, data["avalon"]) + anlib.set_avalon_knob_data(GN, data["avalon"]) # add divider GN.addKnob(nuke.Text_Knob('')) @@ -930,7 +930,7 @@ class WorkfileSettings(object): node['frame_range_lock'].setValue(True) # adding handle_start/end to root avalon knob - if not avalon.nuke.imprint(self._root_node, { + if not anlib.set_avalon_knob_data(self._root_node, { "handleStart": int(handle_start), "handleEnd": int(handle_end) }): diff --git a/pype/hosts/nuke/plugins/create/create_backdrop.py b/pype/hosts/nuke/plugins/create/create_backdrop.py index 0d2b621e21..243b14c2d8 100644 --- a/pype/hosts/nuke/plugins/create/create_backdrop.py +++ b/pype/hosts/nuke/plugins/create/create_backdrop.py @@ -32,7 +32,7 @@ class CreateBackdrop(avalon.nuke.Creator): bckd_node["note_font_size"].setValue(24) bckd_node["label"].setValue("[{}]".format(self.name)) # add avalon knobs - instance = anlib.imprint(bckd_node, self.data) + instance = anlib.set_avalon_knob_data(bckd_node, self.data) return instance else: @@ -48,6 +48,6 @@ class CreateBackdrop(avalon.nuke.Creator): bckd_node["note_font_size"].setValue(24) bckd_node["label"].setValue("[{}]".format(self.name)) # add avalon knobs - instance = anlib.imprint(bckd_node, self.data) + instance = anlib.set_avalon_knob_data(bckd_node, self.data) return instance diff --git a/pype/hosts/nuke/plugins/create/create_camera.py b/pype/hosts/nuke/plugins/create/create_camera.py index 4c668925ad..919be0ea79 100644 --- a/pype/hosts/nuke/plugins/create/create_camera.py +++ b/pype/hosts/nuke/plugins/create/create_camera.py @@ -36,7 +36,7 @@ class CreateCamera(avalon.nuke.Creator): # change node color n["tile_color"].setValue(int(self.node_color, 16)) # add avalon knobs - anlib.imprint(n, data) + anlib.set_avalon_knob_data(n, data) return True else: msg = str("Please select nodes you " @@ -49,5 +49,5 @@ class CreateCamera(avalon.nuke.Creator): camera_node = nuke.createNode("Camera2") camera_node["tile_color"].setValue(int(self.node_color, 16)) # add avalon knobs - instance = anlib.imprint(camera_node, self.data) + instance = anlib.set_avalon_knob_data(camera_node, self.data) return instance diff --git a/pype/hosts/nuke/plugins/create/create_gizmo.py b/pype/hosts/nuke/plugins/create/create_gizmo.py index eb5b1a3fb0..19b5bead8f 100644 --- a/pype/hosts/nuke/plugins/create/create_gizmo.py +++ b/pype/hosts/nuke/plugins/create/create_gizmo.py @@ -34,7 +34,7 @@ class CreateGizmo(avalon.nuke.Creator): if node.Class() in "Group": node["name"].setValue("{}_GZM".format(self.name)) node["tile_color"].setValue(int(self.node_color, 16)) - return anlib.imprint(node, self.data) + return anlib.set_avalon_knob_data(node, self.data) else: msg = ("Please select a group node " "you wish to publish as the gizmo") @@ -57,7 +57,7 @@ class CreateGizmo(avalon.nuke.Creator): "- create User knobs on the group") # add avalon knobs - return anlib.imprint(gizmo_node, self.data) + return anlib.set_avalon_knob_data(gizmo_node, self.data) else: msg = ("Please select nodes you " @@ -80,4 +80,4 @@ class CreateGizmo(avalon.nuke.Creator): "- create User knobs on the group") # add avalon knobs - return anlib.imprint(gizmo_node, self.data) + return anlib.set_avalon_knob_data(gizmo_node, self.data) diff --git a/pype/hosts/nuke/plugins/create/create_read.py b/pype/hosts/nuke/plugins/create/create_read.py index 072d234b32..591f9c14a2 100644 --- a/pype/hosts/nuke/plugins/create/create_read.py +++ b/pype/hosts/nuke/plugins/create/create_read.py @@ -44,7 +44,7 @@ class CrateRead(avalon.nuke.Creator): continue avalon_data = self.data avalon_data['subset'] = "{}".format(self.name) - avalon.nuke.lib.imprint(node, avalon_data) + avalon.nuke.lib.set_avalon_knob_data(node, avalon_data) node['tile_color'].setValue(16744935) count_reads += 1 From 330ffb23a22ccb91e1ac2a9864e1d2ac98b45fc2 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 6 Jan 2021 16:36:35 +0100 Subject: [PATCH 020/113] minor fixes nuke --- pype/hosts/nuke/api/__init__.py | 1 - pype/hosts/nuke/api/lib.py | 33 ++++++++++--------- .../plugins/create/create_write_render.py | 2 ++ pype/hosts/nuke/startup/menu.py | 6 ---- .../system_settings/applications.json | 17 ++++++---- .../defaults/system_settings/general.json | 2 +- 6 files changed, 31 insertions(+), 30 deletions(-) diff --git a/pype/hosts/nuke/api/__init__.py b/pype/hosts/nuke/api/__init__.py index b60f79d910..c303c17b39 100644 --- a/pype/hosts/nuke/api/__init__.py +++ b/pype/hosts/nuke/api/__init__.py @@ -116,7 +116,6 @@ def uninstall(): pyblish.deregister_callback("instanceToggled", on_pyblish_instance_toggled) - reload_config() menu.uninstall() diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index 1f3c34fe31..e9dcb827fb 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -17,7 +17,7 @@ from pype.api import ( config, ApplicationManager ) - + import nuke from .utils import set_context_favorites @@ -41,11 +41,11 @@ def get_node_imageio_setting(**kwarg): "`{}`: Missing mandatory kwargs `host`, `cls`".format(__file__)) imageio_nodes = (get_anatomy_settings(project_name) - ["imageio"] - .get(host, None) - ["nodes"] - ["requiredNodes"] - ) + ["imageio"] + .get(host, None) + ["nodes"] + ["requiredNodes"] + ) for node in imageio_nodes: log.info(node) @@ -61,11 +61,11 @@ def get_imageio_input_colorspace(filename): ''' Get input file colorspace based on regex in settings. ''' imageio_regex_inputs = (get_anatomy_settings(os.getenv("AVALON_PROJECT")) - ["imageio"] - ["nuke"] - ["regexInputs"] - ["inputs"] - ) + ["imageio"] + ["nuke"] + ["regexInputs"] + ["inputs"] + ) preset_clrsp = None for regexInput in imageio_regex_inputs: @@ -253,7 +253,7 @@ def format_anatomy(data): log.error(msg) nuke.message(msg) - + version = data.get("version", None) if not version: file = script_name() @@ -363,7 +363,6 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): if knob["name"] not in ["_id", "_previous"]: _data.update({knob["name"]: knob["value"]}) - _data = avalon.nuke.lib.fix_data_for_node_create(_data) log.debug("_data: `{}`".format(_data)) @@ -838,7 +837,8 @@ class WorkfileSettings(object): def set_colorspace(self): ''' Setting colorpace following presets ''' - nuke_colorspace = config.get_init_presets()["colorspace"].get("nuke", None) + nuke_colorspace = config.get_init_presets( + )["colorspace"].get("nuke", None) try: self.set_root_colorspace(nuke_colorspace["root"]) @@ -903,7 +903,7 @@ class WorkfileSettings(object): handle_start = data["handleStart"] handle_end = data["handleEnd"] - fps = data["fps"] + fps = float(data["fps"]) frame_start = int(data["frameStart"]) - handle_start frame_end = int(data["frameEnd"]) + handle_end @@ -1119,7 +1119,6 @@ def get_write_node_template_attr(node): for k, v in nuke_imageio_writes.items() if k not in ["_id", "_previous"]} - # fix badly encoded data return avalon.nuke.lib.fix_data_for_node_create(correct_data) @@ -1240,6 +1239,7 @@ class ExporterReviewLut(ExporterReview): """ + def __init__(self, klass, instance, @@ -1342,6 +1342,7 @@ class ExporterReviewMov(ExporterReview): instance (pyblish.instance): instance of pyblish context """ + def __init__(self, klass, instance, diff --git a/pype/hosts/nuke/plugins/create/create_write_render.py b/pype/hosts/nuke/plugins/create/create_write_render.py index 3876ba5806..60db8800dd 100644 --- a/pype/hosts/nuke/plugins/create/create_write_render.py +++ b/pype/hosts/nuke/plugins/create/create_write_render.py @@ -48,6 +48,7 @@ class CreateWriteRender(plugin.PypeCreator): "or tick off `Use selection`") self.log.error(msg) nuke.message(msg) + return if len(nodes) == 0: msg = ( @@ -56,6 +57,7 @@ class CreateWriteRender(plugin.PypeCreator): ) self.log.error(msg) nuke.message(msg) + return selected_node = nodes[0] inputs = [selected_node] diff --git a/pype/hosts/nuke/startup/menu.py b/pype/hosts/nuke/startup/menu.py index eb3b88c6cc..be0f6c411c 100644 --- a/pype/hosts/nuke/startup/menu.py +++ b/pype/hosts/nuke/startup/menu.py @@ -1,8 +1,4 @@ -import os -import sys - from pype.hosts.nuke.api.lib import ( - writes_version_sync, on_script_load, check_inventory_versions ) @@ -13,10 +9,8 @@ from pype.api import Logger log = Logger().get_logger(__name__, "nuke") -# nuke.addOnScriptSave(writes_version_sync) nuke.addOnScriptSave(on_script_load) nuke.addOnScriptLoad(check_inventory_versions) nuke.addOnScriptSave(check_inventory_versions) -# nuke.addOnScriptSave(lib.writes_version_sync) log.info('Automatic syncing of write file knob to script version') diff --git a/pype/settings/defaults/system_settings/applications.json b/pype/settings/defaults/system_settings/applications.json index f0e68aefd2..24bed66783 100644 --- a/pype/settings/defaults/system_settings/applications.json +++ b/pype/settings/defaults/system_settings/applications.json @@ -237,7 +237,8 @@ "__environment_keys__": { "nuke": [ "NUKE_PATH", - "PATH" + "PATH", + "LOGLEVEL" ] }, "NUKE_PATH": [ @@ -247,7 +248,8 @@ ], "PATH": { "windows": "C:/Program Files (x86)/QuickTime/QTSystem/;{PATH}" - } + }, + "LOGLEVEL": "INFO" }, "variants": { "nuke_12.2": { @@ -788,9 +790,7 @@ "RESOLVE_DEV" ] }, - "RESOLVE_UTILITY_SCRIPTS_SOURCE_DIR": [ - "{STUDIO_SOFT}/davinci_resolve/scripts/python" - ], + "RESOLVE_UTILITY_SCRIPTS_SOURCE_DIR": [], "RESOLVE_SCRIPT_API": { "windows": "{PROGRAMDATA}/Blackmagic Design/DaVinci Resolve/Support/Developer/Scripting", "darvin": "/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting", @@ -834,7 +834,12 @@ "variant_label": "16", "icon": "", "executables": { - "windows": [], + "windows": [ + [ + "C:/Program Files/Blackmagic Design/DaVinci Resolve/Resolve.exe", + "" + ] + ], "darwin": [], "linux": [] }, diff --git a/pype/settings/defaults/system_settings/general.json b/pype/settings/defaults/system_settings/general.json index bae0ed4e87..31ee818715 100644 --- a/pype/settings/defaults/system_settings/general.json +++ b/pype/settings/defaults/system_settings/general.json @@ -25,7 +25,7 @@ ] }, "FFMPEG_PATH": { - "windows": "{VIRTUAL_ENV}/localized/ffmpeg_exec/windows/bin;{PYPE_SETUP_PATH}/vendor/bin/ffmpeg_exec/windows/bin", + "windows": "C:/CODE/__PYPE/pype3/vendor/bin/ffmpeg_exec/windows/bin", "darwin": "{VIRTUAL_ENV}/localized/ffmpeg_exec/darwin/bin:{PYPE_SETUP_PATH}/vendor/bin/ffmpeg_exec/darwin/bin", "linux": "{VIRTUAL_ENV}/localized/ffmpeg_exec/linux:{PYPE_SETUP_PATH}/vendor/bin/ffmpeg_exec/linux" }, From bf13ba0fc691d8a138d9bc1bd058549084f15315 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 6 Jan 2021 16:41:05 +0100 Subject: [PATCH 021/113] Updated submodule repos/avalon-core --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index c78e83d4b8..a7ddbe7ee4 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit c78e83d4b8e6b409dbe5aafe5a7ec7725cb88145 +Subproject commit a7ddbe7ee4adc1be107064c4ac27e44ee2887f10 From 66134f4f0d136cf7f006211795f1927033ca1b6a Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 6 Jan 2021 16:41:40 +0100 Subject: [PATCH 022/113] setuptools version update to requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 658405e2fb..57e10a06ed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,6 +24,7 @@ pytest-cov pytest-print pyqt5 Qt.py +setuptools==45.0.0 speedcopy six Sphinx From d39f3af5b1175a2f357b4732cf6bb536d4f0f0e9 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 7 Jan 2021 16:38:46 +0100 Subject: [PATCH 023/113] nuke fixes --- pype/hosts/nuke/api/lib.py | 7 +++---- pype/hosts/nuke/plugins/publish/collect_instances.py | 8 ++++---- repos/avalon-core | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index e9dcb827fb..81d00542cc 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -5,7 +5,6 @@ from collections import OrderedDict from avalon import api, io, lib import avalon.nuke -import acre from avalon.nuke import lib as anlib from pype.api import ( Logger, @@ -363,7 +362,7 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): if knob["name"] not in ["_id", "_previous"]: _data.update({knob["name"]: knob["value"]}) - _data = avalon.nuke.lib.fix_data_for_node_create(_data) + _data = anlib.fix_data_for_node_create(_data) log.debug("_data: `{}`".format(_data)) @@ -432,7 +431,7 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): prev_node = now_node # creating write node - write_node = now_node = avalon.nuke.lib.add_write_node( + write_node = now_node = anlib.add_write_node( "inside_{}".format(name), **_data ) @@ -1120,7 +1119,7 @@ def get_write_node_template_attr(node): if k not in ["_id", "_previous"]} # fix badly encoded data - return avalon.nuke.lib.fix_data_for_node_create(correct_data) + return anlib.fix_data_for_node_create(correct_data) class ExporterReview: diff --git a/pype/hosts/nuke/plugins/publish/collect_instances.py b/pype/hosts/nuke/plugins/publish/collect_instances.py index 4b192bfaff..78146f704b 100644 --- a/pype/hosts/nuke/plugins/publish/collect_instances.py +++ b/pype/hosts/nuke/plugins/publish/collect_instances.py @@ -3,8 +3,7 @@ import os import nuke import pyblish.api from avalon import io, api -from avalon.nuke import get_avalon_knob_data - +from avalon.nuke import lib as anlib @pyblish.api.log class CollectNukeInstances(pyblish.api.ContextPlugin): @@ -39,7 +38,8 @@ class CollectNukeInstances(pyblish.api.ContextPlugin): # get data from avalon knob self.log.debug("node[name]: {}".format(node['name'].value())) - avalon_knob_data = get_avalon_knob_data(node, ["avalon:", "ak:"]) + avalon_knob_data = anlib.get_avalon_knob_data( + node, ["avalon:", "ak:"]) self.log.debug("avalon_knob_data: {}".format(avalon_knob_data)) @@ -55,7 +55,7 @@ class CollectNukeInstances(pyblish.api.ContextPlugin): families = list() if families_ak: - families.append(families_ak) + families.append(families_ak.lower()) families.append(family) diff --git a/repos/avalon-core b/repos/avalon-core index a7ddbe7ee4..feba419c4c 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit a7ddbe7ee4adc1be107064c4ac27e44ee2887f10 +Subproject commit feba419c4c8e25bd9e2119f83caad71d45d4f755 From 149823a3c848708b56370a5d5f8633cc03e7c35f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 8 Jan 2021 16:52:32 +0100 Subject: [PATCH 024/113] improving Created Write UX https://pype.freshdesk.com/a/tickets/487 --- pype/hosts/nuke/api/lib.py | 50 +++++++++++++++++++++++--------------- repos/avalon-core | 2 +- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index 81d00542cc..ba4c15c180 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -279,11 +279,11 @@ def script_name(): def add_button_write_to_read(node): name = "createReadNode" - label = "[ Create Read ]" + label = "Cread Read From Rendered" value = "import write_to_read;write_to_read.write_to_read(nuke.thisNode())" - k = nuke.PyScript_Knob(name, label, value) - k.setFlag(0x1000) - node.addKnob(k) + knob = nuke.PyScript_Knob(name, label, value) + knob.clearFlag(nuke.STARTLINE) + node.addKnob(knob) def create_write_node(name, data, input=None, prenodes=None, review=True): @@ -449,29 +449,39 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): # imprinting group node anlib.set_avalon_knob_data(GN, data["avalon"]) - - # add divider - GN.addKnob(nuke.Text_Knob('')) - + anlib.add_publish_knob(GN) add_rendering_knobs(GN) if review: add_review_knob(GN) # add divider - GN.addKnob(nuke.Text_Knob('')) + GN.addKnob(nuke.Text_Knob('', 'Rendering')) # Add linked knobs. - linked_knob_names = ["Render", "use_limit", "first", "last"] + linked_knob_names = [ + "_grp-start_", + "use_limit", "first", "last", + "_grp-end_", + "Render" + ] for name in linked_knob_names: - link = nuke.Link_Knob(name) - link.makeLink(write_node.name(), name) - link.setName(name) - link.setFlag(0x1000) - GN.addKnob(link) - - # add divider - GN.addKnob(nuke.Text_Knob('')) + if "_grp-start_" in name: + knob = nuke.Tab_Knob( + "rnd_attr", "Rendering attributes", nuke.TABBEGINCLOSEDGROUP) + GN.addKnob(knob) + elif "_grp-end_" in name: + knob = nuke.Tab_Knob( + "rnd_attr", "Rendering attributes", nuke.TABENDGROUP) + GN.addKnob(knob) + else: + link = nuke.Link_Knob("") + link.makeLink(write_node.name(), name) + link.setName(name) + if "Render" in name: + link.setLabel("Render Local") + link.setFlag(0x1000) + GN.addKnob(link) # adding write to read button add_button_write_to_read(GN) @@ -496,9 +506,9 @@ def add_rendering_knobs(node): node (obj): with added knobs ''' if "render" not in node.knobs(): - knob = nuke.Enumeration_Knob("render", "Render", [ + knob = nuke.Enumeration_Knob("render", "", [ "Use existing frames", "Local", "On farm"]) - knob.setFlag(0x1000) + knob.clearFlag(nuke.STARTLINE) node.addKnob(knob) return node diff --git a/repos/avalon-core b/repos/avalon-core index feba419c4c..d98cf8f0db 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit feba419c4c8e25bd9e2119f83caad71d45d4f755 +Subproject commit d98cf8f0db78e5d225dda09cc5ca140bf41772d5 From 97a4ac562e6d7856ab1cf097c1a6a14a847a47ee Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 8 Jan 2021 17:12:23 +0100 Subject: [PATCH 025/113] nuke instance collect to pre-collect --- .../{collect_instances.py => precollect_instances.py} | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) rename pype/hosts/nuke/plugins/publish/{collect_instances.py => precollect_instances.py} (96%) diff --git a/pype/hosts/nuke/plugins/publish/collect_instances.py b/pype/hosts/nuke/plugins/publish/precollect_instances.py similarity index 96% rename from pype/hosts/nuke/plugins/publish/collect_instances.py rename to pype/hosts/nuke/plugins/publish/precollect_instances.py index 78146f704b..60e90002da 100644 --- a/pype/hosts/nuke/plugins/publish/collect_instances.py +++ b/pype/hosts/nuke/plugins/publish/precollect_instances.py @@ -1,16 +1,15 @@ -import os - import nuke import pyblish.api from avalon import io, api from avalon.nuke import lib as anlib + @pyblish.api.log -class CollectNukeInstances(pyblish.api.ContextPlugin): +class PreCollectNukeInstances(pyblish.api.ContextPlugin): """Collect all nodes with Avalon knob.""" - order = pyblish.api.CollectorOrder + 0.01 - label = "Collect Instances" + order = pyblish.api.CollectorOrder - 0.6 + label = "Pre-collect Instances" hosts = ["nuke", "nukeassist"] def process(self, context): @@ -122,7 +121,6 @@ class CollectNukeInstances(pyblish.api.ContextPlugin): "pixelAspect": pixel_aspect, }) - self.log.info("collected instance: {}".format(instance.data)) instances.append(instance) From 3ba9964edd99d9f233405649fcf8f515a6be5989 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 8 Jan 2021 17:13:42 +0100 Subject: [PATCH 026/113] nuke fixing closing group issue --- pype/hosts/nuke/api/__init__.py | 4 +--- pype/hosts/nuke/api/lib.py | 2 +- repos/avalon-core | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pype/hosts/nuke/api/__init__.py b/pype/hosts/nuke/api/__init__.py index c303c17b39..0c9618bcf4 100644 --- a/pype/hosts/nuke/api/__init__.py +++ b/pype/hosts/nuke/api/__init__.py @@ -9,7 +9,6 @@ from avalon.tools import workfiles from pyblish import api as pyblish from pype.api import Logger import pype.hosts.nuke -from pype import PLUGINS_DIR from . import lib, menu @@ -18,7 +17,6 @@ self.workfiles_launched = False log = Logger().get_logger(__name__, "nuke") AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") - HOST_DIR = os.path.dirname(os.path.abspath(pype.hosts.nuke.__file__)) PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") @@ -72,7 +70,7 @@ def install(): # Register Avalon event for workfiles loading. avalon.on("workio.open_file", lib.check_inventory_versions) - # pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) + pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) workfile_settings = lib.WorkfileSettings() # Disable all families except for the ones we explicitly want to see family_states = [ diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index ba4c15c180..b2ada0d19c 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -472,7 +472,7 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): GN.addKnob(knob) elif "_grp-end_" in name: knob = nuke.Tab_Knob( - "rnd_attr", "Rendering attributes", nuke.TABENDGROUP) + "rnd_attr_end", "Rendering attributes", nuke.TABENDGROUP) GN.addKnob(knob) else: link = nuke.Link_Knob("") diff --git a/repos/avalon-core b/repos/avalon-core index d98cf8f0db..8a19fc31f9 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit d98cf8f0db78e5d225dda09cc5ca140bf41772d5 +Subproject commit 8a19fc31f9f503f63a1b4d6cb90f3690902c2e5d From 0a7bad7b386fe417a03552c7081980603e6b55af Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 13 Jan 2021 15:10:46 +0100 Subject: [PATCH 027/113] Harmony to Deadline - 2x.develop version --- pype/hosts/harmony/__init__.py | 35 +- pype/hosts/harmony/js/PypeHarmony.js | 18 +- .../harmony/js/publish/CollectFarmRender.js | 52 +++ .../global/publish/submit_publish_job.py | 5 +- .../harmony/create/create_farm_render.py | 31 ++ pype/plugins/harmony/create/create_render.py | 4 +- .../harmony/publish/collect_farm_render.py | 170 ++++++++ .../harmony/publish/collect_instances.py | 4 + .../harmony/publish/collect_palettes.py | 1 + pype/plugins/harmony/publish/collect_scene.py | 15 + .../harmony/publish/collect_workfile.py | 2 +- .../plugins/harmony/publish/extract_render.py | 2 +- .../publish/submit_harmony_deadline..py | 404 ++++++++++++++++++ .../publish/validate_scene_settings.py | 2 +- 14 files changed, 732 insertions(+), 13 deletions(-) create mode 100644 pype/hosts/harmony/js/publish/CollectFarmRender.js create mode 100644 pype/plugins/harmony/create/create_farm_render.py create mode 100644 pype/plugins/harmony/publish/collect_farm_render.py create mode 100644 pype/plugins/harmony/publish/submit_harmony_deadline..py diff --git a/pype/hosts/harmony/__init__.py b/pype/hosts/harmony/__init__.py index 7ea261292e..a3de979839 100644 --- a/pype/hosts/harmony/__init__.py +++ b/pype/hosts/harmony/__init__.py @@ -50,10 +50,19 @@ def get_asset_settings(): } try: - skip_resolution_check = \ - config.get_presets()["harmony"]["general"]["skip_resolution_check"] - skip_timelines_check = \ - config.get_presets()["harmony"]["general"]["skip_timelines_check"] + # temporary, in pype3 replace with api.get_current_project_settings + skip_resolution_check = ( + get_current_project_settings() + ["harmony"] + ["general"] + ["skip_resolution_check"] + ) + skip_timelines_check = ( + get_current_project_settings() + ["harmony"] + ["general"] + ["skip_timelines_check"] + ) except KeyError: skip_resolution_check = [] skip_timelines_check = [] @@ -69,6 +78,24 @@ def get_asset_settings(): return scene_data +# temporary, in pype3 replace with api.get_current_project_settings +def get_current_project_settings(): + """Project settings for current context project. + + Project name should be stored in environment variable `AVALON_PROJECT`. + This function should be used only in host context where environment + variable must be set and should not happen that any part of process will + change the value of the enviornment variable. + """ + project_name = os.environ.get("AVALON_PROJECT") + if not project_name: + raise ValueError( + "Missing context project in environemt variable `AVALON_PROJECT`." + ) + presets = config.get_presets(project=os.environ['AVALON_PROJECT']) + return presets + + def ensure_scene_settings(): """Validate if Harmony scene has valid settings.""" settings = get_asset_settings() diff --git a/pype/hosts/harmony/js/PypeHarmony.js b/pype/hosts/harmony/js/PypeHarmony.js index a98dbd52cd..555a5ce8fd 100644 --- a/pype/hosts/harmony/js/PypeHarmony.js +++ b/pype/hosts/harmony/js/PypeHarmony.js @@ -5,7 +5,7 @@ var LD_OPENHARMONY_PATH = System.getenv('LIB_OPENHARMONY_PATH'); include(LD_OPENHARMONY_PATH + '/openHarmony.js'); -this.__proto__['$'] = $; + /** @@ -79,7 +79,8 @@ PypeHarmony.getSceneSettings = function() { scene.getStopFrame(), sound.getSoundtrackAll().path(), scene.defaultResolutionX(), - scene.defaultResolutionY() + scene.defaultResolutionY(), + scene.defaultResolutionFOV() ]; }; @@ -200,3 +201,16 @@ PypeHarmony.getDependencies = function(_node) { } return dependencies; }; + + +/** + * return version of running Harmony instance. + * @function + * @return {array} [major_version, minor_version] + */ +PypeHarmony.getVersion = function() { + return [ + about.getMajorVersion(), + about.getMinorVersion() + ]; +} diff --git a/pype/hosts/harmony/js/publish/CollectFarmRender.js b/pype/hosts/harmony/js/publish/CollectFarmRender.js new file mode 100644 index 0000000000..153c38e868 --- /dev/null +++ b/pype/hosts/harmony/js/publish/CollectFarmRender.js @@ -0,0 +1,52 @@ +/* global PypeHarmony:writable, include */ +// *************************************************************************** +// * CollectFarmRender * +// *************************************************************************** + + +// check if PypeHarmony is defined and if not, load it. +if (typeof PypeHarmony !== 'undefined') { + var PYPE_HARMONY_JS = System.getenv('PYPE_HARMONY_JS'); + include(PYPE_HARMONY_JS + '/pype_harmony.js'); +} + + +/** + * @namespace + * @classdesc Image Sequence loader JS code. + */ +var CollectFarmRender = function() {}; + + +/** + * Get information important for render output. + * @function + * @param node {String} node name. + * @return {array} array of render info. + * + * @example + * + * var ret = [ + * file_prefix, // like foo/bar- + * type, // PNG4, ... + * leading_zeros, // 3 - for 0001 + * start // start frame + * ] + */ +CollectFarmRender.prototype.getRenderNodeSettings = function(n) { + // this will return + var output = [ + node.getTextAttr( + n, frame.current(), 'DRAWING_NAME'), + node.getTextAttr( + n, frame.current(), 'DRAWING_TYPE'), + node.getTextAttr( + n, frame.current(), 'LEADING_ZEROS'), + node.getTextAttr(n, frame.current(), 'START') + ]; + + return output; +}; + +// add self to Pype Loaders +PypeHarmony.Publish.CollectFarmRender = new CollectFarmRender(); diff --git a/pype/plugins/global/publish/submit_publish_job.py b/pype/plugins/global/publish/submit_publish_job.py index b8bf240c06..be2add4ed0 100644 --- a/pype/plugins/global/publish/submit_publish_job.py +++ b/pype/plugins/global/publish/submit_publish_job.py @@ -128,13 +128,14 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): order = pyblish.api.IntegratorOrder + 0.2 icon = "tractor" - hosts = ["fusion", "maya", "nuke", "celaction", "aftereffects"] + hosts = ["fusion", "maya", "nuke", "celaction", "aftereffects", "harmony"] - families = ["render.farm", "prerener", + families = ["render.farm", "prerender", "renderlayer", "imagesequence", "vrayscene"] aov_filter = {"maya": [r".+(?:\.|_)([Bb]eauty)(?:\.|_).*"], "aftereffects": [r".*"], # for everything from AE + "harmony": [r".*"], # for everything from AE "celaction": [r".*"]} enviro_filter = [ diff --git a/pype/plugins/harmony/create/create_farm_render.py b/pype/plugins/harmony/create/create_farm_render.py new file mode 100644 index 0000000000..e134f28f43 --- /dev/null +++ b/pype/plugins/harmony/create/create_farm_render.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +"""Create Composite node for render on farm.""" +from avalon import harmony + + +class CreateFarmRender(harmony.Creator): + """Composite node for publishing renders.""" + + name = "renderDefault" + label = "Render on Farm" + family = "renderFarm" + node_type = "WRITE" + + def __init__(self, *args, **kwargs): + """Constructor.""" + super(CreateFarmRender, self).__init__(*args, **kwargs) + + def setup_node(self, node): + """Set render node.""" + path = "render/{0}/{0}.".format(node.split("/")[-1]) + harmony.send( + { + "function": f"PypeHarmony.Creators.CreateRender.create", + "args": [node, path] + }) + harmony.send( + { + "function": f"PypeHarmony.color", + "args": [[0.9, 0.75, 0.3, 1.0]] + } + ) diff --git a/pype/plugins/harmony/create/create_render.py b/pype/plugins/harmony/create/create_render.py index f8fc2d238b..8e3408d900 100644 --- a/pype/plugins/harmony/create/create_render.py +++ b/pype/plugins/harmony/create/create_render.py @@ -8,7 +8,7 @@ class CreateRender(harmony.Creator): name = "renderDefault" label = "Render" - family = "render" + family = "renderLocal" node_type = "WRITE" def __init__(self, *args, **kwargs): @@ -18,7 +18,7 @@ class CreateRender(harmony.Creator): def setup_node(self, node): """Set render node.""" self_name = self.__class__.__name__ - path = "{0}/{0}".format(node.split("/")[-1]) + path = "render/{0}/{0}.".format(node.split("/")[-1]) harmony.send( { "function": f"PypeHarmony.Creators.{self_name}.create", diff --git a/pype/plugins/harmony/publish/collect_farm_render.py b/pype/plugins/harmony/publish/collect_farm_render.py new file mode 100644 index 0000000000..baf037491b --- /dev/null +++ b/pype/plugins/harmony/publish/collect_farm_render.py @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- +"""Collect data to render from scene.""" +from pathlib import Path + +import attr +from avalon import harmony, api + +import pype.lib.abstract_collect_render +from pype.lib.abstract_collect_render import RenderInstance + + +@attr.s +class HarmonyRenderInstance(RenderInstance): + outputType = attr.ib(default="Image") + outputFormat = attr.ib(default="PNG4") + outputStartFrame = attr.ib(default=1) + leadingZeros = attr.ib(default=3) + + +class CollectFarmRender(pype.lib.abstract_collect_render. + AbstractCollectRender): + """Gather all publishable renders.""" + + # https://docs.toonboom.com/help/harmony-17/premium/reference/node/output/write-node-image-formats.html + ext_mapping = { + "tvg": ["TVG"], + "tga": ["TGA", "TGA4", "TGA3", "TGA1"], + "sgi": ["SGI", "SGI4", "SGA3", "SGA1", "SGIDP", "SGIDP4", "SGIDP3"], + "psd": ["PSD", "PSD1", "PSD3", "PSD4", "PSDDP", "PSDDP1", "PSDDP3", + "PSDDP4"], + "yuv": ["YUV"], + "pal": ["PAL"], + "scan": ["SCAN"], + "png": ["PNG", "PNG4", "PNGDP", "PNGDP3", "PNGDP4"], + "jpg": ["JPG"], + "bmp": ["BMP", "BMP4"], + "opt": ["OPT", "OPT1", "OPT3", "OPT4"], + "var": ["VAR"], + "tif": ["TIF"], + "dpx": ["DPX", "DPX3_8", "DPX3_10", "DPX3_12", "DPX3_16", + "DPX3_10_INVERTED_CHANNELS", "DPX3_12_INVERTED_CHANNELS", + "DPX3_16_INVERTED_CHANNELS"], + "exr": ["EXR"], + "pdf": ["PDF"], + "dtext": ["DTEX"] + } + + def get_expected_files(self, render_instance): + """Get list of expected files to be rendered from Harmony. + + This returns full path with file name determined by Write node + settings. + """ + start = render_instance.frameStart + end = render_instance.frameEnd + node = render_instance.setMembers[0] + self_name = self.__class__.__name__ + # 0 - filename / 1 - type / 2 - zeros / 3 - start + info = harmony.send( + { + "function": f"PypeHarmony.Publish.{self_name}." + "getRenderNodeSettings", + "args": node + })["result"] + + ext = None + for k, v in self.ext_mapping.items(): + if info[1] in v: + ext = k + + if not ext: + raise AssertionError( + f"Cannot determine file extension for {info[1]}") + + path = Path(render_instance.source).parent + + # is sequence start node on write node offsetting whole sequence? + expected_files = [] + for frame in range(start, end): + expected_files.append( + path / "{}{}.{}".format( + info[0], + str(frame).rjust(int(info[2]) + 1, "0"), + ext + ) + ) + + return expected_files + + def get_instances(self, context): + """Get instances per Write node in `renderFarm` family.""" + version = None + if self.sync_workfile_version: + version = context.data["version"] + + instances = [] + + self_name = self.__class__.__name__ + + for node in context.data["allNodes"]: + data = harmony.read(node) + + # Skip non-tagged nodes. + if not data: + continue + + # Skip containers. + if "container" in data["id"]: + continue + + if data["family"] != "renderFarm": + continue + + # 0 - filename / 1 - type / 2 - zeros / 3 - start + info = harmony.send( + { + "function": f"PypeHarmony.Publish.{self_name}." + "getRenderNodeSettings", + "args": node + })["result"] + + # TODO: handle pixel aspect and frame step + # TODO: set Deadline stuff (pools, priority, etc. by presets) + render_instance = HarmonyRenderInstance( + version=version, + time=api.time(), + source=context.data["currentFile"], + label=node.split("/")[1], + subset=node.split("/")[1], + asset=api.Session["AVALON_ASSET"], + attachTo=False, + setMembers=[node], + publish=True, + review=False, + renderer=None, + priority=50, + name=node.split("/")[1], + + family="renderlayer", + families=["renderlayer"], + + resolutionWidth=context.data["resolutionWidth"], + resolutionHeight=context.data["resolutionHeight"], + pixelAspect=1.0, + multipartExr=False, + tileRendering=False, + tilesX=0, + tilesY=0, + convertToScanline=False, + + # time settings + frameStart=context.data["frameStart"], + frameEnd=context.data["frameEnd"], + frameStep=1, + outputType="Image", + outputFormat=info[1], + outputStartFrame=info[3], + leadingZeros=info[2], + toBeRenderedOn='deadline' + + ) + self.log.debug(render_instance) + instances.append(render_instance) + + return instances + + def add_additional_data(self, instance): + instance["FOV"] = self._context.data["FOV"] + + return instance diff --git a/pype/plugins/harmony/publish/collect_instances.py b/pype/plugins/harmony/publish/collect_instances.py index 21aa00e972..c3e551271f 100644 --- a/pype/plugins/harmony/publish/collect_instances.py +++ b/pype/plugins/harmony/publish/collect_instances.py @@ -49,6 +49,10 @@ class CollectInstances(pyblish.api.ContextPlugin): if "container" in data["id"]: continue + # skip render farm family as it is collected separately + if data["family"] == "renderFarm": + continue + instance = context.create_instance(node.split("/")[-1]) instance.append(node) instance.data.update(data) diff --git a/pype/plugins/harmony/publish/collect_palettes.py b/pype/plugins/harmony/publish/collect_palettes.py index 0900f3c3ff..26b83ff171 100644 --- a/pype/plugins/harmony/publish/collect_palettes.py +++ b/pype/plugins/harmony/publish/collect_palettes.py @@ -27,6 +27,7 @@ class CollectPalettes(pyblish.api.ContextPlugin): instance.data.update({ "id": id, "family": "harmony.palette", + 'families': [], "asset": os.environ["AVALON_ASSET"], "subset": "{}{}".format("palette", name) }) diff --git a/pype/plugins/harmony/publish/collect_scene.py b/pype/plugins/harmony/publish/collect_scene.py index 2a838ca0cd..afb49369dc 100644 --- a/pype/plugins/harmony/publish/collect_scene.py +++ b/pype/plugins/harmony/publish/collect_scene.py @@ -30,9 +30,24 @@ class CollectScene(pyblish.api.ContextPlugin): context.data["audioPath"] = result[6] context.data["resolutionWidth"] = result[7] context.data["resolutionHeight"] = result[8] + context.data["FOV"] = result[9] all_nodes = harmony.send( {"function": "node.subNodes", "args": ["Top"]} )["result"] context.data["allNodes"] = all_nodes + + # collect all write nodes to be able disable them in Deadline + all_write_nodes = harmony.send( + {"function": "node.getNodes", "args": ["WRITE"]} + )["result"] + + context.data["all_write_nodes"] = all_write_nodes + + result = harmony.send( + { + f"function": "PypeHarmony.getVersion", + "args": []} + )["result"] + context.data["harmonyVersion"] = "{}.{}".format(result[0], result[1]) diff --git a/pype/plugins/harmony/publish/collect_workfile.py b/pype/plugins/harmony/publish/collect_workfile.py index 02eb38db48..63bfd5929b 100644 --- a/pype/plugins/harmony/publish/collect_workfile.py +++ b/pype/plugins/harmony/publish/collect_workfile.py @@ -26,7 +26,7 @@ class CollectWorkfile(pyblish.api.ContextPlugin): "label": basename, "name": basename, "family": family, - "families": [], + "families": [family], "representations": [], "asset": os.environ["AVALON_ASSET"] }) diff --git a/pype/plugins/harmony/publish/extract_render.py b/pype/plugins/harmony/publish/extract_render.py index c5744d43e2..84fa503f54 100644 --- a/pype/plugins/harmony/publish/extract_render.py +++ b/pype/plugins/harmony/publish/extract_render.py @@ -17,7 +17,7 @@ class ExtractRender(pyblish.api.InstancePlugin): label = "Extract Render" order = pyblish.api.ExtractorOrder hosts = ["harmony"] - families = ["render"] + families = ["renderLocal"] def process(self, instance): # Collect scene data. diff --git a/pype/plugins/harmony/publish/submit_harmony_deadline..py b/pype/plugins/harmony/publish/submit_harmony_deadline..py new file mode 100644 index 0000000000..88ab1bec1d --- /dev/null +++ b/pype/plugins/harmony/publish/submit_harmony_deadline..py @@ -0,0 +1,404 @@ +# -*- coding: utf-8 -*- +"""Submitting render job to Deadline.""" +import os +from pathlib import Path +from collections import OrderedDict +from zipfile import ZipFile, is_zipfile + +import attr +import pyblish.api + +import pype.lib.abstract_submit_deadline +from pype.lib.abstract_submit_deadline import DeadlineJobInfo +from avalon import api + + +class _ZipFile(ZipFile): + """Extended check for windows invalid characters.""" + + # this is extending default zipfile table for few invalid characters + # that can come from Mac + _windows_illegal_characters = ":<>|\"?*\r\n\x00" + _windows_illegal_name_trans_table = str.maketrans( + _windows_illegal_characters, + "_" * len(_windows_illegal_characters) + ) + + +@attr.s +class PluginInfo(object): + """Plugin info structure for Harmony Deadline plugin.""" + + SceneFile = attr.ib() + # Harmony version + Version = attr.ib() + + Camera = attr.ib(default="") + FieldOfView = attr.ib(default=41.11) + IsDatabase = attr.ib(default=False) + ResolutionX = attr.ib(default=1920) + ResolutionY = attr.ib(default=1080) + + # Resolution name preset, default + UsingResPreset = attr.ib(default=False) + ResolutionName = attr.ib(default="HDTV_1080p24") + + PreRenderInlineScript = attr.ib(default=None) + + # -------------------------------------------------- + _outputNode = attr.ib(factory=list) + + @property + def OutputNode(self): # noqa: N802 + """Return all output nodes formatted for Deadline. + + Returns: + dict: as `{'Output0Node', 'Top/renderFarmDefault'}` + + """ + out = {} + for index, v in enumerate(self._outputNode): + out["Output{}Node".format(index)] = v + return out + + @OutputNode.setter + def OutputNode(self, val): # noqa: N802 + self._outputNode.append(val) + + # -------------------------------------------------- + _outputType = attr.ib(factory=list) + + @property + def OutputType(self): # noqa: N802 + """Return output nodes type formatted for Deadline. + + Returns: + dict: as `{'Output0Type', 'Image'}` + + """ + out = {} + for index, v in enumerate(self._outputType): + out["Output{}Type".format(index)] = v + return out + + @OutputType.setter + def OutputType(self, val): # noqa: N802 + self._outputType.append(val) + + # -------------------------------------------------- + _outputLeadingZero = attr.ib(factory=list) + + @property + def OutputLeadingZero(self): # noqa: N802 + """Return output nodes type formatted for Deadline. + + Returns: + dict: as `{'Output0LeadingZero', '3'}` + + """ + out = {} + for index, v in enumerate(self._outputLeadingZero): + out["Output{}LeadingZero".format(index)] = v + return out + + @OutputLeadingZero.setter + def OutputLeadingZero(self, val): # noqa: N802 + self._outputLeadingZero.append(val) + + # -------------------------------------------------- + _outputFormat = attr.ib(factory=list) + + @property + def OutputFormat(self): # noqa: N802 + """Return output nodes format formatted for Deadline. + + Returns: + dict: as `{'Output0Type', 'PNG4'}` + + """ + out = {} + for index, v in enumerate(self._outputFormat): + out["Output{}Format".format(index)] = v + return out + + @OutputFormat.setter + def OutputFormat(self, val): # noqa: N802 + self._outputFormat.append(val) + + # -------------------------------------------------- + _outputStartFrame = attr.ib(factory=list) + + @property + def OutputStartFrame(self): # noqa: N802 + """Return start frame for output nodes formatted for Deadline. + + Returns: + dict: as `{'Output0StartFrame', '1'}` + + """ + out = {} + for index, v in enumerate(self._outputStartFrame): + out["Output{}StartFrame".format(index)] = v + return out + + @OutputStartFrame.setter + def OutputStartFrame(self, val): # noqa: N802 + self._outputStartFrame.append(val) + + # -------------------------------------------------- + _outputPath = attr.ib(factory=list) + + @property + def OutputPath(self): # noqa: N802 + """Return output paths for nodes formatted for Deadline. + + Returns: + dict: as `{'Output0Path', '/output/path'}` + + """ + out = {} + for index, v in enumerate(self._outputPath): + out["Output{}Path".format(index)] = v + return out + + @OutputPath.setter + def OutputPath(self, val): # noqa: N802 + self._outputPath.append(val) + + def set_output(self, node, image_format, output, + output_type="Image", zeros=3, start_frame=1): + """Helper to set output. + + This should be used instead of setting properties individually + as so index remain consistent. + + Args: + node (str): harmony write node name + image_format (str): format of output (PNG4, TIF, ...) + output (str): output path + output_type (str, optional): "Image" or "Movie" (not supported). + zeros (int, optional): Leading zeros (for 0001 = 3) + start_frame (int, optional): Sequence offset. + + """ + + self.OutputNode = node + self.OutputFormat = image_format + self.OutputPath = output + self.OutputType = output_type + self.OutputLeadingZero = zeros + self.OutputStartFrame = start_frame + + def serialize(self): + """Return all data serialized as dictionary. + + Returns: + OrderedDict: all serialized data. + + """ + def filter_data(a, v): + if a.name.startswith("_"): + return False + if v is None: + return False + return True + + serialized = attr.asdict( + self, dict_factory=OrderedDict, filter=filter_data) + serialized.update(self.OutputNode) + serialized.update(self.OutputFormat) + serialized.update(self.OutputPath) + serialized.update(self.OutputType) + serialized.update(self.OutputLeadingZero) + serialized.update(self.OutputStartFrame) + + return serialized + + +class HarmonySubmitDeadline( + pype.lib.abstract_submit_deadline.AbstractSubmitDeadline): + """Submit render write of Harmony scene to Deadline. + + Renders are submitted to a Deadline Web Service as + supplied via the environment variable ``DEADLINE_REST_URL``. + + Note: + If Deadline configuration is not detected, this plugin will + be disabled. + + Attributes: + use_published (bool): Use published scene to render instead of the + one in work area. + + """ + + label = "Submit to Deadline" + order = pyblish.api.IntegratorOrder + 0.1 + hosts = ["harmony"] + families = ["renderlayer"] + if not os.environ.get("DEADLINE_REST_URL"): + optional = False + active = False + else: + optional = True + + use_published = False + primary_pool = "" + secondary_pool = "" + priority = 50 + chunk_size = 1000000 + + def get_job_info(self): + job_info = DeadlineJobInfo("Harmony") + job_info.Name = self._instance.data["name"] + job_info.Frames = "{}-{}".format( + self._instance.data["frameStart"], + self._instance.data["frameEnd"] + ) + # for now, get those from presets. Later on it should be + # configurable in Harmony UI directly. + job_info.Priority = self.priority + job_info.Pool = self.primary_pool + job_info.SecondaryPool = self.secondary_pool + job_info.ChunkSize = self.chunk_size + job_info.BatchName = os.path.basename(self._instance.data["source"]) + + keys = [ + "FTRACK_API_KEY", + "FTRACK_API_USER", + "FTRACK_SERVER", + "AVALON_PROJECT", + "AVALON_ASSET", + "AVALON_TASK", + "PYPE_USERNAME", + "PYPE_DEV", + "PYPE_LOG_NO_COLORS" + ] + + environment = dict({key: os.environ[key] for key in keys + if key in os.environ}, **api.Session) + for key in keys: + val = environment.get(key) + if val: + job_info.EnvironmentKeyValue = "{key}={value}".format( + key=key, + value=val) + + return job_info + + def _unzip_scene_file(self, published_scene: Path) -> Path: + """Unzip scene zip file to its directory. + + Unzip scene file (if it is zip file) to its current directory and + return path to xstage file there. Xstage file is determined by its + name. + + Args: + published_scene (Path): path to zip file. + + Returns: + Path: The path to unzipped xstage. + """ + # if not zip, bail out. + if "zip" not in published_scene.suffix or not is_zipfile( + published_scene.as_posix() + ): + self.log.error("Published scene is not in zip.") + self.log.error(published_scene) + raise AssertionError("invalid scene format") + + xstage_path = ( + published_scene.parent + / published_scene.stem + / f"{published_scene.stem}.xstage" + ) + + unzip_dir = (published_scene.parent / published_scene.stem) + with _ZipFile(published_scene, "r") as zip_ref: + zip_ref.extractall(unzip_dir.as_posix()) + + # find any xstage files in directory, prefer the one with the same name + # as directory (plus extension) + xstage_files = [] + for scene in unzip_dir.iterdir(): + if scene.suffix == ".xstage": + xstage_files.append(scene) + + # there must be at least one (but maybe not more?) xstage file + if not xstage_files: + self.log.error("No xstage files found in zip") + raise AssertionError("Invalid scene archive") + + ideal_scene = False + # find the one with the same name as zip. In case there can be more + # then one xtage file. + for scene in xstage_files: + # if /foo/bar/baz.zip == /foo/bar/baz/baz.xstage + # ^^^ ^^^ + if scene.stem == published_scene.stem: + xstage_path = scene + ideal_scene = True + + # but sometimes xstage file has different name then zip - in that case + # use that one. + if not ideal_scene: + xstage_path = xstage_files[0] + + return xstage_path + + def get_plugin_info(self): + work_scene = Path(self._instance.data["source"]) + + # this is path to published scene workfile _ZIP_. Before + # rendering, we need to unzip it. + published_scene = Path( + self.from_published_scene(False)) + self.log.info(f"Processing {published_scene.as_posix()}") + xstage_path = self._unzip_scene_file(published_scene) + render_path = xstage_path.parent / "renders" + + # for submit_publish job to create .json file in + self._instance.data["outputDir"] = render_path + new_expected_files = [] + work_path_str = str(work_scene.parent.as_posix()) + render_path_str = str(render_path.as_posix()) + for file in self._instance.data["expectedFiles"]: + _file = str(Path(file).as_posix()) + new_expected_files.append( + _file.replace(work_path_str, render_path_str) + ) + + self._instance.data["source"] = str(published_scene.as_posix()) + self._instance.data["expectedFiles"] = new_expected_files + harmony_plugin_info = PluginInfo( + SceneFile=xstage_path.as_posix(), + Version=( + self._instance.context.data["harmonyVersion"].split(".")[0]), + FieldOfView=self._instance.context.data["FOV"], + ResolutionX=self._instance.data["resolutionWidth"], + ResolutionY=self._instance.data["resolutionHeight"] + ) + + dynamic_part = "{}.{}".format( + str(1).rjust(int(self._instance.data["leadingZeros"]) + 1, "0"), + self._instance.data["outputFormat"].lower()) + + harmony_plugin_info.set_output( + self._instance.data["setMembers"][0], + self._instance.data["outputFormat"], + self._instance.data["expectedFiles"][0].replace(dynamic_part, ''), + self._instance.data["outputType"], + self._instance.data["leadingZeros"], + self._instance.data["outputStartFrame"] + ) + + all_write_nodes = self._instance.context.data["all_write_nodes"] + disable_nodes = [] + for node in all_write_nodes: + # disable all other write nodes + if node != self._instance.data["setMembers"][0]: + disable_nodes.append("node.setEnable('{}', false)" + .format(node)) + harmony_plugin_info.PreRenderInlineScript = ';'.join(disable_nodes) + + return harmony_plugin_info.serialize() diff --git a/pype/plugins/harmony/publish/validate_scene_settings.py b/pype/plugins/harmony/publish/validate_scene_settings.py index 70e6f47721..17fc528cc0 100644 --- a/pype/plugins/harmony/publish/validate_scene_settings.py +++ b/pype/plugins/harmony/publish/validate_scene_settings.py @@ -21,7 +21,7 @@ class ValidateSceneSettingsRepair(pyblish.api.Action): pype.hosts.harmony.set_scene_settings( pype.hosts.harmony.get_asset_settings() ) - if not os.patch.exists(context.data["scenePath"]): + if not os.path.exists(context.data["scenePath"]): self.log.info("correcting scene name") scene_dir = os.path.dirname(context.data["currentFile"]) scene_path = os.path.join( From 01bbaec74ac8ee3b22582ade8483f75a9abca837 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 13 Jan 2021 18:36:44 +0100 Subject: [PATCH 028/113] Harmony to Deadline - 2x.develop version added custom plugin - for error_code handling and preRenderInline --- pype/plugins/harmony/publish/submit_harmony_deadline..py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/plugins/harmony/publish/submit_harmony_deadline..py b/pype/plugins/harmony/publish/submit_harmony_deadline..py index 88ab1bec1d..9af9f5b393 100644 --- a/pype/plugins/harmony/publish/submit_harmony_deadline..py +++ b/pype/plugins/harmony/publish/submit_harmony_deadline..py @@ -251,6 +251,7 @@ class HarmonySubmitDeadline( def get_job_info(self): job_info = DeadlineJobInfo("Harmony") job_info.Name = self._instance.data["name"] + job_info.Plugin = "HarmonyPype" job_info.Frames = "{}-{}".format( self._instance.data["frameStart"], self._instance.data["frameEnd"] @@ -382,7 +383,6 @@ class HarmonySubmitDeadline( dynamic_part = "{}.{}".format( str(1).rjust(int(self._instance.data["leadingZeros"]) + 1, "0"), self._instance.data["outputFormat"].lower()) - harmony_plugin_info.set_output( self._instance.data["setMembers"][0], self._instance.data["outputFormat"], From afce3b6932a6365d7d02084a46ccc8dcf1185599 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 14 Jan 2021 16:22:14 +0100 Subject: [PATCH 029/113] Harmon to Deadline - fix for usage of 'png4' etc. Fix - last character of file prefix is a number --- pype/plugins/harmony/publish/collect_farm_render.py | 8 +++++++- .../harmony/publish/submit_harmony_deadline..py | 10 ++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pype/plugins/harmony/publish/collect_farm_render.py b/pype/plugins/harmony/publish/collect_farm_render.py index baf037491b..065d52c3fc 100644 --- a/pype/plugins/harmony/publish/collect_farm_render.py +++ b/pype/plugins/harmony/publish/collect_farm_render.py @@ -76,10 +76,16 @@ class CollectFarmRender(pype.lib.abstract_collect_render. # is sequence start node on write node offsetting whole sequence? expected_files = [] + + # add '.' if last character of file prefix is a number + file_prefix = info[0] + last_char = file_prefix[-1] + if str.isdigit(last_char): + file_prefix += '.' for frame in range(start, end): expected_files.append( path / "{}{}.{}".format( - info[0], + file_prefix, str(frame).rjust(int(info[2]) + 1, "0"), ext ) diff --git a/pype/plugins/harmony/publish/submit_harmony_deadline..py b/pype/plugins/harmony/publish/submit_harmony_deadline..py index 9af9f5b393..dfb2702a8b 100644 --- a/pype/plugins/harmony/publish/submit_harmony_deadline..py +++ b/pype/plugins/harmony/publish/submit_harmony_deadline..py @@ -4,6 +4,7 @@ import os from pathlib import Path from collections import OrderedDict from zipfile import ZipFile, is_zipfile +import re import attr import pyblish.api @@ -380,13 +381,14 @@ class HarmonySubmitDeadline( ResolutionY=self._instance.data["resolutionHeight"] ) - dynamic_part = "{}.{}".format( - str(1).rjust(int(self._instance.data["leadingZeros"]) + 1, "0"), - self._instance.data["outputFormat"].lower()) + pattern = '[0]{' + str(self._instance.data["leadingZeros"]) + \ + '}1\.[a-zA-Z]{3}' + render_prefix = re.sub(pattern, '', + self._instance.data["expectedFiles"][0]) harmony_plugin_info.set_output( self._instance.data["setMembers"][0], self._instance.data["outputFormat"], - self._instance.data["expectedFiles"][0].replace(dynamic_part, ''), + render_prefix, self._instance.data["outputType"], self._instance.data["leadingZeros"], self._instance.data["outputStartFrame"] From 3b93fae6f7e317986503544936e262180e94f63b Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 15 Jan 2021 16:02:15 +0100 Subject: [PATCH 030/113] Harmon to Deadline - fix for non alpha last character on write node Number or non alpha (._) last characters in write node create problems. Remove them as this value is internal and not used in final publish either way --- pype/plugins/harmony/publish/collect_farm_render.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pype/plugins/harmony/publish/collect_farm_render.py b/pype/plugins/harmony/publish/collect_farm_render.py index 065d52c3fc..be9c3dd008 100644 --- a/pype/plugins/harmony/publish/collect_farm_render.py +++ b/pype/plugins/harmony/publish/collect_farm_render.py @@ -77,11 +77,11 @@ class CollectFarmRender(pype.lib.abstract_collect_render. # is sequence start node on write node offsetting whole sequence? expected_files = [] - # add '.' if last character of file prefix is a number + # remove last char if last character of file prefix is a number file_prefix = info[0] - last_char = file_prefix[-1] - if str.isdigit(last_char): - file_prefix += '.' + while not str.isalpha(file_prefix[-1]): + file_prefix = file_prefix[:-1] + for frame in range(start, end): expected_files.append( path / "{}{}.{}".format( From 19a91b9ea7a348ffffe87eca576f24d0853fbe08 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 15 Jan 2021 17:06:59 +0100 Subject: [PATCH 031/113] Harmon to Deadline - fix for 17 It seems that Harmony 17 needs at least one '.' in file_prefix. Cannot be last character though! --- pype/plugins/harmony/publish/collect_farm_render.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pype/plugins/harmony/publish/collect_farm_render.py b/pype/plugins/harmony/publish/collect_farm_render.py index be9c3dd008..e604cb0bc0 100644 --- a/pype/plugins/harmony/publish/collect_farm_render.py +++ b/pype/plugins/harmony/publish/collect_farm_render.py @@ -77,10 +77,9 @@ class CollectFarmRender(pype.lib.abstract_collect_render. # is sequence start node on write node offsetting whole sequence? expected_files = [] - # remove last char if last character of file prefix is a number + # Harmony 17 needs at least one '.' in file_prefix, but not at end file_prefix = info[0] - while not str.isalpha(file_prefix[-1]): - file_prefix = file_prefix[:-1] + file_prefix += '.temp' for frame in range(start, end): expected_files.append( From 889c301a6c219910d6f36e6e9bbe93f60baf79f7 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 15 Jan 2021 17:30:24 +0100 Subject: [PATCH 032/113] clean code with deprecated code and other mess --- pype/hosts/nuke/api/__init__.py | 2 +- pype/hosts/nuke/api/lib.py | 2 +- pype/hosts/nuke/api/menu.py | 2 +- pype/hosts/nuke/api/plugin.py | 10 +++------- pype/hosts/nuke/api/utils.py | 3 ++- pype/hosts/nuke/startup/menu.py | 2 +- pype/hosts/nuke/startup/write_to_read.py | 2 +- 7 files changed, 10 insertions(+), 13 deletions(-) diff --git a/pype/hosts/nuke/api/__init__.py b/pype/hosts/nuke/api/__init__.py index 0c9618bcf4..cca17eae57 100644 --- a/pype/hosts/nuke/api/__init__.py +++ b/pype/hosts/nuke/api/__init__.py @@ -14,7 +14,7 @@ from . import lib, menu self = sys.modules[__name__] self.workfiles_launched = False -log = Logger().get_logger(__name__, "nuke") +log = Logger().get_logger(__name__) AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") HOST_DIR = os.path.dirname(os.path.abspath(pype.hosts.nuke.__file__)) diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index b2ada0d19c..96067a3d48 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -21,7 +21,7 @@ import nuke from .utils import set_context_favorites -log = Logger().get_logger(__name__, "nuke") +log = Logger().get_logger(__name__) self = sys.modules[__name__] self._project = None diff --git a/pype/hosts/nuke/api/menu.py b/pype/hosts/nuke/api/menu.py index 7bebbeeefc..8161b9024c 100644 --- a/pype/hosts/nuke/api/menu.py +++ b/pype/hosts/nuke/api/menu.py @@ -4,7 +4,7 @@ from avalon.api import Session from .lib import WorkfileSettings from pype.api import Logger, BuildWorkfile -log = Logger().get_logger(__name__, "nuke") +log = Logger().get_logger(__name__) def install(): diff --git a/pype/hosts/nuke/api/plugin.py b/pype/hosts/nuke/api/plugin.py index 1d8d137156..d6799ed6ca 100644 --- a/pype/hosts/nuke/api/plugin.py +++ b/pype/hosts/nuke/api/plugin.py @@ -1,11 +1,10 @@ -import re import avalon.api import avalon.nuke from pype.api import get_current_project_settings from .lib import check_subsetname_exists - import nuke + class PypeCreator(avalon.nuke.pipeline.Creator): """Pype Nuke Creator class wrapper """ @@ -17,11 +16,8 @@ class PypeCreator(avalon.nuke.pipeline.Creator): if check_subsetname_exists( nuke.allNodes(), self.data["subset"]): - msg = "The subset name `{0}` is already used on a node in" \ - "this workfile.".format(self.data["subset"]) + msg = ("The subset name `{0}` is already used on a node in" + "this workfile.".format(self.data["subset"])) self.log.error(msg + '\n\nPlease use other subset name!') raise NameError("`{0}: {1}".format(__name__, msg)) return - - - diff --git a/pype/hosts/nuke/api/utils.py b/pype/hosts/nuke/api/utils.py index 72c7b7bc14..e14b03d453 100644 --- a/pype/hosts/nuke/api/utils.py +++ b/pype/hosts/nuke/api/utils.py @@ -4,12 +4,13 @@ from avalon.nuke import lib as anlib from pype.api import resources -def set_context_favorites(favorites={}): +def set_context_favorites(favorites=None): """ Addig favorite folders to nuke's browser Argumets: favorites (dict): couples of {name:path} """ + favorites = favorites or {} icon_path = resources.get_resource("icons", "folder-favorite3.png") for name, path in favorites.items(): nuke.addFavoriteDir( diff --git a/pype/hosts/nuke/startup/menu.py b/pype/hosts/nuke/startup/menu.py index be0f6c411c..8e2e06a169 100644 --- a/pype/hosts/nuke/startup/menu.py +++ b/pype/hosts/nuke/startup/menu.py @@ -6,7 +6,7 @@ from pype.hosts.nuke.api.lib import ( import nuke from pype.api import Logger -log = Logger().get_logger(__name__, "nuke") +log = Logger().get_logger(__name__) nuke.addOnScriptSave(on_script_load) diff --git a/pype/hosts/nuke/startup/write_to_read.py b/pype/hosts/nuke/startup/write_to_read.py index 58985947bd..d4556fa64c 100644 --- a/pype/hosts/nuke/startup/write_to_read.py +++ b/pype/hosts/nuke/startup/write_to_read.py @@ -3,7 +3,7 @@ import os import glob import nuke from pype.api import Logger -log = Logger().get_logger(__name__, "nuke") +log = Logger().get_logger(__name__) SINGLE_FILE_FORMATS = ['avi', 'mp4', 'mxf', 'mov', 'mpg', 'mpeg', 'wmv', 'm4v', 'm2v'] From fe8c9546db0c4c31ed1e0e5c5bf72252a636d802 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 18 Jan 2021 10:58:26 +0100 Subject: [PATCH 033/113] fix(global): import otio python27 workaround --- pype/lib/editorial.py | 49 +++++++++++++++++++++------------------- pype/lib/import_utils.py | 25 ++++++++++++++++++++ 2 files changed, 51 insertions(+), 23 deletions(-) create mode 100644 pype/lib/import_utils.py diff --git a/pype/lib/editorial.py b/pype/lib/editorial.py index 7f29bf00bb..1dbc4d7954 100644 --- a/pype/lib/editorial.py +++ b/pype/lib/editorial.py @@ -1,15 +1,18 @@ import os import re import clique -from opentimelineio import opentime -from opentimelineio.opentime import ( - to_frames, RationalTime, TimeRange) +from .import_utils import discover_host_vendor_module + +try: + from opentimelineio import opentime as _ot +except ImportError: + _ot = discover_host_vendor_module("opentimelineio.opentime") def otio_range_to_frame_range(otio_range): - start = to_frames( + start = _ot.to_frames( otio_range.start_time, otio_range.start_time.rate) - end = start + to_frames( + end = start + _ot.to_frames( otio_range.duration, otio_range.duration.rate) - 1 return start, end @@ -19,12 +22,12 @@ def otio_range_with_handles(otio_range, instance): handle_end = instance.data["handleEnd"] handles_duration = handle_start + handle_end fps = float(otio_range.start_time.rate) - start = to_frames(otio_range.start_time, fps) - duration = to_frames(otio_range.duration, fps) + start = _ot.to_frames(otio_range.start_time, fps) + duration = _ot.to_frames(otio_range.duration, fps) - return TimeRange( - start_time=RationalTime((start - handle_start), fps), - duration=RationalTime((duration + handles_duration), fps) + return _ot.TimeRange( + start_time=_ot.RationalTime((start - handle_start), fps), + duration=_ot.RationalTime((duration + handles_duration), fps) ) @@ -80,22 +83,22 @@ def trim_media_range(media_range, source_range): Trim input media range with clip source range. Args: - media_range (otio.opentime.TimeRange): available range of media - source_range (otio.opentime.TimeRange): clip required range + media_range (otio._ot._ot.TimeRange): available range of media + source_range (otio._ot._ot.TimeRange): clip required range Returns: - otio.opentime.TimeRange: trimmed media range + otio._ot._ot.TimeRange: trimmed media range """ - rw_media_start = RationalTime( + rw_media_start = _ot.RationalTime( media_range.start_time.value + source_range.start_time.value, media_range.start_time.rate ) - rw_media_duration = RationalTime( + rw_media_duration = _ot.RationalTime( source_range.duration.value, media_range.duration.rate ) - return TimeRange( + return _ot.TimeRange( rw_media_start, rw_media_duration) @@ -109,12 +112,12 @@ def range_from_frames(start, duration, fps): fps (float): frame range Returns: - otio.opentime.TimeRange: crated range + otio._ot._ot.TimeRange: crated range """ - return TimeRange( - RationalTime(start, fps), - RationalTime(duration, fps) + return _ot.TimeRange( + _ot.RationalTime(start, fps), + _ot.RationalTime(duration, fps) ) @@ -130,8 +133,8 @@ def frames_to_secons(frames, framerate): float: second value """ - rt = opentime.from_frames(frames, framerate) - return opentime.to_seconds(rt) + rt = _ot.from_frames(frames, framerate) + return _ot.to_seconds(rt) def make_sequence_collection(path, otio_range, metadata): @@ -140,7 +143,7 @@ def make_sequence_collection(path, otio_range, metadata): Args: path (str): path to image sequence with `%d` - otio_range (otio.opentime.TimeRange): range to be used + otio_range (otio._ot._ot.TimeRange): range to be used metadata (dict): data where padding value can be found Returns: diff --git a/pype/lib/import_utils.py b/pype/lib/import_utils.py new file mode 100644 index 0000000000..5c832a925c --- /dev/null +++ b/pype/lib/import_utils.py @@ -0,0 +1,25 @@ +import os +import sys +import importlib +from .log import PypeLogger as Logger + +log = Logger().get_logger(__name__) + + +def discover_host_vendor_module(module_name): + host = os.environ["AVALON_APP"] + pype_root = os.environ["PYPE_ROOT"] + main_module = module_name.split(".")[0] + module_path = os.path.join( + pype_root, "hosts", host, "vendor", main_module) + + log.debug( + "Importing moduel from host vendor path: `{}`".format(module_path)) + + if not os.path.exists(module_path): + log.warning( + "Path not existing: `{}`".format(module_path)) + return None + + sys.path.insert(1, module_path) + return importlib.import_module(module_name) From 0911787fdb9e72d993598243beda879583d3e88c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 19 Jan 2021 17:36:44 +0100 Subject: [PATCH 034/113] hound(nuke): pep8 suggestions --- pype/hosts/nuke/api/__init__.py | 3 +-- .../plugins/create/create_write_prerender.py | 2 +- pype/hosts/nuke/plugins/load/load_mov.py | 26 +++++++++---------- pype/hosts/nuke/plugins/load/load_sequence.py | 2 -- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/pype/hosts/nuke/api/__init__.py b/pype/hosts/nuke/api/__init__.py index cca17eae57..26a8248f01 100644 --- a/pype/hosts/nuke/api/__init__.py +++ b/pype/hosts/nuke/api/__init__.py @@ -1,7 +1,5 @@ import os import sys -import logging - import nuke from avalon import api as avalon @@ -53,6 +51,7 @@ def reload_config(): try: importlib.reload(module) except AttributeError as e: + from importlib import reload log.warning("Cannot reload module: {}".format(e)) reload(module) diff --git a/pype/hosts/nuke/plugins/create/create_write_prerender.py b/pype/hosts/nuke/plugins/create/create_write_prerender.py index 44b01f4bcd..d1969c7fba 100644 --- a/pype/hosts/nuke/plugins/create/create_write_prerender.py +++ b/pype/hosts/nuke/plugins/create/create_write_prerender.py @@ -91,7 +91,7 @@ class CreateWritePrerender(plugin.PypeCreator): write_data.update({ "fpath_template": ("{work}/prerenders/nuke/{subset}" "/{subset}.{frame}.{ext}")}) - + self.log.info("write_data: {}".format(write_data)) write_node = lib.create_write_node( diff --git a/pype/hosts/nuke/plugins/load/load_mov.py b/pype/hosts/nuke/plugins/load/load_mov.py index 95bd780896..f9be675cb9 100644 --- a/pype/hosts/nuke/plugins/load/load_mov.py +++ b/pype/hosts/nuke/plugins/load/load_mov.py @@ -1,4 +1,3 @@ -import re import nuke import contextlib @@ -9,7 +8,6 @@ from pype.hosts.nuke.api.lib import ( ) - @contextlib.contextmanager def preserve_trim(node): """Preserve the relative trim of the Loader tool. @@ -77,16 +75,17 @@ def add_review_presets_config(): "representations": list() } settings = get_current_project_settings() - review_profiles = (settings["global"] - ["publish"] - ["ExtractReview"] - ["profiles"] - ) + review_profiles = ( + settings["global"] + ["publish"] + ["ExtractReview"] + ["profiles"] + ) outputs = {} for profile in review_profiles: outputs.update(profile.get("outputs", {})) - + for output, properities in outputs.items(): returning["representations"].append(output) returning["families"] += properities.get("families", []) @@ -277,10 +276,11 @@ class LoadMov(api.Loader): colorspace = version_data.get("colorspace") if first is None: - self.log.warning("Missing start frame for updated version" - "assuming starts at frame 0 for: " - "{} ({})".format( - node['name'].value(), representation)) + self.log.warning(( + "Missing start frame for updated version" + "assuming starts at frame 0 for: " + "{} ({})").format( + node['name'].value(), representation)) first = 0 # fix handle start and end if none are available @@ -313,7 +313,7 @@ class LoadMov(api.Loader): preset_clrsp = get_imageio_input_colorspace(file) if preset_clrsp is not None: - r["colorspace"].setValue(preset_clrsp) + node["colorspace"].setValue(preset_clrsp) updated_dict = {} updated_dict.update({ diff --git a/pype/hosts/nuke/plugins/load/load_sequence.py b/pype/hosts/nuke/plugins/load/load_sequence.py index e3c0202395..f99b7be52f 100644 --- a/pype/hosts/nuke/plugins/load/load_sequence.py +++ b/pype/hosts/nuke/plugins/load/load_sequence.py @@ -1,5 +1,3 @@ -import re -import os import nuke import contextlib From 8355979cc991f48741590e72084ebca14f7a8eba Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 20 Jan 2021 13:05:46 +0100 Subject: [PATCH 035/113] Harmon to Deadline - fix last frame wasn't published --- pype/plugins/harmony/publish/collect_farm_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/plugins/harmony/publish/collect_farm_render.py b/pype/plugins/harmony/publish/collect_farm_render.py index e604cb0bc0..aaf965d3c6 100644 --- a/pype/plugins/harmony/publish/collect_farm_render.py +++ b/pype/plugins/harmony/publish/collect_farm_render.py @@ -81,7 +81,7 @@ class CollectFarmRender(pype.lib.abstract_collect_render. file_prefix = info[0] file_prefix += '.temp' - for frame in range(start, end): + for frame in range(start, end + 1): expected_files.append( path / "{}{}.{}".format( file_prefix, From e0680af5857b2351a11967a075ced02212cf1048 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 13:39:31 +0100 Subject: [PATCH 036/113] fix(global): removing private dev content --- pype/settings/defaults/system_settings/general.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/settings/defaults/system_settings/general.json b/pype/settings/defaults/system_settings/general.json index 31ee818715..1e7d4b697f 100644 --- a/pype/settings/defaults/system_settings/general.json +++ b/pype/settings/defaults/system_settings/general.json @@ -25,7 +25,7 @@ ] }, "FFMPEG_PATH": { - "windows": "C:/CODE/__PYPE/pype3/vendor/bin/ffmpeg_exec/windows/bin", + "windows": "{PYPE_ROOT}/vendor/bin/ffmpeg_exec/windows/bin", "darwin": "{VIRTUAL_ENV}/localized/ffmpeg_exec/darwin/bin:{PYPE_SETUP_PATH}/vendor/bin/ffmpeg_exec/darwin/bin", "linux": "{VIRTUAL_ENV}/localized/ffmpeg_exec/linux:{PYPE_SETUP_PATH}/vendor/bin/ffmpeg_exec/linux" }, From 92d0992e141a1361af0237b0142b14ad4b0930e7 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 13:40:41 +0100 Subject: [PATCH 037/113] nuke debug loglevel --- pype/settings/defaults/system_settings/applications.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/settings/defaults/system_settings/applications.json b/pype/settings/defaults/system_settings/applications.json index 24bed66783..b5f82c0593 100644 --- a/pype/settings/defaults/system_settings/applications.json +++ b/pype/settings/defaults/system_settings/applications.json @@ -249,7 +249,7 @@ "PATH": { "windows": "C:/Program Files (x86)/QuickTime/QTSystem/;{PATH}" }, - "LOGLEVEL": "INFO" + "LOGLEVEL": "DEBUG" }, "variants": { "nuke_12.2": { From 5735ad4950eada953bb3ed981ee2fa775d0bb1bc Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 13:41:05 +0100 Subject: [PATCH 038/113] nuke disable plugins for different workflow --- pype/settings/defaults/project_settings/nuke.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/settings/defaults/project_settings/nuke.json b/pype/settings/defaults/project_settings/nuke.json index 82dcf23694..76a95d2140 100644 --- a/pype/settings/defaults/project_settings/nuke.json +++ b/pype/settings/defaults/project_settings/nuke.json @@ -36,7 +36,7 @@ } }, "ValidateKnobs": { - "enabled": true, + "enabled": false, "knobs": { "render": { "review": true @@ -44,7 +44,7 @@ } }, "ExtractReviewDataLut": { - "enabled": true + "enabled": false }, "ExtractReviewDataMov": { "enabled": true, From 398bc687d4e7fc7ce1a6d7e522cf6a7e4402abf1 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 13:41:22 +0100 Subject: [PATCH 039/113] fix: nuke self to cls --- pype/hosts/nuke/plugins/publish/validate_knobs.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pype/hosts/nuke/plugins/publish/validate_knobs.py b/pype/hosts/nuke/plugins/publish/validate_knobs.py index 34c82f4b36..ce15831c9c 100644 --- a/pype/hosts/nuke/plugins/publish/validate_knobs.py +++ b/pype/hosts/nuke/plugins/publish/validate_knobs.py @@ -54,15 +54,15 @@ class ValidateKnobs(pyblish.api.ContextPlugin): # Filter families. families = [instance.data["family"]] families += instance.data.get("families", []) - families = list(set(families) & set(self.knobs.keys())) + families = list(set(families) & set(cls.knobs.keys())) if not families: continue # Get all knobs to validate. knobs = {} for family in families: - for preset in self.knobs[family]: - knobs.update({preset: self.knobs[family][preset]}) + for preset in cls.knobs[family]: + knobs.update({preset: cls.knobs[family][preset]}) # Get invalid knobs. nodes = [] From c7e331b786119026e1bd9d89b657c8ed8c3c7bb5 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 13:41:49 +0100 Subject: [PATCH 040/113] nuke plugins to precollect stage --- .../plugins/publish/collect_current_file.py | 19 ------------- .../publish/extract_review_data_mov.py | 2 +- .../plugins/publish/precollect_instances.py | 16 +++++++++-- ...ect_workfile.py => precollect_workfile.py} | 28 +++++++++++-------- ...collect_writes.py => precollect_writes.py} | 20 ++++++++----- 5 files changed, 44 insertions(+), 41 deletions(-) delete mode 100644 pype/hosts/nuke/plugins/publish/collect_current_file.py rename pype/hosts/nuke/plugins/publish/{collect_workfile.py => precollect_workfile.py} (79%) rename pype/hosts/nuke/plugins/publish/{collect_writes.py => precollect_writes.py} (90%) diff --git a/pype/hosts/nuke/plugins/publish/collect_current_file.py b/pype/hosts/nuke/plugins/publish/collect_current_file.py deleted file mode 100644 index 253b9a7a24..0000000000 --- a/pype/hosts/nuke/plugins/publish/collect_current_file.py +++ /dev/null @@ -1,19 +0,0 @@ -import pyblish.api - - -class CollectCurrentFile(pyblish.api.ContextPlugin): - """Inject the current working file into context""" - - order = pyblish.api.CollectorOrder - 0.5 - label = "Collect Current File" - hosts = ["nuke"] - - def process(self, context): - import os - import nuke - current_file = nuke.root().name() - - normalised = os.path.normpath(current_file) - - context.data["current_file"] = normalised - context.data["currentFile"] = normalised diff --git a/pype/hosts/nuke/plugins/publish/extract_review_data_mov.py b/pype/hosts/nuke/plugins/publish/extract_review_data_mov.py index e9ac3c2c84..c64c7adc93 100644 --- a/pype/hosts/nuke/plugins/publish/extract_review_data_mov.py +++ b/pype/hosts/nuke/plugins/publish/extract_review_data_mov.py @@ -1,7 +1,7 @@ import os import pyblish.api from avalon.nuke import lib as anlib -from pype.hosts.nuke import lib as pnlib +from pype.hosts.nuke.api import lib as pnlib import pype diff --git a/pype/hosts/nuke/plugins/publish/precollect_instances.py b/pype/hosts/nuke/plugins/publish/precollect_instances.py index 60e90002da..1084eec620 100644 --- a/pype/hosts/nuke/plugins/publish/precollect_instances.py +++ b/pype/hosts/nuke/plugins/publish/precollect_instances.py @@ -8,7 +8,7 @@ from avalon.nuke import lib as anlib class PreCollectNukeInstances(pyblish.api.ContextPlugin): """Collect all nodes with Avalon knob.""" - order = pyblish.api.CollectorOrder - 0.6 + order = pyblish.api.CollectorOrder - 0.59 label = "Pre-collect Instances" hosts = ["nuke", "nukeassist"] @@ -36,7 +36,6 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): self.log.warning(E) # get data from avalon knob - self.log.debug("node[name]: {}".format(node['name'].value())) avalon_knob_data = anlib.get_avalon_knob_data( node, ["avalon:", "ak:"]) @@ -69,6 +68,12 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): instance = context.create_instance(subset) instance.append(node) + # get review knob value + review = False + if "review" in node.knobs(): + review = node["review"].value() + families.append("review") + # Add all nodes in group instances. if node.Class() == "Group": # only alter families for render family @@ -119,10 +124,15 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): "resolutionWidth": resolution_width, "resolutionHeight": resolution_height, "pixelAspect": pixel_aspect, + "review": review }) self.log.info("collected instance: {}".format(instance.data)) instances.append(instance) - context.data["instances"] = instances + # create instances in context data if not are created yet + if not context.data.get("instances"): + context.data["instances"] = list() + + context.data["instances"].extend(instances) self.log.debug("context: {}".format(context)) diff --git a/pype/hosts/nuke/plugins/publish/collect_workfile.py b/pype/hosts/nuke/plugins/publish/precollect_workfile.py similarity index 79% rename from pype/hosts/nuke/plugins/publish/collect_workfile.py rename to pype/hosts/nuke/plugins/publish/precollect_workfile.py index b95edf0a93..4b90587bbb 100644 --- a/pype/hosts/nuke/plugins/publish/collect_workfile.py +++ b/pype/hosts/nuke/plugins/publish/precollect_workfile.py @@ -2,32 +2,31 @@ import nuke import pyblish.api import os -from avalon.nuke import ( - get_avalon_knob_data, - add_publish_knob -) +from avalon.nuke import lib as anlib +reload(anlib) class CollectWorkfile(pyblish.api.ContextPlugin): """Collect current script for publish.""" - order = pyblish.api.CollectorOrder + 0.1 - label = "Collect Workfile" + order = pyblish.api.CollectorOrder - 0.60 + label = "Pre-collect Workfile" hosts = ['nuke'] def process(self, context): root = nuke.root() - knob_data = get_avalon_knob_data(root) + current_file = os.path.normpath(nuke.root().name()) - add_publish_knob(root) + knob_data = anlib.get_avalon_knob_data(root) + + anlib.add_publish_knob(root) family = "workfile" task = os.getenv("AVALON_TASK", None) # creating instances per write node - file_path = context.data["currentFile"] - staging_dir = os.path.dirname(file_path) - base_name = os.path.basename(file_path) + staging_dir = os.path.dirname(current_file) + base_name = os.path.basename(current_file) subset = family + task.capitalize() # Get frame range @@ -62,6 +61,8 @@ class CollectWorkfile(pyblish.api.ContextPlugin): "handleEnd": handle_end, "step": 1, "fps": root['fps'].value(), + + "currentFile": current_file } context.data.update(script_data) @@ -90,4 +91,9 @@ class CollectWorkfile(pyblish.api.ContextPlugin): instance.data["representations"].append(representation) self.log.info('Publishing script version') + + # create instances in context data if not are created yet + if not context.data.get("instances"): + context.data["instances"] = list() + context.data["instances"].append(instance) diff --git a/pype/hosts/nuke/plugins/publish/collect_writes.py b/pype/hosts/nuke/plugins/publish/precollect_writes.py similarity index 90% rename from pype/hosts/nuke/plugins/publish/collect_writes.py rename to pype/hosts/nuke/plugins/publish/precollect_writes.py index fb00aeb1ae..93865d534d 100644 --- a/pype/hosts/nuke/plugins/publish/collect_writes.py +++ b/pype/hosts/nuke/plugins/publish/precollect_writes.py @@ -1,14 +1,15 @@ import os import nuke import pyblish.api +import pype.api as pype @pyblish.api.log class CollectNukeWrites(pyblish.api.InstancePlugin): """Collect all write nodes.""" - order = pyblish.api.CollectorOrder + 0.1 - label = "Collect Writes" + order = pyblish.api.CollectorOrder - 0.58 + label = "Pre-collect Writes" hosts = ["nuke", "nukeassist"] families = ["write"] @@ -39,11 +40,11 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): # Get frame range handle_start = instance.context.data["handleStart"] handle_end = instance.context.data["handleEnd"] + current_file = instance.context.data["currentFile"] first_frame = int(nuke.root()["first_frame"].getValue()) last_frame = int(nuke.root()["last_frame"].getValue()) - frame_length = int( - last_frame - first_frame + 1 - ) + frame_length = int(last_frame - first_frame + 1) + review = instance.data["review"] if node["use_limit"].getValue(): first_frame = int(node["first"].getValue()) @@ -58,7 +59,7 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): if "prerender" in f), None) and self.sync_workfile_version: # get version to instance for integration - instance.data['version'] = instance.context.data["version"] + instance.data['version'] = pype.get_version_from_path(current_file) self.log.debug('Write Version: %s' % instance.data('version')) @@ -79,7 +80,8 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): representation = { 'name': ext, 'ext': ext, - "stagingDir": output_dir + "stagingDir": output_dir, + "tags": list() } try: @@ -108,6 +110,10 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): collected_frames.insert(0, slate_frame) representation['files'] = collected_frames + # add review if any + if review: + representation["tags"].extend(["review", "ftrackreview"]) + instance.data["representations"].append(representation) except Exception: instance.data["representations"].append(representation) From 8699e274a99e81c51766ffc7a60b10eb59b76e9a Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 14:20:06 +0100 Subject: [PATCH 041/113] nuke: adding precollect intances to settings adding defalut version sync bool --- pype/settings/defaults/project_settings/nuke.json | 3 +++ .../projects_schema/schema_project_nuke.json | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/pype/settings/defaults/project_settings/nuke.json b/pype/settings/defaults/project_settings/nuke.json index 76a95d2140..94cd712639 100644 --- a/pype/settings/defaults/project_settings/nuke.json +++ b/pype/settings/defaults/project_settings/nuke.json @@ -8,6 +8,9 @@ } }, "publish": { + "PreCollectNukeInstances": { + "sync_workfile_version": true + }, "ExtractThumbnail": { "enabled": true, "nodes": { diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_nuke.json b/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_nuke.json index 9bec54fa36..7a6960bcbd 100644 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_nuke.json +++ b/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_nuke.json @@ -47,6 +47,20 @@ "key": "publish", "label": "Publish plugins", "children": [ + { + "type": "dict", + "collapsable": true, + "key": "PreCollectNukeInstances", + "label": "PreCollectNukeInstances", + "is_group": true, + "children": [ + { + "type": "boolean", + "key": "sync_workfile_version", + "label": "Sync Version from workfile" + } + ] + }, { "type": "dict", "collapsable": true, From 5eac2364cc94548e4c7fcff61ea2e010e63c4072 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 14:21:17 +0100 Subject: [PATCH 042/113] nuke reducing nodes and moving args to precollect --- .../nuke/plugins/publish/collect_host.py | 14 ----- .../plugins/publish/collect_host_version.py | 13 ----- .../plugins/publish/collect_legacy_read.py | 30 ----------- .../nuke/plugins/publish/collect_review.py | 52 ------------------- .../nuke/plugins/publish/collect_selection.py | 14 ----- .../plugins/publish/precollect_workfile.py | 8 ++- .../nuke/plugins/publish/precollect_writes.py | 29 +++++++---- 7 files changed, 26 insertions(+), 134 deletions(-) delete mode 100644 pype/hosts/nuke/plugins/publish/collect_host.py delete mode 100644 pype/hosts/nuke/plugins/publish/collect_host_version.py delete mode 100644 pype/hosts/nuke/plugins/publish/collect_legacy_read.py delete mode 100644 pype/hosts/nuke/plugins/publish/collect_review.py delete mode 100644 pype/hosts/nuke/plugins/publish/collect_selection.py diff --git a/pype/hosts/nuke/plugins/publish/collect_host.py b/pype/hosts/nuke/plugins/publish/collect_host.py deleted file mode 100644 index 3ae41ab3e4..0000000000 --- a/pype/hosts/nuke/plugins/publish/collect_host.py +++ /dev/null @@ -1,14 +0,0 @@ -import pyblish.api - - -class CollectHost(pyblish.api.ContextPlugin): - """Inject the host into context""" - - order = pyblish.api.CollectorOrder - label = "Collect Host" - hosts = ["nuke"] - - def process(self, context): - import pyblish.api - - context.data["host"] = pyblish.api.current_host() diff --git a/pype/hosts/nuke/plugins/publish/collect_host_version.py b/pype/hosts/nuke/plugins/publish/collect_host_version.py deleted file mode 100644 index 8d2cb576b2..0000000000 --- a/pype/hosts/nuke/plugins/publish/collect_host_version.py +++ /dev/null @@ -1,13 +0,0 @@ -import pyblish.api - - -class CollectHostVersion(pyblish.api.ContextPlugin): - """Inject the hosts version into context""" - - order = pyblish.api.CollectorOrder - label = "Collect Host Version" - hosts = ["nuke"] - - def process(self, context): - import nuke - context.data["hostVersion"] = nuke.NUKE_VERSION_STRING diff --git a/pype/hosts/nuke/plugins/publish/collect_legacy_read.py b/pype/hosts/nuke/plugins/publish/collect_legacy_read.py deleted file mode 100644 index 6b6ce57245..0000000000 --- a/pype/hosts/nuke/plugins/publish/collect_legacy_read.py +++ /dev/null @@ -1,30 +0,0 @@ -import toml - -import nuke - -import pyblish.api - - -class CollectReadLegacy(pyblish.api.ContextPlugin): - """Collect legacy read nodes.""" - - order = pyblish.api.CollectorOrder - label = "Collect Read Legacy" - hosts = ["nuke", "nukeassist"] - - def process(self, context): - - for node in nuke.allNodes(): - if node.Class() != "Read": - continue - - if "avalon" not in node.knobs().keys(): - continue - - if not toml.loads(node["avalon"].value()): - return - - instance = context.create_instance( - node.name(), family="read.legacy" - ) - instance.append(node) diff --git a/pype/hosts/nuke/plugins/publish/collect_review.py b/pype/hosts/nuke/plugins/publish/collect_review.py deleted file mode 100644 index 42aa910917..0000000000 --- a/pype/hosts/nuke/plugins/publish/collect_review.py +++ /dev/null @@ -1,52 +0,0 @@ -import pyblish.api -import pype.api -from avalon import io, api - -import nuke - - -class CollectReview(pyblish.api.InstancePlugin): - """Collect review instance from rendered frames - """ - - order = pyblish.api.CollectorOrder + 0.3 - label = "Collect Review" - hosts = ["nuke"] - families = ["render", "render.local", "render.farm"] - - def process(self, instance): - - node = instance[0] - - if "review" not in node.knobs(): - knob = nuke.Boolean_Knob("review", "Review") - knob.setValue(True) - node.addKnob(knob) - - if not node["review"].value(): - return - - # * Add audio to instance if exists. - # Find latest versions document - version_doc = pype.api.get_latest_version( - instance.context.data["assetEntity"]["name"], "audioMain" - ) - repre_doc = None - if version_doc: - # Try to find it's representation (Expected there is only one) - repre_doc = io.find_one( - {"type": "representation", "parent": version_doc["_id"]} - ) - - # Add audio to instance if representation was found - if repre_doc: - instance.data["audio"] = [{ - "offset": 0, - "filename": api.get_representation_path(repre_doc) - }] - - instance.data["families"].append("review") - instance.data['families'].append('ftrack') - - self.log.info("Review collected: `{}`".format(instance)) - self.log.debug("__ instance.data: `{}`".format(instance.data)) diff --git a/pype/hosts/nuke/plugins/publish/collect_selection.py b/pype/hosts/nuke/plugins/publish/collect_selection.py deleted file mode 100644 index a8a4f44b1c..0000000000 --- a/pype/hosts/nuke/plugins/publish/collect_selection.py +++ /dev/null @@ -1,14 +0,0 @@ -import nuke - -import pyblish.api - - -class CollectSelection(pyblish.api.ContextPlugin): - """Collect selection.""" - - order = pyblish.api.CollectorOrder - label = "Collect Selection of Nodes" - hosts = ["nuke"] - - def process(self, context): - context.data["selection"] = nuke.selectedNodes() diff --git a/pype/hosts/nuke/plugins/publish/precollect_workfile.py b/pype/hosts/nuke/plugins/publish/precollect_workfile.py index 4b90587bbb..c570254f12 100644 --- a/pype/hosts/nuke/plugins/publish/precollect_workfile.py +++ b/pype/hosts/nuke/plugins/publish/precollect_workfile.py @@ -1,7 +1,7 @@ import nuke import pyblish.api import os - +import pype.api as pype from avalon.nuke import lib as anlib reload(anlib) @@ -62,7 +62,11 @@ class CollectWorkfile(pyblish.api.ContextPlugin): "step": 1, "fps": root['fps'].value(), - "currentFile": current_file + "currentFile": current_file, + "version": pype.get_version_from_path(current_file), + + "host": pyblish.api.current_host(), + "hostVersion": nuke.NUKE_VERSION_STRING } context.data.update(script_data) diff --git a/pype/hosts/nuke/plugins/publish/precollect_writes.py b/pype/hosts/nuke/plugins/publish/precollect_writes.py index 93865d534d..e7b1a30e01 100644 --- a/pype/hosts/nuke/plugins/publish/precollect_writes.py +++ b/pype/hosts/nuke/plugins/publish/precollect_writes.py @@ -2,6 +2,7 @@ import os import nuke import pyblish.api import pype.api as pype +from avalon import io, api @pyblish.api.log @@ -40,7 +41,6 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): # Get frame range handle_start = instance.context.data["handleStart"] handle_end = instance.context.data["handleEnd"] - current_file = instance.context.data["currentFile"] first_frame = int(nuke.root()["first_frame"].getValue()) last_frame = int(nuke.root()["last_frame"].getValue()) frame_length = int(last_frame - first_frame + 1) @@ -55,14 +55,6 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): output_dir = os.path.dirname(path) self.log.debug('output dir: {}'.format(output_dir)) - if not next((f for f in families - if "prerender" in f), - None) and self.sync_workfile_version: - # get version to instance for integration - instance.data['version'] = pype.get_version_from_path(current_file) - - self.log.debug('Write Version: %s' % instance.data('version')) - # create label name = node.name() # Include start and end render frame in label @@ -158,6 +150,25 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): "families": [] }) + # * Add audio to instance if exists. + # Find latest versions document + version_doc = pype.get_latest_version( + instance.data["asset"], "audioMain" + ) + repre_doc = None + if version_doc: + # Try to find it's representation (Expected there is only one) + repre_doc = io.find_one( + {"type": "representation", "parent": version_doc["_id"]} + ) + + # Add audio to instance if representation was found + if repre_doc: + instance.data["audio"] = [{ + "offset": 0, + "filename": api.get_representation_path(repre_doc) + }] + self.log.debug("families: {}".format(families)) self.log.debug("instance.data: {}".format(instance.data)) From b9d80ba01f802b14cdb5da12747f15ecfc7a4564 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 14:21:45 +0100 Subject: [PATCH 043/113] nuke version to instance additional --- pype/hosts/nuke/plugins/publish/collect_gizmo.py | 5 ----- pype/hosts/nuke/plugins/publish/collect_reads.py | 4 ++-- pype/hosts/nuke/plugins/publish/precollect_instances.py | 9 +++++++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/pype/hosts/nuke/plugins/publish/collect_gizmo.py b/pype/hosts/nuke/plugins/publish/collect_gizmo.py index 6436bdc562..bd47e63419 100644 --- a/pype/hosts/nuke/plugins/publish/collect_gizmo.py +++ b/pype/hosts/nuke/plugins/publish/collect_gizmo.py @@ -29,10 +29,6 @@ class CollectGizmo(pyblish.api.InstancePlugin): first_frame = int(nuke.root()["first_frame"].getValue()) last_frame = int(nuke.root()["last_frame"].getValue()) - # get version - version = pype.get_version_from_path(nuke.root().name()) - instance.data['version'] = int(version) - # Add version data to instance version_data = { "handles": handle_start, @@ -41,7 +37,6 @@ class CollectGizmo(pyblish.api.InstancePlugin): "frameStart": first_frame + handle_start, "frameEnd": last_frame - handle_end, "colorspace": nuke.root().knob('workingSpaceLUT').value(), - "version": int(version), "families": [instance.data["family"]] + instance.data["families"], "subset": instance.data["subset"], "fps": instance.context.data["fps"] diff --git a/pype/hosts/nuke/plugins/publish/collect_reads.py b/pype/hosts/nuke/plugins/publish/collect_reads.py index 7fda6334bb..45e9969eb9 100644 --- a/pype/hosts/nuke/plugins/publish/collect_reads.py +++ b/pype/hosts/nuke/plugins/publish/collect_reads.py @@ -10,7 +10,7 @@ class CollectNukeReads(pyblish.api.InstancePlugin): """Collect all read nodes.""" order = pyblish.api.CollectorOrder + 0.04 - label = "Collect Reads" + label = "Collect Source Reads" hosts = ["nuke", "nukeassist"] families = ["source"] @@ -109,7 +109,7 @@ class CollectNukeReads(pyblish.api.InstancePlugin): "handleEnd": handle_end, "frameStart": first_frame + handle_start, "frameEnd": last_frame - handle_end, - "colorspace": colorspace, + "colorspace": colorspace, "families": [instance.data["family"]], "subset": instance.data["subset"], "fps": instance.context.data["fps"] diff --git a/pype/hosts/nuke/plugins/publish/precollect_instances.py b/pype/hosts/nuke/plugins/publish/precollect_instances.py index 1084eec620..1333b19365 100644 --- a/pype/hosts/nuke/plugins/publish/precollect_instances.py +++ b/pype/hosts/nuke/plugins/publish/precollect_instances.py @@ -12,6 +12,9 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): label = "Pre-collect Instances" hosts = ["nuke", "nukeassist"] + # presets + sync_workfile_version = False + def process(self, context): asset_data = io.find_one({ "type": "asset", @@ -109,6 +112,12 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): resolution_height = format.height() pixel_aspect = format.pixelAspect() + if not next((f for f in families + if "prerender" in f), + None) and self.sync_workfile_version: + # get version to instance for integration + instance.data['version'] = instance.context.data['version'] + instance.data.update({ "subset": subset, "asset": avalon_knob_data["asset"], From 24d84b46e013fd43ad89dc5607edeaf1db92d367 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 20 Jan 2021 15:01:22 +0100 Subject: [PATCH 044/113] Harmon to Deadline - performance speedup because of Harmony 17 extract_template is extremely slow in 17, copy full scene for a workfile --- pype/plugins/harmony/publish/extract_workfile.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pype/plugins/harmony/publish/extract_workfile.py b/pype/plugins/harmony/publish/extract_workfile.py index 09bf0db860..be0444f0e6 100644 --- a/pype/plugins/harmony/publish/extract_workfile.py +++ b/pype/plugins/harmony/publish/extract_workfile.py @@ -10,7 +10,7 @@ import pype.hosts.harmony class ExtractWorkfile(pype.api.Extractor): - """Extract the connected nodes to the composite instance.""" + """Extract and zip complete workfile folder into zip.""" label = "Extract Workfile" hosts = ["harmony"] @@ -18,15 +18,11 @@ class ExtractWorkfile(pype.api.Extractor): def process(self, instance): """Plugin entry point.""" - # Export template. - backdrops = harmony.send( - {"function": "Backdrop.backdrops", "args": ["Top"]} - )["result"] - nodes = instance.context.data.get("allNodes") staging_dir = self.staging_dir(instance) filepath = os.path.join(staging_dir, "{}.tpl".format(instance.name)) - - pype.hosts.harmony.export_template(backdrops, nodes, filepath) + src = os.path.dirname(instance.context.data["currentFile"]) + self.log.info("Copying to {}".format(filepath)) + shutil.copytree(src, filepath) # Prep representation. os.chdir(staging_dir) From 0ddd4f904acd05daf8a803e444330c122c0d2e53 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 15:38:08 +0100 Subject: [PATCH 045/113] nuke fixing module import to new `api` host way and other small fixes --- pype/hosts/nuke/plugins/load/actions.py | 4 ++-- pype/hosts/nuke/plugins/load/load_backdrop.py | 2 +- pype/hosts/nuke/plugins/load/load_gizmo_ip.py | 2 +- pype/hosts/nuke/plugins/publish/collect_backdrop.py | 10 +++++----- pype/hosts/nuke/plugins/publish/extract_backdrop.py | 6 +++--- pype/hosts/nuke/plugins/publish/extract_gizmo.py | 3 +-- .../nuke/plugins/publish/extract_review_data_lut.py | 2 +- .../nuke/plugins/publish/precollect_instances.py | 9 +++++++-- .../hosts/nuke/plugins/publish/precollect_workfile.py | 2 +- pype/hosts/nuke/plugins/publish/validate_backdrop.py | 11 ++++++----- 10 files changed, 28 insertions(+), 23 deletions(-) diff --git a/pype/hosts/nuke/plugins/load/actions.py b/pype/hosts/nuke/plugins/load/actions.py index d0c95b6b16..9741e956fa 100644 --- a/pype/hosts/nuke/plugins/load/actions.py +++ b/pype/hosts/nuke/plugins/load/actions.py @@ -25,7 +25,7 @@ class SetFrameRangeLoader(api.Loader): def load(self, context, name, namespace, data): - from pype.hosts.nuke import lib + from pype.hosts.nuke.api import lib version = context['version'] version_data = version.get("data", {}) @@ -59,7 +59,7 @@ class SetFrameRangeWithHandlesLoader(api.Loader): def load(self, context, name, namespace, data): - from pype.hosts.nuke import lib + from pype.hosts.nuke.api import lib version = context['version'] version_data = version.get("data", {}) diff --git a/pype/hosts/nuke/plugins/load/load_backdrop.py b/pype/hosts/nuke/plugins/load/load_backdrop.py index 7d18893965..00bf2df47d 100644 --- a/pype/hosts/nuke/plugins/load/load_backdrop.py +++ b/pype/hosts/nuke/plugins/load/load_backdrop.py @@ -1,7 +1,7 @@ from avalon import api, style, io import nuke import nukescripts -from pype.hosts.nuke import lib as pnlib +from pype.hosts.nuke.api import lib as pnlib from avalon.nuke import lib as anlib from avalon.nuke import containerise, update_container reload(pnlib) diff --git a/pype/hosts/nuke/plugins/load/load_gizmo_ip.py b/pype/hosts/nuke/plugins/load/load_gizmo_ip.py index a2e8a6abb8..b1a9748d16 100644 --- a/pype/hosts/nuke/plugins/load/load_gizmo_ip.py +++ b/pype/hosts/nuke/plugins/load/load_gizmo_ip.py @@ -1,6 +1,6 @@ from avalon import api, style, io import nuke -from pype.hosts.nuke import lib as pnlib +from pype.hosts.nuke.api import lib as pnlib from avalon.nuke import lib as anlib from avalon.nuke import containerise, update_container diff --git a/pype/hosts/nuke/plugins/publish/collect_backdrop.py b/pype/hosts/nuke/plugins/publish/collect_backdrop.py index 5a117c2920..7e616ea7bb 100644 --- a/pype/hosts/nuke/plugins/publish/collect_backdrop.py +++ b/pype/hosts/nuke/plugins/publish/collect_backdrop.py @@ -1,8 +1,8 @@ import pyblish.api -import pype.api as pype -from pype.hosts.nuke import lib as pnlib +from pype.hosts.nuke.api import lib as pnlib import nuke + @pyblish.api.log class CollectBackdrops(pyblish.api.InstancePlugin): """Collect Backdrop node instance and its content @@ -42,12 +42,12 @@ class CollectBackdrops(pyblish.api.InstancePlugin): # get all connections from outside of backdrop nodes = instance[1:] connections_in, connections_out = pnlib.get_dependent_nodes(nodes) - instance.data["connections_in"] = connections_in - instance.data["connections_out"] = connections_out + instance.data["nodeConnectionsIn"] = connections_in + instance.data["nodeConnectionsOut"] = connections_out # make label nicer instance.data["label"] = "{0} ({1} nodes)".format( - bckn.name(), len(instance)-1) + bckn.name(), len(instance) - 1) instance.data["families"].append(instance.data["family"]) diff --git a/pype/hosts/nuke/plugins/publish/extract_backdrop.py b/pype/hosts/nuke/plugins/publish/extract_backdrop.py index 0f7198887f..92153d563e 100644 --- a/pype/hosts/nuke/plugins/publish/extract_backdrop.py +++ b/pype/hosts/nuke/plugins/publish/extract_backdrop.py @@ -1,6 +1,6 @@ import pyblish.api from avalon.nuke import lib as anlib -from pype.hosts.nuke import lib as pnlib +from pype.hosts.nuke.api import lib as pnlib import nuke import os import pype @@ -30,8 +30,8 @@ class ExtractBackdropNode(pype.api.Extractor): # maintain selection with anlib.maintained_selection(): # all connections outside of backdrop - connections_in = instance.data["connections_in"] - connections_out = instance.data["connections_out"] + connections_in = instance.data["nodeConnectionsIn"] + connections_out = instance.data["nodeConnectionsOut"] self.log.debug("_ connections_in: `{}`".format(connections_in)) self.log.debug("_ connections_out: `{}`".format(connections_out)) diff --git a/pype/hosts/nuke/plugins/publish/extract_gizmo.py b/pype/hosts/nuke/plugins/publish/extract_gizmo.py index 465bf9824c..32d9dd0f55 100644 --- a/pype/hosts/nuke/plugins/publish/extract_gizmo.py +++ b/pype/hosts/nuke/plugins/publish/extract_gizmo.py @@ -1,7 +1,6 @@ import pyblish.api from avalon.nuke import lib as anlib -from pype.hosts.nuke import lib as pnlib -from pype.hosts.nuke import utils as pnutils +from pype.hosts.nuke.api import utils as pnutils import nuke import os import pype diff --git a/pype/hosts/nuke/plugins/publish/extract_review_data_lut.py b/pype/hosts/nuke/plugins/publish/extract_review_data_lut.py index 10fe8fa2a9..16ef7a9449 100644 --- a/pype/hosts/nuke/plugins/publish/extract_review_data_lut.py +++ b/pype/hosts/nuke/plugins/publish/extract_review_data_lut.py @@ -1,7 +1,7 @@ import os import pyblish.api from avalon.nuke import lib as anlib -from pype.hosts.nuke import lib as pnlib +from pype.hosts.nuke.api import lib as pnlib import pype reload(pnlib) diff --git a/pype/hosts/nuke/plugins/publish/precollect_instances.py b/pype/hosts/nuke/plugins/publish/precollect_instances.py index 1333b19365..d8c593b0b6 100644 --- a/pype/hosts/nuke/plugins/publish/precollect_instances.py +++ b/pype/hosts/nuke/plugins/publish/precollect_instances.py @@ -52,7 +52,7 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): # establish families family = avalon_knob_data["family"] - families_ak = avalon_knob_data.get("families") + families_ak = avalon_knob_data.get("families") or [] families = list() if families_ak: @@ -112,6 +112,11 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): resolution_height = format.height() pixel_aspect = format.pixelAspect() + # get publish knob value + if "publish" not in node.knobs(): + anlib.add_publish_knob(node) + + # sync workfile version if not next((f for f in families if "prerender" in f), None) and self.sync_workfile_version: @@ -127,8 +132,8 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): "family": family, "families": families, "avalonKnob": avalon_knob_data, - "publish": node.knob('publish').value(), "step": 1, + "publish": node.knob('publish').value(), "fps": nuke.root()['fps'].value(), "resolutionWidth": resolution_width, "resolutionHeight": resolution_height, diff --git a/pype/hosts/nuke/plugins/publish/precollect_workfile.py b/pype/hosts/nuke/plugins/publish/precollect_workfile.py index c570254f12..288caa7a19 100644 --- a/pype/hosts/nuke/plugins/publish/precollect_workfile.py +++ b/pype/hosts/nuke/plugins/publish/precollect_workfile.py @@ -63,7 +63,7 @@ class CollectWorkfile(pyblish.api.ContextPlugin): "fps": root['fps'].value(), "currentFile": current_file, - "version": pype.get_version_from_path(current_file), + "version": int(pype.get_version_from_path(current_file)), "host": pyblish.api.current_host(), "hostVersion": nuke.NUKE_VERSION_STRING diff --git a/pype/hosts/nuke/plugins/publish/validate_backdrop.py b/pype/hosts/nuke/plugins/publish/validate_backdrop.py index cf2d56087d..f280ad4af1 100644 --- a/pype/hosts/nuke/plugins/publish/validate_backdrop.py +++ b/pype/hosts/nuke/plugins/publish/validate_backdrop.py @@ -32,8 +32,8 @@ class SelectCenterInNodeGraph(pyblish.api.Action): # collect all failed nodes xpos and ypos for instance in instances: bdn = instance[0] - xC = bdn.xpos() + bdn.screenWidth()/2 - yC = bdn.ypos() + bdn.screenHeight()/2 + xC = bdn.xpos() + bdn.screenWidth() / 2 + yC = bdn.ypos() + bdn.screenHeight() / 2 all_xC.append(xC) all_yC.append(yC) @@ -58,10 +58,11 @@ class ValidateBackdrop(pyblish.api.InstancePlugin): actions = [SelectCenterInNodeGraph] def process(self, instance): - connections_out = instance.data["connections_out"] + connections_out = instance.data["nodeConnectionsOut"] - msg_multiple_outputs = "Only one outcoming connection from \"{}\" is allowed".format( - instance.data["name"]) + msg_multiple_outputs = ( + "Only one outcoming connection from " + "\"{}\" is allowed").format(instance.data["name"]) assert len(connections_out.keys()) <= 1, msg_multiple_outputs msg_no_content = "No content on backdrop node: \"{}\"".format( From f924b1a1425209792417b07cf4cf6ce3e7f6e1b6 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 16:39:35 +0100 Subject: [PATCH 046/113] nuke fixing node families definition --- pype/hosts/nuke/plugins/publish/collect_gizmo.py | 1 - pype/hosts/nuke/plugins/publish/precollect_instances.py | 7 ++++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pype/hosts/nuke/plugins/publish/collect_gizmo.py b/pype/hosts/nuke/plugins/publish/collect_gizmo.py index bd47e63419..3db26096ae 100644 --- a/pype/hosts/nuke/plugins/publish/collect_gizmo.py +++ b/pype/hosts/nuke/plugins/publish/collect_gizmo.py @@ -1,5 +1,4 @@ import pyblish.api -import pype.api as pype import nuke diff --git a/pype/hosts/nuke/plugins/publish/precollect_instances.py b/pype/hosts/nuke/plugins/publish/precollect_instances.py index d8c593b0b6..2f5edd7fe8 100644 --- a/pype/hosts/nuke/plugins/publish/precollect_instances.py +++ b/pype/hosts/nuke/plugins/publish/precollect_instances.py @@ -52,7 +52,7 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): # establish families family = avalon_knob_data["family"] - families_ak = avalon_knob_data.get("families") or [] + families_ak = avalon_knob_data.get("families") families = list() if families_ak: @@ -76,11 +76,12 @@ class PreCollectNukeInstances(pyblish.api.ContextPlugin): if "review" in node.knobs(): review = node["review"].value() families.append("review") + families.append("ftrack") # Add all nodes in group instances. if node.Class() == "Group": - # only alter families for render family - if "write" in families_ak: + # check if it is write node in family + if "write" in families: target = node["render"].value() if target == "Use existing frames": # Local rendering From 43f363e6aa7e78c0154b731d53ac3b74423625fe Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 17:29:40 +0100 Subject: [PATCH 047/113] nuke, hiero, nukestudo changing settings env --- .../system_settings/applications.json | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pype/settings/defaults/system_settings/applications.json b/pype/settings/defaults/system_settings/applications.json index b5f82c0593..641c9f25da 100644 --- a/pype/settings/defaults/system_settings/applications.json +++ b/pype/settings/defaults/system_settings/applications.json @@ -362,17 +362,19 @@ "__environment_keys__": { "nukex": [ "NUKE_PATH", - "PATH" + "PATH", + "LOGLEVEL" ] }, "NUKE_PATH": [ - "{PYPE_MODULE_ROOT}/repos/avalon-core/setup/nuke/nuke_path", - "{PYPE_MODULE_ROOT}/setup/nuke/nuke_path", + "{PYPE_ROOT}/repos/avalon-core/setup/nuke/nuke_path", + "{PYPE_ROOT}/pype/hosts/nuke/startup", "{PYPE_STUDIO_PLUGINS}/nuke" ], "PATH": { "windows": "C:/Program Files (x86)/QuickTime/QTSystem/;{PATH}" - } + }, + "LOGLEVEL": "DEBUG" }, "variants": { "nukex_12.2": { @@ -488,18 +490,18 @@ "PATH", "WORKFILES_STARTUP", "TAG_ASSETBUILD_STARTUP", - "PYPE_LOG_NO_COLORS" + "LOGLEVEL" ] }, "HIERO_PLUGIN_PATH": [ - "{PYPE_MODULE_ROOT}/setup/nukestudio/hiero_plugin_path" + "{PYPE_MODULE_ROOT}/setup/hiero/hiero_plugin_path" ], "PATH": { "windows": "C:/Program Files (x86)/QuickTime/QTSystem/;{PATH}" }, "WORKFILES_STARTUP": "0", "TAG_ASSETBUILD_STARTUP": "0", - "PYPE_LOG_NO_COLORS": "True" + "LOGLEVEL": "DEBUG" }, "variants": { "nukestudio_12.2": { @@ -610,18 +612,18 @@ "PATH", "WORKFILES_STARTUP", "TAG_ASSETBUILD_STARTUP", - "PYPE_LOG_NO_COLORS" + "LOGLEVEL" ] }, "HIERO_PLUGIN_PATH": [ - "{PYPE_MODULE_ROOT}/setup/nukestudio/hiero_plugin_path" + "{PYPE_MODULE_ROOT}/setup/hiero/hiero_plugin_path" ], "PATH": { "windows": "C:/Program Files (x86)/QuickTime/QTSystem/;{PATH}" }, "WORKFILES_STARTUP": "0", "TAG_ASSETBUILD_STARTUP": "0", - "PYPE_LOG_NO_COLORS": "True" + "LOGLEVEL": "DEBUG" }, "variants": { "hiero_12.2": { From ba927f421e8fa9b2b0b32e0b572018de74dfcaa0 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 20 Jan 2021 18:07:05 +0100 Subject: [PATCH 048/113] nuke fix review on write node --- pype/hosts/nuke/plugins/publish/precollect_writes.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pype/hosts/nuke/plugins/publish/precollect_writes.py b/pype/hosts/nuke/plugins/publish/precollect_writes.py index e7b1a30e01..9806e38633 100644 --- a/pype/hosts/nuke/plugins/publish/precollect_writes.py +++ b/pype/hosts/nuke/plugins/publish/precollect_writes.py @@ -44,7 +44,6 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): first_frame = int(nuke.root()["first_frame"].getValue()) last_frame = int(nuke.root()["last_frame"].getValue()) frame_length = int(last_frame - first_frame + 1) - review = instance.data["review"] if node["use_limit"].getValue(): first_frame = int(node["first"].getValue()) @@ -102,10 +101,6 @@ class CollectNukeWrites(pyblish.api.InstancePlugin): collected_frames.insert(0, slate_frame) representation['files'] = collected_frames - # add review if any - if review: - representation["tags"].extend(["review", "ftrackreview"]) - instance.data["representations"].append(representation) except Exception: instance.data["representations"].append(representation) From 55d447f1d6326778a47eaf8d32ad3eac5d27bc5e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 20 Jan 2021 18:26:52 +0100 Subject: [PATCH 049/113] Harmon to Deadline - added audio file collect --- pype/plugins/harmony/publish/collect_audio.py | 36 +++++++++++++++++++ .../publish/submit_harmony_deadline..py | 5 +++ 2 files changed, 41 insertions(+) create mode 100644 pype/plugins/harmony/publish/collect_audio.py diff --git a/pype/plugins/harmony/publish/collect_audio.py b/pype/plugins/harmony/publish/collect_audio.py new file mode 100644 index 0000000000..8ef9632ea6 --- /dev/null +++ b/pype/plugins/harmony/publish/collect_audio.py @@ -0,0 +1,36 @@ +import os +import pyblish.api + +import pyblish.api +from avalon import harmony + + +class CollectAudio(pyblish.api.InstancePlugin): + """ + Collect relative path for audio file to instance. + + Harmony api `getSoundtrackAll` returns useless path to temp folder, + for render on farm we look into 'audio' folder and select first file. + + Correct path needs to be calculated in `submit_harmony_deadline.py` + """ + + order = pyblish.api.CollectorOrder + 0.499 + label = "Collect Audio" + hosts = ["harmony"] + families = ["renderlayer"] + + def process(self, instance): + audio_dir = os.path.join( + os.path.dirname(instance.context.data.get("currentFile")), 'audio') + if os.path.isdir(audio_dir): + for full_file_name in os.listdir(audio_dir): + file_name, file_ext = os.path.splitext(full_file_name) + + if file_ext not in ['.wav', '.mp3', '.aiff']: + self.log.error("Unsupported file {}.{}".format(file_name, + file_ext)) + + audio_file_path = os.path.join('audio', full_file_name) + self.log.error("audio_file_path {}".format(audio_file_path)) + instance.data["audioFile"] = audio_file_path diff --git a/pype/plugins/harmony/publish/submit_harmony_deadline..py b/pype/plugins/harmony/publish/submit_harmony_deadline..py index dfb2702a8b..e40ff02d08 100644 --- a/pype/plugins/harmony/publish/submit_harmony_deadline..py +++ b/pype/plugins/harmony/publish/submit_harmony_deadline..py @@ -370,6 +370,11 @@ class HarmonySubmitDeadline( _file.replace(work_path_str, render_path_str) ) + audio_file = self._instance.data.get("audioFile") + if audio_file: + abs_path = xstage_path.parent / audio_file + self._instance.context.data["audioFile"] = str(abs_path) + self._instance.data["source"] = str(published_scene.as_posix()) self._instance.data["expectedFiles"] = new_expected_files harmony_plugin_info = PluginInfo( From 017a30a1b7bc7e8a3f00e3d773d67033b04ea044 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 20 Jan 2021 19:35:19 +0100 Subject: [PATCH 050/113] fixed find root path --- pype/lib/anatomy.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pype/lib/anatomy.py b/pype/lib/anatomy.py index ad07851533..d5e54efa9a 100644 --- a/pype/lib/anatomy.py +++ b/pype/lib/anatomy.py @@ -1245,6 +1245,10 @@ class RootItem: root_paths = list(self.cleaned_data.values()) mod_path = self.clean_path(path) for root_path in root_paths: + # Skip empty paths + if not root_path: + continue + if mod_path.startswith(root_path): result = True replacement = "{" + self.full_key() + "}" From af46d1e7f535e46152620302d5020ffac5327618 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 20 Jan 2021 19:35:46 +0100 Subject: [PATCH 051/113] implemented filling of root with environment variable key --- pype/lib/anatomy.py | 116 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/pype/lib/anatomy.py b/pype/lib/anatomy.py index d5e54efa9a..b754f4fd76 100644 --- a/pype/lib/anatomy.py +++ b/pype/lib/anatomy.py @@ -159,6 +159,15 @@ class Anatomy: """Return PYPE_ROOT_* environments for current project in dict.""" return self._roots_obj.root_environments() + def root_environmets_fill_data(self, template=None): + """Environment variable values in dictionary for rootless path. + + Args: + template (str): Template for environment variable key fill. + By default is set to `"${}"`. + """ + return self.roots_obj.root_environmets_fill_data(template) + def find_root_template_from_path(self, *args, **kwargs): """Wrapper for Roots `find_root_template_from_path`.""" return self.roots_obj.find_root_template_from_path(*args, **kwargs) @@ -264,6 +273,78 @@ class Anatomy: # NOTE does not care if there are different keys than "root" return template_path.format(**{"root": self.roots}) + @classmethod + def fill_root_with_path(cls, rootless_path, root_path): + """Fill path without filled "root" key with passed path. + + This is helper to fill root with different directory path than anatomy + has defined no matter if is single or multiroot. + + Output path is same as input path if `rootless_path` does not contain + unfilled root key. + + Args: + rootless_path (str): Path without filled "root" key. Example: + "{root[work]}/MyProject/..." + root_path (str): What should replace root key in `rootless_path`. + + Returns: + str: Path with filled root. + """ + output = str(rootless_path) + for group in re.findall(cls.root_key_regex, rootless_path): + replacement = "{" + group + "}" + output = output.replace(replacement, root_path) + + return output + + def replace_root_with_env_key(self, filepath, template=None): + """Replace root of path with environment key. + + # Example: + ## Project with roots: + ``` + { + "nas": { + "windows": P:/projects", + ... + } + ... + } + ``` + + ## Entered filepath + "P:/projects/project/asset/task/animation_v001.ma" + + ## Entered template + "<{}>" + + ## Output + "/project/asset/task/animation_v001.ma" + + Args: + filepath (str): Full file path where root should be replaced. + template (str): Optional template for environment key. Must + have one index format key. + Default value if not entered: "${}" + + Returns: + str: Path where root is replaced with environment root key. + + Raise: + ValueError: When project's roots were not found in entered path. + """ + success, rootless_path = self.find_root_template_from_path(filepath) + if not success: + raise ValueError( + "{}: Project's roots were not found in path: {}".format( + self.project_name, filepath + ) + ) + + data = self.root_environmets_fill_data(template) + return rootless_path.format(**data) + class TemplateMissingKey(Exception): """Exception for cases when key does not exist in Anatomy.""" @@ -1439,6 +1520,41 @@ class Roots: output.update(self._root_environments(_keys, _value)) return output + def root_environmets_fill_data(self, template=None): + """Environment variable values in dictionary for rootless path. + + Args: + template (str): Template for environment variable key fill. + By default is set to `"${}"`. + """ + if template is None: + template = "${}" + return self._root_environmets_fill_data(template) + + def _root_environmets_fill_data(self, template, keys=None, roots=None): + if keys is None and roots is None: + return { + "root": self._root_environmets_fill_data( + template, [], self.roots + ) + } + + if isinstance(roots, RootItem): + key_items = [Roots.env_prefix] + for _key in keys: + key_items.append(_key.upper()) + key = "_".join(key_items) + return template.format(key) + + output = {} + for key, value in roots.items(): + _keys = list(keys) + _keys.append(key) + output[key] = self._root_environmets_fill_data( + template, _keys, value + ) + return output + @property def project_name(self): """Return project name which will be used for loading root values.""" From a0e3ed743ea109ac6c6a178311a2e157735ada3d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 21 Jan 2021 11:11:34 +0100 Subject: [PATCH 052/113] Harmon to Deadline - fix - wrong logging --- pype/plugins/harmony/publish/collect_audio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/plugins/harmony/publish/collect_audio.py b/pype/plugins/harmony/publish/collect_audio.py index 8ef9632ea6..27f8dfc0d6 100644 --- a/pype/plugins/harmony/publish/collect_audio.py +++ b/pype/plugins/harmony/publish/collect_audio.py @@ -32,5 +32,5 @@ class CollectAudio(pyblish.api.InstancePlugin): file_ext)) audio_file_path = os.path.join('audio', full_file_name) - self.log.error("audio_file_path {}".format(audio_file_path)) + self.log.debug("audio_file_path {}".format(audio_file_path)) instance.data["audioFile"] = audio_file_path From 638245c0daea58ce659f400386e973035e3f78b9 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 21 Jan 2021 14:27:08 +0100 Subject: [PATCH 053/113] Harmon to Deadline - fix - skip resolution validation for renders Value in context.anatomyData is checked for [rR]ender presence --- pype/plugins/harmony/publish/validate_scene_settings.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pype/plugins/harmony/publish/validate_scene_settings.py b/pype/plugins/harmony/publish/validate_scene_settings.py index 17fc528cc0..5ab1b11ec9 100644 --- a/pype/plugins/harmony/publish/validate_scene_settings.py +++ b/pype/plugins/harmony/publish/validate_scene_settings.py @@ -40,6 +40,8 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin): actions = [ValidateSceneSettingsRepair] frame_check_filter = ["_ch_", "_pr_", "_intd_", "_extd_"] + # used for skipping resolution validation for render tasks + render_check_filter = ["render", "Render"] def process(self, instance): """Plugin entry point.""" @@ -65,6 +67,12 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin): fps = float( "{:.2f}".format(instance.context.data.get("frameRate"))) + if any(string in instance.context.data['anatomyData']['task'] + for string in self.render_check_filter): + self.log.debug("Render task detected, resolution check skipped") + expected_settings.pop("resolutionWidth") + expected_settings.pop("resolutionHeight") + current_settings = { "fps": fps, "frameStart": instance.context.data.get("frameStart"), From c45f5f11b4d0cbeb1bd59c78ff84fbf14e52c82e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 21 Jan 2021 19:11:32 +0100 Subject: [PATCH 054/113] Harmon to Deadline - fix - remove 'Farm' from subset name Subset on farm must match subset from manually rendered --- pype/plugins/harmony/publish/collect_farm_render.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pype/plugins/harmony/publish/collect_farm_render.py b/pype/plugins/harmony/publish/collect_farm_render.py index aaf965d3c6..5925dafa72 100644 --- a/pype/plugins/harmony/publish/collect_farm_render.py +++ b/pype/plugins/harmony/publish/collect_farm_render.py @@ -126,12 +126,13 @@ class CollectFarmRender(pype.lib.abstract_collect_render. # TODO: handle pixel aspect and frame step # TODO: set Deadline stuff (pools, priority, etc. by presets) + subset_name = node.split("/")[1].replace('Farm', '') render_instance = HarmonyRenderInstance( version=version, time=api.time(), source=context.data["currentFile"], - label=node.split("/")[1], - subset=node.split("/")[1], + label=subset_name, + subset=subset_name, asset=api.Session["AVALON_ASSET"], attachTo=False, setMembers=[node], From 2bf0d29ebe3bf0ed5d9cc597b407db379e98c85d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 19 Jan 2021 10:44:48 +0000 Subject: [PATCH 055/113] Clone review session with children. --- .../actions/action_clone_review_session.py | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 pype/modules/ftrack/actions/action_clone_review_session.py diff --git a/pype/modules/ftrack/actions/action_clone_review_session.py b/pype/modules/ftrack/actions/action_clone_review_session.py new file mode 100644 index 0000000000..863a929f59 --- /dev/null +++ b/pype/modules/ftrack/actions/action_clone_review_session.py @@ -0,0 +1,133 @@ +import json + +from pype.modules.ftrack.lib import BaseAction + + +def clone_review_session(session, entity): + # Create a client review with timestamp. + name = entity["name"] + review_session = session.create( + "ReviewSession", + { + "name": f"Clone of {name}", + "project": entity["project"] + } + ) + + # Add all invitees. + for invitee in entity["review_session_invitees"]: + session.create( + "ReviewSessionInvitee", + { + "name": invitee["name"], + "email": invitee["email"], + "review_session": review_session + } + ) + + # Add all objects to new review session. + for obj in entity["review_session_objects"]: + session.create( + "ReviewSessionObject", + { + "name": obj["name"], + "version": obj["version"], + "review_session": review_session, + "asset_version": obj["asset_version"] + } + ) + + session.commit() + + +class CloneReviewSession(BaseAction): + '''Generate Client Review action + `label` a descriptive string identifing your action. + `varaint` To group actions together, give them the same + label and specify a unique variant per action. + `identifier` a unique identifier for your action. + `description` a verbose descriptive text for you action + ''' + label = "Clone Review Session" + variant = None + identifier = "clone-review-session" + description = None + + def discover(self, session, entities, event): + '''Return true if we can handle the selected entities. + *session* is a `ftrack_api.Session` instance + *entities* is a list of tuples each containing the entity type and the + entity id. + If the entity is a hierarchical you will always get the entity + type TypedContext, once retrieved through a get operation you + will have the "real" entity type ie. example Shot, Sequence + or Asset Build. + *event* the unmodified original event + ''' + if len(entities) == 1: + if entities[0].entity_type == "ReviewSession": + return True + + return False + + def launch(self, session, entities, event): + '''Callback method for the custom action. + return either a bool ( True if successful or False if the action + failed ) or a dictionary with they keys `message` and `success`, the + message should be a string and will be displayed as feedback to the + user, success should be a bool, True if successful or False if the + action failed. + *session* is a `ftrack_api.Session` instance + *entities* is a list of tuples each containing the entity type and the + entity id. + If the entity is a hierarchical you will always get the entity + type TypedContext, once retrieved through a get operation you + will have the "real" entity type ie. example Shot, Sequence + or Asset Build. + *event* the unmodified original event + ''' + userId = event['source']['user']['id'] + user = session.query('User where id is ' + userId).one() + job = session.create( + 'Job', + { + 'user': user, + 'status': 'running', + 'data': json.dumps({ + 'description': 'Cloning Review Session.' + }) + } + ) + session.commit() + + try: + clone_review_session(session, entities[0]) + + job['status'] = 'done' + session.commit() + except Exception: + session.rollback() + job["status"] = "failed" + session.commit() + self.log.error( + "Cloning review session failed ({})", exc_info=True + ) + + return { + 'success': True, + 'message': 'Action completed successfully' + } + + +def register(session, plugins_presets=None): + '''Register action. Called when used as an event plugin.''' + + CloneReviewSession(session, plugins_presets).register() + + +if __name__ == "__main__": + import ftrack_api + session = ftrack_api.Session() + id = "8394ad42-4f61-11eb-9060-aecad24e2bb7" + entity = session.get("ReviewSession", id) + clone_review_session(session, entity) From 430c2a7210e1087a96b7d4fcb9ad50aac5491bd2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:47:11 +0100 Subject: [PATCH 056/113] moved clone review session from user handlers to server handlers --- .../ftrack/{actions => events}/action_clone_review_session.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pype/modules/ftrack/{actions => events}/action_clone_review_session.py (100%) diff --git a/pype/modules/ftrack/actions/action_clone_review_session.py b/pype/modules/ftrack/events/action_clone_review_session.py similarity index 100% rename from pype/modules/ftrack/actions/action_clone_review_session.py rename to pype/modules/ftrack/events/action_clone_review_session.py From 84db74bdbe0e5a9d07923f4c5e0f2e10e0b46aaf Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:53:26 +0100 Subject: [PATCH 057/113] registration without presets --- .../ftrack/events/action_clone_review_session.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/pype/modules/ftrack/events/action_clone_review_session.py b/pype/modules/ftrack/events/action_clone_review_session.py index 863a929f59..f04f943ad1 100644 --- a/pype/modules/ftrack/events/action_clone_review_session.py +++ b/pype/modules/ftrack/events/action_clone_review_session.py @@ -119,15 +119,7 @@ class CloneReviewSession(BaseAction): } -def register(session, plugins_presets=None): +def register(session): '''Register action. Called when used as an event plugin.''' - CloneReviewSession(session, plugins_presets).register() - - -if __name__ == "__main__": - import ftrack_api - session = ftrack_api.Session() - id = "8394ad42-4f61-11eb-9060-aecad24e2bb7" - entity = session.get("ReviewSession", id) - clone_review_session(session, entity) + CloneReviewSession(session).register() From ebb28b4b4ca075e8976bc6a448b94988921f6bc8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:54:27 +0100 Subject: [PATCH 058/113] user ServerAction instead of BaseAction --- pype/modules/ftrack/events/action_clone_review_session.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/modules/ftrack/events/action_clone_review_session.py b/pype/modules/ftrack/events/action_clone_review_session.py index f04f943ad1..49abd2a808 100644 --- a/pype/modules/ftrack/events/action_clone_review_session.py +++ b/pype/modules/ftrack/events/action_clone_review_session.py @@ -1,6 +1,6 @@ import json -from pype.modules.ftrack.lib import BaseAction +from pype.modules.ftrack.lib import ServerAction def clone_review_session(session, entity): @@ -40,7 +40,7 @@ def clone_review_session(session, entity): session.commit() -class CloneReviewSession(BaseAction): +class CloneReviewSession(ServerAction): '''Generate Client Review action `label` a descriptive string identifing your action. `varaint` To group actions together, give them the same From 4a753b47e9f521305aa502efd83e2ee577c48b3a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:55:09 +0100 Subject: [PATCH 059/113] discovery checks user roles --- .../ftrack/events/action_clone_review_session.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pype/modules/ftrack/events/action_clone_review_session.py b/pype/modules/ftrack/events/action_clone_review_session.py index 49abd2a808..9af04b45c1 100644 --- a/pype/modules/ftrack/events/action_clone_review_session.py +++ b/pype/modules/ftrack/events/action_clone_review_session.py @@ -52,6 +52,7 @@ class CloneReviewSession(ServerAction): variant = None identifier = "clone-review-session" description = None + settings_key = "clone_review_session" def discover(self, session, entities, event): '''Return true if we can handle the selected entities. @@ -64,11 +65,13 @@ class CloneReviewSession(ServerAction): or Asset Build. *event* the unmodified original event ''' - if len(entities) == 1: - if entities[0].entity_type == "ReviewSession": - return True - - return False + is_valid = ( + len(entities) == 1 + and entities[0].entity_type == "ReviewSession" + ) + if is_valid: + is_valid = self.valid_roles(session, entities, event) + return is_valid def launch(self, session, entities, event): '''Callback method for the custom action. From 8eea709c94b7aa237d6a7b5a29601d0d7a1c53b8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 22 Jan 2021 09:59:56 +0100 Subject: [PATCH 060/113] added clone_review_session action to settings for default roles --- .../defaults/project_settings/ftrack.json | 8 ++++++++ .../schema_project_ftrack.json | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/pype/settings/defaults/project_settings/ftrack.json b/pype/settings/defaults/project_settings/ftrack.json index debc92f2b5..17607b6bc1 100644 --- a/pype/settings/defaults/project_settings/ftrack.json +++ b/pype/settings/defaults/project_settings/ftrack.json @@ -26,6 +26,14 @@ "Project Manager" ] }, + "clone_review_session": { + "enabled": true, + "role_list": [ + "Pypeclub", + "Administrator", + "Project Manager" + ] + }, "thumbnail_updates": { "enabled": true, "levels": 1 diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_ftrack.json b/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_ftrack.json index cbff26e135..508b8e870d 100644 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_ftrack.json +++ b/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_ftrack.json @@ -104,6 +104,25 @@ } ] }, + { + "type": "dict", + "key": "clone_review_session", + "label": "Clone Review Session", + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "type": "list", + "key": "role_list", + "label": "Roles for action", + "object_type": "text" + } + ] + }, { "type": "dict", "key": "thumbnail_updates", From 32ee745d1f0614ec517a02426adb9f171c9e20bc Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 22 Jan 2021 11:48:41 +0100 Subject: [PATCH 061/113] Harmony to Deadline - fix if backslash is used in path Settings '64\bin' was mangled to '6in' --- pype/hooks/harmony/pre_launch_args.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/hooks/harmony/pre_launch_args.py b/pype/hooks/harmony/pre_launch_args.py index 70c05eb352..f09cef9384 100644 --- a/pype/hooks/harmony/pre_launch_args.py +++ b/pype/hooks/harmony/pre_launch_args.py @@ -26,7 +26,7 @@ class HarmonyPrelaunchHook(PreLaunchHook): ( "import avalon.harmony;" "avalon.harmony.launch(\"{}\")" - ).format(harmony_executable) + ).format(harmony_executable.replace("\\", "/")) ] # Append as whole list as these areguments should not be separated From 8c4879a7254cebb1be312c1dca8229868bb8b32d Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 22 Jan 2021 12:11:05 +0100 Subject: [PATCH 062/113] fix submodules --- .gitmodules | 2 +- repos/acre | 1 - repos/avalon-core | 2 +- repos/pyblish-base | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) delete mode 160000 repos/acre delete mode 160000 repos/pyblish-base diff --git a/.gitmodules b/.gitmodules index 20aa3a3e8d..a282ef169d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,4 +13,4 @@ url = https://bitbucket.org/ftrack/ftrack-python-api.git [submodule "pype/modules/ftrack/python2_vendor/arrow"] path = pype/modules/ftrack/python2_vendor/arrow - url = git@github.com:arrow-py/arrow.git + url = git@github.com:arrow-py/arrow.git \ No newline at end of file diff --git a/repos/acre b/repos/acre deleted file mode 160000 index 3d06232bd4..0000000000 --- a/repos/acre +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3d06232bd424df4350efe64ab459944b4096ca74 diff --git a/repos/avalon-core b/repos/avalon-core index 8a19fc31f9..67ff915857 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 8a19fc31f9f503f63a1b4d6cb90f3690902c2e5d +Subproject commit 67ff9158574223152b9063fb8b74835df37155d1 diff --git a/repos/pyblish-base b/repos/pyblish-base deleted file mode 160000 index 3290fd5b51..0000000000 --- a/repos/pyblish-base +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3290fd5b51b496d431cc2ca608639e21e727ccbd From 8f1dab4188c3a31bccede81a11a9b6e4fcb1368a Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 22 Jan 2021 12:11:19 +0100 Subject: [PATCH 063/113] add foundry license to environments passed to deadline --- pype/modules/deadline/plugins/publish/submit_nuke_deadline.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pype/modules/deadline/plugins/publish/submit_nuke_deadline.py b/pype/modules/deadline/plugins/publish/submit_nuke_deadline.py index 5e5efb6e62..3ef5386e82 100644 --- a/pype/modules/deadline/plugins/publish/submit_nuke_deadline.py +++ b/pype/modules/deadline/plugins/publish/submit_nuke_deadline.py @@ -219,7 +219,8 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin): "PYBLISHPLUGINPATH", "NUKE_PATH", "TOOL_ENV", - "PYPE_DEV" + "PYPE_DEV", + "FOUNDRY_LICENSE" ] environment = dict({key: os.environ[key] for key in keys if key in os.environ}, **api.Session) From 6e5d7b5846383fa03f71b75edded2c5942f4ba43 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 22 Jan 2021 12:12:13 +0100 Subject: [PATCH 064/113] change avalon-core to develop --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index 67ff915857..964ae5fa71 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 67ff9158574223152b9063fb8b74835df37155d1 +Subproject commit 964ae5fa7110984d5c0c00ad81c2c108031a7834 From 9ff4be8f73c46b53a9fbfa95f1441925447e5c93 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 22 Jan 2021 12:38:33 +0100 Subject: [PATCH 065/113] Harmony to Deadline - fix usage of Settings for Pype3 --- pype/hosts/harmony/__init__.py | 7 ++++--- pype/settings/defaults/project_settings/harmony.json | 4 ++-- .../projects_schema/schema_project_harmony.json | 10 ++++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/pype/hosts/harmony/__init__.py b/pype/hosts/harmony/__init__.py index 7ea261292e..390ede39d9 100644 --- a/pype/hosts/harmony/__init__.py +++ b/pype/hosts/harmony/__init__.py @@ -9,7 +9,7 @@ import avalon.tools.sceneinventory import pyblish.api from pype import lib -from pype.api import config +from pype.api import (get_current_project_settings) def set_scene_settings(settings): @@ -48,12 +48,13 @@ def get_asset_settings(): "resolutionWidth": resolution_width, "resolutionHeight": resolution_height } + settings = get_current_project_settings() try: skip_resolution_check = \ - config.get_presets()["harmony"]["general"]["skip_resolution_check"] + settings["harmony"]["general"]["skip_resolution_check"] skip_timelines_check = \ - config.get_presets()["harmony"]["general"]["skip_timelines_check"] + settings["harmony"]["general"]["skip_timelines_check"] except KeyError: skip_resolution_check = [] skip_timelines_check = [] diff --git a/pype/settings/defaults/project_settings/harmony.json b/pype/settings/defaults/project_settings/harmony.json index 5eca4f60eb..83d63d3392 100644 --- a/pype/settings/defaults/project_settings/harmony.json +++ b/pype/settings/defaults/project_settings/harmony.json @@ -1,7 +1,7 @@ { "publish": {}, "general": { - "skip_resolution_check": false, - "skip_timelines_check": false + "skip_resolution_check": [], + "skip_timelines_check": [] } } \ No newline at end of file diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_harmony.json b/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_harmony.json index 791a08cb8d..92ad39ac2c 100644 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_harmony.json +++ b/pype/tools/settings/settings/gui_schemas/projects_schema/schema_project_harmony.json @@ -19,14 +19,16 @@ "label": "General", "children": [ { - "type": "boolean", + "type": "list", "key": "skip_resolution_check", - "label": "Skip Resolution Check" + "object_type": "text", + "label": "Skip Resolution Check for Tasks" }, { - "type": "boolean", + "type": "list", "key": "skip_timelines_check", - "label": "Skip Timeliene Check" + "object_type": "text", + "label": "Skip Timeliene Check for Tasks" } ] } From b1b6e58110a94cb0ca33f95daf9087af650e92ad Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 22 Jan 2021 13:26:09 +0100 Subject: [PATCH 066/113] Harmony to Deadline - Hound --- pype/hosts/harmony/js/PypeHarmony.js | 2 +- pype/plugins/harmony/publish/collect_audio.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/pype/hosts/harmony/js/PypeHarmony.js b/pype/hosts/harmony/js/PypeHarmony.js index 555a5ce8fd..9d05384461 100644 --- a/pype/hosts/harmony/js/PypeHarmony.js +++ b/pype/hosts/harmony/js/PypeHarmony.js @@ -213,4 +213,4 @@ PypeHarmony.getVersion = function() { about.getMajorVersion(), about.getMinorVersion() ]; -} +}; diff --git a/pype/plugins/harmony/publish/collect_audio.py b/pype/plugins/harmony/publish/collect_audio.py index 27f8dfc0d6..58521d6612 100644 --- a/pype/plugins/harmony/publish/collect_audio.py +++ b/pype/plugins/harmony/publish/collect_audio.py @@ -1,9 +1,6 @@ import os import pyblish.api -import pyblish.api -from avalon import harmony - class CollectAudio(pyblish.api.InstancePlugin): """ From 4b3a0e3acc5b2a5b0ee8333612ef2caf14af1545 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 22 Jan 2021 14:47:02 +0100 Subject: [PATCH 067/113] change avalon-core to develop --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index 964ae5fa71..0f9bb99a1f 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 964ae5fa7110984d5c0c00ad81c2c108031a7834 +Subproject commit 0f9bb99a1f3359e0a1317a940e48b16055c4bfa6 From 3b0b505e5c16a3c5bf8777af831aceeb9921cd80 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 22 Jan 2021 22:35:02 +0100 Subject: [PATCH 068/113] fix extract review cutup (port from 2.x) --- pype/plugins/hiero/publish/extract_review_cutup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pype/plugins/hiero/publish/extract_review_cutup.py b/pype/plugins/hiero/publish/extract_review_cutup.py index ec3a9ec17e..32e43d502e 100644 --- a/pype/plugins/hiero/publish/extract_review_cutup.py +++ b/pype/plugins/hiero/publish/extract_review_cutup.py @@ -151,7 +151,7 @@ class ExtractReviewCutUp(pype.api.Extractor): https://github.com/pypeclub/pype/issues/659 """ frame_duration_extend = 1 - if audio_check_output: + if audio_check_output and ("audio" in inst_data["families"]): frame_duration_extend = 0 # translate frame to sec @@ -267,8 +267,8 @@ class ExtractReviewCutUp(pype.api.Extractor): ).format(**locals())) # append ffmpeg input video clip - input_args.append("-ss {:0.2f}".format(start_sec)) - input_args.append("-t {:0.2f}".format(duration_sec)) + input_args.append("-ss {}".format(start_sec)) + input_args.append("-t {}".format(duration_sec)) input_args.append("-i \"{}\"".format(full_input_path)) # add copy audio video codec if only shortening clip From 2df994f96c50ac85032a0e552d64a7ba4a3b6550 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 22 Jan 2021 22:35:21 +0100 Subject: [PATCH 069/113] add photoshop template copying (port from 2.x) --- pype/hooks/photoshop/prelaunch.py | 131 ++++++++++++++++++++++++++++++ pype/hosts/photoshop/template.psd | Bin 0 -> 159710 bytes 2 files changed, 131 insertions(+) create mode 100644 pype/hooks/photoshop/prelaunch.py create mode 100644 pype/hosts/photoshop/template.psd diff --git a/pype/hooks/photoshop/prelaunch.py b/pype/hooks/photoshop/prelaunch.py new file mode 100644 index 0000000000..bcd842736e --- /dev/null +++ b/pype/hooks/photoshop/prelaunch.py @@ -0,0 +1,131 @@ +import os +import pype.lib +from pype.api import Logger, Anatomy +import shutil +import getpass +import avalon.api + + +class PhotoshopPrelaunch(pype.lib.PypeHook): + """This hook will check for the existence of PyWin + + PyWin is a requirement for the Photoshop integration. + """ + project_code = None + host_name = "photoshop" + + def __init__(self, logger=None): + if not logger: + self.log = Logger().get_logger(self.__class__.__name__) + else: + self.log = logger + + self.signature = "( {} )".format(self.__class__.__name__) + + def execute(self, *args, env: dict = None) -> bool: + output = pype.lib._subprocess(["pip", "install", "pywin32==227"]) + self.log.info(output) + + workfile_path = self.get_workfile_plath(env, self.host_name) + + # adding compulsory environment var for openting file + env["PYPE_WORKFILE_PATH"] = workfile_path + + return True + + def get_anatomy_filled(self, workdir, project_name, asset_name, + task_name, host_name, extension): + dbcon = avalon.api.AvalonMongoDB() + dbcon.install() + dbcon.Session["AVALON_PROJECT"] = project_name + project_document = dbcon.find_one({"type": "project"}) + asset_document = dbcon.find_one({ + "type": "asset", + "name": asset_name + }) + dbcon.uninstall() + + asset_doc_parents = asset_document["data"].get("parents") + hierarchy = "/".join(asset_doc_parents) + + data = { + "project": { + "name": project_document["name"], + "code": project_document["data"].get("code") + }, + "task": task_name, + "asset": asset_name, + "app": host_name, + "hierarchy": hierarchy + } + anatomy = Anatomy(project_name) + file_template = anatomy.templates["work"]["file"] + data.update({ + "version": 1, + "user": os.environ.get("PYPE_USERNAME") or getpass.getuser(), + "ext": extension + }) + + return avalon.api.last_workfile( + workdir, file_template, data, + avalon.api.HOST_WORKFILE_EXTENSIONS[host_name], True + ) + + def get_workfile_plath(self, env, host_name): + # get context variables + project_name = env["AVALON_PROJECT"] + asset_name = env["AVALON_ASSET"] + task_name = env["AVALON_TASK"] + workdir = env["AVALON_WORKDIR"] + extension = avalon.api.HOST_WORKFILE_EXTENSIONS[host_name][0] + template_env_key = "{}_TEMPLATE".format(host_name.upper()) + + # get workfile path + workfile_path = self.get_anatomy_filled( + workdir, project_name, asset_name, task_name, host_name, extension) + + # create workdir if doesn't exist + os.makedirs(workdir, exist_ok=True) + self.log.info("Work dir is: `{}`".format(workdir)) + + # get last version of workfile + workfile_last = env.get("AVALON_LAST_WORKFILE") + self.log.debug("_ workfile_last: `{}`".format(workfile_last)) + + if workfile_last: + workfile = workfile_last + workfile_path = os.path.join(workdir, workfile) + + # copy workfile from template if doesnt exist any on path + if not os.path.isfile(workfile_path): + # try to get path from environment or use default + # from `pype.hosts.` dir + template_path = env.get(template_env_key) or os.path.join( + env.get("PYPE_MODULE_ROOT"), + "pype/hosts/{}/template{}".format(host_name, extension) + ) + + # try to get template from project config folder + proj_config_path = os.path.join( + env["PYPE_PROJECT_CONFIGS"], project_name) + if os.path.exists(proj_config_path): + + template_file = None + for f in os.listdir(proj_config_path): + if extension in os.path.splitext(f): + template_file = f + + if template_file: + template_path = os.path.join( + proj_config_path, template_file) + self.log.info( + "Creating workfile from template: `{}`".format(template_path)) + + # copy template to new destinantion + shutil.copy2( + os.path.normpath(template_path), + os.path.normpath(workfile_path) + ) + + self.log.info("Workfile to open: `{}`".format(workfile_path)) + return workfile_path diff --git a/pype/hosts/photoshop/template.psd b/pype/hosts/photoshop/template.psd new file mode 100644 index 0000000000000000000000000000000000000000..4c731771bac895ff672a86c1281cded9bfa0c049 GIT binary patch literal 159710 zcmeI)2YeLOz6bC#TT?c@&|wJ)p`~nkLK0FTfrNx4R8iRMPLd_t*ph+`5K)0Eiii}I zDuQ^yMiCnziiL}UH0uo_0*V?7qN3)VGh4EusO!7$^WOV>e#2*H&z$o=XU=@*%w3yYJM&72Z zA64BxWTgDV%z;;kmTMZ*_2(Vh&rR_DzP zCY#CHV7ktByNexLFYFwLSvKu{R-uJg+f0@klS!ZJ*zc9D_LPN%Y(Hlz2Tjx&wWen4 z;OvAet90&x&er%MwT;hBN=#D4C92|7nKi29tW;H2YWmPbRaRo6MkOcsOMma8_K^*W834ZnmYqt-d7+_2dRouMA} zg~5?kYP8zaMh#zDluI+>bvkWU8lRq;q0(yO>e5u&xU`Ivw7AR^jV3OIPv`5@X?2+@ zb*6w+UhY}_s-}xf8ao@G&Zf0qHtkXUs-`O}I(lwV>pfyv@4a2cHJZ6ep~2nSo1TEli=u7(YGUYniJ zCAYI%?wZbOy1%;v9qoHmzy3O!8+hX%9WaijgsAH`Vl~y-n$;FQzn+eXzj7=)TJ2ix z%I32Z*!fnk>$)Qxxn1{-ssZ?cq|w0v%IcEYu?o$Gh3z~i(ptlyDK ze^lu2S%Uiqt!vlZyYD}oxDw_++`OYXti&r;aDmG!0k48Fy1?a?fLFm7UEuOcz^h=4 zE^v7z;8ie27r49<@G2Oi3tV0acomG%1um}yyb8wX0+&|;UIk-xfy*lauYxhUz~z;I zSHT!v;POhqt6+>SaCs%*RWL>uxV#eZDj1^+TwV!y6^zjZF0TZ<3dZOHmsbK_1!Hu9 z%PRq|f-$nW(xE+qq9efTDwkf(;0;(X}PZuU06PO3=y_?IBP-_M`xW|9O|*f6~Z%R zR$AVTMHZTEM%PBrjjXk}7pm&55$jT}&= zXZzMY73j6fYvos2^)?~DvPGX)r1!n)v*AK=Qb($zP37WlggXy4rNY~+Z)a`b_e&~J|ZbAAh>YM@XS=v*oN z8Zny)<4ydvkQbn+v8at!`g{^^)U-NAVuVoAm(Bx74IS-jVkA~N#?>^<)3k=PI@*w= z3XvgnPKQHBhpk`=> znh`LY&RW@Qb{?H62%WmK*-1A0%(+Ikx9Ow4Y$mkXlcmJW$sxoRT~7iFX+qn&YVydF z&vwLjjqwO@7j&NPh|#WRXJxkeGWy)CQER>8Y@@NMXqnJWc8I!<1DbioaYPE-#~XWq znUE^?;l#Q|WLEl|ByXLdFJmVJuFHC)LK)2tr60MlP+H`%E_uDhWH)!ol9`0Z5MAf` z;%e5q7a}7SI{&=LlvwtfbUXucTl9)7vkm4-a?w!4vSi z=9F9OyZ$K3)OuTuy1q+PpoZ7$YxovhskNl0yv%jl^>Jl)3HEI;S!U(yb@i@a#URJV zm$w8tz|PFFdv9fg9pzzhIQRfL0-6O-5$zYcrYY z<%E^@JkR>+=?VF&Tt%&L0>3KXpYHaCE5n5&Xb@YGaJY#^v5T4ObrSC3>DC8V^tP-&$>j+TTuJ(zwx?l=zL ziz}&ADm}{nN-{)aw$LA2u95~PYw2_AG(C@|_02Xj%V)g~uWe*$5j*6SAEoJNz1^Ur>7Qsi z+`y~p!6;#;sAwCnX`tyunpRk9s_3t^B%2T)MZHJ5)+24BBap_DLX){w*eA+Cn!!r? z(0+!pgm2dKHd|aJeHVe+qNQ&NFqqXw`WxohW>$-YGFv4@PE%#3rNt%1v-6B=`olt3 z(4Ty>ed`GMew?t+xX6Q@d7YIz^GxgLxtRXWiSO&ot6f3J&O7M|{DaQC=r#26b{-)+ z-tpL;NH$(PUSgo*HSrA8J^g8bJM#JokM+f~^||eoMUF#Q$xt=)L0Y>-Nv|<9yfW^} zLHxHXdUVU9AH%BnI-Xt2@X85vl+jBuy1R{9o$x*eo$-2m_-|J8=mSeS#x+fZZTOvp zPm3qP?}QWaR|knC%%6y-K1xeC_kJt$ok0JVAY@{{vyO33)3jWecbSP6(?yY0C;Tjs z!m1jj#%^hHgh<$zl=zV#5>9%MzGMIyM6YX-NIDr#@<=fmO)BU$++=bSy=rS926_e8 zOl~1_$b7Pp+(#ZHE6HlIfovvQ$undpd6DcTuamdQyW|-8khGCA&L}#L%Ad_gUjWLxiYSbo6Jq;>Nz84=WgNd;1+UAxRu;mZZr2Z_dK_kdy_lN zz0aNE&U4>!zlg*lg(zIqM>J5BAj%Nsi^hm*L^q1+MKeXSMDs-Vik6GkiJlbg5bYJc zEjlJ@6MZSVC?;ZmaiqAvI8K})E)-XYr-$Amb>gk!-Qok{_rz`D3*w(8 zGD(<3DT$K|my}4xOEi+1lG`MUBr7GGBs(PgCGSa2N!lg9O9Q06r9-7z(o*RpX}z>r zI$yd>x>34a`kM5Z^o;aJnM@Wbi)~> zIr0j*T5glim#>gNDSt(NM1Ds8laIeoKc6I@kv>y=j6QRHmiav4^RmwopR+!feS>{t ze6xHje6_x z`Rn{=`!Dx@%Kr`jQ~p0ILKQ<4g^H;PyW(EOS#Gsjj)(tv3ST;CgaO2=d2ERK*G$eIM!;n=&-We(y znl@B7^pT;5he?NJ4l@p0H|#{5A}&9!DQ-*LsrbnFviQ02JLA7jh)$T2aDT#qgx?cW z6ZMH35Ftg8{Rnl ziQ(t6W3&0}4cVu2qH@$ZYjfIimATV%*W|X1=s!X|V%>;O^9JN;^ET$4%^#dUBmc?# zuL}|jECt&OE)`}K-deb)NL)0kXhG4T;?Uyp#Vd*)Ps6l1E#tQ_-c*^n|z+3s>t`RMWo%0C(#GuAkEX9cM! zt$3i~Xy`a zW214usjsQUbl5!9Jm1_lGi&C9Gutg=EE}zy^+xM1TR6R#I%pqczteuIDYt1=(@)J4 znxAb6X)(4OY#q{iPwUxPBWFE!v*c#Y&HHZYf6JU(PTiV+>)PA6+iGvycl&_b=iPp0 z_NdvL=J?HNob#`_iF23C{o#&@ckG_mXWs02r|%qf=a%__^DXmF+%^2J)ptwo*4=&R zp5%L0-1GYa?Si)!CN5mI@Yh9}MQ{B>^^fKM=(xA;-b0Ji7C(BQ>^|dt$L}9;|E47& zOJ*%O{XqExJC-V!E?D}*gVP>-b6Lu=)ereSWPhk_dD-$^E23B2x8m284J(hWDp+$X_C1^N?AGUEo_lzE*!BfGxE-xK+IKeWY}++?*Wu?!KfiDH@ZH;A zh=1Yn7yG}s>ZOR67QgKG^1PQjUYYgE#XaUd7xvcgJ-u(*z7JoW^y<<5&@ri%6Mz%+i7p_IGB2H`@d5Ewf#`qp&jp}zq9Mz%y)Mm z&OZF|kr7AszE||#>qkqEzI|-$vBSs5A3u3w>WQ|K+LPzr*T4Vm2TdPb{&4n3(vKE= z9Q^UJPkMi{?%#v|y{#>+?WI#irw)Ev{pp9NHK)J)%=+1{XXbq#@cFW{{myPamvrvM z^CQo{`^61kocYrH<>d?WzY6*4;jagM{oFTs-yCe8)PCk$%eNihE&9I4_mBUO^25H1 zl@~wx(eUHtOACJL@zbWCGk!ks%fw&KUT*$X{_FDJ2LHDE_c6bJ)M4o85dPK(7p?}_ z#en0E0K0-F;#@jo*Ar{#hhDdHZG>#vL-V8P-~U|4$&RmxLU@hRw8C;C>iC)j3QI&g zo6z8n56L{D@bU5S^-=ixDnk7I{6ivw6pEmT?qOjOVPV}v6vE{Eax7dq=K}ow0|Enr z0|SG@0|NuY*(@;JQ6=QBG|;h!g!s_TuMu-mL=?h_L%5EQ>EHi;9s9Wvw3kwPVL~U` zVK#{gCz42Iavxtme|jUVYavHOVpm}>;Ut_`BoRsFG9Rf}kxUCi#FGA@Drx>Wby(EQ zIZ3kc``12QFd#ajYHw|Fie>KMLV3)R>h@FLYOJY|>z=t|V9^6L+TwldZE4+(jQ^DX z?%8>-zGpxE{m9s*8}5AW!Tm=+`{A+euN^ycaY9|w{AC+=yng)iAJa!otZ%;Sp~rU~ zIC1t;2oZ^BZzV#XLSs$& zHb%xeARm~z?+ES0`fl3d@o6^xQ+F4x--FoBE_8fA6k=hWA!G!(ShJ)wW^nY9($S^S zORAQXMlaoPy^M;EcfE=}>{av;ucF`cD*C8b(eDdKR)1k&-AL!cC<`L_L`!e}*U}rI zN_zR;K+`t*u?i_O4eRzN5lT`>|0(GudLsQ3Ka(}=xGxaJ*2E>1my;nh;X~wHsBl}I z-O(jnPvO5iXo}Qwz1-;;+#qL+h{mXd8)vK?3zsCM*?D2HTRw?^bzhkW)Lu`BJk@kZAv z4UcW%qB^&Q8{)YwBF@zYmn3qxO=ky-9ADZ?-cqA8 z@a%tb@=tQxZ+`wlU!fm$EfzMwS>5YSY~7V=o3JjH9$9W}q`~y}$h~)xSiXjCB<+H$ zJx5<$w||8#nP9ORyWEs@m9lXpHK=EpEY3T!tg_TVZ>701SntGjx)zUee|C$&`C7&< zHzZ~B6>CnD#+ej?Oc^g;e$ff1-I{Ml+ zyAT@EHFQ+v_&D=ZZ?}NHdm~pkF;f9tFwUZ+)!6EZS{H;f}C9`(pg!TwRErd z#Xkr@00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_0D=EafjJ%c z2LT8`00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##{+|nw zIrs+w2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ Z009U<00Izz00bZa0SG_<0{;gE{tFxEb}Ik? literal 0 HcmV?d00001 From 67ab7b4b38b3bc367eb5b0e06c41e97c610ea7eb Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 22 Jan 2021 22:45:46 +0100 Subject: [PATCH 070/113] update core to latest develop --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index 0f9bb99a1f..4427263006 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 0f9bb99a1f3359e0a1317a940e48b16055c4bfa6 +Subproject commit 44272630062ba5e440cdc6c2a5864328d736ae73 From aecd70a7b050a13e58007460916770a953c2a98e Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 25 Jan 2021 11:00:19 +0100 Subject: [PATCH 071/113] nuke: bake writes colorspace --- pype/hosts/nuke/api/lib.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pype/hosts/nuke/api/lib.py b/pype/hosts/nuke/api/lib.py index 96067a3d48..20b00b2d7a 100644 --- a/pype/hosts/nuke/api/lib.py +++ b/pype/hosts/nuke/api/lib.py @@ -1371,6 +1371,7 @@ class ExporterReviewMov(ExporterReview): self.viewer_lut_raw = klass.viewer_lut_raw self.bake_colorspace_fallback = klass.bake_colorspace_fallback self.bake_colorspace_main = klass.bake_colorspace_main + self.write_colorspace = instance.data["colorspace"] self.name = name or "baked" self.ext = ext or "mov" @@ -1416,6 +1417,8 @@ class ExporterReviewMov(ExporterReview): r_node["origfirst"].setValue(self.first_frame) r_node["last"].setValue(self.last_frame) r_node["origlast"].setValue(self.last_frame) + r_node["colorspace"].setValue(self.write_colorspace) + # connect self._temp_nodes.append(r_node) self.previous_node = r_node From e58a4807ea3115798646956a8818fb728f4e0c80 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 25 Jan 2021 17:36:30 +0100 Subject: [PATCH 072/113] Photoshop fix - create called on single layer Version for Pype3 --- .../websocket_server/stubs/photoshop_server_stub.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pype/modules/websocket_server/stubs/photoshop_server_stub.py b/pype/modules/websocket_server/stubs/photoshop_server_stub.py index 04fb7eff0f..d223153797 100644 --- a/pype/modules/websocket_server/stubs/photoshop_server_stub.py +++ b/pype/modules/websocket_server/stubs/photoshop_server_stub.py @@ -135,13 +135,17 @@ class PhotoshopServerStub(): def group_selected_layers(self, name): """ Group selected layers into new LayerSet (eg. group) - Returns: + Returns: (Layer) """ res = self.websocketserver.call(self.client.call ('Photoshop.group_selected_layers', name=name) ) - return self._to_records(res) + res = self._to_records(res) + + if res: + return res.pop() + raise ValueError("No group record returned") def get_selected_layers(self): """ From 18d6bba6647215df7d3c7c3b2fb612c596d535ae Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Jan 2021 15:38:16 +0100 Subject: [PATCH 073/113] Remove unfinished prelaunch hook for templates Should be implemented properly later --- pype/hooks/photoshop/prelaunch.py | 131 ------------------------------ 1 file changed, 131 deletions(-) delete mode 100644 pype/hooks/photoshop/prelaunch.py diff --git a/pype/hooks/photoshop/prelaunch.py b/pype/hooks/photoshop/prelaunch.py deleted file mode 100644 index bcd842736e..0000000000 --- a/pype/hooks/photoshop/prelaunch.py +++ /dev/null @@ -1,131 +0,0 @@ -import os -import pype.lib -from pype.api import Logger, Anatomy -import shutil -import getpass -import avalon.api - - -class PhotoshopPrelaunch(pype.lib.PypeHook): - """This hook will check for the existence of PyWin - - PyWin is a requirement for the Photoshop integration. - """ - project_code = None - host_name = "photoshop" - - def __init__(self, logger=None): - if not logger: - self.log = Logger().get_logger(self.__class__.__name__) - else: - self.log = logger - - self.signature = "( {} )".format(self.__class__.__name__) - - def execute(self, *args, env: dict = None) -> bool: - output = pype.lib._subprocess(["pip", "install", "pywin32==227"]) - self.log.info(output) - - workfile_path = self.get_workfile_plath(env, self.host_name) - - # adding compulsory environment var for openting file - env["PYPE_WORKFILE_PATH"] = workfile_path - - return True - - def get_anatomy_filled(self, workdir, project_name, asset_name, - task_name, host_name, extension): - dbcon = avalon.api.AvalonMongoDB() - dbcon.install() - dbcon.Session["AVALON_PROJECT"] = project_name - project_document = dbcon.find_one({"type": "project"}) - asset_document = dbcon.find_one({ - "type": "asset", - "name": asset_name - }) - dbcon.uninstall() - - asset_doc_parents = asset_document["data"].get("parents") - hierarchy = "/".join(asset_doc_parents) - - data = { - "project": { - "name": project_document["name"], - "code": project_document["data"].get("code") - }, - "task": task_name, - "asset": asset_name, - "app": host_name, - "hierarchy": hierarchy - } - anatomy = Anatomy(project_name) - file_template = anatomy.templates["work"]["file"] - data.update({ - "version": 1, - "user": os.environ.get("PYPE_USERNAME") or getpass.getuser(), - "ext": extension - }) - - return avalon.api.last_workfile( - workdir, file_template, data, - avalon.api.HOST_WORKFILE_EXTENSIONS[host_name], True - ) - - def get_workfile_plath(self, env, host_name): - # get context variables - project_name = env["AVALON_PROJECT"] - asset_name = env["AVALON_ASSET"] - task_name = env["AVALON_TASK"] - workdir = env["AVALON_WORKDIR"] - extension = avalon.api.HOST_WORKFILE_EXTENSIONS[host_name][0] - template_env_key = "{}_TEMPLATE".format(host_name.upper()) - - # get workfile path - workfile_path = self.get_anatomy_filled( - workdir, project_name, asset_name, task_name, host_name, extension) - - # create workdir if doesn't exist - os.makedirs(workdir, exist_ok=True) - self.log.info("Work dir is: `{}`".format(workdir)) - - # get last version of workfile - workfile_last = env.get("AVALON_LAST_WORKFILE") - self.log.debug("_ workfile_last: `{}`".format(workfile_last)) - - if workfile_last: - workfile = workfile_last - workfile_path = os.path.join(workdir, workfile) - - # copy workfile from template if doesnt exist any on path - if not os.path.isfile(workfile_path): - # try to get path from environment or use default - # from `pype.hosts.` dir - template_path = env.get(template_env_key) or os.path.join( - env.get("PYPE_MODULE_ROOT"), - "pype/hosts/{}/template{}".format(host_name, extension) - ) - - # try to get template from project config folder - proj_config_path = os.path.join( - env["PYPE_PROJECT_CONFIGS"], project_name) - if os.path.exists(proj_config_path): - - template_file = None - for f in os.listdir(proj_config_path): - if extension in os.path.splitext(f): - template_file = f - - if template_file: - template_path = os.path.join( - proj_config_path, template_file) - self.log.info( - "Creating workfile from template: `{}`".format(template_path)) - - # copy template to new destinantion - shutil.copy2( - os.path.normpath(template_path), - os.path.normpath(workfile_path) - ) - - self.log.info("Workfile to open: `{}`".format(workfile_path)) - return workfile_path From dd6e1c3c43d3d79c0e917c687ec260d40e93fba7 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Jan 2021 15:39:18 +0100 Subject: [PATCH 074/113] Fix proper escaping for executable - AfterEffects --- pype/hooks/aftereffects/pre_launch_args.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/hooks/aftereffects/pre_launch_args.py b/pype/hooks/aftereffects/pre_launch_args.py index e39247b983..435893fbc0 100644 --- a/pype/hooks/aftereffects/pre_launch_args.py +++ b/pype/hooks/aftereffects/pre_launch_args.py @@ -26,7 +26,7 @@ class AfterEffectsPrelaunchHook(PreLaunchHook): ( "import avalon.aftereffects;" "avalon.aftereffects.launch(\"{}\")" - ).format(aftereffects_executable) + ).format(aftereffects_executable.replace("\\", "\\\\")) ] # Append as whole list as these areguments should not be separated From 523ec644fe10777c4f490da8b5c6ce85f61a47e5 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Jan 2021 15:39:38 +0100 Subject: [PATCH 075/113] Fix proper escaping for executable - Harmony --- pype/hooks/harmony/pre_launch_args.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/hooks/harmony/pre_launch_args.py b/pype/hooks/harmony/pre_launch_args.py index f09cef9384..a61977f4e7 100644 --- a/pype/hooks/harmony/pre_launch_args.py +++ b/pype/hooks/harmony/pre_launch_args.py @@ -26,7 +26,7 @@ class HarmonyPrelaunchHook(PreLaunchHook): ( "import avalon.harmony;" "avalon.harmony.launch(\"{}\")" - ).format(harmony_executable.replace("\\", "/")) + ).format(harmony_executable.replace("\\", "\\\\")) ] # Append as whole list as these areguments should not be separated From e91efcb8a34b27c5088096350e7b3a40bdf58e16 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 26 Jan 2021 15:41:16 +0100 Subject: [PATCH 076/113] Fix proper escaping for executable - Photoshop Plus escaping of workfile path --- pype/hooks/photoshop/pre_launch_args.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pype/hooks/photoshop/pre_launch_args.py b/pype/hooks/photoshop/pre_launch_args.py index b13e7d1e0f..6bd40eb2e1 100644 --- a/pype/hooks/photoshop/pre_launch_args.py +++ b/pype/hooks/photoshop/pre_launch_args.py @@ -20,13 +20,20 @@ class PhotoshopPrelaunchHook(PreLaunchHook): while self.launch_context.launch_args: remainders.append(self.launch_context.launch_args.pop(0)) + workfile_path = self.data["last_workfile_path"] + if not os.path.exists(workfile_path): + workfile_path = "" + new_launch_args = [ self.python_executable(), "-c", ( "import avalon.photoshop;" - "avalon.photoshop.launch(\"{}\")" - ).format(photoshop_executable) + "avalon.photoshop.launch(\"{}\", \"{}\")" + ).format( + photoshop_executable.replace("\\", "\\\\"), + workfile_path.replace("\\", "\\\\") + ) ] # Append as whole list as these areguments should not be separated From b2a8fabaa60135c4f545c74df9c36aff342bf2bd Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 09:47:42 +0100 Subject: [PATCH 077/113] move maya files --- pype/hosts/maya/{ => api}/__init__.py | 0 pype/hosts/maya/{ => api}/action.py | 0 pype/hosts/maya/{ => api}/customize.py | 0 pype/hosts/maya/{ => api}/expected_files.py | 0 pype/hosts/maya/{ => api}/lib.py | 0 pype/hosts/maya/{ => api}/menu.json | 0 pype/hosts/maya/{ => api}/menu.py | 0 pype/hosts/maya/{ => api}/menu_backup.json | 0 pype/hosts/maya/{ => api}/plugin.py | 0 pype/{setdress_api.py => hosts/maya/api/setdress.py} | 0 pype/{plugins/maya => hosts/maya/plugins}/__init__.py | 0 .../maya => hosts/maya/plugins}/create/create_animation.py | 0 pype/{plugins/maya => hosts/maya/plugins}/create/create_ass.py | 0 .../maya => hosts/maya/plugins}/create/create_assembly.py | 0 pype/{plugins/maya => hosts/maya/plugins}/create/create_camera.py | 0 pype/{plugins/maya => hosts/maya/plugins}/create/create_layout.py | 0 pype/{plugins/maya => hosts/maya/plugins}/create/create_look.py | 0 .../maya => hosts/maya/plugins}/create/create_mayaascii.py | 0 pype/{plugins/maya => hosts/maya/plugins}/create/create_model.py | 0 .../maya => hosts/maya/plugins}/create/create_pointcache.py | 0 pype/{plugins/maya => hosts/maya/plugins}/create/create_render.py | 0 .../maya => hosts/maya/plugins}/create/create_rendersetup.py | 0 pype/{plugins/maya => hosts/maya/plugins}/create/create_review.py | 0 pype/{plugins/maya => hosts/maya/plugins}/create/create_rig.py | 0 .../maya => hosts/maya/plugins}/create/create_setdress.py | 0 .../maya/plugins}/create/create_unreal_staticmesh.py | 0 .../maya => hosts/maya/plugins}/create/create_vrayproxy.py | 0 .../maya => hosts/maya/plugins}/create/create_vrayscene.py | 0 .../maya => hosts/maya/plugins}/create/create_yeti_cache.py | 0 .../maya => hosts/maya/plugins}/create/create_yeti_rig.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/_load_animation.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/actions.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_ass.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_assembly.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_audio.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_gpucache.py | 0 .../{plugins/maya => hosts/maya/plugins}/load/load_image_plane.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_look.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_matchmove.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_reference.py | 0 .../{plugins/maya => hosts/maya/plugins}/load/load_rendersetup.py | 0 .../maya => hosts/maya/plugins}/load/load_vdb_to_redshift.py | 0 .../{plugins/maya => hosts/maya/plugins}/load/load_vdb_to_vray.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_vrayproxy.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_yeti_cache.py | 0 pype/{plugins/maya => hosts/maya/plugins}/load/load_yeti_rig.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/__init__.py | 0 .../maya => hosts/maya/plugins}/publish/collect_animation.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/collect_ass.py | 0 .../maya => hosts/maya/plugins}/publish/collect_assembly.py | 0 .../maya/plugins}/publish/collect_file_dependencies.py | 0 .../maya => hosts/maya/plugins}/publish/collect_ftrack_family.py | 0 .../maya => hosts/maya/plugins}/publish/collect_history.py | 0 .../maya => hosts/maya/plugins}/publish/collect_instances.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/collect_look.py | 0 .../maya => hosts/maya/plugins}/publish/collect_maya_units.py | 0 .../maya => hosts/maya/plugins}/publish/collect_maya_workspace.py | 0 .../maya => hosts/maya/plugins}/publish/collect_mayaascii.py | 0 .../{plugins/maya => hosts/maya/plugins}/publish/collect_model.py | 0 .../maya => hosts/maya/plugins}/publish/collect_remove_marked.py | 0 .../maya => hosts/maya/plugins}/publish/collect_render.py | 0 .../maya/plugins}/publish/collect_render_layer_aovs.py | 0 .../maya/plugins}/publish/collect_renderable_camera.py | 0 .../maya => hosts/maya/plugins}/publish/collect_review.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/collect_rig.py | 0 .../{plugins/maya => hosts/maya/plugins}/publish/collect_scene.py | 0 .../maya/plugins}/publish/collect_unreal_staticmesh.py | 0 .../maya => hosts/maya/plugins}/publish/collect_workscene_fps.py | 0 .../maya => hosts/maya/plugins}/publish/collect_yeti_cache.py | 0 .../maya => hosts/maya/plugins}/publish/collect_yeti_rig.py | 0 .../maya/plugins}/publish/determine_future_version.py | 0 .../maya => hosts/maya/plugins}/publish/extract_animation.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/extract_ass.py | 0 .../maya => hosts/maya/plugins}/publish/extract_assembly.py | 0 .../maya => hosts/maya/plugins}/publish/extract_assproxy.py | 0 .../maya => hosts/maya/plugins}/publish/extract_camera_alembic.py | 0 .../maya/plugins}/publish/extract_camera_mayaScene.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/extract_fbx.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/extract_look.py | 0 .../maya => hosts/maya/plugins}/publish/extract_maya_scene_raw.py | 0 .../{plugins/maya => hosts/maya/plugins}/publish/extract_model.py | 0 .../maya => hosts/maya/plugins}/publish/extract_playblast.py | 0 .../maya => hosts/maya/plugins}/publish/extract_pointcache.py | 0 .../maya => hosts/maya/plugins}/publish/extract_rendersetup.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/extract_rig.py | 0 .../maya => hosts/maya/plugins}/publish/extract_thumbnail.py | 0 .../maya => hosts/maya/plugins}/publish/extract_vrayproxy.py | 0 .../maya => hosts/maya/plugins}/publish/extract_yeti_cache.py | 0 .../maya => hosts/maya/plugins}/publish/extract_yeti_rig.py | 0 .../maya/plugins}/publish/increment_current_file_deadline.py | 0 pype/{plugins/maya => hosts/maya/plugins}/publish/save_scene.py | 0 .../maya => hosts/maya/plugins}/publish/submit_maya_muster.py | 0 .../maya/plugins}/publish/validate_animation_content.py | 0 .../publish/validate_animation_out_set_related_node_ids.py | 0 .../maya/plugins}/publish/validate_ass_relative_paths.py | 0 .../maya => hosts/maya/plugins}/publish/validate_assembly_name.py | 0 .../maya/plugins}/publish/validate_assembly_namespaces.py | 0 .../maya/plugins}/publish/validate_assembly_transforms.py | 0 .../maya => hosts/maya/plugins}/publish/validate_attributes.py | 0 .../maya/plugins}/publish/validate_camera_attributes.py | 0 .../maya/plugins}/publish/validate_camera_contents.py | 0 .../maya => hosts/maya/plugins}/publish/validate_color_sets.py | 0 .../plugins}/publish/validate_current_renderlayer_renderable.py | 0 .../maya => hosts/maya/plugins}/publish/validate_frame_range.py | 0 .../maya/plugins}/publish/validate_instance_has_members.py | 0 .../maya/plugins}/publish/validate_instance_subset.py | 0 .../maya/plugins}/publish/validate_instancer_content.py | 0 .../maya/plugins}/publish/validate_instancer_frame_ranges.py | 0 .../maya => hosts/maya/plugins}/publish/validate_joints_hidden.py | 0 .../maya => hosts/maya/plugins}/publish/validate_look_contents.py | 0 .../plugins}/publish/validate_look_default_shaders_connections.py | 0 .../maya/plugins}/publish/validate_look_id_reference_edits.py | 0 .../maya/plugins}/publish/validate_look_members_unique.py | 0 .../maya/plugins}/publish/validate_look_no_default_shaders.py | 0 .../maya => hosts/maya/plugins}/publish/validate_look_sets.py | 0 .../maya/plugins}/publish/validate_look_shading_group.py | 0 .../maya/plugins}/publish/validate_look_single_shader.py | 0 .../maya => hosts/maya/plugins}/publish/validate_maya_units.py | 0 .../maya/plugins}/publish/validate_mesh_arnold_attributes.py | 0 .../maya => hosts/maya/plugins}/publish/validate_mesh_has_uv.py | 0 .../maya/plugins}/publish/validate_mesh_lamina_faces.py | 0 .../maya/plugins}/publish/validate_mesh_no_negative_scale.py | 0 .../maya/plugins}/publish/validate_mesh_non_manifold.py | 0 .../maya/plugins}/publish/validate_mesh_non_zero_edge.py | 0 .../maya/plugins}/publish/validate_mesh_normals_unlocked.py | 0 .../maya/plugins}/publish/validate_mesh_overlapping_uvs.py | 0 .../maya/plugins}/publish/validate_mesh_shader_connections.py | 0 .../maya/plugins}/publish/validate_mesh_single_uv_set.py | 0 .../maya/plugins}/publish/validate_mesh_uv_set_map1.py | 0 .../maya/plugins}/publish/validate_mesh_vertices_have_edges.py | 0 .../maya => hosts/maya/plugins}/publish/validate_model_content.py | 0 .../maya => hosts/maya/plugins}/publish/validate_model_name.py | 0 .../maya/plugins}/publish/validate_muster_connection.py | 0 .../maya => hosts/maya/plugins}/publish/validate_no_animation.py | 0 .../maya/plugins}/publish/validate_no_default_camera.py | 0 .../maya => hosts/maya/plugins}/publish/validate_no_namespace.py | 0 .../maya/plugins}/publish/validate_no_null_transforms.py | 0 .../maya/plugins}/publish/validate_no_unknown_nodes.py | 0 .../maya => hosts/maya/plugins}/publish/validate_no_vraymesh.py | 0 .../maya => hosts/maya/plugins}/publish/validate_node_ids.py | 0 .../maya/plugins}/publish/validate_node_ids_deformed_shapes.py | 0 .../maya/plugins}/publish/validate_node_ids_in_database.py | 0 .../maya/plugins}/publish/validate_node_ids_related.py | 0 .../maya/plugins}/publish/validate_node_ids_unique.py | 0 .../maya/plugins}/publish/validate_node_no_ghosting.py | 0 .../maya/plugins}/publish/validate_render_image_rule.py | 0 .../maya/plugins}/publish/validate_render_no_default_cameras.py | 0 .../maya/plugins}/publish/validate_render_single_camera.py | 0 .../maya/plugins}/publish/validate_renderlayer_aovs.py | 0 .../maya/plugins}/publish/validate_rendersettings.py | 0 .../maya => hosts/maya/plugins}/publish/validate_resources.py | 0 .../maya => hosts/maya/plugins}/publish/validate_rig_contents.py | 0 .../maya/plugins}/publish/validate_rig_controllers.py | 0 .../publish/validate_rig_controllers_arnold_attributes.py | 0 .../maya/plugins}/publish/validate_rig_out_set_node_ids.py | 0 .../maya/plugins}/publish/validate_rig_output_ids.py | 0 .../maya/plugins}/publish/validate_scene_set_workspace.py | 0 .../maya => hosts/maya/plugins}/publish/validate_shader_name.py | 0 .../maya/plugins}/publish/validate_shape_default_names.py | 0 .../maya/plugins}/publish/validate_shape_render_stats.py | 0 .../maya/plugins}/publish/validate_single_assembly.py | 0 .../maya/plugins}/publish/validate_skinCluster_deformer_set.py | 0 .../maya => hosts/maya/plugins}/publish/validate_step_size.py | 0 .../maya/plugins}/publish/validate_transform_naming_suffix.py | 0 .../maya/plugins}/publish/validate_transform_zero.py | 0 .../maya/plugins}/publish/validate_unicode_strings.py | 0 .../maya/plugins}/publish/validate_unreal_mesh_triangulated.py | 0 .../maya/plugins}/publish/validate_unreal_staticmesh_naming.py | 0 .../maya/plugins}/publish/validate_unreal_up_axis.py | 0 .../maya/plugins}/publish/validate_vray_distributed_rendering.py | 0 .../maya/plugins}/publish/validate_vray_referenced_aovs.py | 0 .../maya/plugins}/publish/validate_vray_translator_settings.py | 0 .../maya => hosts/maya/plugins}/publish/validate_vrayproxy.py | 0 .../maya/plugins}/publish/validate_vrayproxy_members.py | 0 .../maya/plugins}/publish/validate_yeti_renderscript_callbacks.py | 0 .../maya/plugins}/publish/validate_yeti_rig_cache_state.py | 0 .../maya/plugins}/publish/validate_yeti_rig_input_in_instance.py | 0 .../maya/plugins}/publish/validate_yeti_rig_settings.py | 0 pype/{resources/maya => hosts/maya/resources}/workspace.mel | 0 pype/{setup/maya => hosts/maya/startup}/userSetup.py | 0 180 files changed, 0 insertions(+), 0 deletions(-) rename pype/hosts/maya/{ => api}/__init__.py (100%) rename pype/hosts/maya/{ => api}/action.py (100%) rename pype/hosts/maya/{ => api}/customize.py (100%) rename pype/hosts/maya/{ => api}/expected_files.py (100%) rename pype/hosts/maya/{ => api}/lib.py (100%) rename pype/hosts/maya/{ => api}/menu.json (100%) rename pype/hosts/maya/{ => api}/menu.py (100%) rename pype/hosts/maya/{ => api}/menu_backup.json (100%) rename pype/hosts/maya/{ => api}/plugin.py (100%) rename pype/{setdress_api.py => hosts/maya/api/setdress.py} (100%) rename pype/{plugins/maya => hosts/maya/plugins}/__init__.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_animation.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_ass.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_assembly.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_camera.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_layout.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_look.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_mayaascii.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_model.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_pointcache.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_render.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_rendersetup.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_review.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_rig.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_setdress.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_unreal_staticmesh.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_vrayproxy.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_vrayscene.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_yeti_cache.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/create/create_yeti_rig.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/_load_animation.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/actions.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_ass.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_assembly.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_audio.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_gpucache.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_image_plane.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_look.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_matchmove.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_reference.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_rendersetup.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_vdb_to_redshift.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_vdb_to_vray.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_vrayproxy.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_yeti_cache.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/load/load_yeti_rig.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/__init__.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_animation.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_ass.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_assembly.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_file_dependencies.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_ftrack_family.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_history.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_instances.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_look.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_maya_units.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_maya_workspace.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_mayaascii.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_model.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_remove_marked.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_render.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_render_layer_aovs.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_renderable_camera.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_review.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_rig.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_scene.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_unreal_staticmesh.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_workscene_fps.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_yeti_cache.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/collect_yeti_rig.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/determine_future_version.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_animation.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_ass.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_assembly.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_assproxy.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_camera_alembic.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_camera_mayaScene.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_fbx.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_look.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_maya_scene_raw.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_model.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_playblast.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_pointcache.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_rendersetup.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_rig.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_thumbnail.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_vrayproxy.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_yeti_cache.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/extract_yeti_rig.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/increment_current_file_deadline.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/save_scene.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/submit_maya_muster.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_animation_content.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_animation_out_set_related_node_ids.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_ass_relative_paths.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_assembly_name.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_assembly_namespaces.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_assembly_transforms.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_attributes.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_camera_attributes.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_camera_contents.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_color_sets.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_current_renderlayer_renderable.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_frame_range.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_instance_has_members.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_instance_subset.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_instancer_content.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_instancer_frame_ranges.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_joints_hidden.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_look_contents.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_look_default_shaders_connections.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_look_id_reference_edits.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_look_members_unique.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_look_no_default_shaders.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_look_sets.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_look_shading_group.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_look_single_shader.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_maya_units.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_arnold_attributes.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_has_uv.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_lamina_faces.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_no_negative_scale.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_non_manifold.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_non_zero_edge.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_normals_unlocked.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_overlapping_uvs.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_shader_connections.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_single_uv_set.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_uv_set_map1.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_mesh_vertices_have_edges.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_model_content.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_model_name.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_muster_connection.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_no_animation.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_no_default_camera.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_no_namespace.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_no_null_transforms.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_no_unknown_nodes.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_no_vraymesh.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_node_ids.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_node_ids_deformed_shapes.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_node_ids_in_database.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_node_ids_related.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_node_ids_unique.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_node_no_ghosting.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_render_image_rule.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_render_no_default_cameras.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_render_single_camera.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_renderlayer_aovs.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_rendersettings.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_resources.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_rig_contents.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_rig_controllers.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_rig_controllers_arnold_attributes.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_rig_out_set_node_ids.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_rig_output_ids.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_scene_set_workspace.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_shader_name.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_shape_default_names.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_shape_render_stats.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_single_assembly.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_skinCluster_deformer_set.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_step_size.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_transform_naming_suffix.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_transform_zero.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_unicode_strings.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_unreal_mesh_triangulated.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_unreal_staticmesh_naming.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_unreal_up_axis.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_vray_distributed_rendering.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_vray_referenced_aovs.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_vray_translator_settings.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_vrayproxy.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_vrayproxy_members.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_yeti_renderscript_callbacks.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_yeti_rig_cache_state.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_yeti_rig_input_in_instance.py (100%) rename pype/{plugins/maya => hosts/maya/plugins}/publish/validate_yeti_rig_settings.py (100%) rename pype/{resources/maya => hosts/maya/resources}/workspace.mel (100%) rename pype/{setup/maya => hosts/maya/startup}/userSetup.py (100%) diff --git a/pype/hosts/maya/__init__.py b/pype/hosts/maya/api/__init__.py similarity index 100% rename from pype/hosts/maya/__init__.py rename to pype/hosts/maya/api/__init__.py diff --git a/pype/hosts/maya/action.py b/pype/hosts/maya/api/action.py similarity index 100% rename from pype/hosts/maya/action.py rename to pype/hosts/maya/api/action.py diff --git a/pype/hosts/maya/customize.py b/pype/hosts/maya/api/customize.py similarity index 100% rename from pype/hosts/maya/customize.py rename to pype/hosts/maya/api/customize.py diff --git a/pype/hosts/maya/expected_files.py b/pype/hosts/maya/api/expected_files.py similarity index 100% rename from pype/hosts/maya/expected_files.py rename to pype/hosts/maya/api/expected_files.py diff --git a/pype/hosts/maya/lib.py b/pype/hosts/maya/api/lib.py similarity index 100% rename from pype/hosts/maya/lib.py rename to pype/hosts/maya/api/lib.py diff --git a/pype/hosts/maya/menu.json b/pype/hosts/maya/api/menu.json similarity index 100% rename from pype/hosts/maya/menu.json rename to pype/hosts/maya/api/menu.json diff --git a/pype/hosts/maya/menu.py b/pype/hosts/maya/api/menu.py similarity index 100% rename from pype/hosts/maya/menu.py rename to pype/hosts/maya/api/menu.py diff --git a/pype/hosts/maya/menu_backup.json b/pype/hosts/maya/api/menu_backup.json similarity index 100% rename from pype/hosts/maya/menu_backup.json rename to pype/hosts/maya/api/menu_backup.json diff --git a/pype/hosts/maya/plugin.py b/pype/hosts/maya/api/plugin.py similarity index 100% rename from pype/hosts/maya/plugin.py rename to pype/hosts/maya/api/plugin.py diff --git a/pype/setdress_api.py b/pype/hosts/maya/api/setdress.py similarity index 100% rename from pype/setdress_api.py rename to pype/hosts/maya/api/setdress.py diff --git a/pype/plugins/maya/__init__.py b/pype/hosts/maya/plugins/__init__.py similarity index 100% rename from pype/plugins/maya/__init__.py rename to pype/hosts/maya/plugins/__init__.py diff --git a/pype/plugins/maya/create/create_animation.py b/pype/hosts/maya/plugins/create/create_animation.py similarity index 100% rename from pype/plugins/maya/create/create_animation.py rename to pype/hosts/maya/plugins/create/create_animation.py diff --git a/pype/plugins/maya/create/create_ass.py b/pype/hosts/maya/plugins/create/create_ass.py similarity index 100% rename from pype/plugins/maya/create/create_ass.py rename to pype/hosts/maya/plugins/create/create_ass.py diff --git a/pype/plugins/maya/create/create_assembly.py b/pype/hosts/maya/plugins/create/create_assembly.py similarity index 100% rename from pype/plugins/maya/create/create_assembly.py rename to pype/hosts/maya/plugins/create/create_assembly.py diff --git a/pype/plugins/maya/create/create_camera.py b/pype/hosts/maya/plugins/create/create_camera.py similarity index 100% rename from pype/plugins/maya/create/create_camera.py rename to pype/hosts/maya/plugins/create/create_camera.py diff --git a/pype/plugins/maya/create/create_layout.py b/pype/hosts/maya/plugins/create/create_layout.py similarity index 100% rename from pype/plugins/maya/create/create_layout.py rename to pype/hosts/maya/plugins/create/create_layout.py diff --git a/pype/plugins/maya/create/create_look.py b/pype/hosts/maya/plugins/create/create_look.py similarity index 100% rename from pype/plugins/maya/create/create_look.py rename to pype/hosts/maya/plugins/create/create_look.py diff --git a/pype/plugins/maya/create/create_mayaascii.py b/pype/hosts/maya/plugins/create/create_mayaascii.py similarity index 100% rename from pype/plugins/maya/create/create_mayaascii.py rename to pype/hosts/maya/plugins/create/create_mayaascii.py diff --git a/pype/plugins/maya/create/create_model.py b/pype/hosts/maya/plugins/create/create_model.py similarity index 100% rename from pype/plugins/maya/create/create_model.py rename to pype/hosts/maya/plugins/create/create_model.py diff --git a/pype/plugins/maya/create/create_pointcache.py b/pype/hosts/maya/plugins/create/create_pointcache.py similarity index 100% rename from pype/plugins/maya/create/create_pointcache.py rename to pype/hosts/maya/plugins/create/create_pointcache.py diff --git a/pype/plugins/maya/create/create_render.py b/pype/hosts/maya/plugins/create/create_render.py similarity index 100% rename from pype/plugins/maya/create/create_render.py rename to pype/hosts/maya/plugins/create/create_render.py diff --git a/pype/plugins/maya/create/create_rendersetup.py b/pype/hosts/maya/plugins/create/create_rendersetup.py similarity index 100% rename from pype/plugins/maya/create/create_rendersetup.py rename to pype/hosts/maya/plugins/create/create_rendersetup.py diff --git a/pype/plugins/maya/create/create_review.py b/pype/hosts/maya/plugins/create/create_review.py similarity index 100% rename from pype/plugins/maya/create/create_review.py rename to pype/hosts/maya/plugins/create/create_review.py diff --git a/pype/plugins/maya/create/create_rig.py b/pype/hosts/maya/plugins/create/create_rig.py similarity index 100% rename from pype/plugins/maya/create/create_rig.py rename to pype/hosts/maya/plugins/create/create_rig.py diff --git a/pype/plugins/maya/create/create_setdress.py b/pype/hosts/maya/plugins/create/create_setdress.py similarity index 100% rename from pype/plugins/maya/create/create_setdress.py rename to pype/hosts/maya/plugins/create/create_setdress.py diff --git a/pype/plugins/maya/create/create_unreal_staticmesh.py b/pype/hosts/maya/plugins/create/create_unreal_staticmesh.py similarity index 100% rename from pype/plugins/maya/create/create_unreal_staticmesh.py rename to pype/hosts/maya/plugins/create/create_unreal_staticmesh.py diff --git a/pype/plugins/maya/create/create_vrayproxy.py b/pype/hosts/maya/plugins/create/create_vrayproxy.py similarity index 100% rename from pype/plugins/maya/create/create_vrayproxy.py rename to pype/hosts/maya/plugins/create/create_vrayproxy.py diff --git a/pype/plugins/maya/create/create_vrayscene.py b/pype/hosts/maya/plugins/create/create_vrayscene.py similarity index 100% rename from pype/plugins/maya/create/create_vrayscene.py rename to pype/hosts/maya/plugins/create/create_vrayscene.py diff --git a/pype/plugins/maya/create/create_yeti_cache.py b/pype/hosts/maya/plugins/create/create_yeti_cache.py similarity index 100% rename from pype/plugins/maya/create/create_yeti_cache.py rename to pype/hosts/maya/plugins/create/create_yeti_cache.py diff --git a/pype/plugins/maya/create/create_yeti_rig.py b/pype/hosts/maya/plugins/create/create_yeti_rig.py similarity index 100% rename from pype/plugins/maya/create/create_yeti_rig.py rename to pype/hosts/maya/plugins/create/create_yeti_rig.py diff --git a/pype/plugins/maya/load/_load_animation.py b/pype/hosts/maya/plugins/load/_load_animation.py similarity index 100% rename from pype/plugins/maya/load/_load_animation.py rename to pype/hosts/maya/plugins/load/_load_animation.py diff --git a/pype/plugins/maya/load/actions.py b/pype/hosts/maya/plugins/load/actions.py similarity index 100% rename from pype/plugins/maya/load/actions.py rename to pype/hosts/maya/plugins/load/actions.py diff --git a/pype/plugins/maya/load/load_ass.py b/pype/hosts/maya/plugins/load/load_ass.py similarity index 100% rename from pype/plugins/maya/load/load_ass.py rename to pype/hosts/maya/plugins/load/load_ass.py diff --git a/pype/plugins/maya/load/load_assembly.py b/pype/hosts/maya/plugins/load/load_assembly.py similarity index 100% rename from pype/plugins/maya/load/load_assembly.py rename to pype/hosts/maya/plugins/load/load_assembly.py diff --git a/pype/plugins/maya/load/load_audio.py b/pype/hosts/maya/plugins/load/load_audio.py similarity index 100% rename from pype/plugins/maya/load/load_audio.py rename to pype/hosts/maya/plugins/load/load_audio.py diff --git a/pype/plugins/maya/load/load_gpucache.py b/pype/hosts/maya/plugins/load/load_gpucache.py similarity index 100% rename from pype/plugins/maya/load/load_gpucache.py rename to pype/hosts/maya/plugins/load/load_gpucache.py diff --git a/pype/plugins/maya/load/load_image_plane.py b/pype/hosts/maya/plugins/load/load_image_plane.py similarity index 100% rename from pype/plugins/maya/load/load_image_plane.py rename to pype/hosts/maya/plugins/load/load_image_plane.py diff --git a/pype/plugins/maya/load/load_look.py b/pype/hosts/maya/plugins/load/load_look.py similarity index 100% rename from pype/plugins/maya/load/load_look.py rename to pype/hosts/maya/plugins/load/load_look.py diff --git a/pype/plugins/maya/load/load_matchmove.py b/pype/hosts/maya/plugins/load/load_matchmove.py similarity index 100% rename from pype/plugins/maya/load/load_matchmove.py rename to pype/hosts/maya/plugins/load/load_matchmove.py diff --git a/pype/plugins/maya/load/load_reference.py b/pype/hosts/maya/plugins/load/load_reference.py similarity index 100% rename from pype/plugins/maya/load/load_reference.py rename to pype/hosts/maya/plugins/load/load_reference.py diff --git a/pype/plugins/maya/load/load_rendersetup.py b/pype/hosts/maya/plugins/load/load_rendersetup.py similarity index 100% rename from pype/plugins/maya/load/load_rendersetup.py rename to pype/hosts/maya/plugins/load/load_rendersetup.py diff --git a/pype/plugins/maya/load/load_vdb_to_redshift.py b/pype/hosts/maya/plugins/load/load_vdb_to_redshift.py similarity index 100% rename from pype/plugins/maya/load/load_vdb_to_redshift.py rename to pype/hosts/maya/plugins/load/load_vdb_to_redshift.py diff --git a/pype/plugins/maya/load/load_vdb_to_vray.py b/pype/hosts/maya/plugins/load/load_vdb_to_vray.py similarity index 100% rename from pype/plugins/maya/load/load_vdb_to_vray.py rename to pype/hosts/maya/plugins/load/load_vdb_to_vray.py diff --git a/pype/plugins/maya/load/load_vrayproxy.py b/pype/hosts/maya/plugins/load/load_vrayproxy.py similarity index 100% rename from pype/plugins/maya/load/load_vrayproxy.py rename to pype/hosts/maya/plugins/load/load_vrayproxy.py diff --git a/pype/plugins/maya/load/load_yeti_cache.py b/pype/hosts/maya/plugins/load/load_yeti_cache.py similarity index 100% rename from pype/plugins/maya/load/load_yeti_cache.py rename to pype/hosts/maya/plugins/load/load_yeti_cache.py diff --git a/pype/plugins/maya/load/load_yeti_rig.py b/pype/hosts/maya/plugins/load/load_yeti_rig.py similarity index 100% rename from pype/plugins/maya/load/load_yeti_rig.py rename to pype/hosts/maya/plugins/load/load_yeti_rig.py diff --git a/pype/plugins/maya/publish/__init__.py b/pype/hosts/maya/plugins/publish/__init__.py similarity index 100% rename from pype/plugins/maya/publish/__init__.py rename to pype/hosts/maya/plugins/publish/__init__.py diff --git a/pype/plugins/maya/publish/collect_animation.py b/pype/hosts/maya/plugins/publish/collect_animation.py similarity index 100% rename from pype/plugins/maya/publish/collect_animation.py rename to pype/hosts/maya/plugins/publish/collect_animation.py diff --git a/pype/plugins/maya/publish/collect_ass.py b/pype/hosts/maya/plugins/publish/collect_ass.py similarity index 100% rename from pype/plugins/maya/publish/collect_ass.py rename to pype/hosts/maya/plugins/publish/collect_ass.py diff --git a/pype/plugins/maya/publish/collect_assembly.py b/pype/hosts/maya/plugins/publish/collect_assembly.py similarity index 100% rename from pype/plugins/maya/publish/collect_assembly.py rename to pype/hosts/maya/plugins/publish/collect_assembly.py diff --git a/pype/plugins/maya/publish/collect_file_dependencies.py b/pype/hosts/maya/plugins/publish/collect_file_dependencies.py similarity index 100% rename from pype/plugins/maya/publish/collect_file_dependencies.py rename to pype/hosts/maya/plugins/publish/collect_file_dependencies.py diff --git a/pype/plugins/maya/publish/collect_ftrack_family.py b/pype/hosts/maya/plugins/publish/collect_ftrack_family.py similarity index 100% rename from pype/plugins/maya/publish/collect_ftrack_family.py rename to pype/hosts/maya/plugins/publish/collect_ftrack_family.py diff --git a/pype/plugins/maya/publish/collect_history.py b/pype/hosts/maya/plugins/publish/collect_history.py similarity index 100% rename from pype/plugins/maya/publish/collect_history.py rename to pype/hosts/maya/plugins/publish/collect_history.py diff --git a/pype/plugins/maya/publish/collect_instances.py b/pype/hosts/maya/plugins/publish/collect_instances.py similarity index 100% rename from pype/plugins/maya/publish/collect_instances.py rename to pype/hosts/maya/plugins/publish/collect_instances.py diff --git a/pype/plugins/maya/publish/collect_look.py b/pype/hosts/maya/plugins/publish/collect_look.py similarity index 100% rename from pype/plugins/maya/publish/collect_look.py rename to pype/hosts/maya/plugins/publish/collect_look.py diff --git a/pype/plugins/maya/publish/collect_maya_units.py b/pype/hosts/maya/plugins/publish/collect_maya_units.py similarity index 100% rename from pype/plugins/maya/publish/collect_maya_units.py rename to pype/hosts/maya/plugins/publish/collect_maya_units.py diff --git a/pype/plugins/maya/publish/collect_maya_workspace.py b/pype/hosts/maya/plugins/publish/collect_maya_workspace.py similarity index 100% rename from pype/plugins/maya/publish/collect_maya_workspace.py rename to pype/hosts/maya/plugins/publish/collect_maya_workspace.py diff --git a/pype/plugins/maya/publish/collect_mayaascii.py b/pype/hosts/maya/plugins/publish/collect_mayaascii.py similarity index 100% rename from pype/plugins/maya/publish/collect_mayaascii.py rename to pype/hosts/maya/plugins/publish/collect_mayaascii.py diff --git a/pype/plugins/maya/publish/collect_model.py b/pype/hosts/maya/plugins/publish/collect_model.py similarity index 100% rename from pype/plugins/maya/publish/collect_model.py rename to pype/hosts/maya/plugins/publish/collect_model.py diff --git a/pype/plugins/maya/publish/collect_remove_marked.py b/pype/hosts/maya/plugins/publish/collect_remove_marked.py similarity index 100% rename from pype/plugins/maya/publish/collect_remove_marked.py rename to pype/hosts/maya/plugins/publish/collect_remove_marked.py diff --git a/pype/plugins/maya/publish/collect_render.py b/pype/hosts/maya/plugins/publish/collect_render.py similarity index 100% rename from pype/plugins/maya/publish/collect_render.py rename to pype/hosts/maya/plugins/publish/collect_render.py diff --git a/pype/plugins/maya/publish/collect_render_layer_aovs.py b/pype/hosts/maya/plugins/publish/collect_render_layer_aovs.py similarity index 100% rename from pype/plugins/maya/publish/collect_render_layer_aovs.py rename to pype/hosts/maya/plugins/publish/collect_render_layer_aovs.py diff --git a/pype/plugins/maya/publish/collect_renderable_camera.py b/pype/hosts/maya/plugins/publish/collect_renderable_camera.py similarity index 100% rename from pype/plugins/maya/publish/collect_renderable_camera.py rename to pype/hosts/maya/plugins/publish/collect_renderable_camera.py diff --git a/pype/plugins/maya/publish/collect_review.py b/pype/hosts/maya/plugins/publish/collect_review.py similarity index 100% rename from pype/plugins/maya/publish/collect_review.py rename to pype/hosts/maya/plugins/publish/collect_review.py diff --git a/pype/plugins/maya/publish/collect_rig.py b/pype/hosts/maya/plugins/publish/collect_rig.py similarity index 100% rename from pype/plugins/maya/publish/collect_rig.py rename to pype/hosts/maya/plugins/publish/collect_rig.py diff --git a/pype/plugins/maya/publish/collect_scene.py b/pype/hosts/maya/plugins/publish/collect_scene.py similarity index 100% rename from pype/plugins/maya/publish/collect_scene.py rename to pype/hosts/maya/plugins/publish/collect_scene.py diff --git a/pype/plugins/maya/publish/collect_unreal_staticmesh.py b/pype/hosts/maya/plugins/publish/collect_unreal_staticmesh.py similarity index 100% rename from pype/plugins/maya/publish/collect_unreal_staticmesh.py rename to pype/hosts/maya/plugins/publish/collect_unreal_staticmesh.py diff --git a/pype/plugins/maya/publish/collect_workscene_fps.py b/pype/hosts/maya/plugins/publish/collect_workscene_fps.py similarity index 100% rename from pype/plugins/maya/publish/collect_workscene_fps.py rename to pype/hosts/maya/plugins/publish/collect_workscene_fps.py diff --git a/pype/plugins/maya/publish/collect_yeti_cache.py b/pype/hosts/maya/plugins/publish/collect_yeti_cache.py similarity index 100% rename from pype/plugins/maya/publish/collect_yeti_cache.py rename to pype/hosts/maya/plugins/publish/collect_yeti_cache.py diff --git a/pype/plugins/maya/publish/collect_yeti_rig.py b/pype/hosts/maya/plugins/publish/collect_yeti_rig.py similarity index 100% rename from pype/plugins/maya/publish/collect_yeti_rig.py rename to pype/hosts/maya/plugins/publish/collect_yeti_rig.py diff --git a/pype/plugins/maya/publish/determine_future_version.py b/pype/hosts/maya/plugins/publish/determine_future_version.py similarity index 100% rename from pype/plugins/maya/publish/determine_future_version.py rename to pype/hosts/maya/plugins/publish/determine_future_version.py diff --git a/pype/plugins/maya/publish/extract_animation.py b/pype/hosts/maya/plugins/publish/extract_animation.py similarity index 100% rename from pype/plugins/maya/publish/extract_animation.py rename to pype/hosts/maya/plugins/publish/extract_animation.py diff --git a/pype/plugins/maya/publish/extract_ass.py b/pype/hosts/maya/plugins/publish/extract_ass.py similarity index 100% rename from pype/plugins/maya/publish/extract_ass.py rename to pype/hosts/maya/plugins/publish/extract_ass.py diff --git a/pype/plugins/maya/publish/extract_assembly.py b/pype/hosts/maya/plugins/publish/extract_assembly.py similarity index 100% rename from pype/plugins/maya/publish/extract_assembly.py rename to pype/hosts/maya/plugins/publish/extract_assembly.py diff --git a/pype/plugins/maya/publish/extract_assproxy.py b/pype/hosts/maya/plugins/publish/extract_assproxy.py similarity index 100% rename from pype/plugins/maya/publish/extract_assproxy.py rename to pype/hosts/maya/plugins/publish/extract_assproxy.py diff --git a/pype/plugins/maya/publish/extract_camera_alembic.py b/pype/hosts/maya/plugins/publish/extract_camera_alembic.py similarity index 100% rename from pype/plugins/maya/publish/extract_camera_alembic.py rename to pype/hosts/maya/plugins/publish/extract_camera_alembic.py diff --git a/pype/plugins/maya/publish/extract_camera_mayaScene.py b/pype/hosts/maya/plugins/publish/extract_camera_mayaScene.py similarity index 100% rename from pype/plugins/maya/publish/extract_camera_mayaScene.py rename to pype/hosts/maya/plugins/publish/extract_camera_mayaScene.py diff --git a/pype/plugins/maya/publish/extract_fbx.py b/pype/hosts/maya/plugins/publish/extract_fbx.py similarity index 100% rename from pype/plugins/maya/publish/extract_fbx.py rename to pype/hosts/maya/plugins/publish/extract_fbx.py diff --git a/pype/plugins/maya/publish/extract_look.py b/pype/hosts/maya/plugins/publish/extract_look.py similarity index 100% rename from pype/plugins/maya/publish/extract_look.py rename to pype/hosts/maya/plugins/publish/extract_look.py diff --git a/pype/plugins/maya/publish/extract_maya_scene_raw.py b/pype/hosts/maya/plugins/publish/extract_maya_scene_raw.py similarity index 100% rename from pype/plugins/maya/publish/extract_maya_scene_raw.py rename to pype/hosts/maya/plugins/publish/extract_maya_scene_raw.py diff --git a/pype/plugins/maya/publish/extract_model.py b/pype/hosts/maya/plugins/publish/extract_model.py similarity index 100% rename from pype/plugins/maya/publish/extract_model.py rename to pype/hosts/maya/plugins/publish/extract_model.py diff --git a/pype/plugins/maya/publish/extract_playblast.py b/pype/hosts/maya/plugins/publish/extract_playblast.py similarity index 100% rename from pype/plugins/maya/publish/extract_playblast.py rename to pype/hosts/maya/plugins/publish/extract_playblast.py diff --git a/pype/plugins/maya/publish/extract_pointcache.py b/pype/hosts/maya/plugins/publish/extract_pointcache.py similarity index 100% rename from pype/plugins/maya/publish/extract_pointcache.py rename to pype/hosts/maya/plugins/publish/extract_pointcache.py diff --git a/pype/plugins/maya/publish/extract_rendersetup.py b/pype/hosts/maya/plugins/publish/extract_rendersetup.py similarity index 100% rename from pype/plugins/maya/publish/extract_rendersetup.py rename to pype/hosts/maya/plugins/publish/extract_rendersetup.py diff --git a/pype/plugins/maya/publish/extract_rig.py b/pype/hosts/maya/plugins/publish/extract_rig.py similarity index 100% rename from pype/plugins/maya/publish/extract_rig.py rename to pype/hosts/maya/plugins/publish/extract_rig.py diff --git a/pype/plugins/maya/publish/extract_thumbnail.py b/pype/hosts/maya/plugins/publish/extract_thumbnail.py similarity index 100% rename from pype/plugins/maya/publish/extract_thumbnail.py rename to pype/hosts/maya/plugins/publish/extract_thumbnail.py diff --git a/pype/plugins/maya/publish/extract_vrayproxy.py b/pype/hosts/maya/plugins/publish/extract_vrayproxy.py similarity index 100% rename from pype/plugins/maya/publish/extract_vrayproxy.py rename to pype/hosts/maya/plugins/publish/extract_vrayproxy.py diff --git a/pype/plugins/maya/publish/extract_yeti_cache.py b/pype/hosts/maya/plugins/publish/extract_yeti_cache.py similarity index 100% rename from pype/plugins/maya/publish/extract_yeti_cache.py rename to pype/hosts/maya/plugins/publish/extract_yeti_cache.py diff --git a/pype/plugins/maya/publish/extract_yeti_rig.py b/pype/hosts/maya/plugins/publish/extract_yeti_rig.py similarity index 100% rename from pype/plugins/maya/publish/extract_yeti_rig.py rename to pype/hosts/maya/plugins/publish/extract_yeti_rig.py diff --git a/pype/plugins/maya/publish/increment_current_file_deadline.py b/pype/hosts/maya/plugins/publish/increment_current_file_deadline.py similarity index 100% rename from pype/plugins/maya/publish/increment_current_file_deadline.py rename to pype/hosts/maya/plugins/publish/increment_current_file_deadline.py diff --git a/pype/plugins/maya/publish/save_scene.py b/pype/hosts/maya/plugins/publish/save_scene.py similarity index 100% rename from pype/plugins/maya/publish/save_scene.py rename to pype/hosts/maya/plugins/publish/save_scene.py diff --git a/pype/plugins/maya/publish/submit_maya_muster.py b/pype/hosts/maya/plugins/publish/submit_maya_muster.py similarity index 100% rename from pype/plugins/maya/publish/submit_maya_muster.py rename to pype/hosts/maya/plugins/publish/submit_maya_muster.py diff --git a/pype/plugins/maya/publish/validate_animation_content.py b/pype/hosts/maya/plugins/publish/validate_animation_content.py similarity index 100% rename from pype/plugins/maya/publish/validate_animation_content.py rename to pype/hosts/maya/plugins/publish/validate_animation_content.py diff --git a/pype/plugins/maya/publish/validate_animation_out_set_related_node_ids.py b/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py similarity index 100% rename from pype/plugins/maya/publish/validate_animation_out_set_related_node_ids.py rename to pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py diff --git a/pype/plugins/maya/publish/validate_ass_relative_paths.py b/pype/hosts/maya/plugins/publish/validate_ass_relative_paths.py similarity index 100% rename from pype/plugins/maya/publish/validate_ass_relative_paths.py rename to pype/hosts/maya/plugins/publish/validate_ass_relative_paths.py diff --git a/pype/plugins/maya/publish/validate_assembly_name.py b/pype/hosts/maya/plugins/publish/validate_assembly_name.py similarity index 100% rename from pype/plugins/maya/publish/validate_assembly_name.py rename to pype/hosts/maya/plugins/publish/validate_assembly_name.py diff --git a/pype/plugins/maya/publish/validate_assembly_namespaces.py b/pype/hosts/maya/plugins/publish/validate_assembly_namespaces.py similarity index 100% rename from pype/plugins/maya/publish/validate_assembly_namespaces.py rename to pype/hosts/maya/plugins/publish/validate_assembly_namespaces.py diff --git a/pype/plugins/maya/publish/validate_assembly_transforms.py b/pype/hosts/maya/plugins/publish/validate_assembly_transforms.py similarity index 100% rename from pype/plugins/maya/publish/validate_assembly_transforms.py rename to pype/hosts/maya/plugins/publish/validate_assembly_transforms.py diff --git a/pype/plugins/maya/publish/validate_attributes.py b/pype/hosts/maya/plugins/publish/validate_attributes.py similarity index 100% rename from pype/plugins/maya/publish/validate_attributes.py rename to pype/hosts/maya/plugins/publish/validate_attributes.py diff --git a/pype/plugins/maya/publish/validate_camera_attributes.py b/pype/hosts/maya/plugins/publish/validate_camera_attributes.py similarity index 100% rename from pype/plugins/maya/publish/validate_camera_attributes.py rename to pype/hosts/maya/plugins/publish/validate_camera_attributes.py diff --git a/pype/plugins/maya/publish/validate_camera_contents.py b/pype/hosts/maya/plugins/publish/validate_camera_contents.py similarity index 100% rename from pype/plugins/maya/publish/validate_camera_contents.py rename to pype/hosts/maya/plugins/publish/validate_camera_contents.py diff --git a/pype/plugins/maya/publish/validate_color_sets.py b/pype/hosts/maya/plugins/publish/validate_color_sets.py similarity index 100% rename from pype/plugins/maya/publish/validate_color_sets.py rename to pype/hosts/maya/plugins/publish/validate_color_sets.py diff --git a/pype/plugins/maya/publish/validate_current_renderlayer_renderable.py b/pype/hosts/maya/plugins/publish/validate_current_renderlayer_renderable.py similarity index 100% rename from pype/plugins/maya/publish/validate_current_renderlayer_renderable.py rename to pype/hosts/maya/plugins/publish/validate_current_renderlayer_renderable.py diff --git a/pype/plugins/maya/publish/validate_frame_range.py b/pype/hosts/maya/plugins/publish/validate_frame_range.py similarity index 100% rename from pype/plugins/maya/publish/validate_frame_range.py rename to pype/hosts/maya/plugins/publish/validate_frame_range.py diff --git a/pype/plugins/maya/publish/validate_instance_has_members.py b/pype/hosts/maya/plugins/publish/validate_instance_has_members.py similarity index 100% rename from pype/plugins/maya/publish/validate_instance_has_members.py rename to pype/hosts/maya/plugins/publish/validate_instance_has_members.py diff --git a/pype/plugins/maya/publish/validate_instance_subset.py b/pype/hosts/maya/plugins/publish/validate_instance_subset.py similarity index 100% rename from pype/plugins/maya/publish/validate_instance_subset.py rename to pype/hosts/maya/plugins/publish/validate_instance_subset.py diff --git a/pype/plugins/maya/publish/validate_instancer_content.py b/pype/hosts/maya/plugins/publish/validate_instancer_content.py similarity index 100% rename from pype/plugins/maya/publish/validate_instancer_content.py rename to pype/hosts/maya/plugins/publish/validate_instancer_content.py diff --git a/pype/plugins/maya/publish/validate_instancer_frame_ranges.py b/pype/hosts/maya/plugins/publish/validate_instancer_frame_ranges.py similarity index 100% rename from pype/plugins/maya/publish/validate_instancer_frame_ranges.py rename to pype/hosts/maya/plugins/publish/validate_instancer_frame_ranges.py diff --git a/pype/plugins/maya/publish/validate_joints_hidden.py b/pype/hosts/maya/plugins/publish/validate_joints_hidden.py similarity index 100% rename from pype/plugins/maya/publish/validate_joints_hidden.py rename to pype/hosts/maya/plugins/publish/validate_joints_hidden.py diff --git a/pype/plugins/maya/publish/validate_look_contents.py b/pype/hosts/maya/plugins/publish/validate_look_contents.py similarity index 100% rename from pype/plugins/maya/publish/validate_look_contents.py rename to pype/hosts/maya/plugins/publish/validate_look_contents.py diff --git a/pype/plugins/maya/publish/validate_look_default_shaders_connections.py b/pype/hosts/maya/plugins/publish/validate_look_default_shaders_connections.py similarity index 100% rename from pype/plugins/maya/publish/validate_look_default_shaders_connections.py rename to pype/hosts/maya/plugins/publish/validate_look_default_shaders_connections.py diff --git a/pype/plugins/maya/publish/validate_look_id_reference_edits.py b/pype/hosts/maya/plugins/publish/validate_look_id_reference_edits.py similarity index 100% rename from pype/plugins/maya/publish/validate_look_id_reference_edits.py rename to pype/hosts/maya/plugins/publish/validate_look_id_reference_edits.py diff --git a/pype/plugins/maya/publish/validate_look_members_unique.py b/pype/hosts/maya/plugins/publish/validate_look_members_unique.py similarity index 100% rename from pype/plugins/maya/publish/validate_look_members_unique.py rename to pype/hosts/maya/plugins/publish/validate_look_members_unique.py diff --git a/pype/plugins/maya/publish/validate_look_no_default_shaders.py b/pype/hosts/maya/plugins/publish/validate_look_no_default_shaders.py similarity index 100% rename from pype/plugins/maya/publish/validate_look_no_default_shaders.py rename to pype/hosts/maya/plugins/publish/validate_look_no_default_shaders.py diff --git a/pype/plugins/maya/publish/validate_look_sets.py b/pype/hosts/maya/plugins/publish/validate_look_sets.py similarity index 100% rename from pype/plugins/maya/publish/validate_look_sets.py rename to pype/hosts/maya/plugins/publish/validate_look_sets.py diff --git a/pype/plugins/maya/publish/validate_look_shading_group.py b/pype/hosts/maya/plugins/publish/validate_look_shading_group.py similarity index 100% rename from pype/plugins/maya/publish/validate_look_shading_group.py rename to pype/hosts/maya/plugins/publish/validate_look_shading_group.py diff --git a/pype/plugins/maya/publish/validate_look_single_shader.py b/pype/hosts/maya/plugins/publish/validate_look_single_shader.py similarity index 100% rename from pype/plugins/maya/publish/validate_look_single_shader.py rename to pype/hosts/maya/plugins/publish/validate_look_single_shader.py diff --git a/pype/plugins/maya/publish/validate_maya_units.py b/pype/hosts/maya/plugins/publish/validate_maya_units.py similarity index 100% rename from pype/plugins/maya/publish/validate_maya_units.py rename to pype/hosts/maya/plugins/publish/validate_maya_units.py diff --git a/pype/plugins/maya/publish/validate_mesh_arnold_attributes.py b/pype/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_arnold_attributes.py rename to pype/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py diff --git a/pype/plugins/maya/publish/validate_mesh_has_uv.py b/pype/hosts/maya/plugins/publish/validate_mesh_has_uv.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_has_uv.py rename to pype/hosts/maya/plugins/publish/validate_mesh_has_uv.py diff --git a/pype/plugins/maya/publish/validate_mesh_lamina_faces.py b/pype/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_lamina_faces.py rename to pype/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py diff --git a/pype/plugins/maya/publish/validate_mesh_no_negative_scale.py b/pype/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_no_negative_scale.py rename to pype/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py diff --git a/pype/plugins/maya/publish/validate_mesh_non_manifold.py b/pype/hosts/maya/plugins/publish/validate_mesh_non_manifold.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_non_manifold.py rename to pype/hosts/maya/plugins/publish/validate_mesh_non_manifold.py diff --git a/pype/plugins/maya/publish/validate_mesh_non_zero_edge.py b/pype/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_non_zero_edge.py rename to pype/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py diff --git a/pype/plugins/maya/publish/validate_mesh_normals_unlocked.py b/pype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_normals_unlocked.py rename to pype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py diff --git a/pype/plugins/maya/publish/validate_mesh_overlapping_uvs.py b/pype/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_overlapping_uvs.py rename to pype/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py diff --git a/pype/plugins/maya/publish/validate_mesh_shader_connections.py b/pype/hosts/maya/plugins/publish/validate_mesh_shader_connections.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_shader_connections.py rename to pype/hosts/maya/plugins/publish/validate_mesh_shader_connections.py diff --git a/pype/plugins/maya/publish/validate_mesh_single_uv_set.py b/pype/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_single_uv_set.py rename to pype/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py diff --git a/pype/plugins/maya/publish/validate_mesh_uv_set_map1.py b/pype/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_uv_set_map1.py rename to pype/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py diff --git a/pype/plugins/maya/publish/validate_mesh_vertices_have_edges.py b/pype/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py similarity index 100% rename from pype/plugins/maya/publish/validate_mesh_vertices_have_edges.py rename to pype/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py diff --git a/pype/plugins/maya/publish/validate_model_content.py b/pype/hosts/maya/plugins/publish/validate_model_content.py similarity index 100% rename from pype/plugins/maya/publish/validate_model_content.py rename to pype/hosts/maya/plugins/publish/validate_model_content.py diff --git a/pype/plugins/maya/publish/validate_model_name.py b/pype/hosts/maya/plugins/publish/validate_model_name.py similarity index 100% rename from pype/plugins/maya/publish/validate_model_name.py rename to pype/hosts/maya/plugins/publish/validate_model_name.py diff --git a/pype/plugins/maya/publish/validate_muster_connection.py b/pype/hosts/maya/plugins/publish/validate_muster_connection.py similarity index 100% rename from pype/plugins/maya/publish/validate_muster_connection.py rename to pype/hosts/maya/plugins/publish/validate_muster_connection.py diff --git a/pype/plugins/maya/publish/validate_no_animation.py b/pype/hosts/maya/plugins/publish/validate_no_animation.py similarity index 100% rename from pype/plugins/maya/publish/validate_no_animation.py rename to pype/hosts/maya/plugins/publish/validate_no_animation.py diff --git a/pype/plugins/maya/publish/validate_no_default_camera.py b/pype/hosts/maya/plugins/publish/validate_no_default_camera.py similarity index 100% rename from pype/plugins/maya/publish/validate_no_default_camera.py rename to pype/hosts/maya/plugins/publish/validate_no_default_camera.py diff --git a/pype/plugins/maya/publish/validate_no_namespace.py b/pype/hosts/maya/plugins/publish/validate_no_namespace.py similarity index 100% rename from pype/plugins/maya/publish/validate_no_namespace.py rename to pype/hosts/maya/plugins/publish/validate_no_namespace.py diff --git a/pype/plugins/maya/publish/validate_no_null_transforms.py b/pype/hosts/maya/plugins/publish/validate_no_null_transforms.py similarity index 100% rename from pype/plugins/maya/publish/validate_no_null_transforms.py rename to pype/hosts/maya/plugins/publish/validate_no_null_transforms.py diff --git a/pype/plugins/maya/publish/validate_no_unknown_nodes.py b/pype/hosts/maya/plugins/publish/validate_no_unknown_nodes.py similarity index 100% rename from pype/plugins/maya/publish/validate_no_unknown_nodes.py rename to pype/hosts/maya/plugins/publish/validate_no_unknown_nodes.py diff --git a/pype/plugins/maya/publish/validate_no_vraymesh.py b/pype/hosts/maya/plugins/publish/validate_no_vraymesh.py similarity index 100% rename from pype/plugins/maya/publish/validate_no_vraymesh.py rename to pype/hosts/maya/plugins/publish/validate_no_vraymesh.py diff --git a/pype/plugins/maya/publish/validate_node_ids.py b/pype/hosts/maya/plugins/publish/validate_node_ids.py similarity index 100% rename from pype/plugins/maya/publish/validate_node_ids.py rename to pype/hosts/maya/plugins/publish/validate_node_ids.py diff --git a/pype/plugins/maya/publish/validate_node_ids_deformed_shapes.py b/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py similarity index 100% rename from pype/plugins/maya/publish/validate_node_ids_deformed_shapes.py rename to pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py diff --git a/pype/plugins/maya/publish/validate_node_ids_in_database.py b/pype/hosts/maya/plugins/publish/validate_node_ids_in_database.py similarity index 100% rename from pype/plugins/maya/publish/validate_node_ids_in_database.py rename to pype/hosts/maya/plugins/publish/validate_node_ids_in_database.py diff --git a/pype/plugins/maya/publish/validate_node_ids_related.py b/pype/hosts/maya/plugins/publish/validate_node_ids_related.py similarity index 100% rename from pype/plugins/maya/publish/validate_node_ids_related.py rename to pype/hosts/maya/plugins/publish/validate_node_ids_related.py diff --git a/pype/plugins/maya/publish/validate_node_ids_unique.py b/pype/hosts/maya/plugins/publish/validate_node_ids_unique.py similarity index 100% rename from pype/plugins/maya/publish/validate_node_ids_unique.py rename to pype/hosts/maya/plugins/publish/validate_node_ids_unique.py diff --git a/pype/plugins/maya/publish/validate_node_no_ghosting.py b/pype/hosts/maya/plugins/publish/validate_node_no_ghosting.py similarity index 100% rename from pype/plugins/maya/publish/validate_node_no_ghosting.py rename to pype/hosts/maya/plugins/publish/validate_node_no_ghosting.py diff --git a/pype/plugins/maya/publish/validate_render_image_rule.py b/pype/hosts/maya/plugins/publish/validate_render_image_rule.py similarity index 100% rename from pype/plugins/maya/publish/validate_render_image_rule.py rename to pype/hosts/maya/plugins/publish/validate_render_image_rule.py diff --git a/pype/plugins/maya/publish/validate_render_no_default_cameras.py b/pype/hosts/maya/plugins/publish/validate_render_no_default_cameras.py similarity index 100% rename from pype/plugins/maya/publish/validate_render_no_default_cameras.py rename to pype/hosts/maya/plugins/publish/validate_render_no_default_cameras.py diff --git a/pype/plugins/maya/publish/validate_render_single_camera.py b/pype/hosts/maya/plugins/publish/validate_render_single_camera.py similarity index 100% rename from pype/plugins/maya/publish/validate_render_single_camera.py rename to pype/hosts/maya/plugins/publish/validate_render_single_camera.py diff --git a/pype/plugins/maya/publish/validate_renderlayer_aovs.py b/pype/hosts/maya/plugins/publish/validate_renderlayer_aovs.py similarity index 100% rename from pype/plugins/maya/publish/validate_renderlayer_aovs.py rename to pype/hosts/maya/plugins/publish/validate_renderlayer_aovs.py diff --git a/pype/plugins/maya/publish/validate_rendersettings.py b/pype/hosts/maya/plugins/publish/validate_rendersettings.py similarity index 100% rename from pype/plugins/maya/publish/validate_rendersettings.py rename to pype/hosts/maya/plugins/publish/validate_rendersettings.py diff --git a/pype/plugins/maya/publish/validate_resources.py b/pype/hosts/maya/plugins/publish/validate_resources.py similarity index 100% rename from pype/plugins/maya/publish/validate_resources.py rename to pype/hosts/maya/plugins/publish/validate_resources.py diff --git a/pype/plugins/maya/publish/validate_rig_contents.py b/pype/hosts/maya/plugins/publish/validate_rig_contents.py similarity index 100% rename from pype/plugins/maya/publish/validate_rig_contents.py rename to pype/hosts/maya/plugins/publish/validate_rig_contents.py diff --git a/pype/plugins/maya/publish/validate_rig_controllers.py b/pype/hosts/maya/plugins/publish/validate_rig_controllers.py similarity index 100% rename from pype/plugins/maya/publish/validate_rig_controllers.py rename to pype/hosts/maya/plugins/publish/validate_rig_controllers.py diff --git a/pype/plugins/maya/publish/validate_rig_controllers_arnold_attributes.py b/pype/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py similarity index 100% rename from pype/plugins/maya/publish/validate_rig_controllers_arnold_attributes.py rename to pype/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py diff --git a/pype/plugins/maya/publish/validate_rig_out_set_node_ids.py b/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py similarity index 100% rename from pype/plugins/maya/publish/validate_rig_out_set_node_ids.py rename to pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py diff --git a/pype/plugins/maya/publish/validate_rig_output_ids.py b/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py similarity index 100% rename from pype/plugins/maya/publish/validate_rig_output_ids.py rename to pype/hosts/maya/plugins/publish/validate_rig_output_ids.py diff --git a/pype/plugins/maya/publish/validate_scene_set_workspace.py b/pype/hosts/maya/plugins/publish/validate_scene_set_workspace.py similarity index 100% rename from pype/plugins/maya/publish/validate_scene_set_workspace.py rename to pype/hosts/maya/plugins/publish/validate_scene_set_workspace.py diff --git a/pype/plugins/maya/publish/validate_shader_name.py b/pype/hosts/maya/plugins/publish/validate_shader_name.py similarity index 100% rename from pype/plugins/maya/publish/validate_shader_name.py rename to pype/hosts/maya/plugins/publish/validate_shader_name.py diff --git a/pype/plugins/maya/publish/validate_shape_default_names.py b/pype/hosts/maya/plugins/publish/validate_shape_default_names.py similarity index 100% rename from pype/plugins/maya/publish/validate_shape_default_names.py rename to pype/hosts/maya/plugins/publish/validate_shape_default_names.py diff --git a/pype/plugins/maya/publish/validate_shape_render_stats.py b/pype/hosts/maya/plugins/publish/validate_shape_render_stats.py similarity index 100% rename from pype/plugins/maya/publish/validate_shape_render_stats.py rename to pype/hosts/maya/plugins/publish/validate_shape_render_stats.py diff --git a/pype/plugins/maya/publish/validate_single_assembly.py b/pype/hosts/maya/plugins/publish/validate_single_assembly.py similarity index 100% rename from pype/plugins/maya/publish/validate_single_assembly.py rename to pype/hosts/maya/plugins/publish/validate_single_assembly.py diff --git a/pype/plugins/maya/publish/validate_skinCluster_deformer_set.py b/pype/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py similarity index 100% rename from pype/plugins/maya/publish/validate_skinCluster_deformer_set.py rename to pype/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py diff --git a/pype/plugins/maya/publish/validate_step_size.py b/pype/hosts/maya/plugins/publish/validate_step_size.py similarity index 100% rename from pype/plugins/maya/publish/validate_step_size.py rename to pype/hosts/maya/plugins/publish/validate_step_size.py diff --git a/pype/plugins/maya/publish/validate_transform_naming_suffix.py b/pype/hosts/maya/plugins/publish/validate_transform_naming_suffix.py similarity index 100% rename from pype/plugins/maya/publish/validate_transform_naming_suffix.py rename to pype/hosts/maya/plugins/publish/validate_transform_naming_suffix.py diff --git a/pype/plugins/maya/publish/validate_transform_zero.py b/pype/hosts/maya/plugins/publish/validate_transform_zero.py similarity index 100% rename from pype/plugins/maya/publish/validate_transform_zero.py rename to pype/hosts/maya/plugins/publish/validate_transform_zero.py diff --git a/pype/plugins/maya/publish/validate_unicode_strings.py b/pype/hosts/maya/plugins/publish/validate_unicode_strings.py similarity index 100% rename from pype/plugins/maya/publish/validate_unicode_strings.py rename to pype/hosts/maya/plugins/publish/validate_unicode_strings.py diff --git a/pype/plugins/maya/publish/validate_unreal_mesh_triangulated.py b/pype/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py similarity index 100% rename from pype/plugins/maya/publish/validate_unreal_mesh_triangulated.py rename to pype/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py diff --git a/pype/plugins/maya/publish/validate_unreal_staticmesh_naming.py b/pype/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py similarity index 100% rename from pype/plugins/maya/publish/validate_unreal_staticmesh_naming.py rename to pype/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py diff --git a/pype/plugins/maya/publish/validate_unreal_up_axis.py b/pype/hosts/maya/plugins/publish/validate_unreal_up_axis.py similarity index 100% rename from pype/plugins/maya/publish/validate_unreal_up_axis.py rename to pype/hosts/maya/plugins/publish/validate_unreal_up_axis.py diff --git a/pype/plugins/maya/publish/validate_vray_distributed_rendering.py b/pype/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py similarity index 100% rename from pype/plugins/maya/publish/validate_vray_distributed_rendering.py rename to pype/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py diff --git a/pype/plugins/maya/publish/validate_vray_referenced_aovs.py b/pype/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py similarity index 100% rename from pype/plugins/maya/publish/validate_vray_referenced_aovs.py rename to pype/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py diff --git a/pype/plugins/maya/publish/validate_vray_translator_settings.py b/pype/hosts/maya/plugins/publish/validate_vray_translator_settings.py similarity index 100% rename from pype/plugins/maya/publish/validate_vray_translator_settings.py rename to pype/hosts/maya/plugins/publish/validate_vray_translator_settings.py diff --git a/pype/plugins/maya/publish/validate_vrayproxy.py b/pype/hosts/maya/plugins/publish/validate_vrayproxy.py similarity index 100% rename from pype/plugins/maya/publish/validate_vrayproxy.py rename to pype/hosts/maya/plugins/publish/validate_vrayproxy.py diff --git a/pype/plugins/maya/publish/validate_vrayproxy_members.py b/pype/hosts/maya/plugins/publish/validate_vrayproxy_members.py similarity index 100% rename from pype/plugins/maya/publish/validate_vrayproxy_members.py rename to pype/hosts/maya/plugins/publish/validate_vrayproxy_members.py diff --git a/pype/plugins/maya/publish/validate_yeti_renderscript_callbacks.py b/pype/hosts/maya/plugins/publish/validate_yeti_renderscript_callbacks.py similarity index 100% rename from pype/plugins/maya/publish/validate_yeti_renderscript_callbacks.py rename to pype/hosts/maya/plugins/publish/validate_yeti_renderscript_callbacks.py diff --git a/pype/plugins/maya/publish/validate_yeti_rig_cache_state.py b/pype/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py similarity index 100% rename from pype/plugins/maya/publish/validate_yeti_rig_cache_state.py rename to pype/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py diff --git a/pype/plugins/maya/publish/validate_yeti_rig_input_in_instance.py b/pype/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py similarity index 100% rename from pype/plugins/maya/publish/validate_yeti_rig_input_in_instance.py rename to pype/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py diff --git a/pype/plugins/maya/publish/validate_yeti_rig_settings.py b/pype/hosts/maya/plugins/publish/validate_yeti_rig_settings.py similarity index 100% rename from pype/plugins/maya/publish/validate_yeti_rig_settings.py rename to pype/hosts/maya/plugins/publish/validate_yeti_rig_settings.py diff --git a/pype/resources/maya/workspace.mel b/pype/hosts/maya/resources/workspace.mel similarity index 100% rename from pype/resources/maya/workspace.mel rename to pype/hosts/maya/resources/workspace.mel diff --git a/pype/setup/maya/userSetup.py b/pype/hosts/maya/startup/userSetup.py similarity index 100% rename from pype/setup/maya/userSetup.py rename to pype/hosts/maya/startup/userSetup.py From f2aef2298296580f5f70a5d83ff2e702ee59b153 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 10:53:32 +0100 Subject: [PATCH 078/113] change maya init imports --- pype/hosts/maya/api/__init__.py | 40 +++++++++++++++++---------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/pype/hosts/maya/api/__init__.py b/pype/hosts/maya/api/__init__.py index 06b3e2c63c..35d8d92d26 100644 --- a/pype/hosts/maya/api/__init__.py +++ b/pype/hosts/maya/api/__init__.py @@ -4,22 +4,24 @@ import weakref from maya import utils, cmds -from avalon import api as avalon, pipeline, maya -from avalon.maya.pipeline import IS_HEADLESS +from avalon import api as avalon +from avalon import pipeline +from avalon.maya import suspended_refresh +from avalon.maya.pipeline import IS_HEADLESS, _on_task_changed from avalon.tools import workfiles from pyblish import api as pyblish - -from ...lib import any_outdated -from pype import PLUGINS_DIR - -from . import menu -from . import lib +from pype.lib import any_outdated +import pype.hosts.maya +from . import menu, lib log = logging.getLogger("pype.hosts.maya") -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "maya", "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "maya", "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "maya", "create") +HOST_DIR = os.path.dirname(os.path.abspath(pype.hosts.maya.__file__)) +PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") def install(): @@ -35,7 +37,7 @@ def install(): # Callbacks below are not required for headless mode, the `init` however # is important to load referenced Alembics correctly at rendertime. if IS_HEADLESS: - log.info("Running in headless mode, skipping Colorbleed Maya " + log.info("Running in headless mode, skipping Maya " "save/open/new callback installation..") return @@ -118,16 +120,16 @@ def on_init(_): safe_deferred(override_toolbox_ui) -def launch_workfiles_app(*args): +def launch_workfiles_app(): workfiles.show(os.environ["AVALON_WORKDIR"]) -def on_before_save(return_code, _): +def on_before_save(return_code): """Run validation for scene's FPS prior to saving""" return lib.validate_fps() -def on_save(_): +def on_save(): """Automatically add IDs to new nodes Any transform of a mesh, without an existing ID, is given one @@ -145,7 +147,7 @@ def on_save(_): lib.set_id(node, new_id, overwrite=False) -def on_open(_): +def on_open(): """On scene open let's assume the containers have changed.""" from avalon.vendor.Qt import QtWidgets @@ -194,7 +196,7 @@ def on_open(_): def on_new(_): """Set project resolution and fps when create a new file""" avalon.logger.info("Running callback on new..") - with maya.suspended_refresh(): + with suspended_refresh(): cmds.evalDeferred( "from pype.hosts.maya import lib;lib.remove_render_layer_observer()") cmds.evalDeferred( @@ -207,8 +209,8 @@ def on_new(_): def on_task_changed(*args): """Wrapped function of app initialize and maya's on task changed""" # Run - maya.pipeline._on_task_changed() - with maya.suspended_refresh(): + _on_task_changed() + with suspended_refresh(): lib.set_context_settings() lib.update_content_on_context_change() From afb56dbd9a48456a5006ad13bb63b1de57d0fd36 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 10:54:07 +0100 Subject: [PATCH 079/113] change host.maya api imports --- pype/hosts/maya/__init__.py | 0 pype/hosts/maya/api/action.py | 2 +- pype/hosts/maya/api/expected_files.py | 2 +- pype/hosts/maya/api/lib.py | 6 ++---- pype/hosts/maya/api/menu.py | 2 +- pype/hosts/maya/api/setdress.py | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) create mode 100644 pype/hosts/maya/__init__.py diff --git a/pype/hosts/maya/__init__.py b/pype/hosts/maya/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pype/hosts/maya/api/action.py b/pype/hosts/maya/api/action.py index bb6815ed7d..35a57a4445 100644 --- a/pype/hosts/maya/api/action.py +++ b/pype/hosts/maya/api/action.py @@ -4,7 +4,7 @@ from __future__ import absolute_import import pyblish.api -from ...action import get_errored_instances_from_context +from pype.api import get_errored_instances_from_context class GenerateUUIDsOnInvalidAction(pyblish.api.Action): diff --git a/pype/hosts/maya/api/expected_files.py b/pype/hosts/maya/api/expected_files.py index d39e5fa204..0a234baef7 100644 --- a/pype/hosts/maya/api/expected_files.py +++ b/pype/hosts/maya/api/expected_files.py @@ -44,7 +44,7 @@ from abc import ABCMeta, abstractmethod import six -import pype.hosts.maya.lib as lib +import pype.hosts.maya.api.lib as lib from maya import cmds import maya.app.renderSetup.model.renderSetup as renderSetup diff --git a/pype/hosts/maya/api/lib.py b/pype/hosts/maya/api/lib.py index 37e4ccf915..3a820af814 100644 --- a/pype/hosts/maya/api/lib.py +++ b/pype/hosts/maya/api/lib.py @@ -114,9 +114,7 @@ def matrix_equals(a, b, tolerance=1e-10): bool : True or False """ - if not all(abs(x - y) < tolerance for x, y in zip(a, b)): - return False - return True + return all(abs(x - y) < tolerance for x, y in zip(a, b)) def float_round(num, places=0, direction=ceil): @@ -1084,7 +1082,7 @@ def get_id_required_nodes(referenced_nodes=False, nodes=None): # Check if plugin nodes are available for Maya by checking if the plugin # is loaded - if cmds.pluginInfo("pgYetiMaya", query=True, loaded=True): + if cmds.pluginInfo("pgYetiMaya", query=True, loaded=True): types.append("pgYetiMaya") # We *always* ignore intermediate shapes, so we filter them out directly diff --git a/pype/hosts/maya/api/menu.py b/pype/hosts/maya/api/menu.py index fa7690bca7..9381043511 100644 --- a/pype/hosts/maya/api/menu.py +++ b/pype/hosts/maya/api/menu.py @@ -4,7 +4,7 @@ import logging from avalon.vendor.Qt import QtWidgets, QtGui from avalon.maya import pipeline -from ...lib import BuildWorkfile +from pype.api import BuildWorkfile import maya.cmds as cmds self = sys.modules[__name__] diff --git a/pype/hosts/maya/api/setdress.py b/pype/hosts/maya/api/setdress.py index 7c764a42df..2c4dd93b18 100644 --- a/pype/hosts/maya/api/setdress.py +++ b/pype/hosts/maya/api/setdress.py @@ -9,7 +9,7 @@ from maya import cmds from avalon import api, io from avalon.maya.lib import unique_namespace -from pype.hosts.maya.lib import matrix_equals +from pype.hosts.maya.api.lib import matrix_equals log = logging.getLogger("PackageLoader") From 3e22810217197e02439e53e8a0e816e9b8786839 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 10:54:26 +0100 Subject: [PATCH 080/113] change maya plugin imports --- pype/hosts/maya/plugins/create/create_animation.py | 2 +- pype/hosts/maya/plugins/create/create_ass.py | 2 +- pype/hosts/maya/plugins/create/create_camera.py | 2 +- pype/hosts/maya/plugins/create/create_look.py | 2 +- pype/hosts/maya/plugins/create/create_pointcache.py | 2 +- pype/hosts/maya/plugins/create/create_render.py | 2 +- pype/hosts/maya/plugins/create/create_rendersetup.py | 2 +- pype/hosts/maya/plugins/create/create_review.py | 2 +- pype/hosts/maya/plugins/create/create_rig.py | 2 +- pype/hosts/maya/plugins/create/create_yeti_cache.py | 2 +- pype/hosts/maya/plugins/create/create_yeti_rig.py | 2 +- pype/hosts/maya/plugins/load/_load_animation.py | 4 ++-- pype/hosts/maya/plugins/load/load_ass.py | 4 ++-- pype/hosts/maya/plugins/load/load_gpucache.py | 2 +- pype/hosts/maya/plugins/load/load_look.py | 12 ++++++------ pype/hosts/maya/plugins/load/load_reference.py | 4 ++-- pype/hosts/maya/plugins/load/load_rendersetup.py | 4 ++-- pype/hosts/maya/plugins/load/load_vrayproxy.py | 2 +- pype/hosts/maya/plugins/load/load_yeti_cache.py | 2 +- pype/hosts/maya/plugins/load/load_yeti_rig.py | 6 +++--- pype/hosts/maya/plugins/publish/collect_assembly.py | 2 +- pype/hosts/maya/plugins/publish/collect_look.py | 2 +- pype/hosts/maya/plugins/publish/collect_render.py | 4 ++-- .../plugins/publish/collect_render_layer_aovs.py | 2 +- .../plugins/publish/collect_renderable_camera.py | 2 +- .../hosts/maya/plugins/publish/collect_yeti_cache.py | 2 +- pype/hosts/maya/plugins/publish/collect_yeti_rig.py | 2 +- pype/hosts/maya/plugins/publish/extract_animation.py | 2 +- pype/hosts/maya/plugins/publish/extract_assembly.py | 2 +- pype/hosts/maya/plugins/publish/extract_assproxy.py | 2 +- .../maya/plugins/publish/extract_camera_alembic.py | 2 +- .../maya/plugins/publish/extract_camera_mayaScene.py | 2 +- pype/hosts/maya/plugins/publish/extract_look.py | 2 +- pype/hosts/maya/plugins/publish/extract_model.py | 2 +- pype/hosts/maya/plugins/publish/extract_playblast.py | 2 +- .../hosts/maya/plugins/publish/extract_pointcache.py | 2 +- pype/hosts/maya/plugins/publish/extract_thumbnail.py | 2 +- pype/hosts/maya/plugins/publish/extract_yeti_rig.py | 2 +- .../hosts/maya/plugins/publish/submit_maya_muster.py | 2 +- .../plugins/publish/validate_animation_content.py | 4 ++-- .../validate_animation_out_set_related_node_ids.py | 6 +++--- .../plugins/publish/validate_ass_relative_paths.py | 2 +- .../maya/plugins/publish/validate_assembly_name.py | 4 ++-- .../plugins/publish/validate_assembly_namespaces.py | 4 ++-- .../plugins/publish/validate_assembly_transforms.py | 8 ++++---- .../plugins/publish/validate_camera_attributes.py | 4 ++-- .../maya/plugins/publish/validate_camera_contents.py | 4 ++-- .../maya/plugins/publish/validate_color_sets.py | 4 ++-- .../plugins/publish/validate_instance_has_members.py | 4 ++-- .../plugins/publish/validate_instancer_content.py | 2 +- .../maya/plugins/publish/validate_joints_hidden.py | 6 +++--- .../maya/plugins/publish/validate_look_contents.py | 4 ++-- .../publish/validate_look_id_reference_edits.py | 4 ++-- .../plugins/publish/validate_look_members_unique.py | 6 +++--- .../publish/validate_look_no_default_shaders.py | 4 ++-- .../hosts/maya/plugins/publish/validate_look_sets.py | 6 +++--- .../plugins/publish/validate_look_shading_group.py | 4 ++-- .../plugins/publish/validate_look_single_shader.py | 4 ++-- .../maya/plugins/publish/validate_maya_units.py | 2 +- .../publish/validate_mesh_arnold_attributes.py | 4 ++-- .../maya/plugins/publish/validate_mesh_has_uv.py | 4 ++-- .../plugins/publish/validate_mesh_lamina_faces.py | 4 ++-- .../publish/validate_mesh_no_negative_scale.py | 4 ++-- .../plugins/publish/validate_mesh_non_manifold.py | 4 ++-- .../plugins/publish/validate_mesh_non_zero_edge.py | 6 +++--- .../publish/validate_mesh_normals_unlocked.py | 4 ++-- .../plugins/publish/validate_mesh_overlapping_uvs.py | 4 ++-- .../publish/validate_mesh_shader_connections.py | 4 ++-- .../plugins/publish/validate_mesh_single_uv_set.py | 6 +++--- .../plugins/publish/validate_mesh_uv_set_map1.py | 4 ++-- .../publish/validate_mesh_vertices_have_edges.py | 4 ++-- .../maya/plugins/publish/validate_model_content.py | 6 +++--- .../maya/plugins/publish/validate_model_name.py | 4 ++-- .../plugins/publish/validate_muster_connection.py | 2 +- .../maya/plugins/publish/validate_no_animation.py | 4 ++-- .../plugins/publish/validate_no_default_camera.py | 4 ++-- .../maya/plugins/publish/validate_no_namespace.py | 4 ++-- .../plugins/publish/validate_no_null_transforms.py | 4 ++-- .../plugins/publish/validate_no_unknown_nodes.py | 4 ++-- pype/hosts/maya/plugins/publish/validate_node_ids.py | 8 ++++---- .../publish/validate_node_ids_deformed_shapes.py | 6 +++--- .../plugins/publish/validate_node_ids_in_database.py | 8 ++++---- .../plugins/publish/validate_node_ids_related.py | 8 ++++---- .../maya/plugins/publish/validate_node_ids_unique.py | 8 ++++---- .../plugins/publish/validate_node_no_ghosting.py | 4 ++-- .../publish/validate_render_no_default_cameras.py | 4 ++-- .../plugins/publish/validate_render_single_camera.py | 4 ++-- .../plugins/publish/validate_renderlayer_aovs.py | 4 ++-- .../maya/plugins/publish/validate_rendersettings.py | 2 +- .../maya/plugins/publish/validate_rig_controllers.py | 6 +++--- .../validate_rig_controllers_arnold_attributes.py | 6 +++--- .../plugins/publish/validate_rig_out_set_node_ids.py | 6 +++--- .../maya/plugins/publish/validate_rig_output_ids.py | 6 +++--- .../maya/plugins/publish/validate_shader_name.py | 4 ++-- .../plugins/publish/validate_shape_default_names.py | 4 ++-- .../plugins/publish/validate_shape_render_stats.py | 4 ++-- .../publish/validate_skinCluster_deformer_set.py | 4 ++-- .../hosts/maya/plugins/publish/validate_step_size.py | 4 ++-- .../publish/validate_transform_naming_suffix.py | 4 ++-- .../maya/plugins/publish/validate_transform_zero.py | 4 ++-- .../maya/plugins/publish/validate_unicode_strings.py | 2 +- .../publish/validate_unreal_mesh_triangulated.py | 2 +- .../publish/validate_unreal_staticmesh_naming.py | 4 ++-- .../publish/validate_vray_distributed_rendering.py | 2 +- .../plugins/publish/validate_vray_referenced_aovs.py | 2 +- .../plugins/publish/validate_vrayproxy_members.py | 4 ++-- .../plugins/publish/validate_yeti_rig_cache_state.py | 4 ++-- .../publish/validate_yeti_rig_input_in_instance.py | 4 ++-- 108 files changed, 202 insertions(+), 202 deletions(-) diff --git a/pype/hosts/maya/plugins/create/create_animation.py b/pype/hosts/maya/plugins/create/create_animation.py index 7bafce774c..6894fffb5d 100644 --- a/pype/hosts/maya/plugins/create/create_animation.py +++ b/pype/hosts/maya/plugins/create/create_animation.py @@ -1,5 +1,5 @@ import avalon.maya -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class CreateAnimation(avalon.maya.Creator): diff --git a/pype/hosts/maya/plugins/create/create_ass.py b/pype/hosts/maya/plugins/create/create_ass.py index 7fd66e8e15..b7d5f27114 100644 --- a/pype/hosts/maya/plugins/create/create_ass.py +++ b/pype/hosts/maya/plugins/create/create_ass.py @@ -1,7 +1,7 @@ from collections import OrderedDict import avalon.maya -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib from maya import cmds diff --git a/pype/hosts/maya/plugins/create/create_camera.py b/pype/hosts/maya/plugins/create/create_camera.py index acff93c03c..cb438e68ba 100644 --- a/pype/hosts/maya/plugins/create/create_camera.py +++ b/pype/hosts/maya/plugins/create/create_camera.py @@ -1,5 +1,5 @@ import avalon.maya -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class CreateCamera(avalon.maya.Creator): diff --git a/pype/hosts/maya/plugins/create/create_look.py b/pype/hosts/maya/plugins/create/create_look.py index 5ea64cc7e4..2d8576a8b4 100644 --- a/pype/hosts/maya/plugins/create/create_look.py +++ b/pype/hosts/maya/plugins/create/create_look.py @@ -1,5 +1,5 @@ import avalon.maya -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class CreateLook(avalon.maya.Creator): diff --git a/pype/hosts/maya/plugins/create/create_pointcache.py b/pype/hosts/maya/plugins/create/create_pointcache.py index 1eb561b5ce..271257c85e 100644 --- a/pype/hosts/maya/plugins/create/create_pointcache.py +++ b/pype/hosts/maya/plugins/create/create_pointcache.py @@ -1,5 +1,5 @@ import avalon.maya -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class CreatePointCache(avalon.maya.Creator): diff --git a/pype/hosts/maya/plugins/create/create_render.py b/pype/hosts/maya/plugins/create/create_render.py index 2b0b0e19f7..0763b19c17 100644 --- a/pype/hosts/maya/plugins/create/create_render.py +++ b/pype/hosts/maya/plugins/create/create_render.py @@ -8,7 +8,7 @@ import requests from maya import cmds import maya.app.renderSetup.model.renderSetup as renderSetup -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib from pype.api import get_system_settings import avalon.maya diff --git a/pype/hosts/maya/plugins/create/create_rendersetup.py b/pype/hosts/maya/plugins/create/create_rendersetup.py index 40e3731bf0..bbf46e2169 100644 --- a/pype/hosts/maya/plugins/create/create_rendersetup.py +++ b/pype/hosts/maya/plugins/create/create_rendersetup.py @@ -1,5 +1,5 @@ import avalon.maya -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib from maya import cmds diff --git a/pype/hosts/maya/plugins/create/create_review.py b/pype/hosts/maya/plugins/create/create_review.py index bfeab33f5b..8619f90964 100644 --- a/pype/hosts/maya/plugins/create/create_review.py +++ b/pype/hosts/maya/plugins/create/create_review.py @@ -1,6 +1,6 @@ from collections import OrderedDict import avalon.maya -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class CreateReview(avalon.maya.Creator): diff --git a/pype/hosts/maya/plugins/create/create_rig.py b/pype/hosts/maya/plugins/create/create_rig.py index ae1de4243e..4692997934 100644 --- a/pype/hosts/maya/plugins/create/create_rig.py +++ b/pype/hosts/maya/plugins/create/create_rig.py @@ -1,6 +1,6 @@ from maya import cmds -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib import avalon.maya diff --git a/pype/hosts/maya/plugins/create/create_yeti_cache.py b/pype/hosts/maya/plugins/create/create_yeti_cache.py index a4b5cc537a..c9edb65d8b 100644 --- a/pype/hosts/maya/plugins/create/create_yeti_cache.py +++ b/pype/hosts/maya/plugins/create/create_yeti_cache.py @@ -1,7 +1,7 @@ from collections import OrderedDict import avalon.maya -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class CreateYetiCache(avalon.maya.Creator): diff --git a/pype/hosts/maya/plugins/create/create_yeti_rig.py b/pype/hosts/maya/plugins/create/create_yeti_rig.py index 0b954f500d..c385ca662d 100644 --- a/pype/hosts/maya/plugins/create/create_yeti_rig.py +++ b/pype/hosts/maya/plugins/create/create_yeti_rig.py @@ -1,6 +1,6 @@ from maya import cmds -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib import avalon.maya diff --git a/pype/hosts/maya/plugins/load/_load_animation.py b/pype/hosts/maya/plugins/load/_load_animation.py index 597689ae21..bef97d79bb 100644 --- a/pype/hosts/maya/plugins/load/_load_animation.py +++ b/pype/hosts/maya/plugins/load/_load_animation.py @@ -1,7 +1,7 @@ -import pype.hosts.maya.plugin +import pype.hosts.maya.api.plugin -class AbcLoader(pype.hosts.maya.plugin.ReferenceLoader): +class AbcLoader(pype.hosts.maya.api.plugin.ReferenceLoader): """Specific loader of Alembic for the avalon.animation family""" families = ["animation", diff --git a/pype/hosts/maya/plugins/load/load_ass.py b/pype/hosts/maya/plugins/load/load_ass.py index 9b851a3757..8aaa99369c 100644 --- a/pype/hosts/maya/plugins/load/load_ass.py +++ b/pype/hosts/maya/plugins/load/load_ass.py @@ -1,11 +1,11 @@ from avalon import api -import pype.hosts.maya.plugin +import pype.hosts.maya.api.plugin import os from pype.api import get_project_settings import clique -class AssProxyLoader(pype.hosts.maya.plugin.ReferenceLoader): +class AssProxyLoader(pype.hosts.maya.api.plugin.ReferenceLoader): """Load the Proxy""" families = ["ass"] diff --git a/pype/hosts/maya/plugins/load/load_gpucache.py b/pype/hosts/maya/plugins/load/load_gpucache.py index 0b3daae710..a183a46cd3 100644 --- a/pype/hosts/maya/plugins/load/load_gpucache.py +++ b/pype/hosts/maya/plugins/load/load_gpucache.py @@ -1,5 +1,5 @@ from avalon import api -import pype.hosts.maya.plugin +import pype.hosts.maya.api.plugin import os from pype.api import get_project_settings reload(config) diff --git a/pype/hosts/maya/plugins/load/load_look.py b/pype/hosts/maya/plugins/load/load_look.py index c5b58c9bd5..ab8f971d62 100644 --- a/pype/hosts/maya/plugins/load/load_look.py +++ b/pype/hosts/maya/plugins/load/load_look.py @@ -1,13 +1,13 @@ -import pype.hosts.maya.plugin +import pype.hosts.maya.api.plugin from avalon import api, io import json -import pype.hosts.maya.lib +import pype.hosts.maya.api.lib from collections import defaultdict from pype.widgets.message_window import ScrollMessageBox from Qt import QtWidgets -class LookLoader(pype.hosts.maya.plugin.ReferenceLoader): +class LookLoader(pype.hosts.maya.api.plugin.ReferenceLoader): """Specific loader for lookdev""" families = ["look"] @@ -120,7 +120,7 @@ class LookLoader(pype.hosts.maya.plugin.ReferenceLoader): cmds.file(cr=reference_node) # cleanReference # reapply shading groups from json representation on orig nodes - pype.hosts.maya.lib.apply_shaders(relationships, + pype.hosts.maya.api.lib.apply_shaders(relationships, shader_nodes, orig_nodes) @@ -138,8 +138,8 @@ class LookLoader(pype.hosts.maya.plugin.ReferenceLoader): # region compute lookup nodes_by_id = defaultdict(list) for n in nodes: - nodes_by_id[pype.hosts.maya.lib.get_id(n)].append(n) - pype.hosts.maya.lib.apply_attributes(attributes, nodes_by_id) + nodes_by_id[pype.hosts.maya.api.lib.get_id(n)].append(n) + pype.hosts.maya.api.lib.apply_attributes(attributes, nodes_by_id) # Update metadata cmds.setAttr("{}.representation".format(node), diff --git a/pype/hosts/maya/plugins/load/load_reference.py b/pype/hosts/maya/plugins/load/load_reference.py index 23b3cedb55..d37579423c 100644 --- a/pype/hosts/maya/plugins/load/load_reference.py +++ b/pype/hosts/maya/plugins/load/load_reference.py @@ -1,11 +1,11 @@ -import pype.hosts.maya.plugin +import pype.hosts.maya.api.plugin from avalon import api, maya from maya import cmds import os from pype.api import get_project_settings -class ReferenceLoader(pype.hosts.maya.plugin.ReferenceLoader): +class ReferenceLoader(pype.hosts.maya.api.plugin.ReferenceLoader): """Load the model""" families = ["model", diff --git a/pype/hosts/maya/plugins/load/load_rendersetup.py b/pype/hosts/maya/plugins/load/load_rendersetup.py index 45a314a9d1..c540c3880e 100644 --- a/pype/hosts/maya/plugins/load/load_rendersetup.py +++ b/pype/hosts/maya/plugins/load/load_rendersetup.py @@ -12,7 +12,7 @@ import sys from avalon import api from avalon.maya import lib -from pype.hosts.maya import lib as pypelib +from pype.hosts.maya.api import lib as pypelib from maya import cmds import maya.app.renderSetup.model.renderSetup as renderSetup @@ -32,7 +32,7 @@ class RenderSetupLoader(api.Loader): def load(self, context, name, namespace, data): """Load RenderSetup settings.""" from avalon.maya.pipeline import containerise - # from pype.hosts.maya.lib import namespaced + # from pype.hosts.maya.api.lib import namespaced asset = context['asset']['name'] namespace = namespace or lib.unique_namespace( diff --git a/pype/hosts/maya/plugins/load/load_vrayproxy.py b/pype/hosts/maya/plugins/load/load_vrayproxy.py index 73f02b81e4..270d0f9baa 100644 --- a/pype/hosts/maya/plugins/load/load_vrayproxy.py +++ b/pype/hosts/maya/plugins/load/load_vrayproxy.py @@ -19,7 +19,7 @@ class VRayProxyLoader(api.Loader): def load(self, context, name, namespace, data): from avalon.maya.pipeline import containerise - from pype.hosts.maya.lib import namespaced + from pype.hosts.maya.api.lib import namespaced try: family = context["representation"]["context"]["family"] diff --git a/pype/hosts/maya/plugins/load/load_yeti_cache.py b/pype/hosts/maya/plugins/load/load_yeti_cache.py index 19cf3920fe..16d51ad56d 100644 --- a/pype/hosts/maya/plugins/load/load_yeti_cache.py +++ b/pype/hosts/maya/plugins/load/load_yeti_cache.py @@ -8,7 +8,7 @@ from maya import cmds from avalon import api, io from avalon.maya import lib as avalon_lib, pipeline -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib from pype.api import get_project_settings from pprint import pprint diff --git a/pype/hosts/maya/plugins/load/load_yeti_rig.py b/pype/hosts/maya/plugins/load/load_yeti_rig.py index 3a9339c707..d025ed13cc 100644 --- a/pype/hosts/maya/plugins/load/load_yeti_rig.py +++ b/pype/hosts/maya/plugins/load/load_yeti_rig.py @@ -2,11 +2,11 @@ import os from collections import defaultdict from pype.api import get_project_settings -import pype.hosts.maya.plugin -from pype.hosts.maya import lib +import pype.hosts.maya.api.plugin +from pype.hosts.maya.api import lib -class YetiRigLoader(pype.hosts.maya.plugin.ReferenceLoader): +class YetiRigLoader(pype.hosts.maya.api.plugin.ReferenceLoader): """ This loader will load Yeti rig. You can select something in scene and if it has same ID as mesh published with rig, their shapes will be linked diff --git a/pype/hosts/maya/plugins/publish/collect_assembly.py b/pype/hosts/maya/plugins/publish/collect_assembly.py index f9a933d8e8..be3408a0bd 100644 --- a/pype/hosts/maya/plugins/publish/collect_assembly.py +++ b/pype/hosts/maya/plugins/publish/collect_assembly.py @@ -3,7 +3,7 @@ import pyblish.api from maya import cmds, mel from avalon import maya as avalon -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib # TODO : Publish of assembly: -unique namespace for all assets, VALIDATOR! diff --git a/pype/hosts/maya/plugins/publish/collect_look.py b/pype/hosts/maya/plugins/publish/collect_look.py index 7df85e4ba7..35abc5a991 100644 --- a/pype/hosts/maya/plugins/publish/collect_look.py +++ b/pype/hosts/maya/plugins/publish/collect_look.py @@ -4,7 +4,7 @@ import glob from maya import cmds import pyblish.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib SHAPE_ATTRS = ["castsShadows", "receiveShadows", diff --git a/pype/hosts/maya/plugins/publish/collect_render.py b/pype/hosts/maya/plugins/publish/collect_render.py index 0853473120..208937320d 100644 --- a/pype/hosts/maya/plugins/publish/collect_render.py +++ b/pype/hosts/maya/plugins/publish/collect_render.py @@ -49,8 +49,8 @@ import maya.app.renderSetup.model.renderSetup as renderSetup import pyblish.api from avalon import maya, api -from pype.hosts.maya.expected_files import ExpectedFiles -from pype.hosts.maya import lib +from pype.hosts.maya.api.expected_files import ExpectedFiles +from pype.hosts.maya.api import lib class CollectMayaRender(pyblish.api.ContextPlugin): diff --git a/pype/hosts/maya/plugins/publish/collect_render_layer_aovs.py b/pype/hosts/maya/plugins/publish/collect_render_layer_aovs.py index ff44497d6d..d776b43907 100644 --- a/pype/hosts/maya/plugins/publish/collect_render_layer_aovs.py +++ b/pype/hosts/maya/plugins/publish/collect_render_layer_aovs.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): diff --git a/pype/hosts/maya/plugins/publish/collect_renderable_camera.py b/pype/hosts/maya/plugins/publish/collect_renderable_camera.py index a7d613517b..893a2cab61 100644 --- a/pype/hosts/maya/plugins/publish/collect_renderable_camera.py +++ b/pype/hosts/maya/plugins/publish/collect_renderable_camera.py @@ -2,7 +2,7 @@ import pyblish.api from maya import cmds -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class CollectRenderableCamera(pyblish.api.InstancePlugin): diff --git a/pype/hosts/maya/plugins/publish/collect_yeti_cache.py b/pype/hosts/maya/plugins/publish/collect_yeti_cache.py index 26c3f601f6..2cfc56e486 100644 --- a/pype/hosts/maya/plugins/publish/collect_yeti_cache.py +++ b/pype/hosts/maya/plugins/publish/collect_yeti_cache.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib SETTINGS = {"renderDensity", "renderWidth", diff --git a/pype/hosts/maya/plugins/publish/collect_yeti_rig.py b/pype/hosts/maya/plugins/publish/collect_yeti_rig.py index 73a84b0073..15bcdc51dd 100644 --- a/pype/hosts/maya/plugins/publish/collect_yeti_rig.py +++ b/pype/hosts/maya/plugins/publish/collect_yeti_rig.py @@ -5,7 +5,7 @@ from maya import cmds import pyblish.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib SETTINGS = {"renderDensity", diff --git a/pype/hosts/maya/plugins/publish/extract_animation.py b/pype/hosts/maya/plugins/publish/extract_animation.py index f7058b34f1..f56ba2f400 100644 --- a/pype/hosts/maya/plugins/publish/extract_animation.py +++ b/pype/hosts/maya/plugins/publish/extract_animation.py @@ -4,7 +4,7 @@ from maya import cmds import avalon.maya import pype.api -from pype.hosts.maya.lib import extract_alembic +from pype.hosts.maya.api.lib import extract_alembic class ExtractAnimation(pype.api.Extractor): diff --git a/pype/hosts/maya/plugins/publish/extract_assembly.py b/pype/hosts/maya/plugins/publish/extract_assembly.py index 8c5264713d..c72f1f1835 100644 --- a/pype/hosts/maya/plugins/publish/extract_assembly.py +++ b/pype/hosts/maya/plugins/publish/extract_assembly.py @@ -3,7 +3,7 @@ import json import os import pype.api -from pype.hosts.maya.lib import extract_alembic +from pype.hosts.maya.api.lib import extract_alembic from maya import cmds diff --git a/pype/hosts/maya/plugins/publish/extract_assproxy.py b/pype/hosts/maya/plugins/publish/extract_assproxy.py index 0f97d047c1..80cca1396b 100644 --- a/pype/hosts/maya/plugins/publish/extract_assproxy.py +++ b/pype/hosts/maya/plugins/publish/extract_assproxy.py @@ -5,7 +5,7 @@ import contextlib import avalon.maya import pype.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class ExtractAssProxy(pype.api.Extractor): diff --git a/pype/hosts/maya/plugins/publish/extract_camera_alembic.py b/pype/hosts/maya/plugins/publish/extract_camera_alembic.py index c0538338dc..c37f2ecb76 100644 --- a/pype/hosts/maya/plugins/publish/extract_camera_alembic.py +++ b/pype/hosts/maya/plugins/publish/extract_camera_alembic.py @@ -5,7 +5,7 @@ from maya import cmds import avalon.maya import pype.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class ExtractCameraAlembic(pype.api.Extractor): diff --git a/pype/hosts/maya/plugins/publish/extract_camera_mayaScene.py b/pype/hosts/maya/plugins/publish/extract_camera_mayaScene.py index a1854b1db0..16ebc39419 100644 --- a/pype/hosts/maya/plugins/publish/extract_camera_mayaScene.py +++ b/pype/hosts/maya/plugins/publish/extract_camera_mayaScene.py @@ -7,7 +7,7 @@ from maya import cmds import avalon.maya import pype.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib def massage_ma_file(path): diff --git a/pype/hosts/maya/plugins/publish/extract_look.py b/pype/hosts/maya/plugins/publish/extract_look.py index 0a7e4fb2ee..2c4837b7a7 100644 --- a/pype/hosts/maya/plugins/publish/extract_look.py +++ b/pype/hosts/maya/plugins/publish/extract_look.py @@ -14,7 +14,7 @@ import avalon.maya from avalon import io, api import pype.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib # Modes for transfer COPY = 1 diff --git a/pype/hosts/maya/plugins/publish/extract_model.py b/pype/hosts/maya/plugins/publish/extract_model.py index 8276d1a006..1c268a9e0e 100644 --- a/pype/hosts/maya/plugins/publish/extract_model.py +++ b/pype/hosts/maya/plugins/publish/extract_model.py @@ -6,7 +6,7 @@ from maya import cmds import avalon.maya import pype.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class ExtractModel(pype.api.Extractor): diff --git a/pype/hosts/maya/plugins/publish/extract_playblast.py b/pype/hosts/maya/plugins/publish/extract_playblast.py index 39b02a5a83..770b077e41 100644 --- a/pype/hosts/maya/plugins/publish/extract_playblast.py +++ b/pype/hosts/maya/plugins/publish/extract_playblast.py @@ -4,7 +4,7 @@ import contextlib import clique import capture -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib import pype.api from maya import cmds diff --git a/pype/hosts/maya/plugins/publish/extract_pointcache.py b/pype/hosts/maya/plugins/publish/extract_pointcache.py index e43685cac8..58742c8567 100644 --- a/pype/hosts/maya/plugins/publish/extract_pointcache.py +++ b/pype/hosts/maya/plugins/publish/extract_pointcache.py @@ -4,7 +4,7 @@ from maya import cmds import avalon.maya import pype.api -from pype.hosts.maya.lib import extract_alembic +from pype.hosts.maya.api.lib import extract_alembic class ExtractAlembic(pype.api.Extractor): diff --git a/pype/hosts/maya/plugins/publish/extract_thumbnail.py b/pype/hosts/maya/plugins/publish/extract_thumbnail.py index 6956341ffd..49511f6af6 100644 --- a/pype/hosts/maya/plugins/publish/extract_thumbnail.py +++ b/pype/hosts/maya/plugins/publish/extract_thumbnail.py @@ -4,7 +4,7 @@ import glob import capture -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib import pype.api from maya import cmds diff --git a/pype/hosts/maya/plugins/publish/extract_yeti_rig.py b/pype/hosts/maya/plugins/publish/extract_yeti_rig.py index 71d4cf6198..43908d8742 100644 --- a/pype/hosts/maya/plugins/publish/extract_yeti_rig.py +++ b/pype/hosts/maya/plugins/publish/extract_yeti_rig.py @@ -9,7 +9,7 @@ from maya import cmds import avalon.maya.lib as lib import pype.api -import pype.hosts.maya.lib as maya +import pype.hosts.maya.api.lib as maya @contextlib.contextmanager diff --git a/pype/hosts/maya/plugins/publish/submit_maya_muster.py b/pype/hosts/maya/plugins/publish/submit_maya_muster.py index b10c4ecbbb..e31f989224 100644 --- a/pype/hosts/maya/plugins/publish/submit_maya_muster.py +++ b/pype/hosts/maya/plugins/publish/submit_maya_muster.py @@ -10,7 +10,7 @@ from avalon import api from avalon.vendor import requests import pyblish.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib from pype.api import get_system_settings diff --git a/pype/hosts/maya/plugins/publish/validate_animation_content.py b/pype/hosts/maya/plugins/publish/validate_animation_content.py index 63f1135fdc..ec6f33c969 100644 --- a/pype/hosts/maya/plugins/publish/validate_animation_content.py +++ b/pype/hosts/maya/plugins/publish/validate_animation_content.py @@ -1,6 +1,6 @@ import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateAnimationContent(pyblish.api.InstancePlugin): @@ -15,7 +15,7 @@ class ValidateAnimationContent(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["animation"] label = "Animation Content" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py b/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py index 4fe676404c..ffafd14bcd 100644 --- a/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py +++ b/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py @@ -2,8 +2,8 @@ import maya.cmds as cmds import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin): @@ -20,7 +20,7 @@ class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin): families = ['animation', "pointcache"] hosts = ['maya'] label = 'Animation Out Set Related Node Ids' - actions = [pype.hosts.maya.action.SelectInvalidAction, pype.api.RepairAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] def process(self, instance): """Process all meshes""" diff --git a/pype/hosts/maya/plugins/publish/validate_ass_relative_paths.py b/pype/hosts/maya/plugins/publish/validate_ass_relative_paths.py index 22ebf52d49..b77a0c1923 100644 --- a/pype/hosts/maya/plugins/publish/validate_ass_relative_paths.py +++ b/pype/hosts/maya/plugins/publish/validate_ass_relative_paths.py @@ -5,7 +5,7 @@ import maya.cmds as cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateAssRelativePaths(pyblish.api.InstancePlugin): diff --git a/pype/hosts/maya/plugins/publish/validate_assembly_name.py b/pype/hosts/maya/plugins/publish/validate_assembly_name.py index 934275ca47..54479035c5 100644 --- a/pype/hosts/maya/plugins/publish/validate_assembly_name.py +++ b/pype/hosts/maya/plugins/publish/validate_assembly_name.py @@ -1,6 +1,6 @@ import pyblish.api import maya.cmds as cmds -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateAssemblyName(pyblish.api.InstancePlugin): @@ -12,7 +12,7 @@ class ValidateAssemblyName(pyblish.api.InstancePlugin): label = "Validate Assembly Name" order = pyblish.api.ValidatorOrder families = ["assembly"] - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] active = False @classmethod diff --git a/pype/hosts/maya/plugins/publish/validate_assembly_namespaces.py b/pype/hosts/maya/plugins/publish/validate_assembly_namespaces.py index 50fda1a758..32f4b8db52 100644 --- a/pype/hosts/maya/plugins/publish/validate_assembly_namespaces.py +++ b/pype/hosts/maya/plugins/publish/validate_assembly_namespaces.py @@ -1,6 +1,6 @@ import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateAssemblyNamespaces(pyblish.api.InstancePlugin): @@ -18,7 +18,7 @@ class ValidateAssemblyNamespaces(pyblish.api.InstancePlugin): label = "Validate Assembly Namespaces" order = pyblish.api.ValidatorOrder families = ["assembly"] - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_assembly_transforms.py b/pype/hosts/maya/plugins/publish/validate_assembly_transforms.py index c033f5374a..146736ba8d 100644 --- a/pype/hosts/maya/plugins/publish/validate_assembly_transforms.py +++ b/pype/hosts/maya/plugins/publish/validate_assembly_transforms.py @@ -3,7 +3,7 @@ import pype.api from maya import cmds -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin): @@ -28,7 +28,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder + 0.49 label = "Assembly Model Transforms" families = ["assembly"] - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] prompt_message = ("You are about to reset the matrix to the default values." @@ -44,7 +44,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin): @classmethod def get_invalid(cls, instance): - from pype.hosts.maya import lib + from pype.hosts.maya.api import lib # Get all transforms in the loaded containers container_roots = cmds.listRelatives(instance.data["hierarchy"], @@ -89,7 +89,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin): """ - from pype.hosts.maya import lib + from pype.hosts.maya.api import lib from avalon.vendor.Qt import QtWidgets # Store namespace in variable, cosmetics thingy diff --git a/pype/hosts/maya/plugins/publish/validate_camera_attributes.py b/pype/hosts/maya/plugins/publish/validate_camera_attributes.py index 1a1005d0f7..797244ba84 100644 --- a/pype/hosts/maya/plugins/publish/validate_camera_attributes.py +++ b/pype/hosts/maya/plugins/publish/validate_camera_attributes.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateCameraAttributes(pyblish.api.InstancePlugin): @@ -18,7 +18,7 @@ class ValidateCameraAttributes(pyblish.api.InstancePlugin): families = ['camera'] hosts = ['maya'] label = 'Camera Attributes' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] DEFAULTS = [ ("filmFitOffset", 0.0), diff --git a/pype/hosts/maya/plugins/publish/validate_camera_contents.py b/pype/hosts/maya/plugins/publish/validate_camera_contents.py index 27e2031e87..644cfd16bf 100644 --- a/pype/hosts/maya/plugins/publish/validate_camera_contents.py +++ b/pype/hosts/maya/plugins/publish/validate_camera_contents.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateCameraContents(pyblish.api.InstancePlugin): @@ -19,7 +19,7 @@ class ValidateCameraContents(pyblish.api.InstancePlugin): families = ['camera'] hosts = ['maya'] label = 'Camera Contents' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_color_sets.py b/pype/hosts/maya/plugins/publish/validate_color_sets.py index b1d8847f77..aa5901ee0a 100644 --- a/pype/hosts/maya/plugins/publish/validate_color_sets.py +++ b/pype/hosts/maya/plugins/publish/validate_color_sets.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateColorSets(pyblish.api.Validator): @@ -18,7 +18,7 @@ class ValidateColorSets(pyblish.api.Validator): families = ['model'] category = 'geometry' label = 'Mesh ColorSets' - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] optional = True diff --git a/pype/hosts/maya/plugins/publish/validate_instance_has_members.py b/pype/hosts/maya/plugins/publish/validate_instance_has_members.py index 04e7e1c5eb..b28a056198 100644 --- a/pype/hosts/maya/plugins/publish/validate_instance_has_members.py +++ b/pype/hosts/maya/plugins/publish/validate_instance_has_members.py @@ -1,6 +1,6 @@ import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateInstanceHasMembers(pyblish.api.InstancePlugin): @@ -9,7 +9,7 @@ class ValidateInstanceHasMembers(pyblish.api.InstancePlugin): order = pype.api.ValidateContentsOrder hosts = ["maya"] label = 'Instance has members' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_instancer_content.py b/pype/hosts/maya/plugins/publish/validate_instancer_content.py index a398aead02..74ed73ef53 100644 --- a/pype/hosts/maya/plugins/publish/validate_instancer_content.py +++ b/pype/hosts/maya/plugins/publish/validate_instancer_content.py @@ -1,7 +1,7 @@ import maya.cmds as cmds import pyblish.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class ValidateInstancerContent(pyblish.api.InstancePlugin): diff --git a/pype/hosts/maya/plugins/publish/validate_joints_hidden.py b/pype/hosts/maya/plugins/publish/validate_joints_hidden.py index 80ca29bfbf..61dfcd563d 100644 --- a/pype/hosts/maya/plugins/publish/validate_joints_hidden.py +++ b/pype/hosts/maya/plugins/publish/validate_joints_hidden.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateJointsHidden(pyblish.api.InstancePlugin): @@ -23,7 +23,7 @@ class ValidateJointsHidden(pyblish.api.InstancePlugin): category = 'rig' version = (0, 1, 0) label = "Joints Hidden" - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] @staticmethod diff --git a/pype/hosts/maya/plugins/publish/validate_look_contents.py b/pype/hosts/maya/plugins/publish/validate_look_contents.py index 577c88a7e3..8893fdfae8 100644 --- a/pype/hosts/maya/plugins/publish/validate_look_contents.py +++ b/pype/hosts/maya/plugins/publish/validate_look_contents.py @@ -1,6 +1,6 @@ import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateLookContents(pyblish.api.InstancePlugin): @@ -21,7 +21,7 @@ class ValidateLookContents(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Data Contents' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/pype/hosts/maya/plugins/publish/validate_look_id_reference_edits.py b/pype/hosts/maya/plugins/publish/validate_look_id_reference_edits.py index de44a3b31a..8cf5493d20 100644 --- a/pype/hosts/maya/plugins/publish/validate_look_id_reference_edits.py +++ b/pype/hosts/maya/plugins/publish/validate_look_id_reference_edits.py @@ -3,7 +3,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateLookIdReferenceEdits(pyblish.api.InstancePlugin): @@ -20,7 +20,7 @@ class ValidateLookIdReferenceEdits(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Id Reference Edits' - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] def process(self, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_look_members_unique.py b/pype/hosts/maya/plugins/publish/validate_look_members_unique.py index 8b6dd60e70..0b0b50715a 100644 --- a/pype/hosts/maya/plugins/publish/validate_look_members_unique.py +++ b/pype/hosts/maya/plugins/publish/validate_look_members_unique.py @@ -2,7 +2,7 @@ from collections import defaultdict import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateUniqueRelationshipMembers(pyblish.api.InstancePlugin): @@ -25,8 +25,8 @@ class ValidateUniqueRelationshipMembers(pyblish.api.InstancePlugin): hosts = ['maya'] families = ['look'] - actions = [pype.hosts.maya.action.SelectInvalidAction, - pype.hosts.maya.action.GenerateUUIDsOnInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction, + pype.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] def process(self, instance): """Process all meshes""" diff --git a/pype/hosts/maya/plugins/publish/validate_look_no_default_shaders.py b/pype/hosts/maya/plugins/publish/validate_look_no_default_shaders.py index 87859d390f..0d6a1ca562 100644 --- a/pype/hosts/maya/plugins/publish/validate_look_no_default_shaders.py +++ b/pype/hosts/maya/plugins/publish/validate_look_no_default_shaders.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): @@ -27,7 +27,7 @@ class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look No Default Shaders' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] DEFAULT_SHADERS = {"lambert1", "initialShadingGroup", "initialParticleSE", "particleCloud1"} diff --git a/pype/hosts/maya/plugins/publish/validate_look_sets.py b/pype/hosts/maya/plugins/publish/validate_look_sets.py index 4e06b564ed..d044d8ad2e 100644 --- a/pype/hosts/maya/plugins/publish/validate_look_sets.py +++ b/pype/hosts/maya/plugins/publish/validate_look_sets.py @@ -1,5 +1,5 @@ -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib import pyblish.api import pype.api @@ -42,7 +42,7 @@ class ValidateLookSets(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Sets' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/pype/hosts/maya/plugins/publish/validate_look_shading_group.py b/pype/hosts/maya/plugins/publish/validate_look_shading_group.py index e8911e3f2f..8d4e3ccf70 100644 --- a/pype/hosts/maya/plugins/publish/validate_look_shading_group.py +++ b/pype/hosts/maya/plugins/publish/validate_look_shading_group.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateShadingEngine(pyblish.api.InstancePlugin): @@ -16,7 +16,7 @@ class ValidateShadingEngine(pyblish.api.InstancePlugin): hosts = ["maya"] label = "Look Shading Engine Naming" actions = [ - pype.hosts.maya.action.SelectInvalidAction, pype.api.RepairAction + pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction ] # The default connections to check diff --git a/pype/hosts/maya/plugins/publish/validate_look_single_shader.py b/pype/hosts/maya/plugins/publish/validate_look_single_shader.py index 600652d16d..8c4835c5bf 100644 --- a/pype/hosts/maya/plugins/publish/validate_look_single_shader.py +++ b/pype/hosts/maya/plugins/publish/validate_look_single_shader.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateSingleShader(pyblish.api.InstancePlugin): @@ -16,7 +16,7 @@ class ValidateSingleShader(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Single Shader Per Shape' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] # The default connections to check def process(self, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_maya_units.py b/pype/hosts/maya/plugins/publish/validate_maya_units.py index 8712a90f44..c99b8eb813 100644 --- a/pype/hosts/maya/plugins/publish/validate_maya_units.py +++ b/pype/hosts/maya/plugins/publish/validate_maya_units.py @@ -3,7 +3,7 @@ import maya.cmds as cmds import pyblish.api import pype.api from pype import lib -import pype.hosts.maya.lib as mayalib +import pype.hosts.maya.api.lib as mayalib from math import ceil diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py b/pype/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py index 04a3cf3c79..a2792693af 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py @@ -2,7 +2,7 @@ import pymel.core as pc from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action from avalon import maya @@ -19,7 +19,7 @@ class ValidateMeshArnoldAttributes(pyblish.api.InstancePlugin): category = "geometry" label = "Mesh Arnold Attributes" actions = [ - pype.hosts.maya.action.SelectInvalidAction, + pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction ] optional = True diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_has_uv.py b/pype/hosts/maya/plugins/publish/validate_mesh_has_uv.py index f7b9b8503d..ae80b6a8f2 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_has_uv.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_has_uv.py @@ -4,7 +4,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action def len_flattened(components): @@ -50,7 +50,7 @@ class ValidateMeshHasUVs(pyblish.api.InstancePlugin): families = ['model'] category = 'geometry' label = 'Mesh Has UVs' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] optional = True @classmethod diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py b/pype/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py index 5ebb41b6f9..5628008a38 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin): @@ -18,7 +18,7 @@ class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin): category = 'geometry' version = (0, 1, 0) label = 'Mesh Lamina Faces' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py b/pype/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py index 988c94e4ef..8446808459 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateMeshNoNegativeScale(pyblish.api.Validator): @@ -21,7 +21,7 @@ class ValidateMeshNoNegativeScale(pyblish.api.Validator): hosts = ['maya'] families = ['model'] label = 'Mesh No Negative Scale' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_non_manifold.py b/pype/hosts/maya/plugins/publish/validate_mesh_non_manifold.py index 7559e9e17b..4a2773671d 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_non_manifold.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_non_manifold.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateMeshNonManifold(pyblish.api.Validator): @@ -17,7 +17,7 @@ class ValidateMeshNonManifold(pyblish.api.Validator): hosts = ['maya'] families = ['model'] label = 'Mesh Non-Manifold Vertices/Edges' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py b/pype/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py index 0d30312cad..0ed02328c8 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin): @@ -22,7 +22,7 @@ class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin): category = 'geometry' version = (0, 1, 0) label = 'Mesh Edge Length Non Zero' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] optional = True __tolerance = 1e-5 diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py b/pype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py index a764611b5c..d9d740cf13 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateMeshNormalsUnlocked(pyblish.api.Validator): @@ -19,7 +19,7 @@ class ValidateMeshNormalsUnlocked(pyblish.api.Validator): category = 'geometry' version = (0, 1, 0) label = 'Mesh Normals Unlocked' - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] optional = True diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py b/pype/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py index c6479675d2..3619d27298 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py @@ -1,6 +1,6 @@ import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action import math import maya.api.OpenMaya as om import pymel.core as pm @@ -235,7 +235,7 @@ class ValidateMeshHasOverlappingUVs(pyblish.api.InstancePlugin): families = ['model'] category = 'geometry' label = 'Mesh Has Overlapping UVs' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] optional = True @classmethod diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_shader_connections.py b/pype/hosts/maya/plugins/publish/validate_mesh_shader_connections.py index a31df7c0ae..b9542fe930 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_shader_connections.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_shader_connections.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action def pairs(iterable): @@ -77,7 +77,7 @@ class ValidateMeshShaderConnections(pyblish.api.InstancePlugin): hosts = ['maya'] families = ['model'] label = "Mesh Shader Connections" - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] def process(self, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py b/pype/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py index 87d83c070e..348bcb5fad 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin): @@ -22,7 +22,7 @@ class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin): optional = True version = (0, 1, 0) label = "Mesh Single UV Set" - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] @staticmethod diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py b/pype/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py index 8bf5c55f65..5f954ee917 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin): @@ -20,7 +20,7 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin): families = ['model'] optional = True label = "Mesh has map1 UV Set" - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] @staticmethod diff --git a/pype/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py b/pype/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py index 2dd65da7d2..8d39c5cae4 100644 --- a/pype/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py +++ b/pype/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py @@ -4,7 +4,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action def len_flattened(components): @@ -62,7 +62,7 @@ class ValidateMeshVerticesHaveEdges(pyblish.api.InstancePlugin): families = ['model'] category = 'geometry' label = 'Mesh Vertices Have Edges' - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] @classmethod diff --git a/pype/hosts/maya/plugins/publish/validate_model_content.py b/pype/hosts/maya/plugins/publish/validate_model_content.py index fd7c69ead7..9bec7187e9 100644 --- a/pype/hosts/maya/plugins/publish/validate_model_content.py +++ b/pype/hosts/maya/plugins/publish/validate_model_content.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateModelContent(pyblish.api.InstancePlugin): @@ -18,7 +18,7 @@ class ValidateModelContent(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["model"] label = "Model Content" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_model_name.py b/pype/hosts/maya/plugins/publish/validate_model_name.py index 716b7d5f98..f0004dc81e 100644 --- a/pype/hosts/maya/plugins/publish/validate_model_name.py +++ b/pype/hosts/maya/plugins/publish/validate_model_name.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action import re @@ -18,7 +18,7 @@ class ValidateModelName(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["model"] label = "Model Name" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] # path to shader names definitions # TODO: move it to preset file material_file = None diff --git a/pype/hosts/maya/plugins/publish/validate_muster_connection.py b/pype/hosts/maya/plugins/publish/validate_muster_connection.py index 35acdb326f..ad1022c71d 100644 --- a/pype/hosts/maya/plugins/publish/validate_muster_connection.py +++ b/pype/hosts/maya/plugins/publish/validate_muster_connection.py @@ -5,7 +5,7 @@ import appdirs import pyblish.api from avalon.vendor import requests from pype.plugin import contextplugin_should_run -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateMusterConnection(pyblish.api.ContextPlugin): diff --git a/pype/hosts/maya/plugins/publish/validate_no_animation.py b/pype/hosts/maya/plugins/publish/validate_no_animation.py index fc198745c0..a6daf3246e 100644 --- a/pype/hosts/maya/plugins/publish/validate_no_animation.py +++ b/pype/hosts/maya/plugins/publish/validate_no_animation.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateNoAnimation(pyblish.api.Validator): @@ -19,7 +19,7 @@ class ValidateNoAnimation(pyblish.api.Validator): hosts = ["maya"] families = ["model"] optional = True - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_no_default_camera.py b/pype/hosts/maya/plugins/publish/validate_no_default_camera.py index 876612c076..07ec2e4325 100644 --- a/pype/hosts/maya/plugins/publish/validate_no_default_camera.py +++ b/pype/hosts/maya/plugins/publish/validate_no_default_camera.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateNoDefaultCameras(pyblish.api.InstancePlugin): @@ -18,7 +18,7 @@ class ValidateNoDefaultCameras(pyblish.api.InstancePlugin): families = ['camera'] version = (0, 1, 0) label = "No Default Cameras" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/pype/hosts/maya/plugins/publish/validate_no_namespace.py b/pype/hosts/maya/plugins/publish/validate_no_namespace.py index 6a6c7792c5..97cd46e68a 100644 --- a/pype/hosts/maya/plugins/publish/validate_no_namespace.py +++ b/pype/hosts/maya/plugins/publish/validate_no_namespace.py @@ -3,7 +3,7 @@ import maya.cmds as cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action def get_namespace(node_name): @@ -22,7 +22,7 @@ class ValidateNoNamespace(pyblish.api.InstancePlugin): category = 'cleanup' version = (0, 1, 0) label = 'No Namespaces' - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] @staticmethod diff --git a/pype/hosts/maya/plugins/publish/validate_no_null_transforms.py b/pype/hosts/maya/plugins/publish/validate_no_null_transforms.py index aa35c47339..78f06bbbd8 100644 --- a/pype/hosts/maya/plugins/publish/validate_no_null_transforms.py +++ b/pype/hosts/maya/plugins/publish/validate_no_null_transforms.py @@ -2,7 +2,7 @@ import maya.cmds as cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action def has_shape_children(node): @@ -44,7 +44,7 @@ class ValidateNoNullTransforms(pyblish.api.InstancePlugin): version = (0, 1, 0) label = 'No Empty/Null Transforms' actions = [pype.api.RepairAction, - pype.hosts.maya.action.SelectInvalidAction] + pype.hosts.maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/pype/hosts/maya/plugins/publish/validate_no_unknown_nodes.py b/pype/hosts/maya/plugins/publish/validate_no_unknown_nodes.py index 04c8fd04bc..6b2f1337d3 100644 --- a/pype/hosts/maya/plugins/publish/validate_no_unknown_nodes.py +++ b/pype/hosts/maya/plugins/publish/validate_no_unknown_nodes.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateNoUnknownNodes(pyblish.api.InstancePlugin): @@ -21,7 +21,7 @@ class ValidateNoUnknownNodes(pyblish.api.InstancePlugin): families = ['model', 'rig'] optional = True label = "Unknown Nodes" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/pype/hosts/maya/plugins/publish/validate_node_ids.py b/pype/hosts/maya/plugins/publish/validate_node_ids.py index 777d810c80..4942d44d70 100644 --- a/pype/hosts/maya/plugins/publish/validate_node_ids.py +++ b/pype/hosts/maya/plugins/publish/validate_node_ids.py @@ -1,8 +1,8 @@ import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class ValidateNodeIDs(pyblish.api.InstancePlugin): @@ -25,8 +25,8 @@ class ValidateNodeIDs(pyblish.api.InstancePlugin): "yetiRig", "assembly"] - actions = [pype.hosts.maya.action.SelectInvalidAction, - pype.hosts.maya.action.GenerateUUIDsOnInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction, + pype.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] def process(self, instance): """Process all meshes""" diff --git a/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py b/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py index 49b78f79bc..4bf66a464f 100644 --- a/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py +++ b/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): @@ -20,7 +20,7 @@ class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Deformed shape ids' - actions = [pype.hosts.maya.action.SelectInvalidAction, pype.api.RepairAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/pype/hosts/maya/plugins/publish/validate_node_ids_in_database.py b/pype/hosts/maya/plugins/publish/validate_node_ids_in_database.py index 15241411b7..154d0c1d38 100644 --- a/pype/hosts/maya/plugins/publish/validate_node_ids_in_database.py +++ b/pype/hosts/maya/plugins/publish/validate_node_ids_in_database.py @@ -3,8 +3,8 @@ import pyblish.api from avalon import io import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): @@ -23,8 +23,8 @@ class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): hosts = ['maya'] families = ["*"] - actions = [pype.hosts.maya.action.SelectInvalidAction, - pype.hosts.maya.action.GenerateUUIDsOnInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction, + pype.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] def process(self, instance): invalid = self.get_invalid(instance) diff --git a/pype/hosts/maya/plugins/publish/validate_node_ids_related.py b/pype/hosts/maya/plugins/publish/validate_node_ids_related.py index 193e53440a..390e5c157a 100644 --- a/pype/hosts/maya/plugins/publish/validate_node_ids_related.py +++ b/pype/hosts/maya/plugins/publish/validate_node_ids_related.py @@ -2,9 +2,9 @@ import pyblish.api import pype.api from avalon import io -import pype.hosts.maya.action +import pype.hosts.maya.api.action -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class ValidateNodeIDsRelated(pyblish.api.InstancePlugin): @@ -20,8 +20,8 @@ class ValidateNodeIDsRelated(pyblish.api.InstancePlugin): "rig"] optional = True - actions = [pype.hosts.maya.action.SelectInvalidAction, - pype.hosts.maya.action.GenerateUUIDsOnInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction, + pype.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] def process(self, instance): """Process all nodes in instance (including hierarchy)""" diff --git a/pype/hosts/maya/plugins/publish/validate_node_ids_unique.py b/pype/hosts/maya/plugins/publish/validate_node_ids_unique.py index 3a66941f89..20320854f0 100644 --- a/pype/hosts/maya/plugins/publish/validate_node_ids_unique.py +++ b/pype/hosts/maya/plugins/publish/validate_node_ids_unique.py @@ -2,8 +2,8 @@ from collections import defaultdict import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): @@ -20,8 +20,8 @@ class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): "rig", "yetiRig"] - actions = [pype.hosts.maya.action.SelectInvalidAction, - pype.hosts.maya.action.GenerateUUIDsOnInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction, + pype.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] def process(self, instance): """Process all meshes""" diff --git a/pype/hosts/maya/plugins/publish/validate_node_no_ghosting.py b/pype/hosts/maya/plugins/publish/validate_node_no_ghosting.py index a4b3122b34..3acd5b027d 100644 --- a/pype/hosts/maya/plugins/publish/validate_node_no_ghosting.py +++ b/pype/hosts/maya/plugins/publish/validate_node_no_ghosting.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateNodeNoGhosting(pyblish.api.InstancePlugin): @@ -21,7 +21,7 @@ class ValidateNodeNoGhosting(pyblish.api.InstancePlugin): hosts = ['maya'] families = ['model', 'rig'] label = "No Ghosting" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] _attributes = {'ghosting': 0} diff --git a/pype/hosts/maya/plugins/publish/validate_render_no_default_cameras.py b/pype/hosts/maya/plugins/publish/validate_render_no_default_cameras.py index 8c1fb42f1a..38383310a2 100644 --- a/pype/hosts/maya/plugins/publish/validate_render_no_default_cameras.py +++ b/pype/hosts/maya/plugins/publish/validate_render_no_default_cameras.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateRenderNoDefaultCameras(pyblish.api.InstancePlugin): @@ -12,7 +12,7 @@ class ValidateRenderNoDefaultCameras(pyblish.api.InstancePlugin): hosts = ['maya'] families = ['renderlayer'] label = "No Default Cameras Renderable" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/pype/hosts/maya/plugins/publish/validate_render_single_camera.py b/pype/hosts/maya/plugins/publish/validate_render_single_camera.py index 482cf2fb59..268a6599e2 100644 --- a/pype/hosts/maya/plugins/publish/validate_render_single_camera.py +++ b/pype/hosts/maya/plugins/publish/validate_render_single_camera.py @@ -2,7 +2,7 @@ import re import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action from maya import cmds @@ -28,7 +28,7 @@ class ValidateRenderSingleCamera(pyblish.api.InstancePlugin): hosts = ['maya'] families = ["renderlayer", "vrayscene"] - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] R_CAMERA_TOKEN = re.compile(r'%c|', re.IGNORECASE) diff --git a/pype/hosts/maya/plugins/publish/validate_renderlayer_aovs.py b/pype/hosts/maya/plugins/publish/validate_renderlayer_aovs.py index aba8fdaa96..7fdd8b377c 100644 --- a/pype/hosts/maya/plugins/publish/validate_renderlayer_aovs.py +++ b/pype/hosts/maya/plugins/publish/validate_renderlayer_aovs.py @@ -1,6 +1,6 @@ import pyblish.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action from avalon import io import pype.api @@ -25,7 +25,7 @@ class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin): label = "Render Passes / AOVs Are Registered" hosts = ["maya"] families = ["renderlayer"] - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): invalid = self.get_invalid(instance) diff --git a/pype/hosts/maya/plugins/publish/validate_rendersettings.py b/pype/hosts/maya/plugins/publish/validate_rendersettings.py index 297ead5ebb..88a386db57 100644 --- a/pype/hosts/maya/plugins/publish/validate_rendersettings.py +++ b/pype/hosts/maya/plugins/publish/validate_rendersettings.py @@ -6,7 +6,7 @@ import pymel.core as pm import pyblish.api import pype.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib class ValidateRenderSettings(pyblish.api.InstancePlugin): diff --git a/pype/hosts/maya/plugins/publish/validate_rig_controllers.py b/pype/hosts/maya/plugins/publish/validate_rig_controllers.py index a127728155..ef0df2df7c 100644 --- a/pype/hosts/maya/plugins/publish/validate_rig_controllers.py +++ b/pype/hosts/maya/plugins/publish/validate_rig_controllers.py @@ -3,8 +3,8 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya.lib import undo_chunk +import pype.hosts.maya.api.action +from pype.hosts.maya.api.lib import undo_chunk class ValidateRigControllers(pyblish.api.InstancePlugin): @@ -30,7 +30,7 @@ class ValidateRigControllers(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["rig"] actions = [pype.api.RepairAction, - pype.hosts.maya.action.SelectInvalidAction] + pype.hosts.maya.api.action.SelectInvalidAction] # Default controller values CONTROLLER_DEFAULTS = { diff --git a/pype/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py b/pype/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py index 8c1f8e4c7b..f19e3fbb61 100644 --- a/pype/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py +++ b/pype/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py @@ -3,8 +3,8 @@ from maya import cmds import pyblish.api import pype.api -from pype.hosts.maya import lib -import pype.hosts.maya.action +from pype.hosts.maya.api import lib +import pype.hosts.maya.api.action class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin): @@ -31,7 +31,7 @@ class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["rig"] actions = [pype.api.RepairAction, - pype.hosts.maya.action.SelectInvalidAction] + pype.hosts.maya.api.action.SelectInvalidAction] attributes = [ "rcurve", diff --git a/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py b/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py index 97dca803ee..d1502f885d 100644 --- a/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py +++ b/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py @@ -2,8 +2,8 @@ import maya.cmds as cmds import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya import lib +import pype.hosts.maya.api.action +from pype.hosts.maya.api import lib class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin): @@ -20,7 +20,7 @@ class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin): families = ["rig"] hosts = ['maya'] label = 'Rig Out Set Node Ids' - actions = [pype.hosts.maya.action.SelectInvalidAction, pype.api.RepairAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] def process(self, instance): """Process all meshes""" diff --git a/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py b/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py index fe9662d9d9..43d287ae97 100644 --- a/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py +++ b/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py @@ -3,8 +3,8 @@ import pymel.core as pc import pyblish.api import pype.api -import pype.hosts.maya.action -from pype.hosts.maya.lib import undo_chunk +import pype.hosts.maya.api.action +from pype.hosts.maya.api.lib import undo_chunk class ValidateRigOutputIds(pyblish.api.InstancePlugin): @@ -19,7 +19,7 @@ class ValidateRigOutputIds(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["rig"] actions = [pype.api.RepairAction, - pype.hosts.maya.action.SelectInvalidAction] + pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): invalid = self.get_invalid(instance, compute=True) diff --git a/pype/hosts/maya/plugins/publish/validate_shader_name.py b/pype/hosts/maya/plugins/publish/validate_shader_name.py index 094ac0afe9..4a42ec6e35 100644 --- a/pype/hosts/maya/plugins/publish/validate_shader_name.py +++ b/pype/hosts/maya/plugins/publish/validate_shader_name.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action import re @@ -18,7 +18,7 @@ class ValidateShaderName(pyblish.api.InstancePlugin): families = ["look"] hosts = ['maya'] label = 'Validate Shaders Name' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] regex = r'(?P.*)_(.*)_SHD' # The default connections to check diff --git a/pype/hosts/maya/plugins/publish/validate_shape_default_names.py b/pype/hosts/maya/plugins/publish/validate_shape_default_names.py index c0638863da..cd4e9905d9 100644 --- a/pype/hosts/maya/plugins/publish/validate_shape_default_names.py +++ b/pype/hosts/maya/plugins/publish/validate_shape_default_names.py @@ -4,7 +4,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action def short_name(node): @@ -38,7 +38,7 @@ class ValidateShapeDefaultNames(pyblish.api.InstancePlugin): optional = True version = (0, 1, 0) label = "Shape Default Naming" - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] @staticmethod diff --git a/pype/hosts/maya/plugins/publish/validate_shape_render_stats.py b/pype/hosts/maya/plugins/publish/validate_shape_render_stats.py index af48d664ec..c94becabe9 100644 --- a/pype/hosts/maya/plugins/publish/validate_shape_render_stats.py +++ b/pype/hosts/maya/plugins/publish/validate_shape_render_stats.py @@ -3,7 +3,7 @@ import pype.api from maya import cmds -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateShapeRenderStats(pyblish.api.Validator): @@ -13,7 +13,7 @@ class ValidateShapeRenderStats(pyblish.api.Validator): hosts = ['maya'] families = ['model'] label = 'Shape Default Render Stats' - actions = [pype.hosts.maya.action.SelectInvalidAction, + actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] defaults = {'castsShadows': 1, diff --git a/pype/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py b/pype/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py index 39870658ad..2d28d26b0f 100644 --- a/pype/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py +++ b/pype/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateSkinclusterDeformerSet(pyblish.api.InstancePlugin): @@ -18,7 +18,7 @@ class ValidateSkinclusterDeformerSet(pyblish.api.InstancePlugin): hosts = ['maya'] families = ['fbx'] label = "Skincluster Deformer Relationships" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): """Process all the transform nodes in the instance""" diff --git a/pype/hosts/maya/plugins/publish/validate_step_size.py b/pype/hosts/maya/plugins/publish/validate_step_size.py index 5e46e7df0b..502a1c37c2 100644 --- a/pype/hosts/maya/plugins/publish/validate_step_size.py +++ b/pype/hosts/maya/plugins/publish/validate_step_size.py @@ -1,6 +1,6 @@ import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateStepSize(pyblish.api.InstancePlugin): @@ -15,7 +15,7 @@ class ValidateStepSize(pyblish.api.InstancePlugin): families = ['camera', 'pointcache', 'animation'] - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] MIN = 0.01 MAX = 1.0 diff --git a/pype/hosts/maya/plugins/publish/validate_transform_naming_suffix.py b/pype/hosts/maya/plugins/publish/validate_transform_naming_suffix.py index 120123af4b..14d4e7d5c8 100644 --- a/pype/hosts/maya/plugins/publish/validate_transform_naming_suffix.py +++ b/pype/hosts/maya/plugins/publish/validate_transform_naming_suffix.py @@ -4,7 +4,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin): @@ -34,7 +34,7 @@ class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin): optional = True version = (0, 1, 0) label = 'Suffix Naming Conventions' - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] SUFFIX_NAMING_TABLE = {'mesh': ["_GEO", "_GES", "_GEP", "_OSD"], 'nurbsCurve': ["_CRV"], 'nurbsSurface': ["_NRB"], diff --git a/pype/hosts/maya/plugins/publish/validate_transform_zero.py b/pype/hosts/maya/plugins/publish/validate_transform_zero.py index ac5517061f..0cecc3124b 100644 --- a/pype/hosts/maya/plugins/publish/validate_transform_zero.py +++ b/pype/hosts/maya/plugins/publish/validate_transform_zero.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateTransformZero(pyblish.api.Validator): @@ -20,7 +20,7 @@ class ValidateTransformZero(pyblish.api.Validator): category = "geometry" version = (0, 1, 0) label = "Transform Zero (Freeze)" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] _identity = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, diff --git a/pype/hosts/maya/plugins/publish/validate_unicode_strings.py b/pype/hosts/maya/plugins/publish/validate_unicode_strings.py index bf44d971af..cfcba4f514 100644 --- a/pype/hosts/maya/plugins/publish/validate_unicode_strings.py +++ b/pype/hosts/maya/plugins/publish/validate_unicode_strings.py @@ -3,7 +3,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateUnicodeStrings(pyblish.api.Validator): diff --git a/pype/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py b/pype/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py index 2cefe27019..9011b584fe 100644 --- a/pype/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py +++ b/pype/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py @@ -13,7 +13,7 @@ class ValidateUnrealMeshTriangulated(pyblish.api.InstancePlugin): families = ["unrealStaticMesh"] category = "geometry" label = "Mesh is Triangulated" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py b/pype/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py index 4116c5f534..8bda849b3f 100644 --- a/pype/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/pype/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py @@ -3,7 +3,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action import re @@ -51,7 +51,7 @@ class ValidateUnrealStaticmeshName(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["unrealStaticMesh"] label = "Unreal StaticMesh Name" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] regex_mesh = r"SM_(?P.*)_(\d{2})" regex_collision = r"((UBX)|(UCP)|(USP)|(UCX))_(?P.*)_(\d{2})" diff --git a/pype/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py b/pype/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py index 6bec0c88dd..0c3086fee0 100644 --- a/pype/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py +++ b/pype/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py @@ -1,6 +1,6 @@ import pyblish.api import pype.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib from maya import cmds diff --git a/pype/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py b/pype/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py index 120677021d..f451a08b0b 100644 --- a/pype/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py +++ b/pype/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py @@ -4,7 +4,7 @@ import pyblish.api import types from maya import cmds -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateVrayReferencedAOVs(pyblish.api.InstancePlugin): diff --git a/pype/hosts/maya/plugins/publish/validate_vrayproxy_members.py b/pype/hosts/maya/plugins/publish/validate_vrayproxy_members.py index 75946a6787..829c2d67ae 100644 --- a/pype/hosts/maya/plugins/publish/validate_vrayproxy_members.py +++ b/pype/hosts/maya/plugins/publish/validate_vrayproxy_members.py @@ -3,7 +3,7 @@ import pype.api from maya import cmds -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateVrayProxyMembers(pyblish.api.InstancePlugin): @@ -13,7 +13,7 @@ class ValidateVrayProxyMembers(pyblish.api.InstancePlugin): label = 'VRay Proxy Members' hosts = ['maya'] families = ['vrayproxy'] - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): diff --git a/pype/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py b/pype/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py index 1ed145fecd..7eb3153d1e 100644 --- a/pype/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py +++ b/pype/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py @@ -1,7 +1,7 @@ import pyblish.api import pype.action import maya.cmds as cmds -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateYetiRigCacheState(pyblish.api.InstancePlugin): @@ -18,7 +18,7 @@ class ValidateYetiRigCacheState(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["yetiRig"] actions = [pype.action.RepairAction, - pype.hosts.maya.action.SelectInvalidAction] + pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): invalid = self.get_invalid(instance) diff --git a/pype/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py b/pype/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py index 647a66cb57..c0bd46efc1 100644 --- a/pype/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py +++ b/pype/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import pype.api -import pype.hosts.maya.action +import pype.hosts.maya.api.action class ValidateYetiRigInputShapesInInstance(pyblish.api.Validator): @@ -12,7 +12,7 @@ class ValidateYetiRigInputShapesInInstance(pyblish.api.Validator): hosts = ["maya"] families = ["yetiRig"] label = "Yeti Rig Input Shapes In Instance" - actions = [pype.hosts.maya.action.SelectInvalidAction] + actions = [pype.hosts.maya.api.action.SelectInvalidAction] def process(self, instance): From 63361832b26b23ac5fbd33ee003be5f798f49bc5 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 10:54:39 +0100 Subject: [PATCH 081/113] change maya usersetup import --- pype/hosts/maya/startup/userSetup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/hosts/maya/startup/userSetup.py b/pype/hosts/maya/startup/userSetup.py index 6ee008c5fc..a562d3ab9e 100644 --- a/pype/hosts/maya/startup/userSetup.py +++ b/pype/hosts/maya/startup/userSetup.py @@ -1,6 +1,6 @@ import os from pype.api import get_project_settings -import pype.hosts.maya.lib as mlib +import pype.hosts.maya.api.lib as mlib from maya import cmds From 48c96679759fc14a1d7fe24d8334ca2b7ec80d2b Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 10:54:51 +0100 Subject: [PATCH 082/113] change maya deadline import --- pype/modules/deadline/plugins/publish/submit_maya_deadline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/modules/deadline/plugins/publish/submit_maya_deadline.py b/pype/modules/deadline/plugins/publish/submit_maya_deadline.py index 5811ff4886..08b7479350 100644 --- a/pype/modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/pype/modules/deadline/plugins/publish/submit_maya_deadline.py @@ -35,7 +35,7 @@ from maya import cmds from avalon import api import pyblish.api -from pype.hosts.maya import lib +from pype.hosts.maya.api import lib # Documentation for keys available at: # https://docs.thinkboxsoftware.com From c8d1fd25e439617f787f418cdbc1d285d8670fca Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 10:56:54 +0100 Subject: [PATCH 083/113] move maya sedress api to maya host --- pype/hosts/maya/plugins/load/load_assembly.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pype/hosts/maya/plugins/load/load_assembly.py b/pype/hosts/maya/plugins/load/load_assembly.py index 4f72ff9e13..a5f2394444 100644 --- a/pype/hosts/maya/plugins/load/load_assembly.py +++ b/pype/hosts/maya/plugins/load/load_assembly.py @@ -23,9 +23,9 @@ class AssemblyLoader(api.Loader): suffix="_", ) - from pype import setdress_api + from pype.hosts.maya.api import setdress - containers = setdress_api.load_package(filepath=self.fname, + containers = setdress.load_package(filepath=self.fname, name=name, namespace=namespace) @@ -45,19 +45,19 @@ class AssemblyLoader(api.Loader): def update(self, container, representation): - from pype import setdress_api - return setdress_api.update_package(container, + from pype import setdress + return setdress.update_package(container, representation) def remove(self, container): """Remove all sub containers""" from avalon import api - from pype import setdress_api + from pype import setdress import maya.cmds as cmds # Remove all members - member_containers = setdress_api.get_contained_containers(container) + member_containers = setdress.get_contained_containers(container) for member_container in member_containers: self.log.info("Removing container %s", member_container['objectName']) From a38abee4d90c6df5becf1145c024e051b2cd9411 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 11:00:33 +0100 Subject: [PATCH 084/113] update maya-look-assigner --- repos/maya-look-assigner | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/maya-look-assigner b/repos/maya-look-assigner index baf19fe86a..7adabe8f0e 160000 --- a/repos/maya-look-assigner +++ b/repos/maya-look-assigner @@ -1 +1 @@ -Subproject commit baf19fe86a836259c0ce050b229cd521625708bf +Subproject commit 7adabe8f0e6858bfe5b6bf0b39bd428ed72d0452 From 9e54747c747c9bad3c908d32225698737cef766c Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 11:22:32 +0100 Subject: [PATCH 085/113] fix hound --- pype/hosts/maya/plugins/load/load_gpucache.py | 5 +---- pype/hosts/maya/plugins/publish/extract_assproxy.py | 1 - .../publish/validate_animation_out_set_related_node_ids.py | 5 ++++- .../plugins/publish/validate_node_ids_deformed_shapes.py | 5 ++++- .../maya/plugins/publish/validate_rig_out_set_node_ids.py | 5 ++++- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pype/hosts/maya/plugins/load/load_gpucache.py b/pype/hosts/maya/plugins/load/load_gpucache.py index a183a46cd3..e6fde1eaa8 100644 --- a/pype/hosts/maya/plugins/load/load_gpucache.py +++ b/pype/hosts/maya/plugins/load/load_gpucache.py @@ -1,9 +1,6 @@ -from avalon import api -import pype.hosts.maya.api.plugin import os +from avalon import api from pype.api import get_project_settings -reload(config) - class GpuCacheLoader(api.Loader): """Load model Alembic as gpuCache""" diff --git a/pype/hosts/maya/plugins/publish/extract_assproxy.py b/pype/hosts/maya/plugins/publish/extract_assproxy.py index 80cca1396b..3579d26534 100644 --- a/pype/hosts/maya/plugins/publish/extract_assproxy.py +++ b/pype/hosts/maya/plugins/publish/extract_assproxy.py @@ -5,7 +5,6 @@ import contextlib import avalon.maya import pype.api -from pype.hosts.maya.api import lib class ExtractAssProxy(pype.api.Extractor): diff --git a/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py b/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py index ffafd14bcd..6bea9bf856 100644 --- a/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py +++ b/pype/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py @@ -20,7 +20,10 @@ class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin): families = ['animation', "pointcache"] hosts = ['maya'] label = 'Animation Out Set Related Node Ids' - actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] + actions = [ + pype.hosts.maya.api.action.SelectInvalidAction, + pype.api.RepairAction + ] def process(self, instance): """Process all meshes""" diff --git a/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py b/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py index 4bf66a464f..757414a074 100644 --- a/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py +++ b/pype/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py @@ -20,7 +20,10 @@ class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Deformed shape ids' - actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] + actions = [ + pype.hosts.maya.api.action.SelectInvalidAction, + pype.api.RepairAction + ] def process(self, instance): """Process all the nodes in the instance""" diff --git a/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py b/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py index d1502f885d..1782395d96 100644 --- a/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py +++ b/pype/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py @@ -20,7 +20,10 @@ class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin): families = ["rig"] hosts = ['maya'] label = 'Rig Out Set Node Ids' - actions = [pype.hosts.maya.api.action.SelectInvalidAction, pype.api.RepairAction] + actions = [ + pype.hosts.maya.api.action.SelectInvalidAction, + pype.api.RepairAction + ] def process(self, instance): """Process all meshes""" From a42d59208fa26464efb4d352733dc1ed2e079a4b Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 11:22:50 +0100 Subject: [PATCH 086/113] change maya callbacks to new host structure --- pype/hosts/maya/api/__init__.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/pype/hosts/maya/api/__init__.py b/pype/hosts/maya/api/__init__.py index 35d8d92d26..c2506e3284 100644 --- a/pype/hosts/maya/api/__init__.py +++ b/pype/hosts/maya/api/__init__.py @@ -154,11 +154,14 @@ def on_open(): from ...widgets import popup cmds.evalDeferred( - "from pype.hosts.maya import lib;lib.remove_render_layer_observer()") + "from pype.hosts.maya.api import lib;" + "lib.remove_render_layer_observer()") cmds.evalDeferred( - "from pype.hosts.maya import lib;lib.add_render_layer_observer()") + "from pype.hosts.maya.api import lib;" + "lib.add_render_layer_observer()") cmds.evalDeferred( - "from pype.hosts.maya import lib;lib.add_render_layer_change_observer()") + "from pype.hosts.maya.api import lib;" + "lib.add_render_layer_change_observer()") # # Update current task for the current scene # update_task_from_path(cmds.file(query=True, sceneName=True)) @@ -198,11 +201,14 @@ def on_new(_): avalon.logger.info("Running callback on new..") with suspended_refresh(): cmds.evalDeferred( - "from pype.hosts.maya import lib;lib.remove_render_layer_observer()") + "from pype.hosts.maya.api import lib;" + "lib.remove_render_layer_observer()") cmds.evalDeferred( - "from pype.hosts.maya import lib;lib.add_render_layer_observer()") + "from pype.hosts.maya.api import lib;" + "lib.add_render_layer_observer()") cmds.evalDeferred( - "from pype.hosts.maya import lib;lib.add_render_layer_change_observer()") + "from pype.hosts.maya.api import lib;" + "lib.add_render_layer_change_observer()") lib.set_context_settings() @@ -214,6 +220,7 @@ def on_task_changed(*args): lib.set_context_settings() lib.update_content_on_context_change() - lib.show_message("Context was changed", - ("Context was changed to {}".format( - avalon.Session["AVALON_ASSET"]))) + lib.show_message( + "Context was changed", + ("Context was changed to {}".format(avalon.Session["AVALON_ASSET"])), + ) \ No newline at end of file From b2e152a16f9cfd0318e508383b2a67333fb80dbf Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 11:43:55 +0100 Subject: [PATCH 087/113] change blender import to new structure --- pype/hosts/blender/{ => api}/action.py | 2 +- pype/hosts/blender/{ => api}/plugin.py | 0 pype/hosts/blender/startup/init.py | 3 +++ pype/setup/blender/init.py | 3 --- 4 files changed, 4 insertions(+), 4 deletions(-) rename pype/hosts/blender/{ => api}/action.py (96%) rename pype/hosts/blender/{ => api}/plugin.py (100%) create mode 100644 pype/hosts/blender/startup/init.py delete mode 100644 pype/setup/blender/init.py diff --git a/pype/hosts/blender/action.py b/pype/hosts/blender/api/action.py similarity index 96% rename from pype/hosts/blender/action.py rename to pype/hosts/blender/api/action.py index 78d00f56ad..b140688670 100644 --- a/pype/hosts/blender/action.py +++ b/pype/hosts/blender/api/action.py @@ -2,7 +2,7 @@ import bpy import pyblish.api -from ...action import get_errored_instances_from_context +from pype.api import get_errored_instances_from_context class SelectInvalidAction(pyblish.api.Action): diff --git a/pype/hosts/blender/plugin.py b/pype/hosts/blender/api/plugin.py similarity index 100% rename from pype/hosts/blender/plugin.py rename to pype/hosts/blender/api/plugin.py diff --git a/pype/hosts/blender/startup/init.py b/pype/hosts/blender/startup/init.py new file mode 100644 index 0000000000..9d078f44a3 --- /dev/null +++ b/pype/hosts/blender/startup/init.py @@ -0,0 +1,3 @@ +from pype.hosts import blender.api + +blender.api.install() diff --git a/pype/setup/blender/init.py b/pype/setup/blender/init.py deleted file mode 100644 index 8aa83e51c9..0000000000 --- a/pype/setup/blender/init.py +++ /dev/null @@ -1,3 +0,0 @@ -from pype.hosts import blender - -blender.install() From a9de95dd7c82a3139e1062165f5047b2ff6273ce Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 11:44:13 +0100 Subject: [PATCH 088/113] move blender plugins to host folder --- .../blender/plugins}/create/create_action.py | 4 +- .../plugins}/create/create_animation.py | 4 +- .../blender/plugins}/create/create_camera.py | 4 +- .../blender/plugins}/create/create_layout.py | 4 +- .../blender/plugins}/create/create_model.py | 4 +- .../blender/plugins}/create/create_rig.py | 4 +- .../plugins}/create/create_setdress.py | 4 +- pype/hosts/blender/plugins/load/__init__.py | 0 .../blender/plugins}/load/load_action.py | 10 +- .../blender/plugins}/load/load_animation.py | 10 +- .../blender/plugins}/load/load_camera.py | 10 +- .../blender/plugins}/load/load_layout.py | 2 +- .../blender/plugins}/load/load_model.py | 2 +- .../blender/plugins}/load/load_rig.py | 2 +- .../plugins}/publish/collect_current_file.py | 0 .../plugins}/publish/collect_instances.py | 0 .../blender/plugins}/publish/extract_abc.py | 5 +- .../publish/extract_animation_collection.py | 31 +++--- .../blender/plugins}/publish/extract_blend.py | 94 +++++++++---------- .../blender/plugins}/publish/extract_fbx.py | 0 .../plugins}/publish/extract_fbx_animation.py | 0 .../publish/increment_workfile_version.py | 0 .../plugins}/publish/integrate_animation.py | 0 .../plugins}/publish/validate_mesh_has_uv.py | 4 +- .../validate_mesh_no_negative_scale.py | 4 +- 25 files changed, 104 insertions(+), 98 deletions(-) rename pype/{plugins/blender => hosts/blender/plugins}/create/create_action.py (91%) rename pype/{plugins/blender => hosts/blender/plugins}/create/create_animation.py (87%) rename pype/{plugins/blender => hosts/blender/plugins}/create/create_camera.py (87%) rename pype/{plugins/blender => hosts/blender/plugins}/create/create_layout.py (91%) rename pype/{plugins/blender => hosts/blender/plugins}/create/create_model.py (87%) rename pype/{plugins/blender => hosts/blender/plugins}/create/create_rig.py (92%) rename pype/{plugins/blender => hosts/blender/plugins}/create/create_setdress.py (84%) create mode 100644 pype/hosts/blender/plugins/load/__init__.py rename pype/{plugins/blender => hosts/blender/plugins}/load/load_action.py (96%) rename pype/{plugins/blender => hosts/blender/plugins}/load/load_animation.py (95%) rename pype/{plugins/blender => hosts/blender/plugins}/load/load_camera.py (95%) rename pype/{plugins/blender => hosts/blender/plugins}/load/load_layout.py (99%) rename pype/{plugins/blender => hosts/blender/plugins}/load/load_model.py (99%) rename pype/{plugins/blender => hosts/blender/plugins}/load/load_rig.py (99%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/collect_current_file.py (100%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/collect_instances.py (100%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/extract_abc.py (94%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/extract_animation_collection.py (61%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/extract_blend.py (96%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/extract_fbx.py (100%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/extract_fbx_animation.py (100%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/increment_workfile_version.py (100%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/integrate_animation.py (100%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/validate_mesh_has_uv.py (93%) rename pype/{plugins/blender => hosts/blender/plugins}/publish/validate_mesh_no_negative_scale.py (89%) diff --git a/pype/plugins/blender/create/create_action.py b/pype/hosts/blender/plugins/create/create_action.py similarity index 91% rename from pype/plugins/blender/create/create_action.py rename to pype/hosts/blender/plugins/create/create_action.py index f5273863c4..d402998843 100644 --- a/pype/plugins/blender/create/create_action.py +++ b/pype/hosts/blender/plugins/create/create_action.py @@ -4,7 +4,7 @@ import bpy from avalon import api from avalon.blender import Creator, lib -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin class CreateAction(Creator): @@ -19,7 +19,7 @@ class CreateAction(Creator): asset = self.data["asset"] subset = self.data["subset"] - name = pype.hosts.blender.plugin.asset_name(asset, subset) + name = pype.hosts.blender.api.plugin.asset_name(asset, subset) collection = bpy.data.collections.new(name=name) bpy.context.scene.collection.children.link(collection) self.data['task'] = api.Session.get('AVALON_TASK') diff --git a/pype/plugins/blender/create/create_animation.py b/pype/hosts/blender/plugins/create/create_animation.py similarity index 87% rename from pype/plugins/blender/create/create_animation.py rename to pype/hosts/blender/plugins/create/create_animation.py index acfd6ac1f3..9d68768201 100644 --- a/pype/plugins/blender/create/create_animation.py +++ b/pype/hosts/blender/plugins/create/create_animation.py @@ -3,7 +3,7 @@ import bpy from avalon import api, blender -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin class CreateAnimation(blender.Creator): @@ -17,7 +17,7 @@ class CreateAnimation(blender.Creator): def process(self): asset = self.data["asset"] subset = self.data["subset"] - name = pype.hosts.blender.plugin.asset_name(asset, subset) + name = pype.hosts.blender.api.plugin.asset_name(asset, subset) collection = bpy.data.collections.new(name=name) bpy.context.scene.collection.children.link(collection) self.data['task'] = api.Session.get('AVALON_TASK') diff --git a/pype/plugins/blender/create/create_camera.py b/pype/hosts/blender/plugins/create/create_camera.py similarity index 87% rename from pype/plugins/blender/create/create_camera.py rename to pype/hosts/blender/plugins/create/create_camera.py index 5817985053..a40ddc63d4 100644 --- a/pype/plugins/blender/create/create_camera.py +++ b/pype/hosts/blender/plugins/create/create_camera.py @@ -4,7 +4,7 @@ import bpy from avalon import api from avalon.blender import Creator, lib -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin class CreateCamera(Creator): @@ -19,7 +19,7 @@ class CreateCamera(Creator): asset = self.data["asset"] subset = self.data["subset"] - name = pype.hosts.blender.plugin.asset_name(asset, subset) + name = pype.hosts.blender.api.plugin.asset_name(asset, subset) collection = bpy.data.collections.new(name=name) bpy.context.scene.collection.children.link(collection) self.data['task'] = api.Session.get('AVALON_TASK') diff --git a/pype/plugins/blender/create/create_layout.py b/pype/hosts/blender/plugins/create/create_layout.py similarity index 91% rename from pype/plugins/blender/create/create_layout.py rename to pype/hosts/blender/plugins/create/create_layout.py index 010eec539b..ef765d741b 100644 --- a/pype/plugins/blender/create/create_layout.py +++ b/pype/hosts/blender/plugins/create/create_layout.py @@ -4,7 +4,7 @@ import bpy from avalon import api from avalon.blender import Creator, lib -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin class CreateLayout(Creator): @@ -19,7 +19,7 @@ class CreateLayout(Creator): asset = self.data["asset"] subset = self.data["subset"] - name = pype.hosts.blender.plugin.asset_name(asset, subset) + name = pype.hosts.blender.api.plugin.asset_name(asset, subset) collection = bpy.data.collections.new(name=name) bpy.context.scene.collection.children.link(collection) self.data['task'] = api.Session.get('AVALON_TASK') diff --git a/pype/plugins/blender/create/create_model.py b/pype/hosts/blender/plugins/create/create_model.py similarity index 87% rename from pype/plugins/blender/create/create_model.py rename to pype/hosts/blender/plugins/create/create_model.py index 59905edc41..2bf8aedb48 100644 --- a/pype/plugins/blender/create/create_model.py +++ b/pype/hosts/blender/plugins/create/create_model.py @@ -4,7 +4,7 @@ import bpy from avalon import api from avalon.blender import Creator, lib -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin class CreateModel(Creator): @@ -19,7 +19,7 @@ class CreateModel(Creator): asset = self.data["asset"] subset = self.data["subset"] - name = pype.hosts.blender.plugin.asset_name(asset, subset) + name = pype.hosts.blender.api.plugin.asset_name(asset, subset) collection = bpy.data.collections.new(name=name) bpy.context.scene.collection.children.link(collection) self.data['task'] = api.Session.get('AVALON_TASK') diff --git a/pype/plugins/blender/create/create_rig.py b/pype/hosts/blender/plugins/create/create_rig.py similarity index 92% rename from pype/plugins/blender/create/create_rig.py rename to pype/hosts/blender/plugins/create/create_rig.py index 5c85bf969d..f3efa824f4 100644 --- a/pype/plugins/blender/create/create_rig.py +++ b/pype/hosts/blender/plugins/create/create_rig.py @@ -4,7 +4,7 @@ import bpy from avalon import api from avalon.blender import Creator, lib -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin class CreateRig(Creator): @@ -19,7 +19,7 @@ class CreateRig(Creator): asset = self.data["asset"] subset = self.data["subset"] - name = pype.hosts.blender.plugin.asset_name(asset, subset) + name = pype.hosts.blender.api.plugin.asset_name(asset, subset) collection = bpy.data.collections.new(name=name) bpy.context.scene.collection.children.link(collection) self.data['task'] = api.Session.get('AVALON_TASK') diff --git a/pype/plugins/blender/create/create_setdress.py b/pype/hosts/blender/plugins/create/create_setdress.py similarity index 84% rename from pype/plugins/blender/create/create_setdress.py rename to pype/hosts/blender/plugins/create/create_setdress.py index 06acf716e5..c918949216 100644 --- a/pype/plugins/blender/create/create_setdress.py +++ b/pype/hosts/blender/plugins/create/create_setdress.py @@ -1,7 +1,7 @@ import bpy from avalon import api, blender -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin class CreateSetDress(blender.Creator): """A grouped package of loaded content""" @@ -15,7 +15,7 @@ class CreateSetDress(blender.Creator): def process(self): asset = self.data["asset"] subset = self.data["subset"] - name = pype.hosts.blender.plugin.asset_name(asset, subset) + name = pype.hosts.blender.api.plugin.asset_name(asset, subset) collection = bpy.data.collections.new(name=name) bpy.context.scene.collection.children.link(collection) self.data['task'] = api.Session.get('AVALON_TASK') diff --git a/pype/hosts/blender/plugins/load/__init__.py b/pype/hosts/blender/plugins/load/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pype/plugins/blender/load/load_action.py b/pype/hosts/blender/plugins/load/load_action.py similarity index 96% rename from pype/plugins/blender/load/load_action.py rename to pype/hosts/blender/plugins/load/load_action.py index 1f2a870640..79e42995b3 100644 --- a/pype/plugins/blender/load/load_action.py +++ b/pype/hosts/blender/plugins/load/load_action.py @@ -7,12 +7,12 @@ from typing import Dict, List, Optional from avalon import api, blender import bpy -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin logger = logging.getLogger("pype").getChild("blender").getChild("load_action") -class BlendActionLoader(pype.hosts.blender.plugin.AssetLoader): +class BlendActionLoader(pype.hosts.blender.api.plugin.AssetLoader): """Load action from a .blend file. Warning: @@ -42,8 +42,8 @@ class BlendActionLoader(pype.hosts.blender.plugin.AssetLoader): libpath = self.fname asset = context["asset"]["name"] subset = context["subset"]["name"] - lib_container = pype.hosts.blender.plugin.asset_name(asset, subset) - container_name = pype.hosts.blender.plugin.asset_name( + lib_container = pype.hosts.blender.api.plugin.asset_name(asset, subset) + container_name = pype.hosts.blender.api.plugin.asset_name( asset, subset, namespace ) @@ -149,7 +149,7 @@ class BlendActionLoader(pype.hosts.blender.plugin.AssetLoader): assert libpath.is_file(), ( f"The file doesn't exist: {libpath}" ) - assert extension in pype.hosts.blender.plugin.VALID_EXTENSIONS, ( + assert extension in pype.hosts.blender.api.plugin.VALID_EXTENSIONS, ( f"Unsupported file: {libpath}" ) diff --git a/pype/plugins/blender/load/load_animation.py b/pype/hosts/blender/plugins/load/load_animation.py similarity index 95% rename from pype/plugins/blender/load/load_animation.py rename to pype/hosts/blender/plugins/load/load_animation.py index 32050eca99..a1be6e99ed 100644 --- a/pype/plugins/blender/load/load_animation.py +++ b/pype/hosts/blender/plugins/load/load_animation.py @@ -7,14 +7,14 @@ from typing import Dict, List, Optional from avalon import api, blender import bpy -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin logger = logging.getLogger("pype").getChild( "blender").getChild("load_animation") -class BlendAnimationLoader(pype.hosts.blender.plugin.AssetLoader): +class BlendAnimationLoader(pype.hosts.blender.api.plugin.AssetLoader): """Load animations from a .blend file. Warning: @@ -105,8 +105,8 @@ class BlendAnimationLoader(pype.hosts.blender.plugin.AssetLoader): libpath = self.fname asset = context["asset"]["name"] subset = context["subset"]["name"] - lib_container = pype.hosts.blender.plugin.asset_name(asset, subset) - container_name = pype.hosts.blender.plugin.asset_name( + lib_container = pype.hosts.blender.api.plugin.asset_name(asset, subset) + container_name = pype.hosts.blender.api.plugin.asset_name( asset, subset, namespace ) @@ -175,7 +175,7 @@ class BlendAnimationLoader(pype.hosts.blender.plugin.AssetLoader): assert libpath.is_file(), ( f"The file doesn't exist: {libpath}" ) - assert extension in pype.hosts.blender.plugin.VALID_EXTENSIONS, ( + assert extension in pype.hosts.blender.api.plugin.VALID_EXTENSIONS, ( f"Unsupported file: {libpath}" ) diff --git a/pype/plugins/blender/load/load_camera.py b/pype/hosts/blender/plugins/load/load_camera.py similarity index 95% rename from pype/plugins/blender/load/load_camera.py rename to pype/hosts/blender/plugins/load/load_camera.py index eb53870d5c..e6aa11af7e 100644 --- a/pype/plugins/blender/load/load_camera.py +++ b/pype/hosts/blender/plugins/load/load_camera.py @@ -7,12 +7,12 @@ from typing import Dict, List, Optional from avalon import api, blender import bpy -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin logger = logging.getLogger("pype").getChild("blender").getChild("load_camera") -class BlendCameraLoader(pype.hosts.blender.plugin.AssetLoader): +class BlendCameraLoader(pype.hosts.blender.api.plugin.AssetLoader): """Load a camera from a .blend file. Warning: @@ -92,8 +92,8 @@ class BlendCameraLoader(pype.hosts.blender.plugin.AssetLoader): libpath = self.fname asset = context["asset"]["name"] subset = context["subset"]["name"] - lib_container = pype.hosts.blender.plugin.asset_name(asset, subset) - container_name = pype.hosts.blender.plugin.asset_name( + lib_container = pype.hosts.blender.api.plugin.asset_name(asset, subset) + container_name = pype.hosts.blender.api.plugin.asset_name( asset, subset, namespace ) @@ -162,7 +162,7 @@ class BlendCameraLoader(pype.hosts.blender.plugin.AssetLoader): assert libpath.is_file(), ( f"The file doesn't exist: {libpath}" ) - assert extension in pype.hosts.blender.plugin.VALID_EXTENSIONS, ( + assert extension in pype.hosts.blender.api.plugin.VALID_EXTENSIONS, ( f"Unsupported file: {libpath}" ) diff --git a/pype/plugins/blender/load/load_layout.py b/pype/hosts/blender/plugins/load/load_layout.py similarity index 99% rename from pype/plugins/blender/load/load_layout.py rename to pype/hosts/blender/plugins/load/load_layout.py index c8ef73aea3..6c1afafbee 100644 --- a/pype/plugins/blender/load/load_layout.py +++ b/pype/hosts/blender/plugins/load/load_layout.py @@ -11,7 +11,7 @@ from typing import Dict, List, Optional from avalon import api, blender, pipeline import bpy -import pype.hosts.blender.plugin as plugin +import pype.hosts.blender.api.plugin as plugin class BlendLayoutLoader(plugin.AssetLoader): diff --git a/pype/plugins/blender/load/load_model.py b/pype/hosts/blender/plugins/load/load_model.py similarity index 99% rename from pype/plugins/blender/load/load_model.py rename to pype/hosts/blender/plugins/load/load_model.py index 59dc00726d..f48c0f8f94 100644 --- a/pype/plugins/blender/load/load_model.py +++ b/pype/hosts/blender/plugins/load/load_model.py @@ -7,7 +7,7 @@ from typing import Dict, List, Optional from avalon import api, blender import bpy -import pype.hosts.blender.plugin as plugin +import pype.hosts.blender.api.plugin as plugin class BlendModelLoader(plugin.AssetLoader): diff --git a/pype/plugins/blender/load/load_rig.py b/pype/hosts/blender/plugins/load/load_rig.py similarity index 99% rename from pype/plugins/blender/load/load_rig.py rename to pype/hosts/blender/plugins/load/load_rig.py index 12017fdbb2..1cc722045c 100644 --- a/pype/plugins/blender/load/load_rig.py +++ b/pype/hosts/blender/plugins/load/load_rig.py @@ -7,7 +7,7 @@ from typing import Dict, List, Optional from avalon import api, blender import bpy -import pype.hosts.blender.plugin as plugin +import pype.hosts.blender.api.plugin as plugin class BlendRigLoader(plugin.AssetLoader): diff --git a/pype/plugins/blender/publish/collect_current_file.py b/pype/hosts/blender/plugins/publish/collect_current_file.py similarity index 100% rename from pype/plugins/blender/publish/collect_current_file.py rename to pype/hosts/blender/plugins/publish/collect_current_file.py diff --git a/pype/plugins/blender/publish/collect_instances.py b/pype/hosts/blender/plugins/publish/collect_instances.py similarity index 100% rename from pype/plugins/blender/publish/collect_instances.py rename to pype/hosts/blender/plugins/publish/collect_instances.py diff --git a/pype/plugins/blender/publish/extract_abc.py b/pype/hosts/blender/plugins/publish/extract_abc.py similarity index 94% rename from pype/plugins/blender/publish/extract_abc.py rename to pype/hosts/blender/plugins/publish/extract_abc.py index 41c9c268f7..949b28df51 100644 --- a/pype/plugins/blender/publish/extract_abc.py +++ b/pype/hosts/blender/plugins/publish/extract_abc.py @@ -1,7 +1,7 @@ import os import pype.api -import pype.hosts.blender.plugin +import pype.hosts.blender.api.plugin import bpy @@ -61,7 +61,8 @@ class ExtractABC(pype.api.Extractor): except: continue - new_context = pype.hosts.blender.plugin.create_blender_context(active=selected[0], selected=selected) + new_context = pype.hosts.blender.api.plugin.create_blender_context( + active=selected[0], selected=selected) # We set the scale of the scene for the export scene.unit_settings.scale_length = 0.01 diff --git a/pype/plugins/blender/publish/extract_animation_collection.py b/pype/hosts/blender/plugins/publish/extract_animation_collection.py similarity index 61% rename from pype/plugins/blender/publish/extract_animation_collection.py rename to pype/hosts/blender/plugins/publish/extract_animation_collection.py index e5e0877280..0cdd17cf1f 100644 --- a/pype/plugins/blender/publish/extract_animation_collection.py +++ b/pype/hosts/blender/plugins/publish/extract_animation_collection.py @@ -6,6 +6,7 @@ import pyblish.api import bpy + class ExtractSetDress(pype.api.Extractor): """Extract setdress.""" @@ -21,17 +22,20 @@ class ExtractSetDress(pype.api.Extractor): json_data = [] for i in instance.context: - collection = i.data.get('name') + collection = i.data.get("name") container = None for obj in bpy.data.collections[collection].objects: - if obj.type == 'ARMATURE': - container_name = obj.get('avalon').get('container_name') + if obj.type == "ARMATURE": + container_name = obj.get("avalon").get("container_name") container = bpy.data.collections[container_name] if container: - json_dict = {} - json_dict['subset'] = i.data.get('subset') - json_dict['container'] = container.name - json_dict['instance_name'] = container.get('avalon').get('instance_name') + json_dict = { + "subset": i.data.get("subset"), + "container": container.name, + } + json_dict["instance_name"] = container.get("avalon").get( + "instance_name" + ) json_data.append(json_dict) if "representations" not in instance.data: @@ -44,13 +48,14 @@ class ExtractSetDress(pype.api.Extractor): json.dump(json_data, fp=file, indent=2) json_representation = { - 'name': 'json', - 'ext': 'json', - 'files': json_filename, + "name": "json", + "ext": "json", + "files": json_filename, "stagingDir": stagingdir, } instance.data["representations"].append(json_representation) - self.log.info("Extracted instance '{}' to: {}".format( - instance.name, json_representation)) - + self.log.info( + "Extracted instance '{}' to: {}".format(instance.name, + json_representation) + ) diff --git a/pype/plugins/blender/publish/extract_blend.py b/pype/hosts/blender/plugins/publish/extract_blend.py similarity index 96% rename from pype/plugins/blender/publish/extract_blend.py rename to pype/hosts/blender/plugins/publish/extract_blend.py index a5e76dcf4e..6ba28d039a 100644 --- a/pype/plugins/blender/publish/extract_blend.py +++ b/pype/hosts/blender/plugins/publish/extract_blend.py @@ -1,47 +1,47 @@ -import os -import avalon.blender.workio - -import pype.api - - -class ExtractBlend(pype.api.Extractor): - """Extract a blend file.""" - - label = "Extract Blend" - hosts = ["blender"] - families = ["model", "camera", "rig", "action", "layout", "animation"] - optional = True - - def process(self, instance): - # Define extract output file path - - stagingdir = self.staging_dir(instance) - filename = f"{instance.name}.blend" - filepath = os.path.join(stagingdir, filename) - - # Perform extraction - self.log.info("Performing extraction..") - - # Just save the file to a temporary location. At least for now it's no - # problem to have (possibly) extra stuff in the file. - avalon.blender.workio.save_file(filepath, copy=True) - # - # # Store reference for integration - # if "files" not in instance.data: - # instance.data["files"] = list() - # - # # instance.data["files"].append(filename) - - if "representations" not in instance.data: - instance.data["representations"] = [] - - representation = { - 'name': 'blend', - 'ext': 'blend', - 'files': filename, - "stagingDir": stagingdir, - } - instance.data["representations"].append(representation) - - self.log.info("Extracted instance '%s' to: %s", - instance.name, representation) +import os +import avalon.blender.workio + +import pype.api + + +class ExtractBlend(pype.api.Extractor): + """Extract a blend file.""" + + label = "Extract Blend" + hosts = ["blender"] + families = ["model", "camera", "rig", "action", "layout", "animation"] + optional = True + + def process(self, instance): + # Define extract output file path + + stagingdir = self.staging_dir(instance) + filename = f"{instance.name}.blend" + filepath = os.path.join(stagingdir, filename) + + # Perform extraction + self.log.info("Performing extraction..") + + # Just save the file to a temporary location. At least for now it's no + # problem to have (possibly) extra stuff in the file. + avalon.blender.workio.save_file(filepath, copy=True) + # + # # Store reference for integration + # if "files" not in instance.data: + # instance.data["files"] = list() + # + # # instance.data["files"].append(filename) + + if "representations" not in instance.data: + instance.data["representations"] = [] + + representation = { + 'name': 'blend', + 'ext': 'blend', + 'files': filename, + "stagingDir": stagingdir, + } + instance.data["representations"].append(representation) + + self.log.info("Extracted instance '%s' to: %s", + instance.name, representation) diff --git a/pype/plugins/blender/publish/extract_fbx.py b/pype/hosts/blender/plugins/publish/extract_fbx.py similarity index 100% rename from pype/plugins/blender/publish/extract_fbx.py rename to pype/hosts/blender/plugins/publish/extract_fbx.py diff --git a/pype/plugins/blender/publish/extract_fbx_animation.py b/pype/hosts/blender/plugins/publish/extract_fbx_animation.py similarity index 100% rename from pype/plugins/blender/publish/extract_fbx_animation.py rename to pype/hosts/blender/plugins/publish/extract_fbx_animation.py diff --git a/pype/plugins/blender/publish/increment_workfile_version.py b/pype/hosts/blender/plugins/publish/increment_workfile_version.py similarity index 100% rename from pype/plugins/blender/publish/increment_workfile_version.py rename to pype/hosts/blender/plugins/publish/increment_workfile_version.py diff --git a/pype/plugins/blender/publish/integrate_animation.py b/pype/hosts/blender/plugins/publish/integrate_animation.py similarity index 100% rename from pype/plugins/blender/publish/integrate_animation.py rename to pype/hosts/blender/plugins/publish/integrate_animation.py diff --git a/pype/plugins/blender/publish/validate_mesh_has_uv.py b/pype/hosts/blender/plugins/publish/validate_mesh_has_uv.py similarity index 93% rename from pype/plugins/blender/publish/validate_mesh_has_uv.py rename to pype/hosts/blender/plugins/publish/validate_mesh_has_uv.py index ea5e12918a..c415ea0e0d 100644 --- a/pype/plugins/blender/publish/validate_mesh_has_uv.py +++ b/pype/hosts/blender/plugins/publish/validate_mesh_has_uv.py @@ -3,7 +3,7 @@ from typing import List import bpy import pyblish.api -import pype.hosts.blender.action +import pype.hosts.blender.api.action class ValidateMeshHasUvs(pyblish.api.InstancePlugin): @@ -14,7 +14,7 @@ class ValidateMeshHasUvs(pyblish.api.InstancePlugin): families = ["model"] category = "geometry" label = "Mesh Has UV's" - actions = [pype.hosts.blender.action.SelectInvalidAction] + actions = [pype.hosts.blender.api.action.SelectInvalidAction] optional = True @staticmethod diff --git a/pype/plugins/blender/publish/validate_mesh_no_negative_scale.py b/pype/hosts/blender/plugins/publish/validate_mesh_no_negative_scale.py similarity index 89% rename from pype/plugins/blender/publish/validate_mesh_no_negative_scale.py rename to pype/hosts/blender/plugins/publish/validate_mesh_no_negative_scale.py index 77057c0e68..bbce37f3db 100644 --- a/pype/plugins/blender/publish/validate_mesh_no_negative_scale.py +++ b/pype/hosts/blender/plugins/publish/validate_mesh_no_negative_scale.py @@ -3,7 +3,7 @@ from typing import List import bpy import pyblish.api -import pype.hosts.blender.action +import pype.hosts.blender.api.action class ValidateMeshNoNegativeScale(pyblish.api.Validator): @@ -13,7 +13,7 @@ class ValidateMeshNoNegativeScale(pyblish.api.Validator): hosts = ["blender"] families = ["model"] label = "Mesh No Negative Scale" - actions = [pype.hosts.blender.action.SelectInvalidAction] + actions = [pype.hosts.blender.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance) -> List: From fbf2208651cf622d184c05da2f4ac12146e4d768 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 11:44:32 +0100 Subject: [PATCH 089/113] turn blender host into module --- pype/hosts/blender/__init__.py | 60 ------------------ pype/hosts/blender/api/__init__.py | 63 +++++++++++++++++++ pype/hosts/blender/plugins/__init__.py | 0 pype/hosts/blender/plugins/create/__init__.py | 0 .../hosts/blender/plugins/publish/__init__.py | 0 5 files changed, 63 insertions(+), 60 deletions(-) create mode 100644 pype/hosts/blender/api/__init__.py create mode 100644 pype/hosts/blender/plugins/__init__.py create mode 100644 pype/hosts/blender/plugins/create/__init__.py create mode 100644 pype/hosts/blender/plugins/publish/__init__.py diff --git a/pype/hosts/blender/__init__.py b/pype/hosts/blender/__init__.py index dafeca5107..e69de29bb2 100644 --- a/pype/hosts/blender/__init__.py +++ b/pype/hosts/blender/__init__.py @@ -1,60 +0,0 @@ -import os -import sys -import traceback - -from avalon import api as avalon -from pyblish import api as pyblish - -import bpy - -from pype import PLUGINS_DIR - -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "blender", "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "blender", "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "blender", "create") - -ORIGINAL_EXCEPTHOOK = sys.excepthook - - -def pype_excepthook_handler(*args): - traceback.print_exception(*args) - - -def install(): - """Install Blender configuration for Avalon.""" - sys.excepthook = pype_excepthook_handler - pyblish.register_plugin_path(str(PUBLISH_PATH)) - avalon.register_plugin_path(avalon.Loader, str(LOAD_PATH)) - avalon.register_plugin_path(avalon.Creator, str(CREATE_PATH)) - - avalon.on("new", on_new) - avalon.on("open", on_open) - - -def uninstall(): - """Uninstall Blender configuration for Avalon.""" - sys.excepthook = ORIGINAL_EXCEPTHOOK - pyblish.deregister_plugin_path(str(PUBLISH_PATH)) - avalon.deregister_plugin_path(avalon.Loader, str(LOAD_PATH)) - avalon.deregister_plugin_path(avalon.Creator, str(CREATE_PATH)) - - -def set_start_end_frames(): - from avalon import io - - asset_name = io.Session["AVALON_ASSET"] - asset_doc = io.find_one({ - "type": "asset", - "name": asset_name - }) - - bpy.context.scene.frame_start = asset_doc["data"]["frameStart"] - bpy.context.scene.frame_end = asset_doc["data"]["frameEnd"] - - -def on_new(arg1, arg2): - set_start_end_frames() - - -def on_open(arg1, arg2): - set_start_end_frames() diff --git a/pype/hosts/blender/api/__init__.py b/pype/hosts/blender/api/__init__.py new file mode 100644 index 0000000000..7fcd09201a --- /dev/null +++ b/pype/hosts/blender/api/__init__.py @@ -0,0 +1,63 @@ +import os +import sys +import traceback + +import bpy + +from avalon import api as avalon +from pyblish import api as pyblish + +import pype.hosts.blender + +HOST_DIR = os.path.dirname(os.path.abspath(pype.hosts.blender.__file__)) +PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") + +ORIGINAL_EXCEPTHOOK = sys.excepthook + + +def pype_excepthook_handler(*args): + traceback.print_exception(*args) + + +def install(): + """Install Blender configuration for Avalon.""" + sys.excepthook = pype_excepthook_handler + pyblish.register_plugin_path(str(PUBLISH_PATH)) + avalon.register_plugin_path(avalon.Loader, str(LOAD_PATH)) + avalon.register_plugin_path(avalon.Creator, str(CREATE_PATH)) + + avalon.on("new", on_new) + avalon.on("open", on_open) + + +def uninstall(): + """Uninstall Blender configuration for Avalon.""" + sys.excepthook = ORIGINAL_EXCEPTHOOK + pyblish.deregister_plugin_path(str(PUBLISH_PATH)) + avalon.deregister_plugin_path(avalon.Loader, str(LOAD_PATH)) + avalon.deregister_plugin_path(avalon.Creator, str(CREATE_PATH)) + + +def set_start_end_frames(): + from avalon import io + + asset_name = io.Session["AVALON_ASSET"] + asset_doc = io.find_one({ + "type": "asset", + "name": asset_name + }) + + bpy.context.scene.frame_start = asset_doc["data"]["frameStart"] + bpy.context.scene.frame_end = asset_doc["data"]["frameEnd"] + + +def on_new(arg1, arg2): + set_start_end_frames() + + +def on_open(arg1, arg2): + set_start_end_frames() diff --git a/pype/hosts/blender/plugins/__init__.py b/pype/hosts/blender/plugins/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pype/hosts/blender/plugins/create/__init__.py b/pype/hosts/blender/plugins/create/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pype/hosts/blender/plugins/publish/__init__.py b/pype/hosts/blender/plugins/publish/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From f0498883c65a51ded35f7cff4c24f297aa7f7797 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 12:39:40 +0100 Subject: [PATCH 090/113] change pype-publish stdout and stderr to write, to work in blender --- pype/tools/pyblish_pype/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/tools/pyblish_pype/app.py b/pype/tools/pyblish_pype/app.py index 1bf16ff56a..5ba0a47425 100644 --- a/pype/tools/pyblish_pype/app.py +++ b/pype/tools/pyblish_pype/app.py @@ -62,9 +62,9 @@ def install_fonts(): # In hosts, this will be called each time the GUI is shown, # potentially installing a font each time. if database.addApplicationFont(path) < 0: - sys.stderr.write("Could not install %s\n" % path) + print("Could not install %s\n" % path) else: - sys.stdout.write("Installed %s\n" % font) + print("Installed %s\n" % font) def on_destroyed(): From a49191fe7c0c9fba57629746134a0e3b3eea660c Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 12:40:03 +0100 Subject: [PATCH 091/113] add --python-use-system-env to blender launchers --- pype/settings/defaults/system_settings/applications.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/settings/defaults/system_settings/applications.json b/pype/settings/defaults/system_settings/applications.json index ab2fdcbb57..de0fef125f 100644 --- a/pype/settings/defaults/system_settings/applications.json +++ b/pype/settings/defaults/system_settings/applications.json @@ -937,7 +937,7 @@ "windows": [ [ "C:\\Program Files\\Blender Foundation\\Blender 2.90\\blender.exe", - "" + "--python-use-system-env" ] ], "darwin": [], @@ -958,7 +958,7 @@ "windows": [ [ "C:\\Program Files\\Blender Foundation\\Blender 2.83\\blender.exe", - "" + "--python-use-system-env" ] ], "darwin": [], From 174c9b760a9b3e2211a8ac53782020de0edec3ca Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 12:40:20 +0100 Subject: [PATCH 092/113] fix wrong import in blender init --- pype/hosts/blender/startup/init.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/hosts/blender/startup/init.py b/pype/hosts/blender/startup/init.py index 9d078f44a3..75fe4d30f7 100644 --- a/pype/hosts/blender/startup/init.py +++ b/pype/hosts/blender/startup/init.py @@ -1,3 +1,3 @@ -from pype.hosts import blender.api +from pype.hosts.blender import api -blender.api.install() +api.install() From 021e6305dcb355c57b5c5cd7727a52134bdb9e6d Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 28 Jan 2021 13:04:53 +0100 Subject: [PATCH 093/113] fix nuke: loader was not updating file knob on read --- pype/hosts/nuke/plugins/load/load_image.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pype/hosts/nuke/plugins/load/load_image.py b/pype/hosts/nuke/plugins/load/load_image.py index ac54a90bc0..dcaf31c9e3 100644 --- a/pype/hosts/nuke/plugins/load/load_image.py +++ b/pype/hosts/nuke/plugins/load/load_image.py @@ -186,6 +186,7 @@ class LoadImage(api.Loader): last = first = int(frame_number) # Set the global in to the start frame of the sequence + node["file"].setValue(file) node["origfirst"].setValue(first) node["first"].setValue(first) node["origlast"].setValue(last) From 6c0d136dc0fa0be8e665a2e328c1ba1cf04b7a66 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 13:13:22 +0100 Subject: [PATCH 094/113] fix maya pythonpath to match refactored host --- pype/settings/defaults/system_settings/applications.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/settings/defaults/system_settings/applications.json b/pype/settings/defaults/system_settings/applications.json index ab2fdcbb57..184da76588 100644 --- a/pype/settings/defaults/system_settings/applications.json +++ b/pype/settings/defaults/system_settings/applications.json @@ -17,7 +17,7 @@ ] }, "PYTHONPATH": [ - "{PYPE_ROOT}/pype/setup/maya", + "{PYPE_ROOT}/pype/hosts/maya/startup", "{PYPE_REPOS_ROOT}/avalon-core/setup/maya", "{PYPE_REPOS_ROOT}/maya-look-assigner", "{PYTHONPATH}" From bf3f0eac30c5a05e67a64f1348eefa4d7e7bc9c5 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 16:43:48 +0100 Subject: [PATCH 095/113] move plugins to new structure --- pype/hosts/celaction/plugins/__init__.py | 0 .../plugins}/publish/collect_audio.py | 252 +++++++++--------- .../publish/collect_celaction_cli_kwargs.py | 46 ++-- .../publish/collect_celaction_instances.py | 192 ++++++------- .../plugins}/publish/collect_render_path.py | 0 .../plugins}/publish/integrate_version_up.py | 40 +-- .../publish/submit_celaction_deadline.py | 0 7 files changed, 265 insertions(+), 265 deletions(-) create mode 100644 pype/hosts/celaction/plugins/__init__.py rename pype/{plugins/celaction => hosts/celaction/plugins}/publish/collect_audio.py (97%) rename pype/{plugins/celaction => hosts/celaction/plugins}/publish/collect_celaction_cli_kwargs.py (92%) rename pype/{plugins/celaction => hosts/celaction/plugins}/publish/collect_celaction_instances.py (97%) rename pype/{plugins/celaction => hosts/celaction/plugins}/publish/collect_render_path.py (100%) rename pype/{plugins/celaction => hosts/celaction/plugins}/publish/integrate_version_up.py (96%) rename pype/{plugins/celaction => hosts/celaction/plugins}/publish/submit_celaction_deadline.py (100%) diff --git a/pype/hosts/celaction/plugins/__init__.py b/pype/hosts/celaction/plugins/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pype/plugins/celaction/publish/collect_audio.py b/pype/hosts/celaction/plugins/publish/collect_audio.py similarity index 97% rename from pype/plugins/celaction/publish/collect_audio.py rename to pype/hosts/celaction/plugins/publish/collect_audio.py index bab1203642..8d3c1568e6 100644 --- a/pype/plugins/celaction/publish/collect_audio.py +++ b/pype/hosts/celaction/plugins/publish/collect_audio.py @@ -1,126 +1,126 @@ -import os -import collections - -import pyblish.api -from avalon import io - -from pprint import pformat - - -class AppendCelactionAudio(pyblish.api.ContextPlugin): - - label = "Colect Audio for publishing" - order = pyblish.api.CollectorOrder + 0.1 - - def process(self, context): - self.log.info('Collecting Audio Data') - asset_doc = context.data["assetEntity"] - - # get all available representations - subsets = self.get_subsets( - asset_doc, - representations=["audio", "wav"] - ) - self.log.info(f"subsets is: {pformat(subsets)}") - - if not subsets.get("audioMain"): - raise AttributeError("`audioMain` subset does not exist") - - reprs = subsets.get("audioMain", {}).get("representations", []) - self.log.info(f"reprs is: {pformat(reprs)}") - - repr = next((r for r in reprs), None) - if not repr: - raise "Missing `audioMain` representation" - self.log.info(f"represetation is: {repr}") - - audio_file = repr.get('data', {}).get('path', "") - - if os.path.exists(audio_file): - context.data["audioFile"] = audio_file - self.log.info( - 'audio_file: {}, has been added to context'.format(audio_file)) - else: - self.log.warning("Couldn't find any audio file on Ftrack.") - - def get_subsets(self, asset_doc, representations): - """ - Query subsets with filter on name. - - The method will return all found subsets and its defined version - and subsets. Version could be specified with number. Representation - can be filtered. - - Arguments: - asset_doct (dict): Asset (shot) mongo document - representations (list): list for all representations - - Returns: - dict: subsets with version and representaions in keys - """ - - # Query all subsets for asset - subset_docs = io.find({ - "type": "subset", - "parent": asset_doc["_id"] - }) - # Collect all subset ids - subset_ids = [ - subset_doc["_id"] - for subset_doc in subset_docs - ] - - # Check if we found anything - assert subset_ids, ( - "No subsets found. Check correct filter. " - "Try this for start `r'.*'`: asset: `{}`" - ).format(asset_doc["name"]) - - # Last version aggregation - pipeline = [ - # Find all versions of those subsets - {"$match": { - "type": "version", - "parent": {"$in": subset_ids} - }}, - # Sorting versions all together - {"$sort": {"name": 1}}, - # Group them by "parent", but only take the last - {"$group": { - "_id": "$parent", - "_version_id": {"$last": "$_id"}, - "name": {"$last": "$name"} - }} - ] - last_versions_by_subset_id = dict() - for doc in io.aggregate(pipeline): - doc["parent"] = doc["_id"] - doc["_id"] = doc.pop("_version_id") - last_versions_by_subset_id[doc["parent"]] = doc - - version_docs_by_id = {} - for version_doc in last_versions_by_subset_id.values(): - version_docs_by_id[version_doc["_id"]] = version_doc - - repre_docs = io.find({ - "type": "representation", - "parent": {"$in": list(version_docs_by_id.keys())}, - "name": {"$in": representations} - }) - repre_docs_by_version_id = collections.defaultdict(list) - for repre_doc in repre_docs: - version_id = repre_doc["parent"] - repre_docs_by_version_id[version_id].append(repre_doc) - - output_dict = {} - for version_id, repre_docs in repre_docs_by_version_id.items(): - version_doc = version_docs_by_id[version_id] - subset_id = version_doc["parent"] - subset_doc = last_versions_by_subset_id[subset_id] - # Store queried docs by subset name - output_dict[subset_doc["name"]] = { - "representations": repre_docs, - "version": version_doc - } - - return output_dict +import os +import collections + +import pyblish.api +from avalon import io + +from pprint import pformat + + +class AppendCelactionAudio(pyblish.api.ContextPlugin): + + label = "Colect Audio for publishing" + order = pyblish.api.CollectorOrder + 0.1 + + def process(self, context): + self.log.info('Collecting Audio Data') + asset_doc = context.data["assetEntity"] + + # get all available representations + subsets = self.get_subsets( + asset_doc, + representations=["audio", "wav"] + ) + self.log.info(f"subsets is: {pformat(subsets)}") + + if not subsets.get("audioMain"): + raise AttributeError("`audioMain` subset does not exist") + + reprs = subsets.get("audioMain", {}).get("representations", []) + self.log.info(f"reprs is: {pformat(reprs)}") + + repr = next((r for r in reprs), None) + if not repr: + raise "Missing `audioMain` representation" + self.log.info(f"represetation is: {repr}") + + audio_file = repr.get('data', {}).get('path', "") + + if os.path.exists(audio_file): + context.data["audioFile"] = audio_file + self.log.info( + 'audio_file: {}, has been added to context'.format(audio_file)) + else: + self.log.warning("Couldn't find any audio file on Ftrack.") + + def get_subsets(self, asset_doc, representations): + """ + Query subsets with filter on name. + + The method will return all found subsets and its defined version + and subsets. Version could be specified with number. Representation + can be filtered. + + Arguments: + asset_doct (dict): Asset (shot) mongo document + representations (list): list for all representations + + Returns: + dict: subsets with version and representaions in keys + """ + + # Query all subsets for asset + subset_docs = io.find({ + "type": "subset", + "parent": asset_doc["_id"] + }) + # Collect all subset ids + subset_ids = [ + subset_doc["_id"] + for subset_doc in subset_docs + ] + + # Check if we found anything + assert subset_ids, ( + "No subsets found. Check correct filter. " + "Try this for start `r'.*'`: asset: `{}`" + ).format(asset_doc["name"]) + + # Last version aggregation + pipeline = [ + # Find all versions of those subsets + {"$match": { + "type": "version", + "parent": {"$in": subset_ids} + }}, + # Sorting versions all together + {"$sort": {"name": 1}}, + # Group them by "parent", but only take the last + {"$group": { + "_id": "$parent", + "_version_id": {"$last": "$_id"}, + "name": {"$last": "$name"} + }} + ] + last_versions_by_subset_id = dict() + for doc in io.aggregate(pipeline): + doc["parent"] = doc["_id"] + doc["_id"] = doc.pop("_version_id") + last_versions_by_subset_id[doc["parent"]] = doc + + version_docs_by_id = {} + for version_doc in last_versions_by_subset_id.values(): + version_docs_by_id[version_doc["_id"]] = version_doc + + repre_docs = io.find({ + "type": "representation", + "parent": {"$in": list(version_docs_by_id.keys())}, + "name": {"$in": representations} + }) + repre_docs_by_version_id = collections.defaultdict(list) + for repre_doc in repre_docs: + version_id = repre_doc["parent"] + repre_docs_by_version_id[version_id].append(repre_doc) + + output_dict = {} + for version_id, repre_docs in repre_docs_by_version_id.items(): + version_doc = version_docs_by_id[version_id] + subset_id = version_doc["parent"] + subset_doc = last_versions_by_subset_id[subset_id] + # Store queried docs by subset name + output_dict[subset_doc["name"]] = { + "representations": repre_docs, + "version": version_doc + } + + return output_dict diff --git a/pype/plugins/celaction/publish/collect_celaction_cli_kwargs.py b/pype/hosts/celaction/plugins/publish/collect_celaction_cli_kwargs.py similarity index 92% rename from pype/plugins/celaction/publish/collect_celaction_cli_kwargs.py rename to pype/hosts/celaction/plugins/publish/collect_celaction_cli_kwargs.py index f4a9ec341d..463805ce4b 100644 --- a/pype/plugins/celaction/publish/collect_celaction_cli_kwargs.py +++ b/pype/hosts/celaction/plugins/publish/collect_celaction_cli_kwargs.py @@ -1,23 +1,23 @@ -import pyblish.api -from pype.hosts import celaction - - -class CollectCelactionCliKwargs(pyblish.api.Collector): - """ Collects all keyword arguments passed from the terminal """ - - label = "Collect Celaction Cli Kwargs" - order = pyblish.api.Collector.order - 0.1 - - def process(self, context): - kwargs = celaction.kwargs.copy() - - self.log.info("Storing kwargs: %s" % kwargs) - context.set_data("kwargs", kwargs) - - # get kwargs onto context data as keys with values - for k, v in kwargs.items(): - self.log.info(f"Setting `{k}` to instance.data with value: `{v}`") - if k in ["frameStart", "frameEnd"]: - context.data[k] = kwargs[k] = int(v) - else: - context.data[k] = v +import pyblish.api +from pype.hosts.celaction import api as celaction + + +class CollectCelactionCliKwargs(pyblish.api.Collector): + """ Collects all keyword arguments passed from the terminal """ + + label = "Collect Celaction Cli Kwargs" + order = pyblish.api.Collector.order - 0.1 + + def process(self, context): + kwargs = celaction.kwargs.copy() + + self.log.info("Storing kwargs: %s" % kwargs) + context.set_data("kwargs", kwargs) + + # get kwargs onto context data as keys with values + for k, v in kwargs.items(): + self.log.info(f"Setting `{k}` to instance.data with value: `{v}`") + if k in ["frameStart", "frameEnd"]: + context.data[k] = kwargs[k] = int(v) + else: + context.data[k] = v diff --git a/pype/plugins/celaction/publish/collect_celaction_instances.py b/pype/hosts/celaction/plugins/publish/collect_celaction_instances.py similarity index 97% rename from pype/plugins/celaction/publish/collect_celaction_instances.py rename to pype/hosts/celaction/plugins/publish/collect_celaction_instances.py index d3d1d264c0..f393e471c4 100644 --- a/pype/plugins/celaction/publish/collect_celaction_instances.py +++ b/pype/hosts/celaction/plugins/publish/collect_celaction_instances.py @@ -1,96 +1,96 @@ -import os -from avalon import api -import pyblish.api - - -class CollectCelactionInstances(pyblish.api.ContextPlugin): - """ Adds the celaction render instances """ - - label = "Collect Celaction Instances" - order = pyblish.api.CollectorOrder + 0.1 - - def process(self, context): - task = api.Session["AVALON_TASK"] - current_file = context.data["currentFile"] - staging_dir = os.path.dirname(current_file) - scene_file = os.path.basename(current_file) - version = context.data["version"] - asset_entity = context.data["assetEntity"] - project_entity = context.data["projectEntity"] - - shared_instance_data = { - "asset": asset_entity["name"], - "frameStart": asset_entity["data"]["frameStart"], - "frameEnd": asset_entity["data"]["frameEnd"], - "handleStart": asset_entity["data"]["handleStart"], - "handleEnd": asset_entity["data"]["handleEnd"], - "fps": asset_entity["data"]["fps"], - "resolutionWidth": asset_entity["data"].get( - "resolutionWidth", - project_entity["data"]["resolutionWidth"]), - "resolutionHeight": asset_entity["data"].get( - "resolutionHeight", - project_entity["data"]["resolutionHeight"]), - "pixelAspect": 1, - "step": 1, - "version": version - } - - celaction_kwargs = context.data.get("kwargs", {}) - - if celaction_kwargs: - shared_instance_data.update(celaction_kwargs) - - # workfile instance - family = "workfile" - subset = family + task.capitalize() - # Create instance - instance = context.create_instance(subset) - - # creating instance data - instance.data.update({ - "subset": subset, - "label": scene_file, - "family": family, - "families": [family, "ftrack"], - "representations": list() - }) - - # adding basic script data - instance.data.update(shared_instance_data) - - # creating representation - representation = { - 'name': 'scn', - 'ext': 'scn', - 'files': scene_file, - "stagingDir": staging_dir, - } - - instance.data["representations"].append(representation) - - self.log.info('Publishing Celaction workfile') - - # render instance - family = "render.farm" - subset = f"render{task}Main" - instance = context.create_instance(name=subset) - # getting instance state - instance.data["publish"] = True - - # add assetEntity data into instance - instance.data.update({ - "label": "{} - farm".format(subset), - "family": family, - "families": [family], - "subset": subset - }) - - # adding basic script data - instance.data.update(shared_instance_data) - - self.log.info('Publishing Celaction render instance') - self.log.debug(f"Instance data: `{instance.data}`") - - for i in context: - self.log.debug(f"{i.data['families']}") +import os +from avalon import api +import pyblish.api + + +class CollectCelactionInstances(pyblish.api.ContextPlugin): + """ Adds the celaction render instances """ + + label = "Collect Celaction Instances" + order = pyblish.api.CollectorOrder + 0.1 + + def process(self, context): + task = api.Session["AVALON_TASK"] + current_file = context.data["currentFile"] + staging_dir = os.path.dirname(current_file) + scene_file = os.path.basename(current_file) + version = context.data["version"] + asset_entity = context.data["assetEntity"] + project_entity = context.data["projectEntity"] + + shared_instance_data = { + "asset": asset_entity["name"], + "frameStart": asset_entity["data"]["frameStart"], + "frameEnd": asset_entity["data"]["frameEnd"], + "handleStart": asset_entity["data"]["handleStart"], + "handleEnd": asset_entity["data"]["handleEnd"], + "fps": asset_entity["data"]["fps"], + "resolutionWidth": asset_entity["data"].get( + "resolutionWidth", + project_entity["data"]["resolutionWidth"]), + "resolutionHeight": asset_entity["data"].get( + "resolutionHeight", + project_entity["data"]["resolutionHeight"]), + "pixelAspect": 1, + "step": 1, + "version": version + } + + celaction_kwargs = context.data.get("kwargs", {}) + + if celaction_kwargs: + shared_instance_data.update(celaction_kwargs) + + # workfile instance + family = "workfile" + subset = family + task.capitalize() + # Create instance + instance = context.create_instance(subset) + + # creating instance data + instance.data.update({ + "subset": subset, + "label": scene_file, + "family": family, + "families": [family, "ftrack"], + "representations": list() + }) + + # adding basic script data + instance.data.update(shared_instance_data) + + # creating representation + representation = { + 'name': 'scn', + 'ext': 'scn', + 'files': scene_file, + "stagingDir": staging_dir, + } + + instance.data["representations"].append(representation) + + self.log.info('Publishing Celaction workfile') + + # render instance + family = "render.farm" + subset = f"render{task}Main" + instance = context.create_instance(name=subset) + # getting instance state + instance.data["publish"] = True + + # add assetEntity data into instance + instance.data.update({ + "label": "{} - farm".format(subset), + "family": family, + "families": [family], + "subset": subset + }) + + # adding basic script data + instance.data.update(shared_instance_data) + + self.log.info('Publishing Celaction render instance') + self.log.debug(f"Instance data: `{instance.data}`") + + for i in context: + self.log.debug(f"{i.data['families']}") diff --git a/pype/plugins/celaction/publish/collect_render_path.py b/pype/hosts/celaction/plugins/publish/collect_render_path.py similarity index 100% rename from pype/plugins/celaction/publish/collect_render_path.py rename to pype/hosts/celaction/plugins/publish/collect_render_path.py diff --git a/pype/plugins/celaction/publish/integrate_version_up.py b/pype/hosts/celaction/plugins/publish/integrate_version_up.py similarity index 96% rename from pype/plugins/celaction/publish/integrate_version_up.py rename to pype/hosts/celaction/plugins/publish/integrate_version_up.py index e15c5d5bf6..140878e2b9 100644 --- a/pype/plugins/celaction/publish/integrate_version_up.py +++ b/pype/hosts/celaction/plugins/publish/integrate_version_up.py @@ -1,20 +1,20 @@ -import shutil -import pype -import pyblish.api - - -class VersionUpScene(pyblish.api.ContextPlugin): - order = pyblish.api.IntegratorOrder + 0.5 - label = 'Version Up Scene' - families = ['workfile'] - optional = True - active = True - - def process(self, context): - current_file = context.data.get('currentFile') - v_up = pype.lib.version_up(current_file) - self.log.debug('Current file is: {}'.format(current_file)) - self.log.debug('Version up: {}'.format(v_up)) - - shutil.copy2(current_file, v_up) - self.log.info('Scene saved into new version: {}'.format(v_up)) +import shutil +import pype +import pyblish.api + + +class VersionUpScene(pyblish.api.ContextPlugin): + order = pyblish.api.IntegratorOrder + 0.5 + label = 'Version Up Scene' + families = ['workfile'] + optional = True + active = True + + def process(self, context): + current_file = context.data.get('currentFile') + v_up = pype.lib.version_up(current_file) + self.log.debug('Current file is: {}'.format(current_file)) + self.log.debug('Version up: {}'.format(v_up)) + + shutil.copy2(current_file, v_up) + self.log.info('Scene saved into new version: {}'.format(v_up)) diff --git a/pype/plugins/celaction/publish/submit_celaction_deadline.py b/pype/hosts/celaction/plugins/publish/submit_celaction_deadline.py similarity index 100% rename from pype/plugins/celaction/publish/submit_celaction_deadline.py rename to pype/hosts/celaction/plugins/publish/submit_celaction_deadline.py From b83ddf378093f941c6cbbf3c93d478ed88ca65c9 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 16:44:17 +0100 Subject: [PATCH 096/113] change celaction structure --- pype/hosts/celaction/__init__.py | 1 - pype/hosts/celaction/api/__init__.py | 1 + pype/hosts/celaction/{ => api}/cli.py | 15 ++++++++------- pype/hosts/celaction/hooks/__init__.py | 0 .../celaction/hooks}/pre_celaction_registers.py | 9 +++++---- .../{ => resources}/celaction_template_scene.scn | Bin 6 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 pype/hosts/celaction/api/__init__.py rename pype/hosts/celaction/{ => api}/cli.py (87%) create mode 100644 pype/hosts/celaction/hooks/__init__.py rename pype/{hooks/celaction => hosts/celaction/hooks}/pre_celaction_registers.py (95%) rename pype/hosts/celaction/{ => resources}/celaction_template_scene.scn (100%) diff --git a/pype/hosts/celaction/__init__.py b/pype/hosts/celaction/__init__.py index 8c93d93738..e69de29bb2 100644 --- a/pype/hosts/celaction/__init__.py +++ b/pype/hosts/celaction/__init__.py @@ -1 +0,0 @@ -kwargs = None diff --git a/pype/hosts/celaction/api/__init__.py b/pype/hosts/celaction/api/__init__.py new file mode 100644 index 0000000000..8c93d93738 --- /dev/null +++ b/pype/hosts/celaction/api/__init__.py @@ -0,0 +1 @@ +kwargs = None diff --git a/pype/hosts/celaction/cli.py b/pype/hosts/celaction/api/cli.py similarity index 87% rename from pype/hosts/celaction/cli.py rename to pype/hosts/celaction/api/cli.py index 42f7a1a385..9f2d1a1fdb 100644 --- a/pype/hosts/celaction/cli.py +++ b/pype/hosts/celaction/api/cli.py @@ -11,18 +11,19 @@ import pyblish.util from pype.api import Logger import pype -from pype.hosts import celaction +import pype.hosts.celaction +from pype.hosts.celaction import api as celaction log = Logger().get_logger("Celaction_cli_publisher") publish_host = "celaction" -PUBLISH_PATH = os.path.join(pype.PLUGINS_DIR, publish_host, "publish") - -PUBLISH_PATHS = [ - PUBLISH_PATH, - os.path.join(pype.PLUGINS_DIR, "ftrack", "publish") -] +HOST_DIR = os.path.dirname(os.path.abspath(pype.hosts.celaction.__file__)) +PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") def cli(): diff --git a/pype/hosts/celaction/hooks/__init__.py b/pype/hosts/celaction/hooks/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pype/hooks/celaction/pre_celaction_registers.py b/pype/hosts/celaction/hooks/pre_celaction_registers.py similarity index 95% rename from pype/hooks/celaction/pre_celaction_registers.py rename to pype/hosts/celaction/hooks/pre_celaction_registers.py index 04ecf82c5c..1e836a2d63 100644 --- a/pype/hooks/celaction/pre_celaction_registers.py +++ b/pype/hosts/celaction/hooks/pre_celaction_registers.py @@ -2,7 +2,7 @@ import os import shutil import winreg from pype.lib import PreLaunchHook -from pype.hosts import celaction +from pype.hosts.celaction import api as celaction class CelactionPrelaunchHook(PreLaunchHook): @@ -37,7 +37,7 @@ class CelactionPrelaunchHook(PreLaunchHook): "Software\\CelAction\\CelAction2D\\User Settings", 0, winreg.KEY_ALL_ACCESS) - # TODO: change to root path and pyblish standalone to premiere way + # TODO: change to pype executable pype_root_path = os.getenv("PYPE_SETUP_PATH") path = os.path.join(pype_root_path, "pype.bat") @@ -94,11 +94,12 @@ class CelactionPrelaunchHook(PreLaunchHook): if not os.path.exists(workfile_path): # TODO add ability to set different template workfile path via # settings - pype_celaction_dir = os.path.dirname( + pype_celaction_dir = os.path.dirname(os.path.dirname( os.path.abspath(celaction.__file__) - ) + )) template_path = os.path.join( pype_celaction_dir, + "resources", "celaction_template_scene.scn" ) diff --git a/pype/hosts/celaction/celaction_template_scene.scn b/pype/hosts/celaction/resources/celaction_template_scene.scn similarity index 100% rename from pype/hosts/celaction/celaction_template_scene.scn rename to pype/hosts/celaction/resources/celaction_template_scene.scn From f1bf083dd52f35e88ffce2073c1ad66ff5d1bda0 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 17:28:10 +0100 Subject: [PATCH 097/113] move pymel imports to function to speed up loader menu in maya --- pype/hosts/maya/plugins/load/load_audio.py | 12 ++++--- .../maya/plugins/load/load_image_plane.py | 32 +++++++++++-------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/pype/hosts/maya/plugins/load/load_audio.py b/pype/hosts/maya/plugins/load/load_audio.py index 81bcca48e1..3e29f45bae 100644 --- a/pype/hosts/maya/plugins/load/load_audio.py +++ b/pype/hosts/maya/plugins/load/load_audio.py @@ -1,10 +1,7 @@ -from maya import cmds, mel -import pymel.core as pc - from avalon import api, io from avalon.maya.pipeline import containerise from avalon.maya import lib - +from maya import cmds, mel class AudioLoader(api.Loader): """Specific loader of audio.""" @@ -15,7 +12,10 @@ class AudioLoader(api.Loader): icon = "volume-up" color = "orange" + def load(self, context, name, namespace, data): + import pymel.core as pm + start_frame = cmds.playbackOptions(query=True, min=True) sound_node = cmds.sound( file=context["representation"]["data"]["path"], offset=start_frame @@ -43,8 +43,10 @@ class AudioLoader(api.Loader): ) def update(self, container, representation): + import pymel.core as pm + audio_node = None - for node in pc.PyNode(container["objectName"]).members(): + for node in pm.PyNode(container["objectName"]).members(): if node.nodeType() == "audio": audio_node = node diff --git a/pype/hosts/maya/plugins/load/load_image_plane.py b/pype/hosts/maya/plugins/load/load_image_plane.py index 1bb29e90c4..7596f7c322 100644 --- a/pype/hosts/maya/plugins/load/load_image_plane.py +++ b/pype/hosts/maya/plugins/load/load_image_plane.py @@ -1,11 +1,10 @@ -import pymel.core as pc -import maya.cmds as cmds - from avalon import api, io from avalon.maya.pipeline import containerise from avalon.maya import lib from Qt import QtWidgets, QtCore +from pype.hosts.maya.api import maya_imports + class CameraWindow(QtWidgets.QDialog): @@ -72,7 +71,11 @@ class ImagePlaneLoader(api.Loader): icon = "image" color = "orange" + + @maya_imports def load(self, context, name, namespace, data): + import pymel.core as pm + new_nodes = [] image_plane_depth = 1000 asset = context['asset']['name'] @@ -88,7 +91,7 @@ class ImagePlaneLoader(api.Loader): "frontShape", "perspShape", "sideShape", "topShape" ] cameras = [ - x for x in pc.ls(type="camera") if x.name() not in default_cameras + x for x in pm.ls(type="camera") if x.name() not in default_cameras ] camera_names = {x.getParent().name(): x for x in cameras} camera_names["Create new camera."] = "create_camera" @@ -97,7 +100,7 @@ class ImagePlaneLoader(api.Loader): camera = camera_names[window.camera] if camera == "create_camera": - camera = pc.createNode("camera") + camera = pm.createNode("camera") if camera is None: return @@ -109,7 +112,7 @@ class ImagePlaneLoader(api.Loader): pass # Create image plane - image_plane_transform, image_plane_shape = pc.imagePlane( + image_plane_transform, image_plane_shape = pm.imagePlane( camera=camera, showInAllViews=False ) image_plane_shape.depth.set(image_plane_depth) @@ -118,8 +121,8 @@ class ImagePlaneLoader(api.Loader): context["representation"]["data"]["path"] ) - start_frame = pc.playbackOptions(q=True, min=True) - end_frame = pc.playbackOptions(q=True, max=True) + start_frame = pm.playbackOptions(q=True, min=True) + end_frame = pm.playbackOptions(q=True, max=True) image_plane_shape.frameOffset.set(1 - start_frame) image_plane_shape.frameIn.set(start_frame) @@ -130,12 +133,12 @@ class ImagePlaneLoader(api.Loader): movie_representations = ["mov", "preview"] if context["representation"]["name"] in movie_representations: # Need to get "type" by string, because its a method as well. - pc.Attribute(image_plane_shape + ".type").set(2) + pm.Attribute(image_plane_shape + ".type").set(2) # Ask user whether to use sequence or still image. if context["representation"]["name"] == "exr": # Ensure OpenEXRLoader plugin is loaded. - pc.loadPlugin("OpenEXRLoader.mll", quiet=True) + pm.loadPlugin("OpenEXRLoader.mll", quiet=True) message = ( "Hold image sequence on first frame?" @@ -151,7 +154,7 @@ class ImagePlaneLoader(api.Loader): QtWidgets.QMessageBox.Cancel ) if reply == QtWidgets.QMessageBox.Ok: - pc.delete( + pm.delete( image_plane_shape.listConnections(type="expression")[0] ) image_plane_shape.frameExtension.set(start_frame) @@ -164,7 +167,7 @@ class ImagePlaneLoader(api.Loader): ) for node in new_nodes: - pc.rename(node, "{}:{}".format(namespace, node)) + pm.rename(node, "{}:{}".format(namespace, node)) return containerise( name=name, @@ -174,9 +177,11 @@ class ImagePlaneLoader(api.Loader): loader=self.__class__.__name__ ) + @maya_imports def update(self, container, representation): + import pymel.core as pm image_plane_shape = None - for node in pc.PyNode(container["objectName"]).members(): + for node in pm.PyNode(container["objectName"]).members(): if node.nodeType() == "imagePlane": image_plane_shape = node @@ -204,6 +209,7 @@ class ImagePlaneLoader(api.Loader): def switch(self, container, representation): self.update(container, representation) + @maya_imports def remove(self, container): members = cmds.sets(container['objectName'], query=True) cmds.lockNode(members, lock=False) From b7f4ad7bd238f07cbc4c0c98d92f22f648ea49c9 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 17:44:48 +0100 Subject: [PATCH 098/113] remove unused import --- pype/hosts/maya/plugins/load/load_audio.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pype/hosts/maya/plugins/load/load_audio.py b/pype/hosts/maya/plugins/load/load_audio.py index 3e29f45bae..73a2a4f448 100644 --- a/pype/hosts/maya/plugins/load/load_audio.py +++ b/pype/hosts/maya/plugins/load/load_audio.py @@ -14,7 +14,6 @@ class AudioLoader(api.Loader): def load(self, context, name, namespace, data): - import pymel.core as pm start_frame = cmds.playbackOptions(query=True, min=True) sound_node = cmds.sound( From bf76cf7a140661ba6d55fdb234fcfb6894c5ddf2 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 17:46:11 +0100 Subject: [PATCH 099/113] remove unused decorator --- pype/hosts/maya/plugins/load/load_image_plane.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pype/hosts/maya/plugins/load/load_image_plane.py b/pype/hosts/maya/plugins/load/load_image_plane.py index 7596f7c322..f2640dc2eb 100644 --- a/pype/hosts/maya/plugins/load/load_image_plane.py +++ b/pype/hosts/maya/plugins/load/load_image_plane.py @@ -3,7 +3,7 @@ from avalon.maya.pipeline import containerise from avalon.maya import lib from Qt import QtWidgets, QtCore -from pype.hosts.maya.api import maya_imports +from maya import cmds class CameraWindow(QtWidgets.QDialog): @@ -71,8 +71,6 @@ class ImagePlaneLoader(api.Loader): icon = "image" color = "orange" - - @maya_imports def load(self, context, name, namespace, data): import pymel.core as pm @@ -177,7 +175,6 @@ class ImagePlaneLoader(api.Loader): loader=self.__class__.__name__ ) - @maya_imports def update(self, container, representation): import pymel.core as pm image_plane_shape = None @@ -209,7 +206,6 @@ class ImagePlaneLoader(api.Loader): def switch(self, container, representation): self.update(container, representation) - @maya_imports def remove(self, container): members = cmds.sets(container['objectName'], query=True) cmds.lockNode(members, lock=False) From b9a2a41c1e75f03d563b5bce0c02041909e21052 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 28 Jan 2021 17:47:20 +0100 Subject: [PATCH 100/113] unused import --- pype/hosts/maya/plugins/publish/validate_rig_output_ids.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py b/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py index 43d287ae97..37a50da910 100644 --- a/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py +++ b/pype/hosts/maya/plugins/publish/validate_rig_output_ids.py @@ -4,7 +4,6 @@ import pyblish.api import pype.api import pype.hosts.maya.api.action -from pype.hosts.maya.api.lib import undo_chunk class ValidateRigOutputIds(pyblish.api.InstancePlugin): From 9523ab586c35578c68d65b2d767527fc9f851dad Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 29 Jan 2021 18:24:45 +0100 Subject: [PATCH 101/113] AE - modified pre launch hook to open last workfile TODO - opening from template, opening AE from frozen dist --- pype/hooks/aftereffects/pre_launch_args.py | 13 ++++++++++--- pype/hosts/aftereffects/template.aep | Bin 0 -> 52822 bytes 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 pype/hosts/aftereffects/template.aep diff --git a/pype/hooks/aftereffects/pre_launch_args.py b/pype/hooks/aftereffects/pre_launch_args.py index 435893fbc0..00b3557429 100644 --- a/pype/hooks/aftereffects/pre_launch_args.py +++ b/pype/hooks/aftereffects/pre_launch_args.py @@ -20,16 +20,23 @@ class AfterEffectsPrelaunchHook(PreLaunchHook): while self.launch_context.launch_args: remainders.append(self.launch_context.launch_args.pop(0)) + workfile_path = self.data["last_workfile_path"] + if not os.path.exists(workfile_path): + workfile_path = "" + new_launch_args = [ self.python_executable(), "-c", ( "import avalon.aftereffects;" - "avalon.aftereffects.launch(\"{}\")" - ).format(aftereffects_executable.replace("\\", "\\\\")) + "avalon.aftereffects.launch(\"{}\", \"{}\")" + ).format( + aftereffects_executable.replace("\\", "\\\\"), + workfile_path.replace("\\", "\\\\") + ) ] - # Append as whole list as these areguments should not be separated + # Append as whole list as these arguments should not be separated self.launch_context.launch_args.append(new_launch_args) if remainders: diff --git a/pype/hosts/aftereffects/template.aep b/pype/hosts/aftereffects/template.aep new file mode 100644 index 0000000000000000000000000000000000000000..0857e418f301d0c219696ec848c0b6a773db824f GIT binary patch literal 52822 zcmeHQOKc=Z8Lshr?OpEzK_UrSbxaN`U_1|dcWukwUGI3DI9juo?F~y5wDfdW+s*cL zce>lJ2#FOS2$v`a4iE_`5>XCO5JG@BfXJQ@LL9gtAwVdCNF0!W69*&+e|1;&O!Z^j zGvjgAn<{Ch>-kspSASLgU-fH!W%)KjzxZ=?YwHPjSGEyC17o9Kzp#yE75tB&&!b03 z_#Onnoq^xu<~Am268wl8%;gX|e~x$u-bHW!{^IxRP}VHvvWx|&YfIRHOYcN%_K!K6KKdaNat zwKYSr{T%1si#T;}OD0mFi7fwP)%~hT>l*)}yeqqkquXA-G+7KJe*bIBmZ55@M@o*v zk2)ec$nm}ND;}=vx{4vmm#wR|0{#(}R}V^W2JL6D{*g3A;$jj5XA@)pH2b%+wC#fx zt8SOrS)Eg5&oy`I8&J&0ObJ@>8|WRVkwg(ViR%O1;*aFa{P^4}kihZLozm!bGD<(5IhaP;C#RnXvpd5r5o~r5%j@p5Zwnq z;%GkB2Y_{m`BEq&$V&eQ5L&{TykmG=bc;Ze99F+yESiC8)G(_jIES&*p1Ngws#}9X z&d2|)lLLQ$KkMH}LOkeqfdYdTlAgZya**NLy?5d{+lb*1TeDo<(=GE(F;zke zV*RwA(-HIM6qF;gMt6v%HZ3KABF0v)lw6HyPu;0QD4dreyvm20G&n@8)DRHy3B;0h ztQ^6q5fq4Vh;1mcL9B)rEY5* zU`4KDN0x5d#6)ouO-72~vmIEA?Y1UEe%hMnp90pm71;HmRYB9P8M^Bk+v*fxFpYjY z_Kzkkh`o0Xe#8zZe$F0;uZvcdD4eyEE$a&F+-<2TEWm1@-o^0B>V>((EEuFj>b0AI!MtAlL{f5~o9gjrfQp?^_8r!seamk<+0J z_B@wgu#qU75I#X{%i0dLL zz@$bW4`PCg2rd#n2cD{nEJ1J)h6FpNUB4CgXfcGMM^1;tJz5BTke?VCrrOaF7g^W0 zw%fQ#t5YsA7}O)!h+re2tq(FA`RUXCaAIsEI`d`?b2D_f&o8cwWV94R#Ke`6b`cY7 zBqL(t$_Pwm+&m?&jQEI%DWJFA`5tzHUc}lPm z9}&Su1RF_N)*)K3k!Ch>#;EXb(_$}{?TC$3c3fa1(z80=lhRlIux}1yBkYx4VFCI! ztuuT*L64rklJfSeF5jv(b|FP>%nBB7)e1W*lZRWon8nzlBptaY@U2?+Uw!k^HZ{6DX*jx8s|DAtqak7a?iHM1}YKgaMiMMJcj+f-fp5Ego-m;twdRMV&_d7A6 z+`K4wA;7{RB6y*Xh~R~S7qS^6eiXd0B`+MMh;_{i)Au*SJ~ey=EfHW!F-Hn`x0 z{D3}^kl=;w&x=jF)Pfg+7N+Ttc$O+{h;s9qc$Vq|^(F$2s7#6ldJ?|E^VY54I-$5;*rI<)Qv3E#@-8r|hFjYNF9cZ9?4#C*30|1- zE=Iu%nIawGu`Qhy*9-koE_flYfN44;cp;BdBgCzpf){?Ec;VyU-oVNYBltS)YoHUS z>6eIF@Iv&BhVF#E99cJ4W#=w-$meEL9rvB1gk0=9Ony?7IMVw_hgm%VQ+Uiyxzn@D zJ4lB=nIgB<9i*Y{DV{mXXi0^LiK{pn5xeQ=*o05g!*{R~MvxyBjEr2L<+=2WVd&S9 zZ_{VF21eevGlby3jqi%*(8m&56&=b6SsGE49VW@~GtnJ_CoS*pf#s<(M5gBDRyS%h z-fmPC^HJG<=m0Hpjyd=adpl?)T*r?!>5z!_xpb4wND-l*tWT`z1BOV|+|?av(YCSd zNV+MlW6i({_v)zb5CIK=Rj!Q@1>bb%mc_(gY8}aRgxyEdI(Otg#CB~$crpb$(uQ|n z;51txKyc`Pkrg&|PHNKF>jpMe>84GlKUebG7Cjrrkx@0wJW!tpT8r?Lplc71s(;92X z!_HI2VbG-YY%j2RU|LhdyV$7KYnJP_RGj1KDP`NS>UjBf%ci7{!6WV|*D`c$GBvs9nd6>+`oNZd& z_Z-)3xv&L2o7;}8JegKaGR&nV-2qc3g*Q;W>D2P|nf*g-)vU^(@49TX=%E0?k#BX- zKY_jJHW{46ydg>wy6*bt#95ux?gkj7iiI^zSIFcSqCq?qk?519spBF1E?LfhMEOK; zwdCubiM!cgQ@E~fV%L2L5o2e}DL_J?t^NOH2fHTBi)jibbPN#SR;f)#HeFkGu&ErR zz$Qjz0%Fp-Wf+#GC1|Xe$09nmVybvwvNW>w;>d~iN_RT;9=JAlU}8_(Bz9zr$o6+& zf|;M~*ucED3gSnu(KC+rj`!qHuh)U~yXT@JcmggxHgVJ#uY zV{A>UgqTxYo-nq5G z`t{Ql+1_X_1>qY+0{mhUDr=kM&6(l*H!JHmSDM18q6D>*vb0sCh2;mng;Ni73y(qD zhkvkex`s?_KM;(~%>^l$;({~%?UV$S=ve~t!uhJs@aAa{*BZi;9 zv9Y2pR$LvS;We5semI4e;*o8~gms4{2hq9E-?=9)cc@2lhtU(AH#005Z|?y5N|@TY zCoXpc{i<_uElQ4}Z?;IyniOyEY4k?c!foX{gLc}=pPV_~-Z4~2&e~<{I9l#fLUQr5 zJ(7E_M{+-e7Lre-%h(V1Xny#}k&L&vp7o>iU7j&19+!IrLWPKQ1hids7gEUz-mmGF z4aZy#X`XN3lh{qok`)>Yx2S-x4~=Q?PIT~%EmoyXy^amo$wHd7OY-%h9Qa_Z4y*!A z4@>K`^th(`rN^Ok#j4wutCM|hO%KcK&E;(-Racv&+J;{j()7B+d^Ty_7vR@$PYiyU z1_t58-htovJ>ZkTDd9ij26GTk*k<6azQcTQ1WcII^w#yf_uf6&t-O~@sE6#k_o3!` zAcnCp*`2%Fz-X-;3EuSd3#-Z4C+ zDY{C_=0F_-jo|IWWojP|5%~$OS9aV0dN-lAcB2~V#Y&E%k1}r;$GF@ffVX?s9}_W* zim|x%BjW8HN9hl`WS1Y8dlqeEFWyGZb3Kwf(j&PaIuf~Yd_UYHxgR+ax$zD?gUFs; zw=RyuX>_eyp-?_9_Z0e1Pvnjr$#{!5?U5eg5U)wZ93cY1KG*QOH`Y~WecQiN?GeyM zV#)X}_wwL>!IN8u8@J%-ukLhj?2zxDj{K68Yx;qgcT~>6jTNs>+Y#&qtsk-%)T_0A z2<7<}b`*+_<>4N!^&{xfj#|hUinn(F{guzsQ7A6=6u&vxk<_HQa#i{smzD*OTgfq+1u2?4s^F0E~@S2b^sFz%VAr2bDJ_s#LYv>g~(=4Yhdsk%JHgv^*8m_QwsWgmvMeZ#usOb_~NW~x#piFUpyvy$x?QRLQ&Bwh@PIRU7RhI ziUcvSs-D*2 zqc_fhKVZXgCOhdyV8%iQ&d_|uN?qIs2_$sE( z7r59)v%-?Jm>%!IY$ylvn~JB`vA2!QRtg`8@^eLn%ohSgdVrKG@8Yg-%BJYu;lvH; z7C1HZK-refEv#NCD3 Date: Mon, 1 Feb 2021 10:27:24 +0100 Subject: [PATCH 102/113] add empty arguments that were accidentally deleted --- pype/hosts/maya/api/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pype/hosts/maya/api/__init__.py b/pype/hosts/maya/api/__init__.py index c2506e3284..9caca205e6 100644 --- a/pype/hosts/maya/api/__init__.py +++ b/pype/hosts/maya/api/__init__.py @@ -124,12 +124,12 @@ def launch_workfiles_app(): workfiles.show(os.environ["AVALON_WORKDIR"]) -def on_before_save(return_code): +def on_before_save(return_code, _): """Run validation for scene's FPS prior to saving""" return lib.validate_fps() -def on_save(): +def on_save(_): """Automatically add IDs to new nodes Any transform of a mesh, without an existing ID, is given one @@ -147,7 +147,7 @@ def on_save(): lib.set_id(node, new_id, overwrite=False) -def on_open(): +def on_open(_): """On scene open let's assume the containers have changed.""" from avalon.vendor.Qt import QtWidgets From 1e8c1f9e7180113a517d4ae8ec2c1af1ac3e6d01 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Mon, 1 Feb 2021 13:30:46 +0100 Subject: [PATCH 103/113] fix arnold referenced aovs handling --- pype/hosts/maya/api/expected_files.py | 171 ++++++++---------- .../maya/plugins/create/create_render.py | 2 +- .../maya/plugins/publish/collect_render.py | 9 +- 3 files changed, 78 insertions(+), 104 deletions(-) diff --git a/pype/hosts/maya/api/expected_files.py b/pype/hosts/maya/api/expected_files.py index 0a234baef7..41463b53f8 100644 --- a/pype/hosts/maya/api/expected_files.py +++ b/pype/hosts/maya/api/expected_files.py @@ -29,8 +29,8 @@ Attributes: token in image prefixes. RENDERER_NAMES (dict): Renderer names mapping between reported name and *human readable* name. - ImagePrefixes (dict): Mapping between renderers and their respective - image prefix atrribute names. + IMAGE_PREFIXES (dict): Mapping between renderers and their respective + image prefix attribute names. Todo: Determine `multipart` from render instance. @@ -78,7 +78,7 @@ RENDERER_NAMES = { } # not sure about the renderman image prefix -ImagePrefixes = { +IMAGE_PREFIXES = { "mentalray": "defaultRenderGlobals.imageFilePrefix", "vray": "vraySettings.fileNamePrefix", "arnold": "defaultRenderGlobals.imageFilePrefix", @@ -123,22 +123,22 @@ class ExpectedFiles: if renderer.lower() == "arnold": return self._get_files(ExpectedFilesArnold(layer, self._render_instance)) - elif renderer.lower() == "vray": + if renderer.lower() == "vray": return self._get_files(ExpectedFilesVray( layer, self._render_instance)) - elif renderer.lower() == "redshift": + if renderer.lower() == "redshift": return self._get_files(ExpectedFilesRedshift( layer, self._render_instance)) - elif renderer.lower() == "mentalray": + if renderer.lower() == "mentalray": return self._get_files(ExpectedFilesMentalray( layer, self._render_instance)) - elif renderer.lower() == "renderman": + if renderer.lower() == "renderman": return self._get_files(ExpectedFilesRenderman( layer, self._render_instance)) - else: - raise UnsupportedRendererException( - "unsupported {}".format(renderer) - ) + + raise UnsupportedRendererException( + "unsupported {}".format(renderer) + ) def _get_files(self, renderer): files = renderer.get_files() @@ -169,9 +169,9 @@ class AExpectedFiles: @abstractmethod def get_aovs(self): """To be implemented by renderer class.""" - pass - def sanitize_camera_name(self, camera): + @staticmethod + def sanitize_camera_name(camera): """Sanitize camera name. Remove Maya illegal characters from camera name. @@ -187,8 +187,7 @@ class AExpectedFiles: test_camera_01 """ - sanitized = re.sub('[^0-9a-zA-Z_]+', '_', camera) - return sanitized + return re.sub('[^0-9a-zA-Z_]+', '_', camera) def get_renderer_prefix(self): """Return prefix for specific renderer. @@ -201,12 +200,12 @@ class AExpectedFiles: Raises: :exc:`UnsupportedRendererException`: If we requested image prefix for renderer we know nothing about. - See :data:`ImagePrefixes` for mapping of renderers and + See :data:`IMAGE_PREFIXES` for mapping of renderers and image prefixes. """ try: - file_prefix = cmds.getAttr(ImagePrefixes[self.renderer]) + file_prefix = cmds.getAttr(IMAGE_PREFIXES[self.renderer]) except KeyError: raise UnsupportedRendererException( "Unsupported renderer {}".format(self.renderer) @@ -218,62 +217,32 @@ class AExpectedFiles: # ____________________/ ____________________________________________/ # 1 - get scene name /__________________/ # ____________________/ - scene_dir, scene_basename = os.path.split(cmds.file(q=True, loc=True)) + _, scene_basename = os.path.split(cmds.file(q=True, loc=True)) scene_name, _ = os.path.splitext(scene_basename) - # ______________________________________________ - # ____________________/ ____________________________________________/ - # 2 - detect renderer /__________________/ - # ____________________/ - renderer = self.renderer - - # ________________________________________________ - # __________________/ ______________________________________________/ - # 3 - image prefix /__________________/ - # __________________/ file_prefix = self.get_renderer_prefix() if not file_prefix: raise RuntimeError("Image prefix not set") - default_ext = cmds.getAttr("defaultRenderGlobals.imfPluginKey") - - # ________________________________________________ - # __________________/ ______________________________________________/ - # 4 - get renderable cameras_____________/ - # __________________/ - - # if we have token in prefix path we'll expect output for - # every renderable camera in layer. - - renderable_cameras = self.get_renderable_cameras() - # ________________________________________________ - # __________________/ ______________________________________________/ - # 5 - get AOVs /____________________/ - # __________________/ - - enabled_aovs = self.get_aovs() - layer_name = self.layer if self.layer.startswith("rs_"): layer_name = self.layer[3:] - start_frame = int(self.get_render_attribute("startFrame")) - end_frame = int(self.get_render_attribute("endFrame")) - frame_step = int(self.get_render_attribute("byFrameStep")) - padding = int(self.get_render_attribute("extensionPadding")) scene_data = { - "frameStart": start_frame, - "frameEnd": end_frame, - "frameStep": frame_step, - "padding": padding, - "cameras": renderable_cameras, + "frameStart": int(self.get_render_attribute("startFrame")), + "frameEnd": int(self.get_render_attribute("endFrame")), + "frameStep": int(self.get_render_attribute("byFrameStep")), + "padding": int(self.get_render_attribute("extensionPadding")), + # if we have token in prefix path we'll expect output for + # every renderable camera in layer. + "cameras": self.get_renderable_cameras(), "sceneName": scene_name, "layerName": layer_name, - "renderer": renderer, - "defaultExt": default_ext, + "renderer": self.renderer, + "defaultExt": cmds.getAttr("defaultRenderGlobals.imfPluginKey"), "filePrefix": file_prefix, - "enabledAOVs": enabled_aovs, + "enabledAOVs": self.get_aovs(), } return scene_data @@ -296,9 +265,9 @@ class AExpectedFiles: file_prefix = re.sub(regex, value, file_prefix) for frame in range( - int(layer_data["frameStart"]), - int(layer_data["frameEnd"]) + 1, - int(layer_data["frameStep"]), + int(layer_data["frameStart"]), + int(layer_data["frameEnd"]) + 1, + int(layer_data["frameStep"]), ): expected_files.append( "{}.{}.{}".format( @@ -331,9 +300,9 @@ class AExpectedFiles: aov_files = [] for frame in range( - int(layer_data["frameStart"]), - int(layer_data["frameEnd"]) + 1, - int(layer_data["frameStep"]), + int(layer_data["frameStart"]), + int(layer_data["frameEnd"]) + 1, + int(layer_data["frameStep"]), ): aov_files.append( "{}.{}.{}".format( @@ -388,14 +357,13 @@ class AExpectedFiles: renderable_cameras = [] for cam in cam_parents: - renderable = False if self.maya_is_true(cmds.getAttr("{}.renderable".format(cam))): - renderable = True renderable_cameras.append(cam) return renderable_cameras - def maya_is_true(self, attr_val): + @staticmethod + def maya_is_true(attr_val): """Whether a Maya attr evaluates to True. When querying an attribute value from an ambiguous object the @@ -411,12 +379,13 @@ class AExpectedFiles: """ if isinstance(attr_val, types.BooleanType): return attr_val - elif isinstance(attr_val, (types.ListType, types.GeneratorType)): + if isinstance(attr_val, (types.ListType, types.GeneratorType)): return any(attr_val) - else: - return bool(attr_val) - def get_layer_overrides(self, attr, layer): + return bool(attr_val) + + @staticmethod + def get_layer_overrides(attr): """Get overrides for attribute on given render layer. Args: @@ -491,8 +460,8 @@ class ExpectedFilesArnold(AExpectedFiles): enabled_aovs = [] try: if not ( - cmds.getAttr("defaultArnoldRenderOptions.aovMode") - and not cmds.getAttr("defaultArnoldDriver.mergeAOVs") # noqa: W503, E501 + cmds.getAttr("defaultArnoldRenderOptions.aovMode") + and not cmds.getAttr("defaultArnoldDriver.mergeAOVs") # noqa: W503, E501 ): # AOVs are merged in mutli-channel file self.multipart = True @@ -508,7 +477,14 @@ class ExpectedFilesArnold(AExpectedFiles): # AOVs are set to be rendered separately. We should expect # token in path. - ai_aovs = [n for n in cmds.ls(type="aiAOV")] + # handle aovs from references + use_ref_aovs = self.render_instance.data.get( + "useReferencedAovs", False) or False + + ai_aovs = cmds.ls(type="aiAOV") + if not use_ref_aovs: + ref_aovs = cmds.ls(type="aiAOV", referencedNodes=True) + ai_aovs = list(set(ai_aovs) - set(ref_aovs)) for aov in ai_aovs: enabled = self.maya_is_true(cmds.getAttr("{}.enabled".format(aov))) @@ -523,7 +499,7 @@ class ExpectedFilesArnold(AExpectedFiles): raise AOVError(msg) for override in self.get_layer_overrides( - "{}.enabled".format(aov), self.layer + "{}.enabled".format(aov) ): enabled = self.maya_is_true(override) if enabled: @@ -567,7 +543,7 @@ class ExpectedFilesVray(AExpectedFiles): """Override to get vray specific extension.""" layer_data = super(ExpectedFilesVray, self)._get_layer_data() default_ext = cmds.getAttr("vraySettings.imageFormatStr") - if default_ext == "exr (multichannel)" or default_ext == "exr (deep)": + if default_ext in ["exr (multichannel)", "exr (deep)"]: default_ext = "exr" layer_data["defaultExt"] = default_ext layer_data["padding"] = cmds.getAttr("vraySettings.fileNamePadding") @@ -587,11 +563,11 @@ class ExpectedFilesVray(AExpectedFiles): # remove 'beauty' from filenames as vray doesn't output it update = {} if layer_data.get("enabledAOVs"): - for aov, seq in expected_files[0].items(): + for aov, seqs in expected_files[0].items(): if aov.startswith("beauty"): new_list = [] - for f in seq: - new_list.append(f.replace("_beauty", "")) + for seq in seqs: + new_list.append(seq.replace("_beauty", "")) update[aov] = new_list expected_files[0].update(update) @@ -609,8 +585,8 @@ class ExpectedFilesVray(AExpectedFiles): try: # really? do we set it in vray just by selecting multichannel exr? if ( - cmds.getAttr("vraySettings.imageFormatStr") - == "exr (multichannel)" # noqa: W503 + cmds.getAttr("vraySettings.imageFormatStr") + == "exr (multichannel)" # noqa: W503 ): # AOVs are merged in mutli-channel file self.multipart = True @@ -624,7 +600,7 @@ class ExpectedFilesVray(AExpectedFiles): return enabled_aovs default_ext = cmds.getAttr("vraySettings.imageFormatStr") - if default_ext == "exr (multichannel)" or default_ext == "exr (deep)": + if default_ext in ["exr (multichannel)", "exr (deep)"]: default_ext = "exr" # add beauty as default @@ -634,7 +610,7 @@ class ExpectedFilesVray(AExpectedFiles): # handle aovs from references use_ref_aovs = self.render_instance.data.get( - "vrayUseReferencedAovs", False) or False + "useReferencedAovs", False) or False # this will have list of all aovs no matter if they are coming from # reference or not. @@ -650,18 +626,18 @@ class ExpectedFilesVray(AExpectedFiles): for aov in vr_aovs: enabled = self.maya_is_true(cmds.getAttr("{}.enabled".format(aov))) for override in self.get_layer_overrides( - "{}.enabled".format(aov), "rs_{}".format(self.layer) + "{}.enabled".format(aov) ): enabled = self.maya_is_true(override) if enabled: - # todo: find how vray set format for AOVs enabled_aovs.append( (self._get_vray_aov_name(aov), default_ext)) return enabled_aovs - def _get_vray_aov_name(self, node): + @staticmethod + def _get_vray_aov_name(node): """Get AOVs name from Vray. Args: @@ -762,8 +738,8 @@ class ExpectedFilesRedshift(AExpectedFiles): if aov[0].lower() == "cryptomatte": aov_name = aov[0] expected_files.append( - {aov_name: self._generate_single_file_sequence( - layer_data, aov_name=aov_name)}) + {aov_name: self._generate_single_file_sequence(layer_data)} + ) return expected_files @@ -778,7 +754,7 @@ class ExpectedFilesRedshift(AExpectedFiles): try: if self.maya_is_true( - cmds.getAttr("redshiftOptions.exrForceMultilayer") + cmds.getAttr("redshiftOptions.exrForceMultilayer") ): # AOVs are merged in mutli-channel file self.multipart = True @@ -794,13 +770,13 @@ class ExpectedFilesRedshift(AExpectedFiles): default_ext = self.ext_mapping[ cmds.getAttr("redshiftOptions.imageFormat") ] - rs_aovs = [n for n in cmds.ls(type="RedshiftAOV")] + rs_aovs = cmds.ls(type="RedshiftAOV", referencedNodes=False) # todo: find out how to detect multichannel exr for redshift for aov in rs_aovs: enabled = self.maya_is_true(cmds.getAttr("{}.enabled".format(aov))) for override in self.get_layer_overrides( - "{}.enabled".format(aov), self.layer + "{}.enabled".format(aov) ): enabled = self.maya_is_true(override) @@ -809,7 +785,7 @@ class ExpectedFilesRedshift(AExpectedFiles): # is in the list of AOVs that renderer cannot (or will not) # merge into final exr. if self.maya_is_true( - cmds.getAttr("redshiftOptions.exrForceMultilayer") + cmds.getAttr("redshiftOptions.exrForceMultilayer") ): if cmds.getAttr("%s.name" % aov) in self.unmerged_aovs: enabled_aovs.append( @@ -821,7 +797,7 @@ class ExpectedFilesRedshift(AExpectedFiles): ) if self.maya_is_true( - cmds.getAttr("redshiftOptions.exrForceMultilayer") + cmds.getAttr("redshiftOptions.exrForceMultilayer") ): # AOVs are merged in mutli-channel file self.multipart = True @@ -859,7 +835,7 @@ class ExpectedFilesRenderman(AExpectedFiles): enabled = self.maya_is_true(cmds.getAttr("{}.enable".format(aov))) for override in self.get_layer_overrides( - "{}.enable".format(aov), self.layer + "{}.enable".format(aov) ): enabled = self.maya_is_true(override) @@ -908,6 +884,7 @@ class ExpectedFilesMentalray(AExpectedFiles): :exc:`UnimplementedRendererException`: as it is not implemented. """ + super(ExpectedFilesMentalray, self).__init__(layer, render_instance) raise UnimplementedRendererException("Mentalray not implemented") def get_aovs(self): @@ -923,8 +900,6 @@ class ExpectedFilesMentalray(AExpectedFiles): class AOVError(Exception): """Custom exception for determining AOVs.""" - pass - class UnsupportedRendererException(Exception): """Custom exception. @@ -932,13 +907,9 @@ class UnsupportedRendererException(Exception): Raised when requesting data from unsupported renderer. """ - pass - class UnimplementedRendererException(Exception): """Custom exception. Raised when requesting data from renderer that is not implemented yet. """ - - pass diff --git a/pype/hosts/maya/plugins/create/create_render.py b/pype/hosts/maya/plugins/create/create_render.py index 0763b19c17..2fd9972721 100644 --- a/pype/hosts/maya/plugins/create/create_render.py +++ b/pype/hosts/maya/plugins/create/create_render.py @@ -191,7 +191,7 @@ class CreateRender(avalon.maya.Creator): self.data["tilesX"] = 2 self.data["tilesY"] = 2 self.data["convertToScanline"] = False - self.data["vrayUseReferencedAovs"] = False + self.data["useReferencedAovs"] = False # Disable for now as this feature is not working yet # self.data["assScene"] = False diff --git a/pype/hosts/maya/plugins/publish/collect_render.py b/pype/hosts/maya/plugins/publish/collect_render.py index 208937320d..fdd77815cc 100644 --- a/pype/hosts/maya/plugins/publish/collect_render.py +++ b/pype/hosts/maya/plugins/publish/collect_render.py @@ -2,7 +2,7 @@ """Collect render data. This collector will go through render layers in maya and prepare all data -needed to create instances and their representations for submition and +needed to create instances and their representations for submission and publishing on farm. Requires: @@ -248,8 +248,11 @@ class CollectMayaRender(pyblish.api.ContextPlugin): "tilesX": render_instance.data.get("tilesX") or 2, "tilesY": render_instance.data.get("tilesY") or 2, "priority": render_instance.data.get("priority"), - "convertToScanline": render_instance.data.get("convertToScanline") or False, # noqa: E501 - "vrayUseReferencedAovs": render_instance.data.get("vrayUseReferencedAovs") or False # noqa: E501 + "convertToScanline": render_instance.data.get( + "convertToScanline") or False, + "useReferencedAovs": render_instance.data.get( + "useReferencedAovs") or render_instance.data.get( + "vrayUseReferencedAovs") or False } if self.sync_workfile_version: From 78c41cb13f63f29dfe154afbc94e0f34f7460f74 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Feb 2021 14:58:35 +0100 Subject: [PATCH 104/113] tvpaint extract sequence convert single frame sequence to single file --- pype/hosts/tvpaint/plugins/publish/extract_sequence.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pype/hosts/tvpaint/plugins/publish/extract_sequence.py b/pype/hosts/tvpaint/plugins/publish/extract_sequence.py index d315777203..eb6bc670bb 100644 --- a/pype/hosts/tvpaint/plugins/publish/extract_sequence.py +++ b/pype/hosts/tvpaint/plugins/publish/extract_sequence.py @@ -146,6 +146,10 @@ class ExtractSequence(pyblish.api.Extractor): os.path.basename(filepath) for filepath in output_files_by_frame.values() ] + # Sequence of one frame + if len(repre_files) == 1: + repre_files = repre_files[0] + new_repre = { "name": ext, "ext": ext, From 355fc7b7eae299c2257f426e2b805b857bec539b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Feb 2021 15:12:55 +0100 Subject: [PATCH 105/113] reduced arguments to launch djv to executable and filepath --- pype/modules/ftrack/actions/action_djvview.py | 54 ++++--------------- pype/plugins/global/load/open_djv.py | 50 +++-------------- 2 files changed, 17 insertions(+), 87 deletions(-) diff --git a/pype/modules/ftrack/actions/action_djvview.py b/pype/modules/ftrack/actions/action_djvview.py index 6036f9a35b..dfaa1ebeb9 100644 --- a/pype/modules/ftrack/actions/action_djvview.py +++ b/pype/modules/ftrack/actions/action_djvview.py @@ -90,9 +90,7 @@ class DJVViewAction(BaseAction): items = [] base_label = "v{0} - {1} - {2}" - default_component = self.config_data.get( - 'default_component', None - ) + default_component = None last_available = None select_value = None for version in versions: @@ -152,55 +150,23 @@ class DJVViewAction(BaseAction): # Launching application if "values" not in event["data"]: return - filename = event['data']['values']['path'] + filpath = event['data']['values']['path'] - fps = entities[0].get('custom_attributes', {}).get('fps', None) - - cmd = [] - # DJV path - cmd.append(os.path.normpath(self.djv_path)) - # DJV Options Start ############################################## - # '''layer name''' - # cmd.append('-file_layer (value)') - # ''' Proxy scale: 1/2, 1/4, 1/8''' - # cmd.append('-file_proxy 1/2') - # ''' Cache: True, False.''' - # cmd.append('-file_cache True') - # ''' Start in full screen ''' - # cmd.append('-window_fullscreen') - # ''' Toolbar controls: False, True.''' - # cmd.append("-window_toolbar False") - # ''' Window controls: False, True.''' - # cmd.append("-window_playbar False") - # ''' Grid overlay: None, 1x1, 10x10, 100x100.''' - # cmd.append("-view_grid None") - # ''' Heads up display: True, False.''' - # cmd.append("-view_hud True") - ''' Playback: Stop, Forward, Reverse.''' - cmd.append("-playback Forward") - # ''' Frame.''' - # cmd.append("-playback_frame (value)") - if fps is not None: - cmd.append("-playback_speed {}".format(int(fps))) - # ''' Timer: Sleep, Timeout. Value: Sleep.''' - # cmd.append("-playback_timer (value)") - # ''' Timer resolution (seconds): 0.001.''' - # cmd.append("-playback_timer_resolution (value)") - ''' Time units: Timecode, Frames.''' - cmd.append("-time_units Frames") - # DJV Options End ################################################ - - # PATH TO COMPONENT - cmd.append(os.path.normpath(filename)) + cmd = [ + # DJV path + os.path.normpath(self.djv_path), + # PATH TO COMPONENT + os.path.normpath(filpath) + ] try: # Run DJV with these commands - subprocess.Popen(' '.join(cmd)) + subprocess.Popen(cmd) except FileNotFoundError: return { 'success': False, 'message': 'File "{}" was not found.'.format( - os.path.basename(filename) + os.path.basename(filpath) ) } diff --git a/pype/plugins/global/load/open_djv.py b/pype/plugins/global/load/open_djv.py index a500333875..39b54364d9 100644 --- a/pype/plugins/global/load/open_djv.py +++ b/pype/plugins/global/load/open_djv.py @@ -43,54 +43,18 @@ class OpenInDJV(api.Loader): if not remainder: seqeunce = collections[0] first_image = list(seqeunce)[0] - # start = min(collections) - # end = max(collections) - # - # range = (padding % start) + '-' + (padding % end) - # filename = re.sub('%[0-9]*d', range, filename) else: first_image = self.fname filepath = os.path.normpath(os.path.join(directory, first_image)) self.log.info("Opening : {}".format(filepath)) - fps = context.get('project', {}).get('data', {}).get('fps', 24) - - cmd = [] - # DJV path - cmd.append(os.path.normpath(self.djv_path)) - # DJV Options Start ############################################## - '''layer name''' - # cmd.append('-file_layer (value)') - ''' Proxy scale: 1/2, 1/4, 1/8''' - # cmd.append('-file_proxy 1/2') - ''' Cache: True, False.''' - cmd.append('-file_cache True') - ''' Start in full screen ''' - # cmd.append('-window_fullscreen') - ''' Toolbar controls: False, True.''' - # cmd.append("-window_toolbar False") - ''' Window controls: False, True.''' - # cmd.append("-window_playbar False") - ''' Grid overlay: None, 1x1, 10x10, 100x100.''' - # cmd.append("-view_grid None") - ''' Heads up display: True, False.''' - # cmd.append("-view_hud True") - ''' Playback: Stop, Forward, Reverse.''' - cmd.append("-playback Forward") - ''' Frame.''' - # cmd.append("-playback_frame (value)") - cmd.append("-playback_speed " + str(fps)) - ''' Timer: Sleep, Timeout. Value: Sleep.''' - # cmd.append("-playback_timer (value)") - ''' Timer resolution (seconds): 0.001.''' - # cmd.append("-playback_timer_resolution (value)") - ''' Time units: Timecode, Frames.''' - cmd.append("-time_units Frames") - # DJV Options End ################################################ - - # PATH TO COMPONENT - cmd.append(os.path.normpath(filepath)) + cmd = [ + # DJV path + os.path.normpath(self.djv_path), + # PATH TO COMPONENT + os.path.normpath(filepath) + ] # Run DJV with these commands - subprocess.Popen(' '.join(cmd)) + subprocess.Popen(cmd) From 6bc724846a79915c438993a6b679e24a506305d9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Feb 2021 15:23:48 +0100 Subject: [PATCH 106/113] instance family is added to subset families at first place --- pype/plugins/global/publish/integrate_new.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pype/plugins/global/publish/integrate_new.py b/pype/plugins/global/publish/integrate_new.py index 5ba92435fd..cf267a84cf 100644 --- a/pype/plugins/global/publish/integrate_new.py +++ b/pype/plugins/global/publish/integrate_new.py @@ -674,12 +674,21 @@ class IntegrateAssetNew(pyblish.api.InstancePlugin): self.log.debug( "families. %s" % type(instance.data.get('families'))) + family = instance.data.get("family") + families = [] + if family: + families.append(family) + + for _family in (instance.data.get("families") or []): + if _family not in families: + families.append(_family) + _id = io.insert_one({ "schema": "pype:subset-3.0", "type": "subset", "name": subset_name, "data": { - "families": instance.data.get("families", []) + "families": families }, "parent": asset["_id"] }).inserted_id From 71f0cc292bad9c339e3631026b59c91fc6c81de4 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Feb 2021 16:13:16 +0100 Subject: [PATCH 107/113] stream data are stored to ffprobe_data variable --- pype/scripts/otio_burnin.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pype/scripts/otio_burnin.py b/pype/scripts/otio_burnin.py index 4f5c290e9d..517ef1c7f4 100644 --- a/pype/scripts/otio_burnin.py +++ b/pype/scripts/otio_burnin.py @@ -543,21 +543,22 @@ def burnins_from_data( ffmpeg_args = codec_data else: - codec_name = burnin._streams[0].get("codec_name") + ffprobe_data = burnin._streams[0] + codec_name = ffprobe_data.get("codec_name") if codec_name: ffmpeg_args.append("-codec:v {}".format(codec_name)) - profile_name = burnin._streams[0].get("profile") + profile_name = ffprobe_data.get("profile") if profile_name: # lower profile name and repalce spaces with underscore profile_name = profile_name.replace(" ", "_").lower() ffmpeg_args.append("-profile:v {}".format(profile_name)) - bit_rate = burnin._streams[0].get("bit_rate") + bit_rate = ffprobe_data.get("bit_rate") if bit_rate: ffmpeg_args.append("-b:v {}".format(bit_rate)) - pix_fmt = burnin._streams[0].get("pix_fmt") + pix_fmt = ffprobe_data.get("pix_fmt") if pix_fmt: ffmpeg_args.append("-pix_fmt {}".format(pix_fmt)) From 4e971ffb67dba60164ca60427dc807a761fcf637 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Feb 2021 16:14:58 +0100 Subject: [PATCH 108/113] prores codec name checks tags in stream data for different codecs --- pype/scripts/otio_burnin.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pype/scripts/otio_burnin.py b/pype/scripts/otio_burnin.py index 517ef1c7f4..dec1ad1dbd 100644 --- a/pype/scripts/otio_burnin.py +++ b/pype/scripts/otio_burnin.py @@ -546,6 +546,14 @@ def burnins_from_data( ffprobe_data = burnin._streams[0] codec_name = ffprobe_data.get("codec_name") if codec_name: + if codec_name == "prores": + tags = ffprobe_data.get("tags") or {} + encoder = tags.get("encoder") or "" + if encoder.endswith("prores_ks"): + codec_name = "prores_ks" + + elif encoder.endswith("prores_aw"): + codec_name = "prores_aw" ffmpeg_args.append("-codec:v {}".format(codec_name)) profile_name = ffprobe_data.get("profile") From ec75ceb73e930255ed358de216c10e22bdeb7863 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 2 Feb 2021 10:32:59 +0100 Subject: [PATCH 109/113] move unreal to self contained host --- pype/hosts/celaction/hooks/pre_celaction_registers.py | 5 +---- pype/hosts/unreal/{ => api}/__init__.py | 11 +++++++---- pype/hosts/unreal/{ => api}/lib.py | 0 pype/hosts/unreal/{ => api}/plugin.py | 0 .../unreal/hooks}/pre_workfile_preparation.py | 2 +- pype/{ => hosts/unreal}/plugins/__init__.py | 0 .../unreal/plugins}/create/create_layout.py | 0 .../unreal/plugins}/create/create_staticmeshfbx.py | 2 +- .../unreal/plugins}/load/load_animation.py | 0 .../unreal => hosts/unreal/plugins}/load/load_rig.py | 0 .../unreal/plugins}/load/load_setdress.py | 0 .../unreal/plugins}/load/load_staticmeshfbx.py | 0 .../unreal/plugins}/publish/collect_current_file.py | 0 .../unreal/plugins}/publish/collect_instances.py | 0 .../unreal/plugins}/publish/extract_layout.py | 0 15 files changed, 10 insertions(+), 10 deletions(-) rename pype/hosts/unreal/{ => api}/__init__.py (74%) rename pype/hosts/unreal/{ => api}/lib.py (100%) rename pype/hosts/unreal/{ => api}/plugin.py (100%) rename pype/{hooks/unreal => hosts/unreal/hooks}/pre_workfile_preparation.py (98%) rename pype/{ => hosts/unreal}/plugins/__init__.py (100%) rename pype/{plugins/unreal => hosts/unreal/plugins}/create/create_layout.py (100%) rename pype/{plugins/unreal => hosts/unreal/plugins}/create/create_staticmeshfbx.py (94%) rename pype/{plugins/unreal => hosts/unreal/plugins}/load/load_animation.py (100%) rename pype/{plugins/unreal => hosts/unreal/plugins}/load/load_rig.py (100%) rename pype/{plugins/unreal => hosts/unreal/plugins}/load/load_setdress.py (100%) rename pype/{plugins/unreal => hosts/unreal/plugins}/load/load_staticmeshfbx.py (100%) rename pype/{plugins/unreal => hosts/unreal/plugins}/publish/collect_current_file.py (100%) rename pype/{plugins/unreal => hosts/unreal/plugins}/publish/collect_instances.py (100%) rename pype/{plugins/unreal => hosts/unreal/plugins}/publish/extract_layout.py (100%) diff --git a/pype/hosts/celaction/hooks/pre_celaction_registers.py b/pype/hosts/celaction/hooks/pre_celaction_registers.py index 1e836a2d63..8f6b1b72bb 100644 --- a/pype/hosts/celaction/hooks/pre_celaction_registers.py +++ b/pype/hosts/celaction/hooks/pre_celaction_registers.py @@ -7,10 +7,7 @@ from pype.hosts.celaction import api as celaction class CelactionPrelaunchHook(PreLaunchHook): """ - This hook will check if current workfile path has Unreal - project inside. IF not, it initialize it and finally it pass - path to the project by environment variable to Unreal launcher - shell script. + Bootstrap celacion with pype """ workfile_ext = "scn" app_groups = ["celaction"] diff --git a/pype/hosts/unreal/__init__.py b/pype/hosts/unreal/api/__init__.py similarity index 74% rename from pype/hosts/unreal/__init__.py rename to pype/hosts/unreal/api/__init__.py index 939be48d1e..15479ba952 100644 --- a/pype/hosts/unreal/__init__.py +++ b/pype/hosts/unreal/api/__init__.py @@ -3,13 +3,16 @@ import logging from avalon import api as avalon from pyblish import api as pyblish -from pype import PLUGINS_DIR +import pype.hosts.unreal logger = logging.getLogger("pype.hosts.unreal") -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "unreal", "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "unreal", "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "unreal", "create") +HOST_DIR = os.path.dirname(os.path.abspath(pype.hosts.unreal.__file__)) +PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") def install(): diff --git a/pype/hosts/unreal/lib.py b/pype/hosts/unreal/api/lib.py similarity index 100% rename from pype/hosts/unreal/lib.py rename to pype/hosts/unreal/api/lib.py diff --git a/pype/hosts/unreal/plugin.py b/pype/hosts/unreal/api/plugin.py similarity index 100% rename from pype/hosts/unreal/plugin.py rename to pype/hosts/unreal/api/plugin.py diff --git a/pype/hooks/unreal/pre_workfile_preparation.py b/pype/hosts/unreal/hooks/pre_workfile_preparation.py similarity index 98% rename from pype/hooks/unreal/pre_workfile_preparation.py rename to pype/hosts/unreal/hooks/pre_workfile_preparation.py index f0e09669dc..942cb3bdab 100644 --- a/pype/hooks/unreal/pre_workfile_preparation.py +++ b/pype/hosts/unreal/hooks/pre_workfile_preparation.py @@ -4,7 +4,7 @@ from pype.lib import ( PreLaunchHook, ApplicationLaunchFailed ) -from pype.hosts.unreal import lib as unreal_lib +from pype.hosts.unreal.api import lib as unreal_lib class UnrealPrelaunchHook(PreLaunchHook): diff --git a/pype/plugins/__init__.py b/pype/hosts/unreal/plugins/__init__.py similarity index 100% rename from pype/plugins/__init__.py rename to pype/hosts/unreal/plugins/__init__.py diff --git a/pype/plugins/unreal/create/create_layout.py b/pype/hosts/unreal/plugins/create/create_layout.py similarity index 100% rename from pype/plugins/unreal/create/create_layout.py rename to pype/hosts/unreal/plugins/create/create_layout.py diff --git a/pype/plugins/unreal/create/create_staticmeshfbx.py b/pype/hosts/unreal/plugins/create/create_staticmeshfbx.py similarity index 94% rename from pype/plugins/unreal/create/create_staticmeshfbx.py rename to pype/hosts/unreal/plugins/create/create_staticmeshfbx.py index fa41590ef5..8f414ac56d 100644 --- a/pype/plugins/unreal/create/create_staticmeshfbx.py +++ b/pype/hosts/unreal/plugins/create/create_staticmeshfbx.py @@ -1,5 +1,5 @@ import unreal -from pype.hosts.unreal.plugin import Creator +from pype.hosts.unreal.api.plugin import Creator from avalon.unreal import ( instantiate, ) diff --git a/pype/plugins/unreal/load/load_animation.py b/pype/hosts/unreal/plugins/load/load_animation.py similarity index 100% rename from pype/plugins/unreal/load/load_animation.py rename to pype/hosts/unreal/plugins/load/load_animation.py diff --git a/pype/plugins/unreal/load/load_rig.py b/pype/hosts/unreal/plugins/load/load_rig.py similarity index 100% rename from pype/plugins/unreal/load/load_rig.py rename to pype/hosts/unreal/plugins/load/load_rig.py diff --git a/pype/plugins/unreal/load/load_setdress.py b/pype/hosts/unreal/plugins/load/load_setdress.py similarity index 100% rename from pype/plugins/unreal/load/load_setdress.py rename to pype/hosts/unreal/plugins/load/load_setdress.py diff --git a/pype/plugins/unreal/load/load_staticmeshfbx.py b/pype/hosts/unreal/plugins/load/load_staticmeshfbx.py similarity index 100% rename from pype/plugins/unreal/load/load_staticmeshfbx.py rename to pype/hosts/unreal/plugins/load/load_staticmeshfbx.py diff --git a/pype/plugins/unreal/publish/collect_current_file.py b/pype/hosts/unreal/plugins/publish/collect_current_file.py similarity index 100% rename from pype/plugins/unreal/publish/collect_current_file.py rename to pype/hosts/unreal/plugins/publish/collect_current_file.py diff --git a/pype/plugins/unreal/publish/collect_instances.py b/pype/hosts/unreal/plugins/publish/collect_instances.py similarity index 100% rename from pype/plugins/unreal/publish/collect_instances.py rename to pype/hosts/unreal/plugins/publish/collect_instances.py diff --git a/pype/plugins/unreal/publish/extract_layout.py b/pype/hosts/unreal/plugins/publish/extract_layout.py similarity index 100% rename from pype/plugins/unreal/publish/extract_layout.py rename to pype/hosts/unreal/plugins/publish/extract_layout.py From a25644eb5494c48a85dac92fc383da7cd4bb52a2 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 2 Feb 2021 11:10:34 +0100 Subject: [PATCH 110/113] move houdini host to pype.hosts.houdini.api --- pype/hosts/houdini/__init__.py | 101 --------------------------- pype/hosts/houdini/api/__init__.py | 103 ++++++++++++++++++++++++++++ pype/hosts/houdini/{ => api}/lib.py | 0 3 files changed, 103 insertions(+), 101 deletions(-) create mode 100644 pype/hosts/houdini/api/__init__.py rename pype/hosts/houdini/{ => api}/lib.py (100%) diff --git a/pype/hosts/houdini/__init__.py b/pype/hosts/houdini/__init__.py index 1da6a7774b..e69de29bb2 100644 --- a/pype/hosts/houdini/__init__.py +++ b/pype/hosts/houdini/__init__.py @@ -1,101 +0,0 @@ -import os -import logging - -import hou - -from pyblish import api as pyblish - -from avalon import api as avalon -from avalon.houdini import pipeline as houdini - -from pype.hosts.houdini import lib - -from pype.lib import any_outdated -from pype import PLUGINS_DIR - -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "houdini", "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "houdini", "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "houdini", "create") - -log = logging.getLogger("pype.hosts.houdini") - - -def install(): - - pyblish.register_plugin_path(PUBLISH_PATH) - avalon.register_plugin_path(avalon.Loader, LOAD_PATH) - avalon.register_plugin_path(avalon.Creator, CREATE_PATH) - - log.info("Installing callbacks ... ") - avalon.on("init", on_init) - avalon.before("save", before_save) - avalon.on("save", on_save) - avalon.on("open", on_open) - - pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) - - log.info("Setting default family states for loader..") - avalon.data["familiesStateToggled"] = ["imagesequence"] - - -def on_init(*args): - houdini.on_houdini_initialize() - - -def before_save(*args): - return lib.validate_fps() - - -def on_save(*args): - - avalon.logger.info("Running callback on save..") - - nodes = lib.get_id_required_nodes() - for node, new_id in lib.generate_ids(nodes): - lib.set_id(node, new_id, overwrite=False) - - -def on_open(*args): - - avalon.logger.info("Running callback on open..") - - if any_outdated(): - from ..widgets import popup - - log.warning("Scene has outdated content.") - - # Get main window - parent = hou.ui.mainQtWindow() - if parent is None: - log.info("Skipping outdated content pop-up " - "because Maya window can't be found.") - else: - - # Show outdated pop-up - def _on_show_inventory(): - import avalon.tools.sceneinventory as tool - tool.show(parent=parent) - - dialog = popup.Popup(parent=parent) - dialog.setWindowTitle("Maya scene has outdated content") - dialog.setMessage("There are outdated containers in " - "your Maya scene.") - dialog.on_show.connect(_on_show_inventory) - dialog.show() - - -def on_pyblish_instance_toggled(instance, new_value, old_value): - """Toggle saver tool passthrough states on instance toggles.""" - - nodes = instance[:] - if not nodes: - return - - # Assume instance node is first node - instance_node = nodes[0] - - if instance_node.isBypassed() != (not old_value): - print("%s old bypass state didn't match old instance state, " - "updating anyway.." % instance_node.path()) - - instance_node.bypass(not new_value) diff --git a/pype/hosts/houdini/api/__init__.py b/pype/hosts/houdini/api/__init__.py new file mode 100644 index 0000000000..c6012d1133 --- /dev/null +++ b/pype/hosts/houdini/api/__init__.py @@ -0,0 +1,103 @@ +import os +import logging + +import hou + +from pyblish import api as pyblish + +from avalon import api as avalon +from avalon.houdini import pipeline as houdini + +import pype.hosts.houdini +from pype.hosts.houdini.api import lib + +from pype.lib import any_outdated + +log = logging.getLogger("pype.hosts.houdini") + +HOST_DIR = os.path.dirname(os.path.abspath(pype.hosts.houdini.__file__)) +PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") + +def install(): + + pyblish.register_plugin_path(PUBLISH_PATH) + avalon.register_plugin_path(avalon.Loader, LOAD_PATH) + avalon.register_plugin_path(avalon.Creator, CREATE_PATH) + + log.info("Installing callbacks ... ") + avalon.on("init", on_init) + avalon.before("save", before_save) + avalon.on("save", on_save) + avalon.on("open", on_open) + + pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) + + log.info("Setting default family states for loader..") + avalon.data["familiesStateToggled"] = ["imagesequence"] + + +def on_init(*args): + houdini.on_houdini_initialize() + + +def before_save(*args): + return lib.validate_fps() + + +def on_save(*args): + + avalon.logger.info("Running callback on save..") + + nodes = lib.get_id_required_nodes() + for node, new_id in lib.generate_ids(nodes): + lib.set_id(node, new_id, overwrite=False) + + +def on_open(*args): + + avalon.logger.info("Running callback on open..") + + if any_outdated(): + from ..widgets import popup + + log.warning("Scene has outdated content.") + + # Get main window + parent = hou.ui.mainQtWindow() + if parent is None: + log.info("Skipping outdated content pop-up " + "because Maya window can't be found.") + else: + + # Show outdated pop-up + def _on_show_inventory(): + import avalon.tools.sceneinventory as tool + tool.show(parent=parent) + + dialog = popup.Popup(parent=parent) + dialog.setWindowTitle("Maya scene has outdated content") + dialog.setMessage("There are outdated containers in " + "your Maya scene.") + dialog.on_show.connect(_on_show_inventory) + dialog.show() + + +def on_pyblish_instance_toggled(instance, new_value, old_value): + """Toggle saver tool passthrough states on instance toggles.""" + + nodes = instance[:] + if not nodes: + return + + # Assume instance node is first node + instance_node = nodes[0] + + if instance_node.isBypassed() != (not old_value): + print("%s old bypass state didn't match old instance state, " + "updating anyway.." % instance_node.path()) + + instance_node.bypass(not new_value) diff --git a/pype/hosts/houdini/lib.py b/pype/hosts/houdini/api/lib.py similarity index 100% rename from pype/hosts/houdini/lib.py rename to pype/hosts/houdini/api/lib.py From 616ca3e2f24df40890cec911c3fac6b6bb1040df Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 2 Feb 2021 11:10:49 +0100 Subject: [PATCH 111/113] move houdini plugins to pype.hosts.houdini.plugins --- .../houdini/plugins}/create/create_alembic_camera.py | 0 .../houdini/plugins}/create/create_pointcache.py | 0 .../houdini/plugins}/create/create_vbd_cache.py | 0 .../houdini => hosts/houdini/plugins}/load/load_alembic.py | 0 .../houdini => hosts/houdini/plugins}/load/load_camera.py | 0 .../houdini/plugins}/publish/collect_current_file.py | 0 .../houdini => hosts/houdini/plugins}/publish/collect_frames.py | 2 +- .../houdini/plugins}/publish/collect_instances.py | 0 .../houdini/plugins}/publish/collect_output_node.py | 0 .../houdini/plugins}/publish/collect_workscene_fps.py | 0 .../houdini/plugins}/publish/extract_alembic.py | 0 .../houdini/plugins}/publish/extract_vdb_cache.py | 0 .../houdini/plugins}/publish/valiate_vdb_input_node.py | 0 .../houdini/plugins}/publish/validate_alembic_input_node.py | 0 .../houdini/plugins}/publish/validate_animation_settings.py | 2 +- .../houdini/plugins}/publish/validate_bypass.py | 0 .../houdini/plugins}/publish/validate_camera_rop.py | 0 .../houdini/plugins}/publish/validate_mkpaths_toggled.py | 0 .../houdini/plugins}/publish/validate_outnode_exists.py | 0 .../houdini/plugins}/publish/validate_output_node.py | 0 .../plugins}/publish/validate_primitive_hierarchy_paths.py | 0 .../houdini/plugins}/publish/validate_vdb_input_node.py | 0 22 files changed, 2 insertions(+), 2 deletions(-) rename pype/{plugins/houdini => hosts/houdini/plugins}/create/create_alembic_camera.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/create/create_pointcache.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/create/create_vbd_cache.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/load/load_alembic.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/load/load_camera.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/collect_current_file.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/collect_frames.py (97%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/collect_instances.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/collect_output_node.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/collect_workscene_fps.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/extract_alembic.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/extract_vdb_cache.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/valiate_vdb_input_node.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_alembic_input_node.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_animation_settings.py (97%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_bypass.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_camera_rop.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_mkpaths_toggled.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_outnode_exists.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_output_node.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_primitive_hierarchy_paths.py (100%) rename pype/{plugins/houdini => hosts/houdini/plugins}/publish/validate_vdb_input_node.py (100%) diff --git a/pype/plugins/houdini/create/create_alembic_camera.py b/pype/hosts/houdini/plugins/create/create_alembic_camera.py similarity index 100% rename from pype/plugins/houdini/create/create_alembic_camera.py rename to pype/hosts/houdini/plugins/create/create_alembic_camera.py diff --git a/pype/plugins/houdini/create/create_pointcache.py b/pype/hosts/houdini/plugins/create/create_pointcache.py similarity index 100% rename from pype/plugins/houdini/create/create_pointcache.py rename to pype/hosts/houdini/plugins/create/create_pointcache.py diff --git a/pype/plugins/houdini/create/create_vbd_cache.py b/pype/hosts/houdini/plugins/create/create_vbd_cache.py similarity index 100% rename from pype/plugins/houdini/create/create_vbd_cache.py rename to pype/hosts/houdini/plugins/create/create_vbd_cache.py diff --git a/pype/plugins/houdini/load/load_alembic.py b/pype/hosts/houdini/plugins/load/load_alembic.py similarity index 100% rename from pype/plugins/houdini/load/load_alembic.py rename to pype/hosts/houdini/plugins/load/load_alembic.py diff --git a/pype/plugins/houdini/load/load_camera.py b/pype/hosts/houdini/plugins/load/load_camera.py similarity index 100% rename from pype/plugins/houdini/load/load_camera.py rename to pype/hosts/houdini/plugins/load/load_camera.py diff --git a/pype/plugins/houdini/publish/collect_current_file.py b/pype/hosts/houdini/plugins/publish/collect_current_file.py similarity index 100% rename from pype/plugins/houdini/publish/collect_current_file.py rename to pype/hosts/houdini/plugins/publish/collect_current_file.py diff --git a/pype/plugins/houdini/publish/collect_frames.py b/pype/hosts/houdini/plugins/publish/collect_frames.py similarity index 97% rename from pype/plugins/houdini/publish/collect_frames.py rename to pype/hosts/houdini/plugins/publish/collect_frames.py index 957aedbdd3..47037f94d4 100644 --- a/pype/plugins/houdini/publish/collect_frames.py +++ b/pype/hosts/houdini/plugins/publish/collect_frames.py @@ -2,7 +2,7 @@ import os import re import pyblish.api -from pype.hosts.houdini import lib +from pype.hosts.houdini.api import lib class CollectFrames(pyblish.api.InstancePlugin): diff --git a/pype/plugins/houdini/publish/collect_instances.py b/pype/hosts/houdini/plugins/publish/collect_instances.py similarity index 100% rename from pype/plugins/houdini/publish/collect_instances.py rename to pype/hosts/houdini/plugins/publish/collect_instances.py diff --git a/pype/plugins/houdini/publish/collect_output_node.py b/pype/hosts/houdini/plugins/publish/collect_output_node.py similarity index 100% rename from pype/plugins/houdini/publish/collect_output_node.py rename to pype/hosts/houdini/plugins/publish/collect_output_node.py diff --git a/pype/plugins/houdini/publish/collect_workscene_fps.py b/pype/hosts/houdini/plugins/publish/collect_workscene_fps.py similarity index 100% rename from pype/plugins/houdini/publish/collect_workscene_fps.py rename to pype/hosts/houdini/plugins/publish/collect_workscene_fps.py diff --git a/pype/plugins/houdini/publish/extract_alembic.py b/pype/hosts/houdini/plugins/publish/extract_alembic.py similarity index 100% rename from pype/plugins/houdini/publish/extract_alembic.py rename to pype/hosts/houdini/plugins/publish/extract_alembic.py diff --git a/pype/plugins/houdini/publish/extract_vdb_cache.py b/pype/hosts/houdini/plugins/publish/extract_vdb_cache.py similarity index 100% rename from pype/plugins/houdini/publish/extract_vdb_cache.py rename to pype/hosts/houdini/plugins/publish/extract_vdb_cache.py diff --git a/pype/plugins/houdini/publish/valiate_vdb_input_node.py b/pype/hosts/houdini/plugins/publish/valiate_vdb_input_node.py similarity index 100% rename from pype/plugins/houdini/publish/valiate_vdb_input_node.py rename to pype/hosts/houdini/plugins/publish/valiate_vdb_input_node.py diff --git a/pype/plugins/houdini/publish/validate_alembic_input_node.py b/pype/hosts/houdini/plugins/publish/validate_alembic_input_node.py similarity index 100% rename from pype/plugins/houdini/publish/validate_alembic_input_node.py rename to pype/hosts/houdini/plugins/publish/validate_alembic_input_node.py diff --git a/pype/plugins/houdini/publish/validate_animation_settings.py b/pype/hosts/houdini/plugins/publish/validate_animation_settings.py similarity index 97% rename from pype/plugins/houdini/publish/validate_animation_settings.py rename to pype/hosts/houdini/plugins/publish/validate_animation_settings.py index bdb9f69335..633c13dfb6 100644 --- a/pype/plugins/houdini/publish/validate_animation_settings.py +++ b/pype/hosts/houdini/plugins/publish/validate_animation_settings.py @@ -1,6 +1,6 @@ import pyblish.api -from pype.hosts.houdini import lib +from pype.hosts.houdini.api import lib class ValidateAnimationSettings(pyblish.api.InstancePlugin): diff --git a/pype/plugins/houdini/publish/validate_bypass.py b/pype/hosts/houdini/plugins/publish/validate_bypass.py similarity index 100% rename from pype/plugins/houdini/publish/validate_bypass.py rename to pype/hosts/houdini/plugins/publish/validate_bypass.py diff --git a/pype/plugins/houdini/publish/validate_camera_rop.py b/pype/hosts/houdini/plugins/publish/validate_camera_rop.py similarity index 100% rename from pype/plugins/houdini/publish/validate_camera_rop.py rename to pype/hosts/houdini/plugins/publish/validate_camera_rop.py diff --git a/pype/plugins/houdini/publish/validate_mkpaths_toggled.py b/pype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py similarity index 100% rename from pype/plugins/houdini/publish/validate_mkpaths_toggled.py rename to pype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py diff --git a/pype/plugins/houdini/publish/validate_outnode_exists.py b/pype/hosts/houdini/plugins/publish/validate_outnode_exists.py similarity index 100% rename from pype/plugins/houdini/publish/validate_outnode_exists.py rename to pype/hosts/houdini/plugins/publish/validate_outnode_exists.py diff --git a/pype/plugins/houdini/publish/validate_output_node.py b/pype/hosts/houdini/plugins/publish/validate_output_node.py similarity index 100% rename from pype/plugins/houdini/publish/validate_output_node.py rename to pype/hosts/houdini/plugins/publish/validate_output_node.py diff --git a/pype/plugins/houdini/publish/validate_primitive_hierarchy_paths.py b/pype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py similarity index 100% rename from pype/plugins/houdini/publish/validate_primitive_hierarchy_paths.py rename to pype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py diff --git a/pype/plugins/houdini/publish/validate_vdb_input_node.py b/pype/hosts/houdini/plugins/publish/validate_vdb_input_node.py similarity index 100% rename from pype/plugins/houdini/publish/validate_vdb_input_node.py rename to pype/hosts/houdini/plugins/publish/validate_vdb_input_node.py From 302719241b134ce31bb6f36dd71764e3e8f1038c Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 2 Feb 2021 11:11:07 +0100 Subject: [PATCH 112/113] change houdini startup to reflect new, structure --- .../houdini/startup}/MainMenuCommon.XML | 0 .../houdini => hosts/houdini/startup}/scripts/123.py | 0 .../defaults/system_settings/applications.json | 12 ++++++------ 3 files changed, 6 insertions(+), 6 deletions(-) rename pype/{setup/houdini => hosts/houdini/startup}/MainMenuCommon.XML (100%) rename pype/{setup/houdini => hosts/houdini/startup}/scripts/123.py (100%) diff --git a/pype/setup/houdini/MainMenuCommon.XML b/pype/hosts/houdini/startup/MainMenuCommon.XML similarity index 100% rename from pype/setup/houdini/MainMenuCommon.XML rename to pype/hosts/houdini/startup/MainMenuCommon.XML diff --git a/pype/setup/houdini/scripts/123.py b/pype/hosts/houdini/startup/scripts/123.py similarity index 100% rename from pype/setup/houdini/scripts/123.py rename to pype/hosts/houdini/startup/scripts/123.py diff --git a/pype/settings/defaults/system_settings/applications.json b/pype/settings/defaults/system_settings/applications.json index 1716af41e2..c4acd5f4fe 100644 --- a/pype/settings/defaults/system_settings/applications.json +++ b/pype/settings/defaults/system_settings/applications.json @@ -862,14 +862,14 @@ ] }, "HOUDINI_PATH": { - "darwin": "{PYPE_ROOT}/setup/houdini:&", - "linux": "{PYPE_ROOT}/setup/houdini:&", - "windows": "{PYPE_ROOT}/setup/houdini;&" + "darwin": "{PYPE_ROOT}/pype/hosts/houdini/startup:&", + "linux": "{PYPE_ROOT}/pype/hosts/houdini/startup:&", + "windows": "{PYPE_ROOT}/pype/hosts/houdini/startup;&" }, "HOUDINI_MENU_PATH": { - "darwin": "{PYPE_ROOT}/setup/houdini:&", - "linux": "{PYPE_ROOT}/setup/houdini:&", - "windows": "{PYPE_ROOT}/setup/houdini;&" + "darwin": "{PYPE_ROOT}/pype/hosts/houdini/startup:&", + "linux": "{PYPE_ROOT}/pype/hosts/houdini/startup:&", + "windows": "{PYPE_ROOT}/pype/hosts/houdini/startup;&" } }, "variants": { From 44bb905057cd0b5a65e78b5604e8458fc9c50b05 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 2 Feb 2021 11:11:26 +0100 Subject: [PATCH 113/113] fix forgotten unreal import --- pype/hosts/unreal/plugins/create/create_layout.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/hosts/unreal/plugins/create/create_layout.py b/pype/hosts/unreal/plugins/create/create_layout.py index 82cef43cee..e810357c8a 100644 --- a/pype/hosts/unreal/plugins/create/create_layout.py +++ b/pype/hosts/unreal/plugins/create/create_layout.py @@ -1,5 +1,5 @@ from unreal import EditorLevelLibrary as ell -from pype.hosts.unreal.plugin import Creator +from pype.hosts.unreal.api.plugin import Creator from avalon.unreal import ( instantiate, )