From 597ea868765b8a31e7743e5a94224a3d7738319a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 5 Oct 2023 14:44:56 +0200 Subject: [PATCH 01/43] fix source path, not destination path (#5702) --- start.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start.py b/start.py index 3b020c76c0..54a252ccf3 100644 --- a/start.py +++ b/start.py @@ -366,8 +366,8 @@ def run_disk_mapping_commands(settings): destination = destination.replace("/", "\\").rstrip("\\") source = source.replace("/", "\\").rstrip("\\") # Add slash after ':' ('G:' -> 'G:\') - if destination.endswith(":"): - destination += "\\" + if source.endswith(":"): + source += "\\" else: destination = destination.rstrip("/") source = source.rstrip("/") From 038cdfa80e84052f303bc7c0739c5986c0dc7b04 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 24 Oct 2023 19:34:56 +0800 Subject: [PATCH 02/43] allows users to enable custom attributes for abc depending on their preferences and supsended refresh for abc & obj extractor for optimization --- openpype/hosts/max/api/lib.py | 13 ++++++ .../hosts/max/plugins/create/create_camera.py | 18 ++++++++ .../hosts/max/plugins/create/create_model.py | 18 ++++++++ .../max/plugins/create/create_pointcache.py | 18 ++++++++ .../max/plugins/publish/extract_camera_abc.py | 39 ++++++++---------- .../max/plugins/publish/extract_camera_fbx.py | 3 -- .../plugins/publish/extract_max_scene_raw.py | 1 - .../max/plugins/publish/extract_model.py | 41 +++++++++---------- .../max/plugins/publish/extract_model_fbx.py | 4 -- .../max/plugins/publish/extract_model_obj.py | 27 ++++++------ .../max/plugins/publish/extract_pointcache.py | 37 ++++++++--------- 11 files changed, 134 insertions(+), 85 deletions(-) diff --git a/openpype/hosts/max/api/lib.py b/openpype/hosts/max/api/lib.py index 8b70b3ced7..f02e3372b0 100644 --- a/openpype/hosts/max/api/lib.py +++ b/openpype/hosts/max/api/lib.py @@ -497,3 +497,16 @@ def get_plugins() -> list: plugin_info_list.append(plugin_info) return plugin_info_list + + +@contextlib.contextmanager +def suspended_refresh(): + rt.disableSceneRedraw() + rt.suspendEditing() + + try: + yield + + finally: + rt.enableSceneRedraw() + rt.resumeEditing() diff --git a/openpype/hosts/max/plugins/create/create_camera.py b/openpype/hosts/max/plugins/create/create_camera.py index 804d629ec7..8277581d31 100644 --- a/openpype/hosts/max/plugins/create/create_camera.py +++ b/openpype/hosts/max/plugins/create/create_camera.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """Creator plugin for creating camera.""" from openpype.hosts.max.api import plugin +from openpype.lib import BoolDef class CreateCamera(plugin.MaxCreator): @@ -9,3 +10,20 @@ class CreateCamera(plugin.MaxCreator): label = "Camera" family = "camera" icon = "gear" + + def create(self, subset_name, instance_data, pre_create_data): + instance_data["custom_attrs"] = pre_create_data.get( + "custom_attrs") + + super(CreateCamera, self).create( + subset_name, + instance_data, + pre_create_data) + + def get_pre_create_attr_defs(self): + attrs = super().get_pre_create_attr_defs() + return attrs + [ + BoolDef("custom_attrs", + label="Custom Attributes", + default=False), + ] diff --git a/openpype/hosts/max/plugins/create/create_model.py b/openpype/hosts/max/plugins/create/create_model.py index fc09d475ef..9c459a184e 100644 --- a/openpype/hosts/max/plugins/create/create_model.py +++ b/openpype/hosts/max/plugins/create/create_model.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """Creator plugin for model.""" from openpype.hosts.max.api import plugin +from openpype.lib import BoolDef class CreateModel(plugin.MaxCreator): @@ -9,3 +10,20 @@ class CreateModel(plugin.MaxCreator): label = "Model" family = "model" icon = "gear" + + def create(self, subset_name, instance_data, pre_create_data): + instance_data["custom_attrs"] = pre_create_data.get( + "custom_attrs") + + super(CreateModel, self).create( + subset_name, + instance_data, + pre_create_data) + + def get_pre_create_attr_defs(self): + attrs = super().get_pre_create_attr_defs() + return attrs + [ + BoolDef("custom_attrs", + label="Custom Attributes", + default=False), + ] diff --git a/openpype/hosts/max/plugins/create/create_pointcache.py b/openpype/hosts/max/plugins/create/create_pointcache.py index c2d11f4c32..2790ceeefc 100644 --- a/openpype/hosts/max/plugins/create/create_pointcache.py +++ b/openpype/hosts/max/plugins/create/create_pointcache.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """Creator plugin for creating pointcache alembics.""" from openpype.hosts.max.api import plugin +from openpype.lib import BoolDef class CreatePointCache(plugin.MaxCreator): @@ -9,3 +10,20 @@ class CreatePointCache(plugin.MaxCreator): label = "Point Cache" family = "pointcache" icon = "gear" + + def create(self, subset_name, instance_data, pre_create_data): + instance_data["custom_attrs"] = pre_create_data.get( + "custom_attrs") + + super(CreatePointCache, self).create( + subset_name, + instance_data, + pre_create_data) + + def get_pre_create_attr_defs(self): + attrs = super().get_pre_create_attr_defs() + return attrs + [ + BoolDef("custom_attrs", + label="Custom Attributes", + default=False), + ] diff --git a/openpype/hosts/max/plugins/publish/extract_camera_abc.py b/openpype/hosts/max/plugins/publish/extract_camera_abc.py index b1918c53e0..d7c2e6a557 100644 --- a/openpype/hosts/max/plugins/publish/extract_camera_abc.py +++ b/openpype/hosts/max/plugins/publish/extract_camera_abc.py @@ -4,6 +4,7 @@ import pyblish.api from pymxs import runtime as rt from openpype.hosts.max.api import maintained_selection +from openpype.hosts.max.api.lib import suspended_refresh from openpype.pipeline import OptionalPyblishPluginMixin, publish @@ -22,33 +23,29 @@ class ExtractCameraAlembic(publish.Extractor, OptionalPyblishPluginMixin): start = float(instance.data.get("frameStartHandle", 1)) end = float(instance.data.get("frameEndHandle", 1)) - self.log.info("Extracting Camera ...") - stagingdir = self.staging_dir(instance) filename = "{name}.abc".format(**instance.data) path = os.path.join(stagingdir, filename) - # We run the render - self.log.info(f"Writing alembic '{filename}' to '{stagingdir}'") + with suspended_refresh(): + rt.AlembicExport.ArchiveType = rt.Name("ogawa") + rt.AlembicExport.CoordinateSystem = rt.Name("maya") + rt.AlembicExport.StartFrame = start + rt.AlembicExport.EndFrame = end + rt.AlembicExport.CustomAttributes = instance.data.get( + "custom_attrs", False) - rt.AlembicExport.ArchiveType = rt.Name("ogawa") - rt.AlembicExport.CoordinateSystem = rt.Name("maya") - rt.AlembicExport.StartFrame = start - rt.AlembicExport.EndFrame = end - rt.AlembicExport.CustomAttributes = True + with maintained_selection(): + # select and export + node_list = instance.data["members"] + rt.Select(node_list) + rt.ExportFile( + path, + rt.Name("noPrompt"), + selectedOnly=True, + using=rt.AlembicExport, + ) - with maintained_selection(): - # select and export - node_list = instance.data["members"] - rt.Select(node_list) - rt.ExportFile( - path, - rt.Name("noPrompt"), - selectedOnly=True, - using=rt.AlembicExport, - ) - - self.log.info("Performing Extraction ...") if "representations" not in instance.data: instance.data["representations"] = [] diff --git a/openpype/hosts/max/plugins/publish/extract_camera_fbx.py b/openpype/hosts/max/plugins/publish/extract_camera_fbx.py index 537c88eb4d..4b5631b05f 100644 --- a/openpype/hosts/max/plugins/publish/extract_camera_fbx.py +++ b/openpype/hosts/max/plugins/publish/extract_camera_fbx.py @@ -20,13 +20,10 @@ class ExtractCameraFbx(publish.Extractor, OptionalPyblishPluginMixin): if not self.is_active(instance.data): return - self.log.debug("Extracting Camera ...") stagingdir = self.staging_dir(instance) filename = "{name}.fbx".format(**instance.data) filepath = os.path.join(stagingdir, filename) - self.log.info(f"Writing fbx file '{filename}' to '{filepath}'") - rt.FBXExporterSetParam("Animation", True) rt.FBXExporterSetParam("Cameras", True) rt.FBXExporterSetParam("AxisConversionMethod", "Animation") diff --git a/openpype/hosts/max/plugins/publish/extract_max_scene_raw.py b/openpype/hosts/max/plugins/publish/extract_max_scene_raw.py index a7a889c587..791cc65fcd 100644 --- a/openpype/hosts/max/plugins/publish/extract_max_scene_raw.py +++ b/openpype/hosts/max/plugins/publish/extract_max_scene_raw.py @@ -26,7 +26,6 @@ class ExtractMaxSceneRaw(publish.Extractor, OptionalPyblishPluginMixin): filename = "{name}.max".format(**instance.data) max_path = os.path.join(stagingdir, filename) - self.log.info("Writing max file '%s' to '%s'" % (filename, max_path)) if "representations" not in instance.data: instance.data["representations"] = [] diff --git a/openpype/hosts/max/plugins/publish/extract_model.py b/openpype/hosts/max/plugins/publish/extract_model.py index 38f4848c5e..36e789d180 100644 --- a/openpype/hosts/max/plugins/publish/extract_model.py +++ b/openpype/hosts/max/plugins/publish/extract_model.py @@ -3,6 +3,7 @@ import pyblish.api from openpype.pipeline import publish, OptionalPyblishPluginMixin from pymxs import runtime as rt from openpype.hosts.max.api import maintained_selection +from openpype.hosts.max.api.lib import suspended_refresh class ExtractModel(publish.Extractor, OptionalPyblishPluginMixin): @@ -20,34 +21,30 @@ class ExtractModel(publish.Extractor, OptionalPyblishPluginMixin): if not self.is_active(instance.data): return - self.log.debug("Extracting Geometry ...") - stagingdir = self.staging_dir(instance) filename = "{name}.abc".format(**instance.data) filepath = os.path.join(stagingdir, filename) - # We run the render - self.log.info("Writing alembic '%s' to '%s'" % (filename, stagingdir)) + with suspended_refresh(): + rt.AlembicExport.ArchiveType = rt.name("ogawa") + rt.AlembicExport.CoordinateSystem = rt.name("maya") + rt.AlembicExport.CustomAttributes = instance.data.get( + "custom_attrs", False) + rt.AlembicExport.UVs = True + rt.AlembicExport.VertexColors = True + rt.AlembicExport.PreserveInstances = True - rt.AlembicExport.ArchiveType = rt.name("ogawa") - rt.AlembicExport.CoordinateSystem = rt.name("maya") - rt.AlembicExport.CustomAttributes = True - rt.AlembicExport.UVs = True - rt.AlembicExport.VertexColors = True - rt.AlembicExport.PreserveInstances = True + with maintained_selection(): + # select and export + node_list = instance.data["members"] + rt.Select(node_list) + rt.exportFile( + filepath, + rt.name("noPrompt"), + selectedOnly=True, + using=rt.AlembicExport, + ) - with maintained_selection(): - # select and export - node_list = instance.data["members"] - rt.Select(node_list) - rt.exportFile( - filepath, - rt.name("noPrompt"), - selectedOnly=True, - using=rt.AlembicExport, - ) - - self.log.info("Performing Extraction ...") if "representations" not in instance.data: instance.data["representations"] = [] diff --git a/openpype/hosts/max/plugins/publish/extract_model_fbx.py b/openpype/hosts/max/plugins/publish/extract_model_fbx.py index fd48ed5007..6c42fd5364 100644 --- a/openpype/hosts/max/plugins/publish/extract_model_fbx.py +++ b/openpype/hosts/max/plugins/publish/extract_model_fbx.py @@ -20,12 +20,9 @@ class ExtractModelFbx(publish.Extractor, OptionalPyblishPluginMixin): if not self.is_active(instance.data): return - self.log.debug("Extracting Geometry ...") - stagingdir = self.staging_dir(instance) filename = "{name}.fbx".format(**instance.data) filepath = os.path.join(stagingdir, filename) - self.log.info("Writing FBX '%s' to '%s'" % (filepath, stagingdir)) rt.FBXExporterSetParam("Animation", False) rt.FBXExporterSetParam("Cameras", False) @@ -46,7 +43,6 @@ class ExtractModelFbx(publish.Extractor, OptionalPyblishPluginMixin): using=rt.FBXEXP, ) - self.log.info("Performing Extraction ...") if "representations" not in instance.data: instance.data["representations"] = [] diff --git a/openpype/hosts/max/plugins/publish/extract_model_obj.py b/openpype/hosts/max/plugins/publish/extract_model_obj.py index a5d9ad6597..8464353164 100644 --- a/openpype/hosts/max/plugins/publish/extract_model_obj.py +++ b/openpype/hosts/max/plugins/publish/extract_model_obj.py @@ -3,6 +3,7 @@ import pyblish.api from openpype.pipeline import publish, OptionalPyblishPluginMixin from pymxs import runtime as rt from openpype.hosts.max.api import maintained_selection +from openpype.hosts.max.api.lib import suspended_refresh from openpype.pipeline.publish import KnownPublishError @@ -21,25 +22,21 @@ class ExtractModelObj(publish.Extractor, OptionalPyblishPluginMixin): if not self.is_active(instance.data): return - self.log.debug("Extracting Geometry ...") - stagingdir = self.staging_dir(instance) filename = "{name}.obj".format(**instance.data) filepath = os.path.join(stagingdir, filename) - self.log.info("Writing OBJ '%s' to '%s'" % (filepath, stagingdir)) - - self.log.info("Performing Extraction ...") - with maintained_selection(): - # select and export - node_list = instance.data["members"] - rt.Select(node_list) - rt.exportFile( - filepath, - rt.name("noPrompt"), - selectedOnly=True, - using=rt.ObjExp, - ) + with suspended_refresh(): + with maintained_selection(): + # select and export + node_list = instance.data["members"] + rt.Select(node_list) + rt.exportFile( + filepath, + rt.name("noPrompt"), + selectedOnly=True, + using=rt.ObjExp, + ) if not os.path.exists(filepath): raise KnownPublishError( "File {} wasn't produced by 3ds max, please check the logs.") diff --git a/openpype/hosts/max/plugins/publish/extract_pointcache.py b/openpype/hosts/max/plugins/publish/extract_pointcache.py index c3de623bc0..71dc667d7e 100644 --- a/openpype/hosts/max/plugins/publish/extract_pointcache.py +++ b/openpype/hosts/max/plugins/publish/extract_pointcache.py @@ -42,6 +42,7 @@ import pyblish.api from openpype.pipeline import publish from pymxs import runtime as rt from openpype.hosts.max.api import maintained_selection +from openpype.hosts.max.api.lib import suspended_refresh class ExtractAlembic(publish.Extractor): @@ -54,30 +55,28 @@ class ExtractAlembic(publish.Extractor): start = float(instance.data.get("frameStartHandle", 1)) end = float(instance.data.get("frameEndHandle", 1)) - self.log.debug("Extracting pointcache ...") - parent_dir = self.staging_dir(instance) file_name = "{name}.abc".format(**instance.data) path = os.path.join(parent_dir, file_name) - # We run the render - self.log.info("Writing alembic '%s' to '%s'" % (file_name, parent_dir)) + with suspended_refresh(): + rt.AlembicExport.ArchiveType = rt.name("ogawa") + rt.AlembicExport.CoordinateSystem = rt.name("maya") + rt.AlembicExport.StartFrame = start + rt.AlembicExport.EndFrame = end + rt.AlembicExport.CustomAttributes = instance.data.get( + "custom_attrs", False) - rt.AlembicExport.ArchiveType = rt.name("ogawa") - rt.AlembicExport.CoordinateSystem = rt.name("maya") - rt.AlembicExport.StartFrame = start - rt.AlembicExport.EndFrame = end - - with maintained_selection(): - # select and export - node_list = instance.data["members"] - rt.Select(node_list) - rt.exportFile( - path, - rt.name("noPrompt"), - selectedOnly=True, - using=rt.AlembicExport, - ) + with maintained_selection(): + # select and export + node_list = instance.data["members"] + rt.Select(node_list) + rt.exportFile( + path, + rt.name("noPrompt"), + selectedOnly=True, + using=rt.AlembicExport, + ) if "representations" not in instance.data: instance.data["representations"] = [] From a320c30d437b59c0d2cd83c07e5b477f9cdb8291 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 24 Oct 2023 19:52:54 +0800 Subject: [PATCH 03/43] update docstring --- openpype/hosts/max/api/lib.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/hosts/max/api/lib.py b/openpype/hosts/max/api/lib.py index f02e3372b0..051076c418 100644 --- a/openpype/hosts/max/api/lib.py +++ b/openpype/hosts/max/api/lib.py @@ -501,6 +501,8 @@ def get_plugins() -> list: @contextlib.contextmanager def suspended_refresh(): + """Suspended refresh for scene and modify panel redraw. + """ rt.disableSceneRedraw() rt.suspendEditing() From 92bab3491afa798dfd646555286af1031b225e84 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 24 Oct 2023 21:44:36 +0800 Subject: [PATCH 04/43] add to check if the max is in headless mode for suspend refreshing and optimized the abc extractors --- openpype/hosts/max/api/lib.py | 4 +- .../hosts/max/plugins/create/create_camera.py | 18 ----- .../hosts/max/plugins/create/create_model.py | 18 ----- .../max/plugins/create/create_pointcache.py | 18 ----- .../max/plugins/publish/extract_camera_abc.py | 61 ---------------- .../max/plugins/publish/extract_model.py | 60 ---------------- .../max/plugins/publish/extract_pointcache.py | 70 ++++++++++++++++--- 7 files changed, 62 insertions(+), 187 deletions(-) delete mode 100644 openpype/hosts/max/plugins/publish/extract_camera_abc.py delete mode 100644 openpype/hosts/max/plugins/publish/extract_model.py diff --git a/openpype/hosts/max/api/lib.py b/openpype/hosts/max/api/lib.py index 0c0aa6ad2c..61a2d938a1 100644 --- a/openpype/hosts/max/api/lib.py +++ b/openpype/hosts/max/api/lib.py @@ -517,7 +517,9 @@ def suspended_refresh(): """ rt.disableSceneRedraw() rt.suspendEditing() - + if is_headless(): + yield + return try: yield diff --git a/openpype/hosts/max/plugins/create/create_camera.py b/openpype/hosts/max/plugins/create/create_camera.py index 8277581d31..804d629ec7 100644 --- a/openpype/hosts/max/plugins/create/create_camera.py +++ b/openpype/hosts/max/plugins/create/create_camera.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating camera.""" from openpype.hosts.max.api import plugin -from openpype.lib import BoolDef class CreateCamera(plugin.MaxCreator): @@ -10,20 +9,3 @@ class CreateCamera(plugin.MaxCreator): label = "Camera" family = "camera" icon = "gear" - - def create(self, subset_name, instance_data, pre_create_data): - instance_data["custom_attrs"] = pre_create_data.get( - "custom_attrs") - - super(CreateCamera, self).create( - subset_name, - instance_data, - pre_create_data) - - def get_pre_create_attr_defs(self): - attrs = super().get_pre_create_attr_defs() - return attrs + [ - BoolDef("custom_attrs", - label="Custom Attributes", - default=False), - ] diff --git a/openpype/hosts/max/plugins/create/create_model.py b/openpype/hosts/max/plugins/create/create_model.py index 9c459a184e..fc09d475ef 100644 --- a/openpype/hosts/max/plugins/create/create_model.py +++ b/openpype/hosts/max/plugins/create/create_model.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for model.""" from openpype.hosts.max.api import plugin -from openpype.lib import BoolDef class CreateModel(plugin.MaxCreator): @@ -10,20 +9,3 @@ class CreateModel(plugin.MaxCreator): label = "Model" family = "model" icon = "gear" - - def create(self, subset_name, instance_data, pre_create_data): - instance_data["custom_attrs"] = pre_create_data.get( - "custom_attrs") - - super(CreateModel, self).create( - subset_name, - instance_data, - pre_create_data) - - def get_pre_create_attr_defs(self): - attrs = super().get_pre_create_attr_defs() - return attrs + [ - BoolDef("custom_attrs", - label="Custom Attributes", - default=False), - ] diff --git a/openpype/hosts/max/plugins/create/create_pointcache.py b/openpype/hosts/max/plugins/create/create_pointcache.py index 2790ceeefc..c2d11f4c32 100644 --- a/openpype/hosts/max/plugins/create/create_pointcache.py +++ b/openpype/hosts/max/plugins/create/create_pointcache.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating pointcache alembics.""" from openpype.hosts.max.api import plugin -from openpype.lib import BoolDef class CreatePointCache(plugin.MaxCreator): @@ -10,20 +9,3 @@ class CreatePointCache(plugin.MaxCreator): label = "Point Cache" family = "pointcache" icon = "gear" - - def create(self, subset_name, instance_data, pre_create_data): - instance_data["custom_attrs"] = pre_create_data.get( - "custom_attrs") - - super(CreatePointCache, self).create( - subset_name, - instance_data, - pre_create_data) - - def get_pre_create_attr_defs(self): - attrs = super().get_pre_create_attr_defs() - return attrs + [ - BoolDef("custom_attrs", - label="Custom Attributes", - default=False), - ] diff --git a/openpype/hosts/max/plugins/publish/extract_camera_abc.py b/openpype/hosts/max/plugins/publish/extract_camera_abc.py deleted file mode 100644 index 934c6b9d99..0000000000 --- a/openpype/hosts/max/plugins/publish/extract_camera_abc.py +++ /dev/null @@ -1,61 +0,0 @@ -import os - -import pyblish.api -from pymxs import runtime as rt - -from openpype.hosts.max.api import maintained_selection -from openpype.hosts.max.api.lib import suspended_refresh -from openpype.pipeline import OptionalPyblishPluginMixin, publish - - -class ExtractCameraAlembic(publish.Extractor, OptionalPyblishPluginMixin): - """Extract Camera with AlembicExport.""" - - order = pyblish.api.ExtractorOrder - 0.1 - label = "Extract Alembic Camera" - hosts = ["max"] - families = ["camera"] - optional = True - - def process(self, instance): - if not self.is_active(instance.data): - return - start = instance.data["frameStartHandle"] - end = instance.data["frameEndHandle"] - - stagingdir = self.staging_dir(instance) - filename = "{name}.abc".format(**instance.data) - path = os.path.join(stagingdir, filename) - - with suspended_refresh(): - rt.AlembicExport.ArchiveType = rt.Name("ogawa") - rt.AlembicExport.CoordinateSystem = rt.Name("maya") - rt.AlembicExport.StartFrame = start - rt.AlembicExport.EndFrame = end - rt.AlembicExport.CustomAttributes = instance.data.get( - "custom_attrs", False) - - with maintained_selection(): - # select and export - node_list = instance.data["members"] - rt.Select(node_list) - rt.ExportFile( - path, - rt.Name("noPrompt"), - selectedOnly=True, - using=rt.AlembicExport, - ) - - if "representations" not in instance.data: - instance.data["representations"] = [] - - representation = { - "name": "abc", - "ext": "abc", - "files": filename, - "stagingDir": stagingdir, - "frameStart": start, - "frameEnd": end, - } - instance.data["representations"].append(representation) - self.log.info(f"Extracted instance '{instance.name}' to: {path}") diff --git a/openpype/hosts/max/plugins/publish/extract_model.py b/openpype/hosts/max/plugins/publish/extract_model.py deleted file mode 100644 index 36e789d180..0000000000 --- a/openpype/hosts/max/plugins/publish/extract_model.py +++ /dev/null @@ -1,60 +0,0 @@ -import os -import pyblish.api -from openpype.pipeline import publish, OptionalPyblishPluginMixin -from pymxs import runtime as rt -from openpype.hosts.max.api import maintained_selection -from openpype.hosts.max.api.lib import suspended_refresh - - -class ExtractModel(publish.Extractor, OptionalPyblishPluginMixin): - """ - Extract Geometry in Alembic Format - """ - - order = pyblish.api.ExtractorOrder - 0.1 - label = "Extract Geometry (Alembic)" - hosts = ["max"] - families = ["model"] - optional = True - - def process(self, instance): - if not self.is_active(instance.data): - return - - stagingdir = self.staging_dir(instance) - filename = "{name}.abc".format(**instance.data) - filepath = os.path.join(stagingdir, filename) - - with suspended_refresh(): - rt.AlembicExport.ArchiveType = rt.name("ogawa") - rt.AlembicExport.CoordinateSystem = rt.name("maya") - rt.AlembicExport.CustomAttributes = instance.data.get( - "custom_attrs", False) - rt.AlembicExport.UVs = True - rt.AlembicExport.VertexColors = True - rt.AlembicExport.PreserveInstances = True - - with maintained_selection(): - # select and export - node_list = instance.data["members"] - rt.Select(node_list) - rt.exportFile( - filepath, - rt.name("noPrompt"), - selectedOnly=True, - using=rt.AlembicExport, - ) - - if "representations" not in instance.data: - instance.data["representations"] = [] - - representation = { - "name": "abc", - "ext": "abc", - "files": filename, - "stagingDir": stagingdir, - } - instance.data["representations"].append(representation) - self.log.info( - "Extracted instance '%s' to: %s" % (instance.name, filepath) - ) diff --git a/openpype/hosts/max/plugins/publish/extract_pointcache.py b/openpype/hosts/max/plugins/publish/extract_pointcache.py index fca318a43f..4b3407274c 100644 --- a/openpype/hosts/max/plugins/publish/extract_pointcache.py +++ b/openpype/hosts/max/plugins/publish/extract_pointcache.py @@ -39,34 +39,31 @@ Note: """ import os import pyblish.api -from openpype.pipeline import publish +from openpype.pipeline import publish, OptionalPyblishPluginMixin from pymxs import runtime as rt from openpype.hosts.max.api import maintained_selection from openpype.hosts.max.api.lib import suspended_refresh +from openpype.lib import BoolDef -class ExtractAlembic(publish.Extractor): +class ExtractAlembic(publish.Extractor, + OptionalPyblishPluginMixin): order = pyblish.api.ExtractorOrder label = "Extract Pointcache" hosts = ["max"] families = ["pointcache"] + optional = False def process(self, instance): - start = instance.data["frameStartHandle"] - end = instance.data["frameEndHandle"] + if not self.is_active(instance.data): + return parent_dir = self.staging_dir(instance) file_name = "{name}.abc".format(**instance.data) path = os.path.join(parent_dir, file_name) with suspended_refresh(): - rt.AlembicExport.ArchiveType = rt.name("ogawa") - rt.AlembicExport.CoordinateSystem = rt.name("maya") - rt.AlembicExport.StartFrame = start - rt.AlembicExport.EndFrame = end - rt.AlembicExport.CustomAttributes = instance.data.get( - "custom_attrs", False) - + self._set_abc_attributes(instance) with maintained_selection(): # select and export node_list = instance.data["members"] @@ -88,3 +85,54 @@ class ExtractAlembic(publish.Extractor): "stagingDir": parent_dir, } instance.data["representations"].append(representation) + + def _set_abc_attributes(self, instance): + start = instance.data["frameStartHandle"] + end = instance.data["frameEndHandle"] + attr_values = self.get_attr_values_from_data(instance.data) + custom_attrs = attr_values.get("custom_attrs", False) + rt.AlembicExport.ArchiveType = rt.Name("ogawa") + rt.AlembicExport.CoordinateSystem = rt.Name("maya") + rt.AlembicExport.StartFrame = start + rt.AlembicExport.EndFrame = end + rt.AlembicExport.CustomAttributes = custom_attrs + + @classmethod + def get_attribute_defs(cls): + return [ + BoolDef("custom_attrs", + label="Custom Attributes", + default=False), + ] + + +class ExtractCameraAlembic(ExtractAlembic): + """Extract Camera with AlembicExport.""" + + order = pyblish.api.ExtractorOrder - 0.1 + label = "Extract Alembic Camera" + hosts = ["max"] + families = ["camera"] + optional = True + + +class ExtractModel(ExtractAlembic): + """ + Extract Geometry in Alembic Format + """ + + order = pyblish.api.ExtractorOrder - 0.1 + label = "Extract Geometry (Alembic)" + hosts = ["max"] + families = ["model"] + optional = True + + def _set_abc_attributes(self, instance): + attr_values = self.get_attr_values_from_data(instance.data) + custom_attrs = attr_values.get("custom_attrs", False) + rt.AlembicExport.ArchiveType = rt.name("ogawa") + rt.AlembicExport.CoordinateSystem = rt.name("maya") + rt.AlembicExport.CustomAttributes = custom_attrs + rt.AlembicExport.UVs = True + rt.AlembicExport.VertexColors = True + rt.AlembicExport.PreserveInstances = True From a22d1baa15c03e9889dbf836a5f975c05b8751e7 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 25 Oct 2023 12:31:54 +0800 Subject: [PATCH 05/43] clean up the codes --- openpype/hosts/max/api/lib.py | 4 ++-- openpype/hosts/max/plugins/publish/extract_pointcache.py | 9 +-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/openpype/hosts/max/api/lib.py b/openpype/hosts/max/api/lib.py index 61a2d938a1..e44cea42ad 100644 --- a/openpype/hosts/max/api/lib.py +++ b/openpype/hosts/max/api/lib.py @@ -515,11 +515,11 @@ def get_plugins() -> list: def suspended_refresh(): """Suspended refresh for scene and modify panel redraw. """ - rt.disableSceneRedraw() - rt.suspendEditing() if is_headless(): yield return + rt.disableSceneRedraw() + rt.suspendEditing() try: yield diff --git a/openpype/hosts/max/plugins/publish/extract_pointcache.py b/openpype/hosts/max/plugins/publish/extract_pointcache.py index 4b3407274c..d15cd676f2 100644 --- a/openpype/hosts/max/plugins/publish/extract_pointcache.py +++ b/openpype/hosts/max/plugins/publish/extract_pointcache.py @@ -109,21 +109,14 @@ class ExtractAlembic(publish.Extractor, class ExtractCameraAlembic(ExtractAlembic): """Extract Camera with AlembicExport.""" - order = pyblish.api.ExtractorOrder - 0.1 label = "Extract Alembic Camera" - hosts = ["max"] families = ["camera"] optional = True class ExtractModel(ExtractAlembic): - """ - Extract Geometry in Alembic Format - """ - - order = pyblish.api.ExtractorOrder - 0.1 + """Extract Geometry in Alembic Format""" label = "Extract Geometry (Alembic)" - hosts = ["max"] families = ["model"] optional = True From d108641aa7d9575d03de750945cdd4608c857361 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 25 Oct 2023 12:48:33 +0800 Subject: [PATCH 06/43] remove optional=ture in children class of abc extractor --- openpype/hosts/max/plugins/publish/extract_pointcache.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openpype/hosts/max/plugins/publish/extract_pointcache.py b/openpype/hosts/max/plugins/publish/extract_pointcache.py index d15cd676f2..0097432f43 100644 --- a/openpype/hosts/max/plugins/publish/extract_pointcache.py +++ b/openpype/hosts/max/plugins/publish/extract_pointcache.py @@ -52,7 +52,7 @@ class ExtractAlembic(publish.Extractor, label = "Extract Pointcache" hosts = ["max"] families = ["pointcache"] - optional = False + optional = True def process(self, instance): if not self.is_active(instance.data): @@ -111,14 +111,12 @@ class ExtractCameraAlembic(ExtractAlembic): label = "Extract Alembic Camera" families = ["camera"] - optional = True class ExtractModel(ExtractAlembic): """Extract Geometry in Alembic Format""" label = "Extract Geometry (Alembic)" families = ["model"] - optional = True def _set_abc_attributes(self, instance): attr_values = self.get_attr_values_from_data(instance.data) From f6b41910e1c5059c08fb5508240c2f744cef22be Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 6 Dec 2023 17:04:20 +0100 Subject: [PATCH 07/43] Revert "Revert "Ayon: Updated name of Adobe extension to Ayon" (#6010)" This reverts commit 15eabaf3ad871e134a6732a9460c1d04f1573f8c. --- openpype/hosts/aftereffects/api/README.md | 20 +++++++++-------- openpype/hosts/aftereffects/api/extension.zxp | Bin 103005 -> 106275 bytes .../hosts/aftereffects/api/extension/.debug | 21 +++++++++--------- .../api/extension/CSXS/manifest.xml | 12 +++++----- .../api/extension/icons/ayon_logo.png | Bin 0 -> 3538 bytes openpype/hosts/aftereffects/api/panel.png | Bin 0 -> 16269 bytes .../hosts/aftereffects/api/panel_failure.PNG | Bin 13568 -> 0 bytes .../hosts/aftereffects/api/panel_failure.png | Bin 0 -> 13115 bytes openpype/hosts/photoshop/api/README.md | 10 ++++----- openpype/hosts/photoshop/api/extension.zxp | Bin 54056 -> 55656 bytes openpype/hosts/photoshop/api/extension/.debug | 4 ++-- .../photoshop/api/extension/CSXS/manifest.xml | 10 ++++----- .../api/extension/icons/avalon-logo-48.png | Bin 1362 -> 0 bytes .../api/extension/icons/ayon_logo.png | Bin 0 -> 3538 bytes openpype/hosts/photoshop/api/panel.PNG | Bin 8756 -> 0 bytes .../api/panel.PNG => photoshop/api/panel.png} | Bin .../hosts/photoshop/api/panel_failure.PNG | Bin 13568 -> 0 bytes .../hosts/photoshop/api/panel_failure.png | Bin 0 -> 13115 bytes 18 files changed, 39 insertions(+), 38 deletions(-) create mode 100644 openpype/hosts/aftereffects/api/extension/icons/ayon_logo.png create mode 100644 openpype/hosts/aftereffects/api/panel.png delete mode 100644 openpype/hosts/aftereffects/api/panel_failure.PNG create mode 100644 openpype/hosts/aftereffects/api/panel_failure.png delete mode 100644 openpype/hosts/photoshop/api/extension/icons/avalon-logo-48.png create mode 100644 openpype/hosts/photoshop/api/extension/icons/ayon_logo.png delete mode 100644 openpype/hosts/photoshop/api/panel.PNG rename openpype/hosts/{aftereffects/api/panel.PNG => photoshop/api/panel.png} (100%) delete mode 100644 openpype/hosts/photoshop/api/panel_failure.PNG create mode 100644 openpype/hosts/photoshop/api/panel_failure.png diff --git a/openpype/hosts/aftereffects/api/README.md b/openpype/hosts/aftereffects/api/README.md index 790c9f859a..9c4bad3689 100644 --- a/openpype/hosts/aftereffects/api/README.md +++ b/openpype/hosts/aftereffects/api/README.md @@ -1,6 +1,6 @@ # AfterEffects Integration -Requirements: This extension requires use of Javascript engine, which is +Requirements: This extension requires use of Javascript engine, which is available since CC 16.0. Please check your File>Project Settings>Expressions>Expressions Engine @@ -13,26 +13,28 @@ The After Effects integration requires two components to work; `extension` and ` To install the extension download [Extension Manager Command Line tool (ExManCmd)](https://github.com/Adobe-CEP/Getting-Started-guides/tree/master/Package%20Distribute%20Install#option-2---exmancmd). ``` -ExManCmd /install {path to avalon-core}\avalon\photoshop\extension.zxp +ExManCmd /install {path to addon}/api/extension.zxp ``` OR download [Anastasiy’s Extension Manager](https://install.anastasiy.com/) +`{path to addon}` will be most likely in your AppData (on Windows, in your user data folder in Linux and MacOS.) + ### Server The easiest way to get the server and After Effects launch is with: ``` -python -c ^"import avalon.photoshop;avalon.aftereffects.launch(""c:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe"")^" +python -c ^"import openpype.hosts.photoshop;openpype.hosts..aftereffects.launch(""c:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe"")^" ``` `avalon.aftereffects.launch` launches the application and server, and also closes the server when After Effects exists. ## Usage -The After Effects extension can be found under `Window > Extensions > OpenPype`. Once launched you should be presented with a panel like this: +The After Effects extension can be found under `Window > Extensions > AYON`. Once launched you should be presented with a panel like this: -![Avalon Panel](panel.PNG "Avalon Panel") +![Ayon Panel](panel.png "Ayon Panel") ## Developing @@ -43,8 +45,8 @@ When developing the extension you can load it [unsigned](https://github.com/Adob When signing the extension you can use this [guide](https://github.com/Adobe-CEP/Getting-Started-guides/tree/master/Package%20Distribute%20Install#package-distribute-install-guide). ``` -ZXPSignCmd -selfSignedCert NA NA Avalon Avalon-After-Effects avalon extension.p12 -ZXPSignCmd -sign {path to avalon-core}\avalon\aftereffects\extension {path to avalon-core}\avalon\aftereffects\extension.zxp extension.p12 avalon +ZXPSignCmd -selfSignedCert NA NA Ayon Avalon-After-Effects Ayon extension.p12 +ZXPSignCmd -sign {path to addon}/api/extension {path to addon}/api/extension.zxp extension.p12 Ayon ``` ### Plugin Examples @@ -52,14 +54,14 @@ ZXPSignCmd -sign {path to avalon-core}\avalon\aftereffects\extension {path to av These plugins were made with the [polly config](https://github.com/mindbender-studio/config). To fully integrate and load, you will have to use this config and add `image` to the [integration plugin](https://github.com/mindbender-studio/config/blob/master/polly/plugins/publish/integrate_asset.py). Expected deployed extension location on default Windows: -`c:\Program Files (x86)\Common Files\Adobe\CEP\extensions\com.openpype.AE.panel` +`c:\Program Files (x86)\Common Files\Adobe\CEP\extensions\io.ynput.AE.panel` For easier debugging of Javascript: https://community.adobe.com/t5/download-install/adobe-extension-debuger-problem/td-p/10911704?page=1 Add (optional) --enable-blink-features=ShadowDOMV0,CustomElementsV0 when starting Chrome then localhost:8092 -Or use Visual Studio Code https://medium.com/adobetech/extendscript-debugger-for-visual-studio-code-public-release-a2ff6161fa01 +Or use Visual Studio Code https://medium.com/adobetech/extendscript-debugger-for-visual-studio-code-public-release-a2ff6161fa01 ## Resources - https://javascript-tools-guide.readthedocs.io/introduction/index.html - https://github.com/Adobe-CEP/Getting-Started-guides diff --git a/openpype/hosts/aftereffects/api/extension.zxp b/openpype/hosts/aftereffects/api/extension.zxp index 933dc7dc6cab34b6a1630b25d11a2167fa0aef7a..104a5c9e997577959bd8c134fc2ac9febbb8797a 100644 GIT binary patch delta 11531 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 diff --git a/openpype/hosts/aftereffects/api/extension/.debug b/openpype/hosts/aftereffects/api/extension/.debug index b06ec515dd..20a6713ab2 100644 --- a/openpype/hosts/aftereffects/api/extension/.debug +++ b/openpype/hosts/aftereffects/api/extension/.debug @@ -1,32 +1,31 @@ - + - + - + - + - + - + - + - + - + - + - \ No newline at end of file diff --git a/openpype/hosts/aftereffects/api/extension/CSXS/manifest.xml b/openpype/hosts/aftereffects/api/extension/CSXS/manifest.xml index 7329a9e723..cf6ba67f44 100644 --- a/openpype/hosts/aftereffects/api/extension/CSXS/manifest.xml +++ b/openpype/hosts/aftereffects/api/extension/CSXS/manifest.xml @@ -1,8 +1,8 @@ - + - + @@ -38,7 +38,7 @@ - + ./index.html @@ -49,7 +49,7 @@ Panel - OpenPype + AYON 200 @@ -66,7 +66,7 @@ - ./icons/iconNormal.png + ./icons/ayon_logo.png ./icons/iconRollover.png ./icons/iconDisabled.png ./icons/iconDarkNormal.png diff --git a/openpype/hosts/aftereffects/api/extension/icons/ayon_logo.png b/openpype/hosts/aftereffects/api/extension/icons/ayon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3a96f8e2b499baa337cdc5a4d3cdf547f9ded972 GIT binary patch literal 3538 zcmbVP2{e>zAD=LYtRE>$W=0V*GsZH!jAdpNp=8N+#h7_DgIUZBh8kBIYg*hEDUnht z*(*DlgrrTjgc4~Zvb0|MMvHUrckcJy^WFEH=Y5{%eSXjHzyHs9Q{A>~l9N%Ffj}T~ zPL4!((TrXk(vqULx7ep-(X^c9=*xjXkUEQF8Sk8J6a*simgech^>K9p$V@ttL}3Pl zNFJRfLPH?dwmcSz90qb>!Qf6B1BaNbZA8Fm6dc0a%oXj*B7jtyV=No=h~45zjtwJQ zQV_N_Fl!zlBA|m@5{yR=XK(->4)Ki_5Um$KqY$uf5N;R_VZSI4=Hu!HBQV(@%o2$< zBBRl07}gSLj5Q`>upt{@7&HchLR+AW&5evL05k?LHG%zj5F&AGN(kUi-1tM7Xoo{k zxm*^2LPbYMBcn}_O!iKcv8AOY3XMTwFh(MT5hsShCGm_H9G#yGM36&f(^y;@lL1>~ zBn2}gxj2MK)$caYSxdAG&JRC{JciOpYNF;GV96}T| z6C-1c5!%$#*bFd60~ixSv@w82e}}p=Mf<@YyeAB|!6>ws3xFiM{bRyyqBAbyk8U-*Rhggt< zL(GlH!DtgBEXEXT6pS?|8=0AzSdh(vLr7#3i=X$2OmgI6WPjeL{Ga!?vT35yB8C5B zp2dP&ObNh|#t{W8=0`<%fDu1d;WXH{EC5L4#q7o*$cteGDTp7RY5&**-)W<%posK; zg!?;;!wlg@lh~mBPLa3%Hl0u+<=~j6E125i_4`JB-$)BF_0nZ zTx?N`I_V3Wg+Qd!oQU?G)S-zJyTTuLtG3#nc0GCgesgn>`mQs1d8xL#EsFknc3d~R z6@I6sg{%C{)~5?sk!Q_{O7kMqX?!t$^TMZ{Uv_>`v$}KEwev;)QHI;Xg%i4Qjd9l= z=F@17>MGRQ_u~iOSdZrpn$ueRE*`T<8~r%+udy8cM^vlVrsfo`|jLmspMJ z$XXUQ)|9dTkgUCpL^Z_6p*-$oadL`O)PmMffN#5%VbBK|M@jgr+Wi-L@Sc-8uhn7C z`Zwpl*UR6{`rYEf(F&6)ZRIU(s}2>S`jrG7KwDRnovekL@J96Y9oj2Q4{Wl7)VMen z?Zrus&txja%cF>Ms?A*ZYlC%l8&hKBlH`T&6oy9{+!r`1HYtSmxklxngy%^Nxf=2N z6NcxokYkp)r5-7vQOmXkNLvYxFJQ~%9L}~JDwZmQUXE%G}?{5>)wLOO+t?@-lK6NF2bH(}ByeVcAg#Vd5)F>qh^Qs%!a;A)w4(6$F5mf!;~iP?@!|{`rxm&gT58z>ug3#eQ$;;r?xVbP(D2 z&X2>6m)1D9C>+~%S#CrrDDlXf8o8I#k6+2#bq-SQS=ZceaM=Nr`nL!E%5MyaIqSau zW&rcBvDasplTq%jhn8Q@Fi}ERl~ql{+j<_A;SasrT6lcM%KMgTYP_aZ4Bnu=;S@s= z7`j}Z_h!wy?tE*;S^JpL*)_)%#ETAL;aUmY(jzX$Yjob$t3t>9^*t_czxckUvb3m1 zE!Z#Tm!}>oE^SinXfK>P6(_E+B3!UWyknhCGR z+Fz4hUfK8BuEU6^DI8jde-XNlI;lK|9lQ2{XdGZs?e&p*b}Ca(un(pDwvJ{X`|Gl; zcjF7*YJ=}r@TTLA&nR9|khQ3RmfP@RB|EYu4-R^?k9@dfA6Td&0PT*}$vInlJQA{N9PfNq4!!XJk11`OQr@Z;P%j=O;bRF9)UT>1Q>= z_YUnpM2jEwg9R2G;ACx_8}qrWoATv_@&m!)$AW|Xf}4#h$ol4mr_Ly)m9}ur!L^!? zU{^}C4rleq@Lh$eMZ&Zfg4?!C?XOu|Wo6f>e(semC#2L01Pee+MPE;5hMZlCoJ!gR zJ}-TK+4_%-E}m9^a)oa$j9Iv0c7}GeKBD_Mo|VC>itxOiCz%&nHdRz;a4=>n1YTTN z+J4gD#zlr#TT%m|c-tJ|IYnbn!t%uUQ}eoOBa@4$krtkHw~?w}J&G$du7n@xAGkr5 z^q1i0%yW7Jb;4r;j5Y^)JeZo6nP9Bdh`&;Txdg7)@lbG@(cM*P8S<>uW3~Qc=%kox zEzBhsk=+-vHM5*>JTmih$I;B?g@JDHNG>O$!2pUJSH!doa=X2##$t9u%z_~NK>f^> z*5*==Zm~zj__2$-60h|N8phoBB2G;A-vx!^y95dPZMKO=3Z|1P=bU2odZr#!T&`X_ zX?V^M;(PC2OQg#4sC_3MKknzFN-K&32yt(1>}37e(<^ z3z)TaSjDKyT-#lCYG=0Oap*Z)dKF-KgkKsb>-w9O3KX#+8Pbqxne31MqJ;kHki4lY z$tKw_qSYUNY2kzBS08?5dI!`O(&Lx1s#ocuH8B833?L8#=KuAqZ!9kKygVeWmZ2GR zp(wX%$hOHcIVChXWwpKXU5zsJmN@&k;YwvSiEO#AQ0g>L?|$Um$l_m@lfxEbF+M2a E-zj>|X#fBK literal 0 HcmV?d00001 diff --git a/openpype/hosts/aftereffects/api/panel.png b/openpype/hosts/aftereffects/api/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..d05ed354286dc0dd00b5d7a2df40ba1e3e1fa6cb GIT binary patch literal 16269 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

G+>DJ?e&gjtJv$ZP-J* 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 diff --git a/openpype/hosts/aftereffects/api/panel_failure.png b/openpype/hosts/aftereffects/api/panel_failure.png new file mode 100644 index 0000000000000000000000000000000000000000..6e52a77d22d54708b8bf0d1abac676ce723bd254 GIT binary patch literal 13115 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 Extensions > Avalon`. Once launched you should be presented with a panel like this: +The Photoshop extension can be found under `Window > Extensions > Ayon`. Once launched you should be presented with a panel like this: -![Avalon Panel](panel.PNG "Avalon Panel") +![Ayon Panel](panel.png "AYON Panel") ## Developing @@ -37,7 +37,7 @@ When developing the extension you can load it [unsigned](https://github.com/Adob When signing the extension you can use this [guide](https://github.com/Adobe-CEP/Getting-Started-guides/tree/master/Package%20Distribute%20Install#package-distribute-install-guide). ``` -ZXPSignCmd -selfSignedCert NA NA Avalon Avalon-Photoshop avalon extension.p12 +ZXPSignCmd -selfSignedCert NA NA Ayon Ayon-Photoshop Ayon extension.p12 ZXPSignCmd -sign {path to avalon-core}\avalon\photoshop\extension {path to avalon-core}\avalon\photoshop\extension.zxp extension.p12 avalon ``` diff --git a/openpype/hosts/photoshop/api/extension.zxp b/openpype/hosts/photoshop/api/extension.zxp index 39b766cd0d354e63c5b0e5b874be47131860e3c6..26a73a37fdd2c064a8438f595e8612a7adbcb323 100644 GIT binary patch delta 10879 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 F^*&K&>% delta 9331 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 - + - \ No newline at end of file + diff --git a/openpype/hosts/photoshop/api/extension/CSXS/manifest.xml b/openpype/hosts/photoshop/api/extension/CSXS/manifest.xml index 2089d06da1..16d85be9b4 100644 --- a/openpype/hosts/photoshop/api/extension/CSXS/manifest.xml +++ b/openpype/hosts/photoshop/api/extension/CSXS/manifest.xml @@ -1,7 +1,7 @@ - + - + @@ -16,7 +16,7 @@ - + ./index.html @@ -32,7 +32,7 @@ Panel -

OpenPype + AYON 300 @@ -44,7 +44,7 @@ - ./icons/avalon-logo-48.png + ./icons/ayon_logo.png
diff --git a/openpype/hosts/photoshop/api/extension/icons/avalon-logo-48.png b/openpype/hosts/photoshop/api/extension/icons/avalon-logo-48.png deleted file mode 100644 index 33fe2a606bd1ac9d285eb0d6a90b9b14150ca3c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1362 zcmV-Y1+DstP)5JpvKiH|A7SK4P~kT{6`M*9LrdQ!Ns9=$qj3(E_W@4gmP#=ht)#^0_psT^(5Px6qr0)mBB%5&-P}{Y*9ph@Pcn`!ete zwiE<#115v#ScdV2GBk!NTFTzWbF>Xip`p8%&KqcqI~Jb6tC``Vaf&07o~axnzSGF( z(ok|5&-4zgtV5rc$qke?7a8cU$D55m^%IcuOgXaxfTb~yegblyEaWJw%`Qe=-M%S@ zhOXSbt2KkcJv{&)s&PL6vC{g1Y-aKYBs(yc@x{whhk_0fK#=N=)Uup zs)>qe=dc=h3&3Gwr10?^8zc#g%1L4Xs{p!rj(uw=)9Szs&#`@sH{=+ zG+fz{pjE0VR%8l+hOX;W8`PbV32glOJ!~I2VXJkTz5Ufkuk(!F8z4>Ok_kkI+Kb}3)n06_ssJy4_*!y{BAe4)9jbBbSR!>UnLxyMT9bL9_?YdfL@K^^G6aZ)C$Qje z(NzKf2bZq2#ed1=gx1ZJQM{TNMk>CBw!wSvUjy@gS4qs1_a85GREVYsFz!+tU$`&M%7iR@HuBiw5bSa5S}|?)>G0PCUMb-Q{Pf zZt0{hEhroOCi1l=h%&q$mkBdG$MzLns~iea1>hEds{qcP5QbL){0`u*@Qfwke+13^ UGpuMiD*ylh07*qoM6N<$g1d2qT>t<8 diff --git a/openpype/hosts/photoshop/api/extension/icons/ayon_logo.png b/openpype/hosts/photoshop/api/extension/icons/ayon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3a96f8e2b499baa337cdc5a4d3cdf547f9ded972 GIT binary patch literal 3538 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 E-zj>|X#fBK literal 0 HcmV?d00001 diff --git a/openpype/hosts/photoshop/api/panel.PNG b/openpype/hosts/photoshop/api/panel.PNG deleted file mode 100644 index be5db3b8df08aa426b92de61eacc9afd00e93d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8756 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 diff --git a/openpype/hosts/photoshop/api/panel_failure.png b/openpype/hosts/photoshop/api/panel_failure.png new file mode 100644 index 0000000000000000000000000000000000000000..6e52a77d22d54708b8bf0d1abac676ce723bd254 GIT binary patch literal 13115 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 Date: Tue, 12 Dec 2023 11:06:46 +0800 Subject: [PATCH 08/43] rename extract_pointcache to extract_alembic --- .../plugins/publish/{extract_pointcache.py => extract_alembic.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename openpype/hosts/max/plugins/publish/{extract_pointcache.py => extract_alembic.py} (100%) diff --git a/openpype/hosts/max/plugins/publish/extract_pointcache.py b/openpype/hosts/max/plugins/publish/extract_alembic.py similarity index 100% rename from openpype/hosts/max/plugins/publish/extract_pointcache.py rename to openpype/hosts/max/plugins/publish/extract_alembic.py From 0cb90a75af2d69512f20386e9da8d4ab42d043f5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 12 Dec 2023 16:33:35 +0100 Subject: [PATCH 09/43] create copy of hierarchyContext before any processing --- openpype/plugins/publish/extract_hierarchy_to_ayon.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/plugins/publish/extract_hierarchy_to_ayon.py b/openpype/plugins/publish/extract_hierarchy_to_ayon.py index 8f791a6093..b601a3fc29 100644 --- a/openpype/plugins/publish/extract_hierarchy_to_ayon.py +++ b/openpype/plugins/publish/extract_hierarchy_to_ayon.py @@ -204,7 +204,8 @@ class ExtractHierarchyToAYON(pyblish.api.ContextPlugin): project_item = None project_children_context = None - for key, value in context.data["hierarchyContext"].items(): + hierarchy_context = copy.deepcopy(context.data["hierarchyContext"]) + for key, value in hierarchy_context.items(): project_item = copy.deepcopy(value) project_children_context = project_item.pop("childs", None) project_item["name"] = key From ac1ad826506b72e1d96b8f6ec07c4006ef5c49cf Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 12 Dec 2023 17:40:16 +0100 Subject: [PATCH 10/43] wrong check --- openpype/plugins/publish/collect_resources_path.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/plugins/publish/collect_resources_path.py b/openpype/plugins/publish/collect_resources_path.py index af0ef17789..c8b67a3d05 100644 --- a/openpype/plugins/publish/collect_resources_path.py +++ b/openpype/plugins/publish/collect_resources_path.py @@ -82,7 +82,7 @@ class CollectResourcesPath(pyblish.api.InstancePlugin): # Add fill keys for editorial publishing creating new entity # TODO handle in editorial plugin if instance.data.get("newAssetPublishing"): - if "hierarchy" not in instance.data: + if "hierarchy" not in template_data: template_data["hierarchy"] = instance.data["hierarchy"] if "asset" not in template_data: From 10d3661d84372a146d43e5fd75ca681b2d60fbe6 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Wed, 13 Dec 2023 03:26:46 +0000 Subject: [PATCH 11/43] [Automated] Bump version --- openpype/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/version.py b/openpype/version.py index 012876f6bc..34aa3399b8 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.18.0" +__version__ = "3.17.7-nightly.8" From 48abb52cc36b45bd3617ffd21abf317bc6d187aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 13 Dec 2023 03:27:19 +0000 Subject: [PATCH 12/43] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 569271dd71..9b9c9b242e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -37,6 +37,7 @@ body: options: - 3.18.0 - 3.17.7 + - 3.17.7-nightly.8 - 3.17.7-nightly.7 - 3.17.7-nightly.6 - 3.17.7-nightly.5 @@ -134,7 +135,6 @@ body: - 3.15.4-nightly.1 - 3.15.3 - 3.15.3-nightly.4 - - 3.15.3-nightly.3 validations: required: true - type: dropdown From 79f34220e39168a974f6b63db0a6b1bbb9b8bbf6 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 13 Dec 2023 11:07:33 +0100 Subject: [PATCH 13/43] fixing nightly build version bump --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- openpype/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 9b9c9b242e..dfadd0088c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -37,7 +37,7 @@ body: options: - 3.18.0 - 3.17.7 - - 3.17.7-nightly.8 + - 3.18.1-nightly.1 - 3.17.7-nightly.7 - 3.17.7-nightly.6 - 3.17.7-nightly.5 diff --git a/openpype/version.py b/openpype/version.py index 34aa3399b8..44cae8e131 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.17.7-nightly.8" +__version__ = "3.18.1-nightly.1" From 7748c7bbcee5a950364038e4bb9ad4f907318475 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 13 Dec 2023 15:59:10 +0100 Subject: [PATCH 14/43] updated ayon api to 1.0.0-rc.3 --- .../vendor/python/common/ayon_api/__init__.py | 4 - .../vendor/python/common/ayon_api/_api.py | 10 - .../python/common/ayon_api/entity_hub.py | 23 +- .../python/common/ayon_api/server_api.py | 272 ++++-------------- .../vendor/python/common/ayon_api/version.py | 2 +- 5 files changed, 76 insertions(+), 235 deletions(-) diff --git a/openpype/vendor/python/common/ayon_api/__init__.py b/openpype/vendor/python/common/ayon_api/__init__.py index dc3d361f46..cc15ad9170 100644 --- a/openpype/vendor/python/common/ayon_api/__init__.py +++ b/openpype/vendor/python/common/ayon_api/__init__.py @@ -75,8 +75,6 @@ from ._api import ( download_installer, upload_installer, - get_dependencies_info, - update_dependency_info, get_dependency_packages, create_dependency_package, update_dependency_package, @@ -277,8 +275,6 @@ __all__ = ( "download_installer", "upload_installer", - "get_dependencies_info", - "update_dependency_info", "get_dependency_packages", "create_dependency_package", "update_dependency_package", diff --git a/openpype/vendor/python/common/ayon_api/_api.py b/openpype/vendor/python/common/ayon_api/_api.py index 9d4fc697ae..a0374a08b9 100644 --- a/openpype/vendor/python/common/ayon_api/_api.py +++ b/openpype/vendor/python/common/ayon_api/_api.py @@ -611,16 +611,6 @@ def upload_installer(*args, **kwargs): # Dependency packages -def get_dependencies_info(*args, **kwargs): - con = get_server_api_connection() - return con.get_dependencies_info(*args, **kwargs) - - -def update_dependency_info(*args, **kwargs): - con = get_server_api_connection() - return con.update_dependency_info(*args, **kwargs) - - def download_dependency_package(*args, **kwargs): con = get_server_api_connection() return con.download_dependency_package(*args, **kwargs) diff --git a/openpype/vendor/python/common/ayon_api/entity_hub.py b/openpype/vendor/python/common/ayon_api/entity_hub.py index 61d740fe57..f894c428a8 100644 --- a/openpype/vendor/python/common/ayon_api/entity_hub.py +++ b/openpype/vendor/python/common/ayon_api/entity_hub.py @@ -7,9 +7,21 @@ import six from ._api import get_server_api_connection from .utils import create_entity_id, convert_entity_id, slugify_string -UNKNOWN_VALUE = object() -PROJECT_PARENT_ID = object() -_NOT_SET = object() + +class _CustomNone(object): + def __init__(self, name=None): + self._name = name or "CustomNone" + + def __repr__(self): + return "<{}>".format(self._name) + + def __bool__(self): + return False + + +UNKNOWN_VALUE = _CustomNone("UNKNOWN_VALUE") +PROJECT_PARENT_ID = _CustomNone("PROJECT_PARENT_ID") +_NOT_SET = _CustomNone("_NOT_SET") class EntityHub(object): @@ -1284,7 +1296,10 @@ class BaseEntity(object): changes["name"] = self._name if self._entity_hub.allow_data_changes: - if self._orig_data != self._data: + if ( + self._data is not UNKNOWN_VALUE + and self._orig_data != self._data + ): changes["data"] = self._data if self._orig_thumbnail_id != self._thumbnail_id: diff --git a/openpype/vendor/python/common/ayon_api/server_api.py b/openpype/vendor/python/common/ayon_api/server_api.py index e4e7146279..4aed4e811a 100644 --- a/openpype/vendor/python/common/ayon_api/server_api.py +++ b/openpype/vendor/python/common/ayon_api/server_api.py @@ -8,6 +8,7 @@ import collections import platform import copy import uuid +import warnings from contextlib import contextmanager import six @@ -1022,17 +1023,10 @@ class ServerAPI(object): for attr, filter_value in filters.items(): query.set_variable_value(attr, filter_value) - # Backwards compatibility for server 0.3.x - # - will be removed in future releases - major, minor, _, _, _ = self.server_version_tuple - access_groups_field = "accessGroups" - if major == 0 and minor <= 3: - access_groups_field = "roles" - for parsed_data in query.continuous_query(self): for user in parsed_data["users"]: - user[access_groups_field] = json.loads( - user[access_groups_field]) + user["accessGroups"] = json.loads( + user["accessGroups"]) yield user def get_user(self, username=None): @@ -2044,14 +2038,6 @@ class ServerAPI(object): elif entity_type == "user": entity_type_defaults = set(DEFAULT_USER_FIELDS) - # Backwards compatibility for server 0.3.x - # - will be removed in future releases - major, minor, _, _, _ = self.server_version_tuple - if major == 0 and minor <= 3: - entity_type_defaults.discard("accessGroups") - entity_type_defaults.discard("defaultAccessGroups") - entity_type_defaults.add("roles") - entity_type_defaults.add("defaultRoles") else: raise ValueError("Unknown entity type \"{}\"".format(entity_type)) @@ -2306,125 +2292,8 @@ class ServerAPI(object): progress=progress ) - def get_dependencies_info(self): - """Information about dependency packages on server. - - Example data structure: - { - "packages": [ - { - "name": str, - "platform": str, - "checksum": str, - "sources": list[dict[str, Any]], - "supportedAddons": dict[str, str], - "pythonModules": dict[str, str] - } - ], - "productionPackage": str - } - - Deprecated: - Deprecated since server version 0.2.1. Use - 'get_dependency_packages' instead. - - Returns: - dict[str, Any]: Information about dependency packages known for - server. - """ - - major, minor, patch, _, _ = self.server_version_tuple - if major == 0 and (minor < 2 or (minor == 2 and patch < 1)): - result = self.get("dependencies") - return result.data - packages = self.get_dependency_packages() - packages["productionPackage"] = None - return packages - - def update_dependency_info( - self, - name, - platform_name, - size, - checksum, - checksum_algorithm=None, - supported_addons=None, - python_modules=None, - sources=None - ): - """Update or create dependency package for identifiers. - - The endpoint can be used to create or update dependency package. - - - Deprecated: - Deprecated for server version 0.2.1. Use - 'create_dependency_pacakge' instead. - - Args: - name (str): Name of dependency package. - platform_name (Literal["windows", "linux", "darwin"]): Platform - for which is dependency package targeted. - size (int): Size of dependency package in bytes. - checksum (str): Checksum of archive file where dependencies are. - checksum_algorithm (Optional[str]): Algorithm used to calculate - checksum. By default, is used 'md5' (defined by server). - supported_addons (Optional[dict[str, str]]): Name of addons for - which was the package created. - '{"": "", ...}' - python_modules (Optional[dict[str, str]]): Python modules in - dependencies package. - '{"": "", ...}' - sources (Optional[list[dict[str, Any]]]): Information about - sources where dependency package is available. - """ - - kwargs = { - key: value - for key, value in ( - ("checksumAlgorithm", checksum_algorithm), - ("supportedAddons", supported_addons), - ("pythonModules", python_modules), - ("sources", sources), - ) - if value - } - - response = self.put( - "dependencies", - name=name, - platform=platform_name, - size=size, - checksum=checksum, - **kwargs - ) - response.raise_for_status("Failed to create/update dependency") - return response.data - - def _get_dependency_package_route( - self, filename=None, platform_name=None - ): - major, minor, patch, _, _ = self.server_version_tuple - if (major, minor, patch) <= (0, 2, 0): - # Backwards compatibility for AYON server 0.2.0 and lower - self.log.warning(( - "Using deprecated dependency package route." - " Please update your AYON server to version 0.2.1 or higher." - " Backwards compatibility for this route will be removed" - " in future releases of ayon-python-api." - )) - if platform_name is None: - platform_name = platform.system().lower() - base = "dependencies" - if not filename: - return base - return "{}/{}/{}".format(base, filename, platform_name) - - if (major, minor) <= (0, 3): - endpoint = "desktop/dependency_packages" - else: - endpoint = "desktop/dependencyPackages" - + def _get_dependency_package_route(self, filename=None): + endpoint = "desktop/dependencyPackages" if filename: return "{}/{}".format(endpoint, filename) return endpoint @@ -2535,14 +2404,21 @@ class ServerAPI(object): """Remove dependency package for specific platform. Args: - filename (str): Filename of dependency package. Or name of package - for server version 0.2.0 or lower. - platform_name (Optional[str]): Which platform of the package - should be removed. Current platform is used if not passed. - Deprecated since version 0.2.1 + filename (str): Filename of dependency package. + platform_name (Optional[str]): Deprecated. """ - route = self._get_dependency_package_route(filename, platform_name) + if platform_name is not None: + warnings.warn( + ( + "Argument 'platform_name' is deprecated in" + " 'delete_dependency_package'. The argument will be" + " removed, please modify your code accordingly." + ), + DeprecationWarning + ) + + route = self._get_dependency_package_route(filename) response = self.delete(route) response.raise_for_status("Failed to delete dependency file") return response.data @@ -2567,18 +2443,25 @@ class ServerAPI(object): to download. dst_directory (str): Where the file should be downloaded. dst_filename (str): Name of destination filename. - platform_name (Optional[str]): Name of platform for which the - dependency package is targeted. Default value is - current platform. Deprecated since server version 0.2.1. + platform_name (Optional[str]): Deprecated. chunk_size (Optional[int]): Download chunk size. progress (Optional[TransferProgress]): Object that gives ability to track download progress. Returns: str: Filepath to downloaded file. - """ + """ - route = self._get_dependency_package_route(src_filename, platform_name) + if platform_name is not None: + warnings.warn( + ( + "Argument 'platform_name' is deprecated in" + " 'download_dependency_package'. The argument will be" + " removed, please modify your code accordingly." + ), + DeprecationWarning + ) + route = self._get_dependency_package_route(src_filename) package_filepath = os.path.join(dst_directory, dst_filename) self.download_file( route, @@ -2597,32 +2480,24 @@ class ServerAPI(object): src_filepath (str): Path to a package file. dst_filename (str): Dependency package filename or name of package for server version 0.2.0 or lower. Must be unique. - platform_name (Optional[str]): For which platform is the - package targeted. Deprecated since server version 0.2.1. + platform_name (Optional[str]): Deprecated. progress (Optional[TransferProgress]): Object to keep track about upload state. """ - route = self._get_dependency_package_route(dst_filename, platform_name) + if platform_name is not None: + warnings.warn( + ( + "Argument 'platform_name' is deprecated in" + " 'upload_dependency_package'. The argument will be" + " removed, please modify your code accordingly." + ), + DeprecationWarning + ) + + route = self._get_dependency_package_route(dst_filename) self.upload_file(route, src_filepath, progress=progress) - def create_dependency_package_basename(self, platform_name=None): - """Create basename for dependency package file. - - Deprecated: - Use 'create_dependency_package_basename' from `ayon_api` or - `ayon_api.utils` instead. - - Args: - platform_name (Optional[str]): Name of platform for which the - bundle is targeted. Default value is current platform. - - Returns: - str: Dependency package name with timestamp and platform. - """ - - return create_dependency_package_basename(platform_name) - def upload_addon_zip(self, src_filepath, progress=None): """Upload addon zip file to server. @@ -2650,14 +2525,6 @@ class ServerAPI(object): ) return response.json() - def _get_bundles_route(self): - major, minor, patch, _, _ = self.server_version_tuple - # Backwards compatibility for AYON server 0.3.0 - # - first version where bundles were available - if major == 0 and minor == 3 and patch == 0: - return "desktop/bundles" - return "bundles" - def get_bundles(self): """Server bundles with basic information. @@ -2688,7 +2555,7 @@ class ServerAPI(object): dict[str, Any]: Server bundles with basic information. """ - response = self.get(self._get_bundles_route()) + response = self.get("bundles") response.raise_for_status() return response.data @@ -2731,7 +2598,7 @@ class ServerAPI(object): if value is not None: body[key] = value - response = self.post(self._get_bundles_route(), **body) + response = self.post("bundles", **body) response.raise_for_status() def update_bundle( @@ -2766,7 +2633,7 @@ class ServerAPI(object): if value is not None } response = self.patch( - "{}/{}".format(self._get_bundles_route(), bundle_name), + "{}/{}".format("bundles", bundle_name), **body ) response.raise_for_status() @@ -2779,7 +2646,7 @@ class ServerAPI(object): """ response = self.delete( - "{}/{}".format(self._get_bundles_route(), bundle_name) + "{}/{}".format("bundles", bundle_name) ) response.raise_for_status() @@ -3102,16 +2969,13 @@ class ServerAPI(object): - test how it behaves if there is not any production/staging bundle. - Warnings: - For AYON server < 0.3.0 bundle name will be ignored. - Example output: { "addons": [ { "name": "addon-name", "version": "addon-version", - "settings": {...} + "settings": {...}, "siteSettings": {...} } ] @@ -3121,7 +2985,6 @@ class ServerAPI(object): dict[str, Any]: All settings for single bundle. """ - major, minor, _, _, _ = self.server_version_tuple query_values = { key: value for key, value in ( @@ -3137,21 +3000,8 @@ class ServerAPI(object): if site_id: query_values["site_id"] = site_id - if major == 0 and minor >= 3: - url = "settings" - else: - # Backward compatibility for AYON server < 0.3.0 - url = "settings/addons" - query_values.pop("bundle_name", None) - for new_key, old_key in ( - ("project_name", "project"), - ("site_id", "site"), - ): - if new_key in query_values: - query_values[old_key] = query_values.pop(new_key) - query = prepare_query_string(query_values) - response = self.get("{}{}".format(url, query)) + response = self.get("settings{}".format(query)) response.raise_for_status() return response.data @@ -3194,15 +3044,10 @@ class ServerAPI(object): use_site=use_site ) if only_values: - major, minor, patch, _, _ = self.server_version_tuple - if major == 0 and minor >= 3: - output = { - addon["name"]: addon["settings"] - for addon in output["addons"] - } - else: - # Backward compatibility for AYON server < 0.3.0 - output = output["settings"] + output = { + addon["name"]: addon["settings"] + for addon in output["addons"] + } return output def get_addons_project_settings( @@ -3263,15 +3108,10 @@ class ServerAPI(object): use_site=use_site ) if only_values: - major, minor, patch, _, _ = self.server_version_tuple - if major == 0 and minor >= 3: - output = { - addon["name"]: addon["settings"] - for addon in output["addons"] - } - else: - # Backward compatibility for AYON server < 0.3.0 - output = output["settings"] + output = { + addon["name"]: addon["settings"] + for addon in output["addons"] + } return output def get_addons_settings( diff --git a/openpype/vendor/python/common/ayon_api/version.py b/openpype/vendor/python/common/ayon_api/version.py index bc1107da1e..ce0173a248 100644 --- a/openpype/vendor/python/common/ayon_api/version.py +++ b/openpype/vendor/python/common/ayon_api/version.py @@ -1,2 +1,2 @@ """Package declaring Python API for Ayon server.""" -__version__ = "1.0.0-rc.1" +__version__ = "1.0.0-rc.3" From 69615971d42eb43dafafea29138c95391cfda7f6 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Wed, 13 Dec 2023 16:15:15 +0000 Subject: [PATCH 15/43] [Automated] Release --- CHANGELOG.md | 21 +++++++++++++++++++++ openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a10c2715a3..f309d904eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,27 @@ # Changelog +## [3.18.1](https://github.com/ynput/OpenPype/tree/3.18.1) + + +[Full Changelog](https://github.com/ynput/OpenPype/compare/3.18.0...3.18.1) + +### **🚀 Enhancements** + + +
+AYON: Update ayon api to 1.0.0-rc.3 #6052 + +Updated ayon python api to 1.0.0-rc.3. + + +___ + +
+ + + + ## [3.18.0](https://github.com/ynput/OpenPype/tree/3.18.0) diff --git a/openpype/version.py b/openpype/version.py index 44cae8e131..56b6cd002b 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.18.1-nightly.1" +__version__ = "3.18.1" diff --git a/pyproject.toml b/pyproject.toml index 040da82aa3..e64018498f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.18.0" # OpenPype +version = "3.18.1" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From ad0efdc85fadcfdb35950d4276db8b2bb699e952 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 13 Dec 2023 16:16:16 +0000 Subject: [PATCH 16/43] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index dfadd0088c..38b5a79232 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -35,9 +35,10 @@ body: label: Version description: What version are you running? Look to OpenPype Tray options: + - 3.18.1 + - 3.18.1-nightly.1 - 3.18.0 - 3.17.7 - - 3.18.1-nightly.1 - 3.17.7-nightly.7 - 3.17.7-nightly.6 - 3.17.7-nightly.5 @@ -134,7 +135,6 @@ body: - 3.15.4-nightly.2 - 3.15.4-nightly.1 - 3.15.3 - - 3.15.3-nightly.4 validations: required: true - type: dropdown From d20fefe761bff6c87f60bbce5cdd5735cdf881a8 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 13 Dec 2023 18:32:23 +0100 Subject: [PATCH 17/43] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ed3e058002..a79b9f2582 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ OpenPype [![documentation](https://github.com/pypeclub/pype/actions/workflows/documentation.yml/badge.svg)](https://github.com/pypeclub/pype/actions/workflows/documentation.yml) ![GitHub VFX Platform](https://img.shields.io/badge/vfx%20platform-2022-lightgrey?labelColor=303846) +## Important Notice! + +OpenPype as a standalone product has reach end of it's life and this repository is now used as a pipeline core code for [AYON](https://ynput.io/ayon/). You can read more details about the end of life process here https://community.ynput.io/t/openpype-end-of-life-timeline/877 + Introduction ------------ From 9711900309ed9d61efebb6510bc52db21e2f854a Mon Sep 17 00:00:00 2001 From: Sponge96 Date: Thu, 14 Dec 2023 11:48:16 +0000 Subject: [PATCH 18/43] Fusion: Project/User option for output format (create_saver) (#6045) * feat: schema for saver output extensions * feat: saver output ext option added * fix: typo on dict get * feat: added tiff * fix: typo on fetching default attr * Transfered new Settings to Ayon --------- Co-authored-by: Jack P Co-authored-by: kalisp --- .../fusion/plugins/create/create_saver.py | 96 +++++++++---------- .../defaults/project_settings/fusion.json | 3 +- .../schema_project_fusion.json | 13 +++ server_addon/fusion/server/settings.py | 17 +++- server_addon/fusion/server/version.py | 2 +- 5 files changed, 75 insertions(+), 56 deletions(-) diff --git a/openpype/hosts/fusion/plugins/create/create_saver.py b/openpype/hosts/fusion/plugins/create/create_saver.py index ecf36abdd2..6e71b41541 100644 --- a/openpype/hosts/fusion/plugins/create/create_saver.py +++ b/openpype/hosts/fusion/plugins/create/create_saver.py @@ -14,7 +14,7 @@ from openpype.pipeline import ( legacy_io, Creator as NewCreator, CreatedInstance, - Anatomy + Anatomy, ) @@ -27,28 +27,21 @@ class CreateSaver(NewCreator): description = "Fusion Saver to generate image sequence" icon = "fa5.eye" - instance_attributes = [ - "reviewable" - ] + instance_attributes = ["reviewable"] + image_format = "exr" # TODO: This should be renamed together with Nuke so it is aligned temp_rendering_path_template = ( - "{workdir}/renders/fusion/{subset}/{subset}.{frame}.{ext}") + "{workdir}/renders/fusion/{subset}/{subset}.{frame}.{ext}" + ) def create(self, subset_name, instance_data, pre_create_data): - self.pass_pre_attributes_to_instance( - instance_data, - pre_create_data + self.pass_pre_attributes_to_instance(instance_data, pre_create_data) + + instance_data.update( + {"id": "pyblish.avalon.instance", "subset": subset_name} ) - instance_data.update({ - "id": "pyblish.avalon.instance", - "subset": subset_name - }) - - # TODO: Add pre_create attributes to choose file format? - file_format = "OpenEXRFormat" - comp = get_current_comp() with comp_lock_and_undo_chunk(comp): args = (-32768, -32768) # Magical position numbers @@ -56,19 +49,6 @@ class CreateSaver(NewCreator): self._update_tool_with_data(saver, data=instance_data) - saver["OutputFormat"] = file_format - - # Check file format settings are available - if saver[file_format] is None: - raise RuntimeError( - f"File format is not set to {file_format}, this is a bug" - ) - - # Set file format attributes - saver[file_format]["Depth"] = 0 # Auto | float16 | float32 - # TODO Is this needed? - saver[file_format]["SaveAlpha"] = 1 - # Register the CreatedInstance instance = CreatedInstance( family=self.family, @@ -151,17 +131,17 @@ class CreateSaver(NewCreator): anatomy = Anatomy() frame_padding = anatomy.templates["frame_padding"] + # get output format + ext = data["creator_attributes"]["image_format"] + # Subset change detected workdir = os.path.normpath(legacy_io.Session["AVALON_WORKDIR"]) - formatting_data.update({ - "workdir": workdir, - "frame": "0" * frame_padding, - "ext": "exr" - }) + formatting_data.update( + {"workdir": workdir, "frame": "0" * frame_padding, "ext": ext} + ) # build file path to render - filepath = self.temp_rendering_path_template.format( - **formatting_data) + filepath = self.temp_rendering_path_template.format(**formatting_data) comp = get_current_comp() tool["Clip"] = comp.ReverseMapPath(os.path.normpath(filepath)) @@ -201,7 +181,8 @@ class CreateSaver(NewCreator): attr_defs = [ self._get_render_target_enum(), self._get_reviewable_bool(), - self._get_frame_range_enum() + self._get_frame_range_enum(), + self._get_image_format_enum(), ] return attr_defs @@ -209,11 +190,7 @@ class CreateSaver(NewCreator): """Settings for publish page""" return self.get_pre_create_attr_defs() - def pass_pre_attributes_to_instance( - self, - instance_data, - pre_create_data - ): + def pass_pre_attributes_to_instance(self, instance_data, pre_create_data): creator_attrs = instance_data["creator_attributes"] = {} for pass_key in pre_create_data.keys(): creator_attrs[pass_key] = pre_create_data[pass_key] @@ -236,13 +213,13 @@ class CreateSaver(NewCreator): frame_range_options = { "asset_db": "Current asset context", "render_range": "From render in/out", - "comp_range": "From composition timeline" + "comp_range": "From composition timeline", } return EnumDef( "frame_range_source", items=frame_range_options, - label="Frame range source" + label="Frame range source", ) def _get_reviewable_bool(self): @@ -252,20 +229,33 @@ class CreateSaver(NewCreator): label="Review", ) + def _get_image_format_enum(self): + image_format_options = ["exr", "tga", "tif", "png", "jpg"] + return EnumDef( + "image_format", + items=image_format_options, + default=self.image_format, + label="Output Image Format", + ) + def apply_settings(self, project_settings): """Method called on initialization of plugin to apply settings.""" # plugin settings - plugin_settings = ( - project_settings["fusion"]["create"][self.__class__.__name__] - ) + plugin_settings = project_settings["fusion"]["create"][ + self.__class__.__name__ + ] # individual attributes self.instance_attributes = plugin_settings.get( - "instance_attributes") or self.instance_attributes - self.default_variants = plugin_settings.get( - "default_variants") or self.default_variants - self.temp_rendering_path_template = ( - plugin_settings.get("temp_rendering_path_template") - or self.temp_rendering_path_template + "instance_attributes", self.instance_attributes + ) + self.default_variants = plugin_settings.get( + "default_variants", self.default_variants + ) + self.temp_rendering_path_template = plugin_settings.get( + "temp_rendering_path_template", self.temp_rendering_path_template + ) + self.image_format = plugin_settings.get( + "image_format", self.image_format ) diff --git a/openpype/settings/defaults/project_settings/fusion.json b/openpype/settings/defaults/project_settings/fusion.json index ab24727db5..0edcae060a 100644 --- a/openpype/settings/defaults/project_settings/fusion.json +++ b/openpype/settings/defaults/project_settings/fusion.json @@ -25,7 +25,8 @@ "instance_attributes": [ "reviewable", "farm_rendering" - ] + ], + "image_format": "exr" } }, "publish": { diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_fusion.json b/openpype/settings/entities/schemas/projects_schema/schema_project_fusion.json index 342411f8a5..5177d8bc7c 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_fusion.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_fusion.json @@ -80,6 +80,19 @@ "farm_rendering": "Farm rendering" } ] + }, + { + "key": "image_format", + "label": "Output Image Format", + "type": "enum", + "multiselect": false, + "enum_items": [ + {"exr": "exr"}, + {"tga": "tga"}, + {"png": "png"}, + {"tif": "tif"}, + {"jpg": "jpg"} + ] } ] } diff --git a/server_addon/fusion/server/settings.py b/server_addon/fusion/server/settings.py index 92fb362c66..1bc12773d2 100644 --- a/server_addon/fusion/server/settings.py +++ b/server_addon/fusion/server/settings.py @@ -25,6 +25,16 @@ def _create_saver_instance_attributes_enum(): ] +def _image_format_enum(): + return [ + {"value": "exr", "label": "exr"}, + {"value": "tga", "label": "tga"}, + {"value": "png", "label": "png"}, + {"value": "tif", "label": "tif"}, + {"value": "jpg", "label": "jpg"}, + ] + + class CreateSaverPluginModel(BaseSettingsModel): _isGroup = True temp_rendering_path_template: str = Field( @@ -39,6 +49,10 @@ class CreateSaverPluginModel(BaseSettingsModel): enum_resolver=_create_saver_instance_attributes_enum, title="Instance attributes" ) + image_format: str = Field( + enum_resolver=_image_format_enum, + title="Output Image Format" + ) class CreatPluginsModel(BaseSettingsModel): @@ -89,7 +103,8 @@ DEFAULT_VALUES = { "instance_attributes": [ "reviewable", "farm_rendering" - ] + ], + "image_format": "exr" } } } diff --git a/server_addon/fusion/server/version.py b/server_addon/fusion/server/version.py index 3dc1f76bc6..485f44ac21 100644 --- a/server_addon/fusion/server/version.py +++ b/server_addon/fusion/server/version.py @@ -1 +1 @@ -__version__ = "0.1.0" +__version__ = "0.1.1" From 7e883fc1674e6ca46bad5cca1fa64d4d9484289c Mon Sep 17 00:00:00 2001 From: Jack P Date: Fri, 15 Dec 2023 10:25:24 +0000 Subject: [PATCH 19/43] feat: added new saver output ext validator --- .../validate_saver_output_extension.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py new file mode 100644 index 0000000000..8ece175344 --- /dev/null +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -0,0 +1,59 @@ +import os + +import pyblish.api +from openpype.pipeline import PublishValidationError +from openpype.pipeline.publish import RepairAction +from openpype.hosts.fusion.api.action import SelectInvalidAction + + +class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): + """ + Temp docstring + """ + + order = pyblish.api.ValidatorOrder + label = "Validate Saver Output Extension" + families = ["render"] + hosts = ["fusion"] + actions = [SelectInvalidAction, RepairAction] + + @classmethod + def get_invalid(cls, instance): + saver = instance.data["tool"] + output_path = saver.Clip[1] + current_ext = get_file_extension(output_path) + ext = instance.data["image_format"] + if not current_ext == ext: + return (saver, current_ext, ext) + + def process(self, instance): + saver = instance.data["tool"] + current_ext = get_file_extension(saver.Clip[1]) + expected_ext = instance.data["image_format"] + + if not current_ext == expected_ext: + raise PublishValidationError( + f"Instance {saver.Name} output image format does not match the current publish selection.\n\n" + f"Current: {current_ext}\n\n" + f"Expected: {expected_ext}\n\n" + "You can use the repair action to update this instance.", + title=self.label, + ) + + @classmethod + def repair(cls, instance): + saver = instance.data["tool"] + output_path = saver.Clip[1] + ext = get_file_extension(output_path) + output_path = output_path.replace( + f".{ext}", f".{instance.data['image_format']}" + ) + saver.SetData( + "openpype.creator_attributes.image_format", + instance.data["image_format"], + ) + saver.Clip[1] = output_path + + +def get_file_extension(full_path): + return os.path.splitext(full_path)[1].replace(".", "") From 19fe8e0c1b5d2803cd7644253cd3ebedc2ddae55 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 10:50:17 +0000 Subject: [PATCH 20/43] chore: removed redunant function + small refactor --- .../publish/validate_saver_output_extension.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index 8ece175344..7c668d4467 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -17,21 +17,12 @@ class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): hosts = ["fusion"] actions = [SelectInvalidAction, RepairAction] - @classmethod - def get_invalid(cls, instance): - saver = instance.data["tool"] - output_path = saver.Clip[1] - current_ext = get_file_extension(output_path) - ext = instance.data["image_format"] - if not current_ext == ext: - return (saver, current_ext, ext) - def process(self, instance): saver = instance.data["tool"] - current_ext = get_file_extension(saver.Clip[1]) - expected_ext = instance.data["image_format"] + current_extension = get_file_extension(saver.Clip[1]) + expected_extension = instance.data["image_format"] - if not current_ext == expected_ext: + if current_ext != expected_ext: raise PublishValidationError( f"Instance {saver.Name} output image format does not match the current publish selection.\n\n" f"Current: {current_ext}\n\n" From 1cc824c099119234031b7770b653b5bf89185df5 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 10:50:28 +0000 Subject: [PATCH 21/43] chore: updated docstring --- .../plugins/publish/validate_saver_output_extension.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index 7c668d4467..b96a136a9d 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -8,7 +8,10 @@ from openpype.hosts.fusion.api.action import SelectInvalidAction class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): """ - Temp docstring + Validate Saver Output Extension matches Publish menu + + This ensures that if the user tweaks the 'Output File Extension' in the publish menu, + it is respected during the publish. """ order = pyblish.api.ValidatorOrder From f7a1a029c768e167e2fe001e4b9030f4f6396433 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 10:50:55 +0000 Subject: [PATCH 22/43] refactor: get_file_ext to use lstrip instead of replace --- .../fusion/plugins/publish/validate_saver_output_extension.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index b96a136a9d..ce2e671d4b 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -46,8 +46,7 @@ class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): "openpype.creator_attributes.image_format", instance.data["image_format"], ) - saver.Clip[1] = output_path def get_file_extension(full_path): - return os.path.splitext(full_path)[1].replace(".", "") + return os.path.splitext(full_path)[1].lstrip(".") From fb90d78160703aab838c16ce88026e0372c7abcf Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 10:51:28 +0000 Subject: [PATCH 23/43] refactor: improved repair function --- .../publish/validate_saver_output_extension.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index ce2e671d4b..2b6d4f2f19 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -1,5 +1,4 @@ import os - import pyblish.api from openpype.pipeline import PublishValidationError from openpype.pipeline.publish import RepairAction @@ -38,10 +37,13 @@ class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): def repair(cls, instance): saver = instance.data["tool"] output_path = saver.Clip[1] - ext = get_file_extension(output_path) - output_path = output_path.replace( - f".{ext}", f".{instance.data['image_format']}" - ) + + root, old_extension = os.path.splitext(output_path) + new_extension = instance.data["image_format"] + + new_output_path = f"{root}.{new_extension}" + saver.Clip[1] = new_output_path + saver.SetData( "openpype.creator_attributes.image_format", instance.data["image_format"], From 9e69e5d48e75d8b47bb0317fc78bb848f04ac9c0 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 11:23:03 +0000 Subject: [PATCH 24/43] fix: typo --- .../fusion/plugins/publish/validate_saver_output_extension.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index 2b6d4f2f19..c19c297f97 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -24,7 +24,7 @@ class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): current_extension = get_file_extension(saver.Clip[1]) expected_extension = instance.data["image_format"] - if current_ext != expected_ext: + if current_extension != expected_extension: raise PublishValidationError( f"Instance {saver.Name} output image format does not match the current publish selection.\n\n" f"Current: {current_ext}\n\n" From e4b24189d1d84be4af09652a9f2533b336d51af4 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 11:25:12 +0000 Subject: [PATCH 25/43] fix: more typos.. love when my lsp isn't working --- .../fusion/plugins/publish/validate_saver_output_extension.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index c19c297f97..f10f1d68ba 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -27,8 +27,8 @@ class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): if current_extension != expected_extension: raise PublishValidationError( f"Instance {saver.Name} output image format does not match the current publish selection.\n\n" - f"Current: {current_ext}\n\n" - f"Expected: {expected_ext}\n\n" + f"Current: {current_extension}\n\n" + f"Expected: {expected_extension}\n\n" "You can use the repair action to update this instance.", title=self.label, ) From b5b1be262e760ba01406468a9d4d643f1bfb9919 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 11:28:54 +0000 Subject: [PATCH 26/43] chore: added optional tag for testing --- .../fusion/plugins/publish/validate_saver_output_extension.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index f10f1d68ba..0862e0ac61 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -17,6 +17,7 @@ class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): label = "Validate Saver Output Extension" families = ["render"] hosts = ["fusion"] + optional = True actions = [SelectInvalidAction, RepairAction] def process(self, instance): From 437246c090af27eacd65af52e0d8e28bb7d6ec30 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 11:36:15 +0000 Subject: [PATCH 27/43] chore: added optional class inherit for testing --- .../plugins/publish/validate_saver_output_extension.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index 0862e0ac61..ea55832288 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -1,11 +1,16 @@ import os import pyblish.api -from openpype.pipeline import PublishValidationError +from openpype.pipeline import ( + PublishValidationError, + OptionalPyblishPluginMixin, +) from openpype.pipeline.publish import RepairAction from openpype.hosts.fusion.api.action import SelectInvalidAction -class ValidateSaverOutputExtension(pyblish.api.InstancePlugin): +class ValidateSaverOutputExtension( + pyblish.api.InstancePlugin, OptionalPyblishPluginMixin +): """ Validate Saver Output Extension matches Publish menu From 289eb1f4c8e6d11f34fc66157ed38b3d86ede9ac Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 11:46:18 +0000 Subject: [PATCH 28/43] fix: added check for optional behaviour --- .../fusion/plugins/publish/validate_saver_output_extension.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py index ea55832288..746bb5eb6f 100644 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py @@ -26,6 +26,9 @@ class ValidateSaverOutputExtension( actions = [SelectInvalidAction, RepairAction] def process(self, instance): + if not self.is_active(instance.data): + return + saver = instance.data["tool"] current_extension = get_file_extension(saver.Clip[1]) expected_extension = instance.data["image_format"] From 839e8153e384055b5f990975491ab01301b5857d Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 14:30:32 +0000 Subject: [PATCH 29/43] feat: create_saver now respects changes to creator_attributes --- openpype/hosts/fusion/plugins/create/create_saver.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/fusion/plugins/create/create_saver.py b/openpype/hosts/fusion/plugins/create/create_saver.py index 6e71b41541..c75a780a2a 100644 --- a/openpype/hosts/fusion/plugins/create/create_saver.py +++ b/openpype/hosts/fusion/plugins/create/create_saver.py @@ -119,10 +119,9 @@ class CreateSaver(NewCreator): if "subset" not in data: return - original_subset = tool.GetData("openpype.subset") - subset = data["subset"] - if original_subset != subset: - self._configure_saver_tool(data, tool, subset) + original_data = tool.GetData("openpype") + if original_data != data["creator_attributes"]: + self._configure_saver_tool(data, tool, data["subset"]) def _configure_saver_tool(self, data, tool, subset): formatting_data = deepcopy(data) From 23d0c166dfc55ba6e276993d1c967715a70484c3 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 14:33:38 +0000 Subject: [PATCH 30/43] chore: removed redundant validator this is no longer needed since the creator now respects changes to attributes --- .../validate_saver_output_extension.py | 63 ------------------- 1 file changed, 63 deletions(-) delete mode 100644 openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py diff --git a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py b/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py deleted file mode 100644 index 746bb5eb6f..0000000000 --- a/openpype/hosts/fusion/plugins/publish/validate_saver_output_extension.py +++ /dev/null @@ -1,63 +0,0 @@ -import os -import pyblish.api -from openpype.pipeline import ( - PublishValidationError, - OptionalPyblishPluginMixin, -) -from openpype.pipeline.publish import RepairAction -from openpype.hosts.fusion.api.action import SelectInvalidAction - - -class ValidateSaverOutputExtension( - pyblish.api.InstancePlugin, OptionalPyblishPluginMixin -): - """ - Validate Saver Output Extension matches Publish menu - - This ensures that if the user tweaks the 'Output File Extension' in the publish menu, - it is respected during the publish. - """ - - order = pyblish.api.ValidatorOrder - label = "Validate Saver Output Extension" - families = ["render"] - hosts = ["fusion"] - optional = True - actions = [SelectInvalidAction, RepairAction] - - def process(self, instance): - if not self.is_active(instance.data): - return - - saver = instance.data["tool"] - current_extension = get_file_extension(saver.Clip[1]) - expected_extension = instance.data["image_format"] - - if current_extension != expected_extension: - raise PublishValidationError( - f"Instance {saver.Name} output image format does not match the current publish selection.\n\n" - f"Current: {current_extension}\n\n" - f"Expected: {expected_extension}\n\n" - "You can use the repair action to update this instance.", - title=self.label, - ) - - @classmethod - def repair(cls, instance): - saver = instance.data["tool"] - output_path = saver.Clip[1] - - root, old_extension = os.path.splitext(output_path) - new_extension = instance.data["image_format"] - - new_output_path = f"{root}.{new_extension}" - saver.Clip[1] = new_output_path - - saver.SetData( - "openpype.creator_attributes.image_format", - instance.data["image_format"], - ) - - -def get_file_extension(full_path): - return os.path.splitext(full_path)[1].lstrip(".") From 3c272e4a7db54366c7c171b530de5688b947a5a9 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 14:48:36 +0000 Subject: [PATCH 31/43] fix: typo in comparison of data --- openpype/hosts/fusion/plugins/create/create_saver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/fusion/plugins/create/create_saver.py b/openpype/hosts/fusion/plugins/create/create_saver.py index c75a780a2a..b2235bd2b6 100644 --- a/openpype/hosts/fusion/plugins/create/create_saver.py +++ b/openpype/hosts/fusion/plugins/create/create_saver.py @@ -119,7 +119,7 @@ class CreateSaver(NewCreator): if "subset" not in data: return - original_data = tool.GetData("openpype") + original_data = tool.GetData("openpype.creator_attributes") if original_data != data["creator_attributes"]: self._configure_saver_tool(data, tool, data["subset"]) From 940103feeeb233d933d71d552d0e3e0ab8744480 Mon Sep 17 00:00:00 2001 From: JackP Date: Fri, 15 Dec 2023 15:50:11 +0000 Subject: [PATCH 32/43] refactor: more accurately specified the conditions of '_configure_saver_tool' calls --- .../hosts/fusion/plugins/create/create_saver.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/fusion/plugins/create/create_saver.py b/openpype/hosts/fusion/plugins/create/create_saver.py index b2235bd2b6..5870828b41 100644 --- a/openpype/hosts/fusion/plugins/create/create_saver.py +++ b/openpype/hosts/fusion/plugins/create/create_saver.py @@ -119,9 +119,17 @@ class CreateSaver(NewCreator): if "subset" not in data: return - original_data = tool.GetData("openpype.creator_attributes") - if original_data != data["creator_attributes"]: - self._configure_saver_tool(data, tool, data["subset"]) + original_subset = tool.GetData("openpype.subset") + original_format = tool.GetData( + "openpype.creator_attributes.image_format" + ) + + subset = data["subset"] + if ( + original_subset != subset + or original_format != data["creator_attributes"]["image_format"] + ): + self._configure_saver_tool(data, tool, subset) def _configure_saver_tool(self, data, tool, subset): formatting_data = deepcopy(data) From bf2ecb6293dc2f0fe3f700ecdb3e0be6d37639f6 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Sat, 16 Dec 2023 03:25:11 +0000 Subject: [PATCH 33/43] [Automated] Bump version --- openpype/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/version.py b/openpype/version.py index 56b6cd002b..e053a8364e 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.18.1" +__version__ = "3.18.2-nightly.1" From a21ba52cdbcbed26ecfbfd07a7461c63cb7c9c1e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 16 Dec 2023 03:25:45 +0000 Subject: [PATCH 34/43] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 38b5a79232..be0a6e1299 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -35,6 +35,7 @@ body: label: Version description: What version are you running? Look to OpenPype Tray options: + - 3.18.2-nightly.1 - 3.18.1 - 3.18.1-nightly.1 - 3.18.0 @@ -134,7 +135,6 @@ body: - 3.15.4-nightly.3 - 3.15.4-nightly.2 - 3.15.4-nightly.1 - - 3.15.3 validations: required: true - type: dropdown From a26e575ce01ed9e36ecab74bbae1a81181fd4357 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 18 Dec 2023 11:54:45 +0100 Subject: [PATCH 35/43] Photoshop: fix layer publish thumbnail missing in loader (#6061) * OP-1645 - explicitly add thumbnail path to be integrated to Ayon Thumbnail representation is set to 'delete', eg wont be integrated, another source of thumbnail must be used. This will effectively limit option of NOT pushing thumbnail to Ayon, which use case I am actuall not seeing. * OP-1645 - added more description * Remove comment It works even for OP. Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> * Update openpype/plugins/publish/integrate_thumbnail_ayon.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> * Updates to docstring Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> * Update openpype/plugins/publish/integrate_thumbnail_ayon.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> * OP-1645 - fix formatting --------- Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../photoshop/plugins/publish/extract_review.py | 1 + .../plugins/publish/integrate_thumbnail_ayon.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/photoshop/plugins/publish/extract_review.py b/openpype/hosts/photoshop/plugins/publish/extract_review.py index d5dac417d7..c2773b2a20 100644 --- a/openpype/hosts/photoshop/plugins/publish/extract_review.py +++ b/openpype/hosts/photoshop/plugins/publish/extract_review.py @@ -224,6 +224,7 @@ class ExtractReview(publish.Extractor): "stagingDir": staging_dir, "tags": ["thumbnail", "delete"] }) + instance.data["thumbnailPath"] = thumbnail_path def _check_and_resize(self, processed_img_names, source_files_pattern, staging_dir): diff --git a/openpype/plugins/publish/integrate_thumbnail_ayon.py b/openpype/plugins/publish/integrate_thumbnail_ayon.py index 1947c9dd4c..fc77a803fc 100644 --- a/openpype/plugins/publish/integrate_thumbnail_ayon.py +++ b/openpype/plugins/publish/integrate_thumbnail_ayon.py @@ -5,7 +5,21 @@ pull into a scene. This one is used only as image describing content of published item and - shows up only in Loader in right column section. + shows up only in Loader or WebUI. + + Instance must have 'published_representations' to + be able to integrate thumbnail. + Possible sources of thumbnail paths: + - instance.data["thumbnailPath"] + - representation with 'thumbnail' name in 'published_representations' + - context.data["thumbnailPath"] + + Notes: + Issue with 'thumbnail' representation is that we most likely don't + want to integrate it as representation. Integrated representation + is polluting Loader and database without real usage. That's why + they usually have 'delete' tag to skip the integration. + """ import os From 443d107b0ecbd9c2c49352375b19b52dcc0c920c Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 18 Dec 2023 12:28:44 +0100 Subject: [PATCH 36/43] OP-7470 - fix for single frame rendering (#6056) --- .../hosts/fusion/plugins/publish/extract_render_local.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/fusion/plugins/publish/extract_render_local.py b/openpype/hosts/fusion/plugins/publish/extract_render_local.py index 08d608139d..068df22c06 100644 --- a/openpype/hosts/fusion/plugins/publish/extract_render_local.py +++ b/openpype/hosts/fusion/plugins/publish/extract_render_local.py @@ -146,11 +146,15 @@ class FusionRenderLocal( staging_dir = os.path.dirname(path) + files = [os.path.basename(f) for f in expected_files] + if len(expected_files) == 1: + files = files[0] + repre = { "name": ext[1:], "ext": ext[1:], "frameStart": f"%0{padding}d" % start, - "files": [os.path.basename(f) for f in expected_files], + "files": files, "stagingDir": staging_dir, } From 0252c9e137e77d0395afc1b0bfe01d1042dcb944 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 18 Dec 2023 16:02:39 +0100 Subject: [PATCH 37/43] OP-7606 - fix creation of .mov (#6064) --- openpype/hosts/photoshop/plugins/publish/extract_review.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openpype/hosts/photoshop/plugins/publish/extract_review.py b/openpype/hosts/photoshop/plugins/publish/extract_review.py index c2773b2a20..09c5d63aa5 100644 --- a/openpype/hosts/photoshop/plugins/publish/extract_review.py +++ b/openpype/hosts/photoshop/plugins/publish/extract_review.py @@ -170,8 +170,7 @@ class ExtractReview(publish.Extractor): # Generate mov. mov_path = os.path.join(staging_dir, "review.mov") self.log.info(f"Generate mov review: {mov_path}") - args = [ - ffmpeg_path, + args = ffmpeg_path + [ "-y", "-i", source_files_pattern, "-vf", "pad=ceil(iw/2)*2:ceil(ih/2)*2", From 263f1a0adbf8b73f62ea7824d6aea50e89fb1308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Mon, 18 Dec 2023 16:09:28 +0100 Subject: [PATCH 38/43] :bug: fix wrong nuke version constant name --- openpype/hosts/nuke/api/pipeline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/nuke/api/pipeline.py b/openpype/hosts/nuke/api/pipeline.py index 7bc17ff504..12562a6b6f 100644 --- a/openpype/hosts/nuke/api/pipeline.py +++ b/openpype/hosts/nuke/api/pipeline.py @@ -260,7 +260,7 @@ def _install_menu(): "Create...", lambda: host_tools.show_publisher( parent=( - main_window if nuke.NUKE_VERSION_RELEASE >= 14 else None + main_window if nuke.NUKE_VERSION_MAJOR >= 14 else None ), tab="create" ) @@ -271,7 +271,7 @@ def _install_menu(): "Publish...", lambda: host_tools.show_publisher( parent=( - main_window if nuke.NUKE_VERSION_RELEASE >= 14 else None + main_window if nuke.NUKE_VERSION_MAJOR >= 14 else None ), tab="publish" ) From 1aca2d3befbb4e969f37347d1ada03e305c54678 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Mon, 18 Dec 2023 16:19:14 +0100 Subject: [PATCH 39/43] expect 'ayon' group as one of option to get custom attributes --- openpype/modules/ftrack/lib/custom_attributes.py | 2 +- .../ftrack/plugins/publish/integrate_hierarchy_ftrack.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/modules/ftrack/lib/custom_attributes.py b/openpype/modules/ftrack/lib/custom_attributes.py index 3e40bb02f2..76c7bcd403 100644 --- a/openpype/modules/ftrack/lib/custom_attributes.py +++ b/openpype/modules/ftrack/lib/custom_attributes.py @@ -66,7 +66,7 @@ def get_openpype_attr(session, split_hierarchical=True, query_keys=None): "select {}" " from CustomAttributeConfiguration" # Kept `pype` for Backwards Compatibility - " where group.name in (\"pype\", \"{}\")" + " where group.name in (\"pype\", \"ayon\", \"{}\")" ).format(", ".join(query_keys), CUST_ATTR_GROUP) all_avalon_attr = session.query(cust_attrs_query).all() for cust_attr in all_avalon_attr: diff --git a/openpype/modules/ftrack/plugins/publish/integrate_hierarchy_ftrack.py b/openpype/modules/ftrack/plugins/publish/integrate_hierarchy_ftrack.py index a1aa7c0daa..68a31035f6 100644 --- a/openpype/modules/ftrack/plugins/publish/integrate_hierarchy_ftrack.py +++ b/openpype/modules/ftrack/plugins/publish/integrate_hierarchy_ftrack.py @@ -21,7 +21,7 @@ def get_pype_attr(session, split_hierarchical=True): "select id, entity_type, object_type_id, is_hierarchical, default" " from CustomAttributeConfiguration" # Kept `pype` for Backwards Compatibility - " where group.name in (\"pype\", \"{}\")" + " where group.name in (\"pype\", \"ayon\", \"{}\")" ).format(CUST_ATTR_GROUP) all_avalon_attr = session.query(cust_attrs_query).all() for cust_attr in all_avalon_attr: From 8c387c30432d29d576bd702637382571bbc6f8b9 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 18 Dec 2023 16:39:29 +0100 Subject: [PATCH 40/43] Photoshop: fix Collect Color Coded settings (#6065) * OP-7609 - fix Photoshop publish plugin model Was causing issues when saving settings for `Collect Color Coded Instances` * OP-7609 - bump up version for Photoshop addon Caused by change of Settings model. --- server_addon/photoshop/server/settings/publish_plugins.py | 2 +- server_addon/photoshop/server/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/photoshop/server/settings/publish_plugins.py b/server_addon/photoshop/server/settings/publish_plugins.py index 2863979ca9..21e7d670f0 100644 --- a/server_addon/photoshop/server/settings/publish_plugins.py +++ b/server_addon/photoshop/server/settings/publish_plugins.py @@ -29,7 +29,7 @@ class ColorCodeMappings(BaseSettingsModel): ) layer_name_regex: list[str] = Field( - "", + default_factory=list, title="Layer name regex" ) diff --git a/server_addon/photoshop/server/version.py b/server_addon/photoshop/server/version.py index d4b9e2d7f3..a242f0e757 100644 --- a/server_addon/photoshop/server/version.py +++ b/server_addon/photoshop/server/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring addon version.""" -__version__ = "0.1.0" +__version__ = "0.1.1" From cd2e907dc2bc8302af37c668546e05d7ffedca28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Mon, 18 Dec 2023 17:06:40 +0100 Subject: [PATCH 41/43] :bug: fix AYON settings for Maya workspace --- server_addon/maya/server/settings/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/maya/server/settings/main.py b/server_addon/maya/server/settings/main.py index 62fd12ec8a..a5b573a75e 100644 --- a/server_addon/maya/server/settings/main.py +++ b/server_addon/maya/server/settings/main.py @@ -97,7 +97,7 @@ DEFAULT_MEL_WORKSPACE_SETTINGS = "\n".join(( 'workspace -fr "renderData" "renderData";', 'workspace -fr "sourceImages" "sourceimages";', 'workspace -fr "fileCache" "cache/nCache";', - 'workspace -fr "autoSave" "autosave"', + 'workspace -fr "autoSave" "autosave";', '', )) From c964f1411af3fe7c34c9ed067a143f9502bdf605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Mon, 18 Dec 2023 17:07:13 +0100 Subject: [PATCH 42/43] :recycle: sync defaults with AYON --- openpype/settings/defaults/project_settings/maya.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/settings/defaults/project_settings/maya.json b/openpype/settings/defaults/project_settings/maya.json index 7719a5e255..34452eb8ce 100644 --- a/openpype/settings/defaults/project_settings/maya.json +++ b/openpype/settings/defaults/project_settings/maya.json @@ -436,7 +436,7 @@ "viewTransform": "sRGB gamma" } }, - "mel_workspace": "workspace -fr \"shaders\" \"renderData/shaders\";\nworkspace -fr \"images\" \"renders/maya\";\nworkspace -fr \"particles\" \"particles\";\nworkspace -fr \"mayaAscii\" \"\";\nworkspace -fr \"mayaBinary\" \"\";\nworkspace -fr \"scene\" \"\";\nworkspace -fr \"alembicCache\" \"cache/alembic\";\nworkspace -fr \"renderData\" \"renderData\";\nworkspace -fr \"sourceImages\" \"sourceimages\";\nworkspace -fr \"fileCache\" \"cache/nCache\";\n", + "mel_workspace": "workspace -fr \"shaders\" \"renderData/shaders\";\nworkspace -fr \"images\" \"renders/maya\";\nworkspace -fr \"particles\" \"particles\";\nworkspace -fr \"mayaAscii\" \"\";\nworkspace -fr \"mayaBinary\" \"\";\nworkspace -fr \"scene\" \"\";\nworkspace -fr \"alembicCache\" \"cache/alembic\";\nworkspace -fr \"renderData\" \"renderData\";\nworkspace -fr \"sourceImages\" \"sourceimages\";\nworkspace -fr \"fileCache\" \"cache/nCache\";\nworkspace -fr \"autoSave\" \"autosave\";", "ext_mapping": { "model": "ma", "mayaAscii": "ma", From 4db853ec03342da8d4a1e8ecaef32080cc804b6d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 19 Dec 2023 11:24:55 +0100 Subject: [PATCH 43/43] do not use thumbnailSource for integration (#6063) --- openpype/plugins/publish/integrate_thumbnail_ayon.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openpype/plugins/publish/integrate_thumbnail_ayon.py b/openpype/plugins/publish/integrate_thumbnail_ayon.py index fc77a803fc..e56c567667 100644 --- a/openpype/plugins/publish/integrate_thumbnail_ayon.py +++ b/openpype/plugins/publish/integrate_thumbnail_ayon.py @@ -106,11 +106,8 @@ class IntegrateThumbnailsAYON(pyblish.api.ContextPlugin): continue # Find thumbnail path on instance - thumbnail_source = instance.data.get("thumbnailSource") - thumbnail_path = instance.data.get("thumbnailPath") thumbnail_path = ( - thumbnail_source - or thumbnail_path + instance.data.get("thumbnailPath") or self._get_instance_thumbnail_path(published_repres) ) if thumbnail_path: