From 08084b899d18fd1c34eafc2e93253d72754f478f Mon Sep 17 00:00:00 2001 From: FadyFS Date: Wed, 7 Jun 2023 14:01:05 +0200 Subject: [PATCH 01/38] use frame sequence ok --- .../hosts/maya/plugins/load/load_arnold_standin.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 7c3a732389..4e8941e0ad 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -16,10 +16,13 @@ from openpype.hosts.maya.api.pipeline import containerise def is_sequence(files): sequence = False - collections, remainder = clique.assemble(files) + print("here calling") + if len(files) == 1: + collections, remainder = clique.assemble(files, minimum_items=1) + else: + collections, remainder = clique.assemble(files) if collections: sequence = True - return sequence @@ -84,6 +87,7 @@ class ArnoldStandinLoader(load.LoaderPlugin): sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) + nodes = [root, standin, standin_shape] if operator is not None: nodes.append(operator) @@ -146,6 +150,10 @@ class ArnoldStandinLoader(load.LoaderPlugin): os.path.basename(path), type="string" ) + print("#"*100) + + + # Object name value cmds.connectAttr( string_replace_operator + ".out", From 15766ae910e9fa4414e3512d5a3fe52c95052d90 Mon Sep 17 00:00:00 2001 From: FadyFS Date: Wed, 7 Jun 2023 15:06:56 +0200 Subject: [PATCH 02/38] blanks spaces + correct FPS imported --- openpype/hosts/maya/plugins/load/load_arnold_standin.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 4e8941e0ad..881e6a5643 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -16,7 +16,6 @@ from openpype.hosts.maya.api.pipeline import containerise def is_sequence(files): sequence = False - print("here calling") if len(files) == 1: collections, remainder = clique.assemble(files, minimum_items=1) else: @@ -86,7 +85,7 @@ class ArnoldStandinLoader(load.LoaderPlugin): cmds.setAttr(standin_shape + ".dso", path, type="string") sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) - + cmds.setAttr(standin_shape + ".abcFPS", 30) nodes = [root, standin, standin_shape] if operator is not None: @@ -150,11 +149,8 @@ class ArnoldStandinLoader(load.LoaderPlugin): os.path.basename(path), type="string" ) - print("#"*100) - # Object name value - cmds.connectAttr( string_replace_operator + ".out", "{}.inputs[{}]".format( From c49b59a7eaadd223069fc77601be0047fa212067 Mon Sep 17 00:00:00 2001 From: FadyFS Date: Thu, 8 Jun 2023 11:14:41 +0200 Subject: [PATCH 03/38] getter for fps project --- .../maya/plugins/load/load_arnold_standin.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 881e6a5643..4bc4a1bbe5 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -6,10 +6,11 @@ import maya.cmds as cmds from openpype.settings import get_project_settings from openpype.pipeline import ( load, + legacy_io, get_representation_path ) from openpype.hosts.maya.api.lib import ( - unique_namespace, get_attribute_input, maintained_selection + unique_namespace, get_attribute_input, maintained_selection, convert_to_maya_fps ) from openpype.hosts.maya.api.pipeline import containerise @@ -24,6 +25,17 @@ def is_sequence(files): sequence = True return sequence +#get the fps from the project itself +def get_fps(standin_shape): + + fps = convert_to_maya_fps( + float(legacy_io.Session.get("AVALON_FPS", 25)) + ) + return fps + + + + class ArnoldStandinLoader(load.LoaderPlugin): """Load as Arnold standin""" @@ -85,7 +97,10 @@ class ArnoldStandinLoader(load.LoaderPlugin): cmds.setAttr(standin_shape + ".dso", path, type="string") sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) - cmds.setAttr(standin_shape + ".abcFPS", 30) + + cmds.setAttr(standin_shape + ".dso", path, type="string") + matching_fps = get_fps(os.listdir(os.path.dirname(self.fname))) + cmds.setAttr(standin_shape + ".abcFPS", matching_fps) nodes = [root, standin, standin_shape] if operator is not None: From 873922d2753cc53d5e396a2236933a844deb61d6 Mon Sep 17 00:00:00 2001 From: FadyFS Date: Thu, 8 Jun 2023 11:48:25 +0200 Subject: [PATCH 04/38] FPS corrected --- .../hosts/maya/plugins/load/load_arnold_standin.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 4bc4a1bbe5..0d76ba9f84 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -10,7 +10,10 @@ from openpype.pipeline import ( get_representation_path ) from openpype.hosts.maya.api.lib import ( - unique_namespace, get_attribute_input, maintained_selection, convert_to_maya_fps + unique_namespace, + get_attribute_input, + maintained_selection, + convert_to_maya_fps ) from openpype.hosts.maya.api.pipeline import containerise @@ -25,7 +28,6 @@ def is_sequence(files): sequence = True return sequence -#get the fps from the project itself def get_fps(standin_shape): fps = convert_to_maya_fps( @@ -33,10 +35,6 @@ def get_fps(standin_shape): ) return fps - - - - class ArnoldStandinLoader(load.LoaderPlugin): """Load as Arnold standin""" From dce5483919f732d2f3055bdc1a267f10406a7a5b Mon Sep 17 00:00:00 2001 From: FadyFS Date: Thu, 8 Jun 2023 11:54:28 +0200 Subject: [PATCH 05/38] no trailing whitespaces --- openpype/hosts/maya/plugins/load/load_arnold_standin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 0d76ba9f84..27c88869de 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -10,9 +10,9 @@ from openpype.pipeline import ( get_representation_path ) from openpype.hosts.maya.api.lib import ( - unique_namespace, - get_attribute_input, - maintained_selection, + unique_namespace, + get_attribute_input, + maintained_selection, convert_to_maya_fps ) from openpype.hosts.maya.api.pipeline import containerise From 786ee1bf37a145754bc59e95a25de14abbfa9793 Mon Sep 17 00:00:00 2001 From: FadyFS Date: Thu, 8 Jun 2023 16:28:56 +0200 Subject: [PATCH 06/38] Updated method to get correct FPS from abc file --- .../hosts/maya/plugins/load/load_arnold_standin.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 27c88869de..61f093fbf3 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -17,7 +17,6 @@ from openpype.hosts.maya.api.lib import ( ) from openpype.hosts.maya.api.pipeline import containerise - def is_sequence(files): sequence = False if len(files) == 1: @@ -28,13 +27,6 @@ def is_sequence(files): sequence = True return sequence -def get_fps(standin_shape): - - fps = convert_to_maya_fps( - float(legacy_io.Session.get("AVALON_FPS", 25)) - ) - return fps - class ArnoldStandinLoader(load.LoaderPlugin): """Load as Arnold standin""" @@ -96,9 +88,8 @@ class ArnoldStandinLoader(load.LoaderPlugin): sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) - cmds.setAttr(standin_shape + ".dso", path, type="string") - matching_fps = get_fps(os.listdir(os.path.dirname(self.fname))) - cmds.setAttr(standin_shape + ".abcFPS", matching_fps) + fps = float(version["data"]["fps"]) + cmds.setAttr(standin_shape + ".abcFPS", fps) nodes = [root, standin, standin_shape] if operator is not None: From bf15830a9a7d464279e92cd4ee45b0d2a1075395 Mon Sep 17 00:00:00 2001 From: FadyFS Date: Thu, 8 Jun 2023 17:42:05 +0200 Subject: [PATCH 07/38] new fps getter --- openpype/hosts/maya/plugins/load/load_arnold_standin.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 61f093fbf3..2b07b1ca51 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -27,6 +27,10 @@ def is_sequence(files): sequence = True return sequence +def get_current_fps(): + session_fps = float(legacy_io.Session.get('AVALON_FPS', 25)) + return convert_to_maya_fps(session_fps) + class ArnoldStandinLoader(load.LoaderPlugin): """Load as Arnold standin""" @@ -88,7 +92,9 @@ class ArnoldStandinLoader(load.LoaderPlugin): sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) - fps = float(version["data"]["fps"]) + fps = float(version["data"].get("fps")) + if fps is None: + fps = get_current_fps() cmds.setAttr(standin_shape + ".abcFPS", fps) nodes = [root, standin, standin_shape] From d2ef628b22dd5bd97e46ce8c82a8381ffcf7ae3d Mon Sep 17 00:00:00 2001 From: FadyFS Date: Thu, 8 Jun 2023 17:44:27 +0200 Subject: [PATCH 08/38] new fps getter updated --- openpype/hosts/maya/plugins/load/load_arnold_standin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 2b07b1ca51..92b1433bb3 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -27,6 +27,7 @@ def is_sequence(files): sequence = True return sequence + def get_current_fps(): session_fps = float(legacy_io.Session.get('AVALON_FPS', 25)) return convert_to_maya_fps(session_fps) From 8c3d5be711bccb68f4c7897505c0a83d1b9cef37 Mon Sep 17 00:00:00 2001 From: FadyFS Date: Mon, 12 Jun 2023 11:08:12 +0200 Subject: [PATCH 09/38] reviews --- .../hosts/maya/plugins/load/load_arnold_standin.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 92b1433bb3..0b75915cb5 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -19,10 +19,7 @@ from openpype.hosts.maya.api.pipeline import containerise def is_sequence(files): sequence = False - if len(files) == 1: - collections, remainder = clique.assemble(files, minimum_items=1) - else: - collections, remainder = clique.assemble(files) + collections, remainder = clique.assemble(files, minimum_items=1) if collections: sequence = True return sequence @@ -93,9 +90,7 @@ class ArnoldStandinLoader(load.LoaderPlugin): sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) - fps = float(version["data"].get("fps")) - if fps is None: - fps = get_current_fps() + fps = float(version["data"].get("fps"), get_current_fps()) cmds.setAttr(standin_shape + ".abcFPS", fps) nodes = [root, standin, standin_shape] @@ -161,7 +156,6 @@ class ArnoldStandinLoader(load.LoaderPlugin): type="string" ) - # Object name value cmds.connectAttr( string_replace_operator + ".out", "{}.inputs[{}]".format( From ba4ce235e2563da7dc0d90d27c5a129b04b21ca5 Mon Sep 17 00:00:00 2001 From: FadyFS Date: Mon, 12 Jun 2023 11:23:05 +0200 Subject: [PATCH 10/38] update fps attribute --- openpype/hosts/maya/plugins/load/load_arnold_standin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 0b75915cb5..f62749f587 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -90,7 +90,7 @@ class ArnoldStandinLoader(load.LoaderPlugin): sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) - fps = float(version["data"].get("fps"), get_current_fps()) + fps = float(version["data"].get("fps")) or get_current_fps() cmds.setAttr(standin_shape + ".abcFPS", fps) nodes = [root, standin, standin_shape] From ebc38d6d4fd0e003545dc00d23bdfeb36adaa91d Mon Sep 17 00:00:00 2001 From: FadyFS Date: Mon, 12 Jun 2023 11:34:49 +0200 Subject: [PATCH 11/38] get current session fps --- openpype/hosts/maya/plugins/load/load_arnold_standin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index f62749f587..74dd54a472 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -25,7 +25,7 @@ def is_sequence(files): return sequence -def get_current_fps(): +def get_current_session_fps(): session_fps = float(legacy_io.Session.get('AVALON_FPS', 25)) return convert_to_maya_fps(session_fps) @@ -90,7 +90,7 @@ class ArnoldStandinLoader(load.LoaderPlugin): sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) - fps = float(version["data"].get("fps")) or get_current_fps() + fps = float(version["data"].get("fps")) or get_current_session_fps() cmds.setAttr(standin_shape + ".abcFPS", fps) nodes = [root, standin, standin_shape] From addec3fd7a65dc67fa9005414b4035a9cd6e3867 Mon Sep 17 00:00:00 2001 From: FadyFS Date: Mon, 12 Jun 2023 13:55:28 +0200 Subject: [PATCH 12/38] line correction --- openpype/hosts/maya/plugins/load/load_arnold_standin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_arnold_standin.py b/openpype/hosts/maya/plugins/load/load_arnold_standin.py index 74dd54a472..0040baeec3 100644 --- a/openpype/hosts/maya/plugins/load/load_arnold_standin.py +++ b/openpype/hosts/maya/plugins/load/load_arnold_standin.py @@ -90,7 +90,7 @@ class ArnoldStandinLoader(load.LoaderPlugin): sequence = is_sequence(os.listdir(os.path.dirname(self.fname))) cmds.setAttr(standin_shape + ".useFrameExtension", sequence) - fps = float(version["data"].get("fps")) or get_current_session_fps() + fps = float(version["data"].get("fps"))or get_current_session_fps() cmds.setAttr(standin_shape + ".abcFPS", fps) nodes = [root, standin, standin_shape] From c2a576a39a9a38b67bf3cd4fa3e1d0edc36d6bcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabi=C3=A0=20Serra=20Arrizabalaga?= Date: Mon, 12 Jun 2023 19:47:43 +0200 Subject: [PATCH 13/38] Nuke: Add support for more complex templates in temp_rendering_path_template --- openpype/hosts/nuke/api/lib.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index 777f4454dc..bb58bea4e3 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -1302,10 +1302,7 @@ def create_write_node( fdir = str(anatomy_filled["work"]["folder"]).replace("\\", "/") fpath = data["fpath_template"].format( work=fdir, - version=data["version"], - subset=data["subset"], - frame=data["frame"], - ext=ext + **data, ) # create directory From 079f7a935aa3d1a42f39eb8e47c96462ceebe898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabi=C3=A0=20Serra=20Arrizabalaga?= Date: Mon, 12 Jun 2023 19:47:59 +0200 Subject: [PATCH 14/38] Add fallback in case key doesn't exist --- openpype/hosts/nuke/api/lib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index bb58bea4e3..860c42ebf3 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -2051,7 +2051,7 @@ class WorkfileSettings(object): self._root_node["colorManagement"].setValue("OCIO") # we dont need the key anymore - workfile_settings.pop("customOCIOConfigPath") + workfile_settings.pop("customOCIOConfigPath", None) workfile_settings.pop("colorManagement") workfile_settings.pop("OCIO_config") From e769a76ac32ba4d8def490f0d2cca7c2420db284 Mon Sep 17 00:00:00 2001 From: Fabia Serra Arrizabalaga Date: Wed, 14 Jun 2023 09:12:08 -0500 Subject: [PATCH 15/38] Use StringTemplate to allow for optional template keys --- openpype/hosts/nuke/api/lib.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index 860c42ebf3..39a0ffeac1 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -30,6 +30,7 @@ from openpype.lib import ( env_value_to_bool, Logger, get_version_from_path, + StringTemplate, ) from openpype.settings import ( @@ -1300,10 +1301,8 @@ def create_write_node( # build file path to workfiles fdir = str(anatomy_filled["work"]["folder"]).replace("\\", "/") - fpath = data["fpath_template"].format( - work=fdir, - **data, - ) + data["work"] = fdir + fpath = StringTemplate(data["fpath_template"]).format_strict(data) # create directory if not os.path.isdir(os.path.dirname(fpath)): From 09c5512e9177e30d65a3ca668cfdc05054ea12cc Mon Sep 17 00:00:00 2001 From: Fabia Serra Arrizabalaga Date: Wed, 14 Jun 2023 09:22:35 -0500 Subject: [PATCH 16/38] Skip empty values --- openpype/hosts/nuke/api/lib.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index 39a0ffeac1..14294ed44d 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -2060,6 +2060,9 @@ class WorkfileSettings(object): # it will be dict in value if isinstance(value_, dict): continue + # skip empty values + if not value_: + continue if self._root_node[knob].value() not in value_: self._root_node[knob].setValue(str(value_)) log.debug("nuke.root()['{}'] changed to: {}".format( From e128695c428d64b34085b992ca4427f4f84bc096 Mon Sep 17 00:00:00 2001 From: Fabia Serra Arrizabalaga Date: Wed, 14 Jun 2023 09:22:49 -0500 Subject: [PATCH 17/38] Fix typo --- openpype/hosts/nuke/api/lib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index 14294ed44d..3098d5630a 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -2163,7 +2163,7 @@ class WorkfileSettings(object): log.debug(changes) if changes: - msg = "Read nodes are not set to correct colospace:\n\n" + msg = "Read nodes are not set to correct colorspace:\n\n" for nname, knobs in changes.items(): msg += ( " - node: '{0}' is now '{1}' but should be '{2}'\n" From 97faf90463773c8d6e8ed8323133df18953cf3b1 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 16 Jun 2023 17:01:47 +0800 Subject: [PATCH 18/38] bug fix arnoldExportAss unable to export selected set members --- .../plugins/publish/collect_arnold_scene_source.py | 9 ++++++++- .../plugins/publish/extract_arnold_scene_source.py | 11 +++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index f160a3a0c5..1bacd80f11 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -25,11 +25,18 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): members = cmds.ls(members, long=True) children = get_all_children(members) instance.data["contentMembers"] = children + # TODO: include another instance.data for content members + instance.data["contentMembersTransform"] = members self.log.debug("content members: {}".format(children)) + self.log.debug("content members Transform : {}".format(members)) elif objset.endswith("proxy_SET"): - set_members = get_all_children(cmds.ls(members, long=True)) + proxy_members = cmds.ls(members, long=True) + set_members = get_all_children(proxy_members) instance.data["proxy"] = set_members + instance.data["proxyTransform"] = proxy_members + # TODO: include another instance.data for proxy self.log.debug("proxy members: {}".format(set_members)) + self.log.debug("proxy members Transform: {}".format(proxy_members)) # Use camera in object set if present else default to render globals # camera. diff --git a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py index 14bcc71da6..9ed475e20f 100644 --- a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py @@ -69,9 +69,10 @@ class ExtractArnoldSceneSource(publish.Extractor): "camera": instance.data["camera"], "mask": mask } - + # TODO: dont use instance.data["contentMembers"] + # but use the new instance.data["contentMemberTransforms"] filenames, nodes_by_id = self._extract( - instance.data["contentMembers"], attribute_data, kwargs + instance.data["contentMembersTransform"], attribute_data, kwargs ) if "representations" not in instance.data: @@ -109,8 +110,10 @@ class ExtractArnoldSceneSource(publish.Extractor): return kwargs["filename"] = file_path.replace(".ass", "_proxy.ass") + # TODO: dont use instance.data["proxy"] + # but use the new instance.data["proxyTransforms"] filenames, _ = self._extract( - instance.data["proxy"], attribute_data, kwargs + instance.data["proxyTransform"], attribute_data, kwargs ) representation = { @@ -187,7 +190,7 @@ class ExtractArnoldSceneSource(publish.Extractor): self.log.info( "Extracting ass sequence with: {}".format(kwargs) ) - + # arnoldExportAss -selected needs an active selection or a list of objects exported_files = cmds.arnoldExportAss(**kwargs) for file in exported_files: From e10b228be2a460f7a606dba19044bfed1459f56d Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 16 Jun 2023 17:07:56 +0800 Subject: [PATCH 19/38] hound fix --- igniter/.ass | 212 ++++++++++++++++++ .../publish/collect_arnold_scene_source.py | 6 +- .../publish/extract_arnold_scene_source.py | 2 +- 3 files changed, 217 insertions(+), 3 deletions(-) create mode 100644 igniter/.ass diff --git a/igniter/.ass b/igniter/.ass new file mode 100644 index 0000000000..599a76d732 --- /dev/null +++ b/igniter/.ass @@ -0,0 +1,212 @@ +### exported: Thu Jun 15 17:07:53 2023 +### from: Arnold 7.1.3.2 [2a385cac] windows clang-10.0.1 oiio-2.4.1 osl-1.12.0 vdb-7.1.1 adlsdk-6.3.1.44 clmhub-2.0.0.235 rlm-14.1.3 optix-6.6.0 2022/09/12 08:50:17 +### host app: MtoA 5.2.1.1 6a048927 (fix-5.2.1) Maya 2023 +### bounds: -1.207354 -0.269835 -1.207354 1.207354 2.144874 1.207354 +### user: Kayla +### render_layer: defaultRenderLayer +### scene: D:/dummy_test/test_Project/test/work/test_v002/test_project_test_test_v002_v070.mb +### meters_per_unit: 0.010000 + + + +options +{ + AA_samples 3 + outputs 4 1 STRING + "RGBA RGBA defaultArnoldFilter/gaussian_filter defaultArnoldDriver/driver_exr.RGBA" + "P VECTOR aiAOVFilter1/closest_filter defaultArnoldDriver/driver_exr.RGBA" + "Pref RGB aiAOVFilter2/closest_filter defaultArnoldDriver/driver_exr.RGBA" + "albedo RGB defaultArnoldFilter/gaussian_filter defaultArnoldDriver/driver_exr.RGBA" + xres 1920 + yres 1080 + texture_per_file_stats on + texture_searchpath "[OPENPYPE_PROJECT_ROOT_WORK];D:/dummy_test/test_Project/test/work/test_v002/sourceimages" + texture_automip off + camera "/camera1/cameraShape1" + color_manager "defaultColorMgtGlobals" + operator "aiMerge1" + meters_per_unit 0.00999999978 + frame 1 + fps 25 + procedural_searchpath "[OPENPYPE_PROJECT_ROOT_WORK];D:/dummy_test/test_Project/test/work/test_v002/" + GI_diffuse_depth 1 + GI_specular_depth 1 + GI_transmission_depth 8 + declare render_layer constant STRING + render_layer "defaultRenderLayer" +} + +gaussian_filter +{ + name defaultArnoldFilter/gaussian_filter +} + +driver_exr +{ + name defaultArnoldDriver/driver_exr.RGBA + filename "D:/dummy_test/test_Project/test/work/test_v002/renders/test_project_test_test_v002_v070/masterLayer/masterLayer.exr" + color_space "" +} + +closest_filter +{ + name aiAOVFilter1/closest_filter +} + +closest_filter +{ + name aiAOVFilter2/closest_filter +} + +merge +{ + name aiMerge1 + inputs "test_01_:string_replace_operator" +} + +string_replace +{ + name test_01_:string_replace_operator + selection "*.(@node=='alembic')" + match "resources/test_project_test_modelMain_v067_proxy.abc" + replace "test_project_test_modelMain_v067.abc" +} + +color_manager_ocio +{ + name defaultColorMgtGlobals + config "D:/maya_config/OCIO-configs/Maya2022-default/config.ocio" + color_space_linear "ACEScg" +} + +polymesh +{ + name /proxy/pSphere/pSphereShape + visibility 255 + sidedness 255 + matrix + 2.41470838 0 0 0 + 0 2.41470838 0 0 + 0 0 2.41470838 0 + 0 0.937519372 0 1 + shader "lambert1" + id 2564139679 + nsides 6 1 UINT +4 4 4 4 4 4 + vidxs 24 1 b85UINT +B$ZuK*%:$$-?2$vMr4%:&UObB$w/J=(3BP? + vlist 8 1 b85VECTOR +aDq99aDq9989+]c89+]caDq9989+]caDq99!89+]c$$$$)aDq9989+]caDq9989+]c89+]c!aDq99$$$$(89+]caDq99aDq99 + nlist 24 1 b85VECTOR +zzyzzyzzyzzyzyzzyzzyzzy!$$$$$$$$$'aRT=dzzaRT=dzzaRT=dzzaRT=dzaRT=dzzaRT=dzzaRT=dzzaRT=dzyzzyzzyzzyzzaRT=dzzaRT=dzzaRT=dzzaRT=dzz + uvlist 14 1 b85VECTOR2 +82:0xz80l$K@wi$mMpJ$pnKs$PHvV$PKhS$rXa4$v$<]$USg@$UVY=$wcQs%&/-G$Z^X*$ZaJ'%'nB]%+9s1$_iHi$_l:f%-$3G%0Dcp$dt9S$dw+P%2/$1$h@,s$j**=$j,q:%79ip%:ZED$o4p'$o7b$%j%8uiM%8x[J%[0T+%^Q/T%>+Z7%>.L4%`;Dj%c[u>%C6Jv%C9%mqVg%ML,J%MNsG%o[l(%s'GQ%RVr4%RYd1%tf\g%x28;%5U-2%WdT\&$qMQ&(=)%%\lS]%\oEZ&*'>;&-Gnd%awDG%b%6D&/2/%&2R_N%g-51%g0'.&4RV8&As1a%vM\D%vPNA&C]Fw&$nOd&&XM.&&[?+&Hh7a&L3h5&+c=m&+f/j&Ms(K&Q>Xt&0n.W&0puT&S(n5&VII^&5xtA&6&f>&X3^t&[T:H&;.e+&;1W(&]>O^&`_+2&@9Uj&@x&jta[&JO7>&JR);&l^vq&p*RE&OZ((&O\o%&qig[&u5C/&Tdmg&Tg_d&vtXE'%@3n&Yo^Q&YrPN''*I/'*K$X&_%O;&_(A8',59n'/UjB&d0@%&d31w'1@*X'4`[,&G.Ox&i=wM'6JpB'9kKk&nEvN&nHhK';Ua,'>vb'VriE'Vu[B($*ai('N/L'\(Z/'\+L,()8Db(,Xu6'a3Jn'a6;X'fA-U(3N&6(6nV_'kI,B'kKs?(8Xku(<$GI'pSr,'pVd)(=c\_(A/83'u^bk'uaTh(BnMI(F:(r'X\ri(%lE>(H$>3(KDn\(*tD?(*w6<(M/.r(PO_F(0*5)(0-'&(R9t\(UZP0(55%h(57le(WDeF(Ze@o(:?kR(:B]O(\OV0(_p1Y(?J\<(?MN9(aZFo(e%wC(DUM&(DX>x(fe7Y(Gv@F(I`=e(Ic/b(kp(C(o;Xl(Nk.O(NmuL(q%n-(tFIV(Sut9(Sxf6(v0^l)$Q:@(Y+dx(Y.Vu)&;OV))\+*(^6Ub(^9G_)+F@@).fpi(cAFL(cD8I)0Q1*)3qaS(hL76(hO)3)5Y/Z)9'R=(mW'u(mYnr):fgS)>2C'(ram_(rd_\)?qX=)C=3f(wl^I(woPF)E'I')HH$P)'wO3)(%A0)J29f)MRj:)--?r)-01o)O=*P)R][$)280\)2:wY)TGp:)WhKc(j6@Z)7Eh/)YRa$)\sc`)Kn9C)Kq+@)n(xv)qITJ)Q$*-)Q&q*)s3i`)vTE4)V.ol)V1ai)x>ZJ)YOc7)[9`V)[Z)toi=)tr[:*B*Sp*EK/D*%%Z'*%(L$*G2RK*JUu.**0Jf**3-M*QK&.*TkVW*4F,:*4Hs7*VUkm*YvGA*9Pr$*9Scv*[`\W*_,8+*>[bc*>^T`*`kMA*d7(j*CfSM*CiEJ*ev>+*iAnT*&dcK*Ht5u*k,.j*nL_>*N'4v*N*&s*p6tT*sWP(*S2%`*S4l]*uAe>*xb@g*Xp+/b7Q+3-h%*g]=]*g`/Z+4m(;*k)1(*lh.G*ljuD+9wn%+=CIN*qrt1*quf.+?-^d+BN:8*w(dp*w+Vm+D8ON+GY*w+'3UZ+'6GW+IC@8+Lcpa+,>FD+,A8A+NN0w+QnaK+1I7.+1L)++SXva+W$R5+6T'm+6Vnj+X`u<+Yj%R+Yj1W+Yj=\+YjIa+YjUf+Yjak+Yjmp+Yk$u+Yk1%+Yk=*+YkI/+YkU4+Yka9+Ykm>+Yl$C+Yl0H+Yl$GoW-$IVb>$IVnF$K>Tg$R08V$SlCg$SlOo$UT6;$\Eo*$^-%;$^-1C$_ild$f[PS$$)E7$)3rI$j*)Y$ka82$/uZ&$0%nh$mMp;$plM,$:6;M$:;,-$rXa($uwb%$DKqs$DP>G$wcQj%&-vs$NaSD$NePa%'nBW%+96l$Xw4j$Y%c&%-$3D%0DKe$c7k;$c:u@%2/$1$j$j?$hC+1$hEr-%5R^`%:ZED$o4p'$o7b$%+Z7%>.L4%`;Dj%c[u>%C6Jv%C9%mqVg%ML,J%MNsG%o[l(%s'GQ%RVr4%RYd1%tf\g%x28;%7<8B%YK_m&&XL\&(=)$%\lS\%\oEZ&*'>;&-Gnd%awDG%b%6D&/2/%&2R_N%g-51%g0'.&4RV8&As1a%vM\D%vPNA&C]Fw&&Ufx&$qMw&$t?s&G,,Q&L3h5&+c=m&+f/j&Ms(K&Q>Xt&0n.W&0puT&S(n5&VII^&5xtA&6&f>&X3^t&[T:H&;.e+&;1W(&]>O^&`_+2&@9Uj&@vb'VriE'Vu[B($*mn(%fm9'\(N,'\+@(()8Db(,Xu6'a3Jn'a6;X'fA-U(3N&6(6nV_'kI,B'kKs?(8Xku(<$GI'pSr,'pVd)(=c\_(A/83'u^bk'uaTh(BnMI(F:(r'ZD)$('SPO(I`=>(KDn[(*tD>(*w6<(M/.r(PO_F(0*5)(0-'&(R9t\(UZP0(55%h(57le(WDeF(Ze@o(:?kR(:B]O(\OV0(_p1Y(?J\<(?MN9(aZFo(e%wC(DUM&(DX>x(fe7Y(I]WZ(H$>Y(H'0U(j3r3(o;Xl(Nk.O(NmuL(q%n-(tFIV(Sut9(Sxf6(v0^l)$Q:@(Y+dx(Y.Vu)&;OV))\+*(^6Ub(^9G_)+F@@).fpi(cAFL(cD8I)0Q1*)3qaS(hL76(hO)3)5Y;_)7@;*(mVpr(mYbn):fgS)>2C'(ram_(rd_\)?qX=)C=3f(wl^I(woPF)E'I')HH$P)'wO3)(%A0)J29f)MRj:)--?r)-01o)O=*P)R][$)280\)2:wY)TGp:)WhKc(krKj)9,s@)[9`/)\sc`)Kn9C)Kq+@)n(xv)qITJ)Q$*-)Q&q*)s3i`)vTE4)V.ol)V1ai)x>ZJ)[7%K)YRaJ)YUSF*&b@$*+j&])`DQ@)`GC=*-T;s*0tlG)eOB*)eR4'*2_,]*6*]1)jZ2i)j]$f*7irG*;5Mp)odxS)ogjP*Z)toi=)tr[:*B*Sp*EK/D*%%Z'*%(L$*G2^P*Hn]p**0>c**30_*L@5D*O`em*/;;P*/>-M*QK&.*TkVW*4F,:*4Hs7*VUkm*YvGA*9Pr$*9Scv*[`\W*_,8+*>[bc*>^T`*`kMA*d7(j*CfSM*CiEJ*ev>+*iAnT*(Kn[*J[A1*lh-u*nL_=*N'4u*N*&s*p6tT*sWP(*S2%`*S4l]*uAe>*xb@g*Xp+/b7Q+3-h%*g]=]*g`/Z+4m(;*leH<*k,/;*k.v7+8;bj+=CIN*qrt1*quf.+?-^d+BN:8*w(dp*w+Vm+D8ON+GY*w+'3UZ+'6GW+IC@8+Lcpa+,>FD+,A8A+NN0w+QnaK+1I7.+1L)++SXva+W$R5+6T'm+6Vnj+Xa,A+Yj%R+Yj1Y+YjUg+Yjmq+Yk1&+YkI0+Yka:+Yl$D+YlHN$N^ls$,R7G$,U5H$PI98$Si]]$1](1$1`&2$UT)w$XtNG$6gmp$6jkq$Z^oa$^*?1$;r^Z$;u\[$_i`K$c5/p$A(OD$A+ME$dtQ5$h?uZ$F3@.$GrI?$kfY4$o2(Y$M%H-$M(F.$pqIs$t'W%&2+G%)ROl$\Eo@$\HmA%++Z8%>.X9%aw\)%eC+N%C6Jw%C9Hx%g-Lh%jMq8%HA;a%HD9b%l8=R%oXaw%ML,K%MO*L%qC.<%tcRa%RVr5%RYp6%vMt&&$nCK%Wabt%Wd`u&&Xde&*$45%\lS^%^V\o&-Jld&0k<4%c^[]%caY^&2U]N&5v,s%hiLG%hlJH&7`N8&;+r]%mt=1%mw;2&w&@6cG%s*-p%s-+q&Av/a&EAT1%x4sZ%x7q[&G+uK&JLDp&(?dD&(BbE&L6f5&OW5Z&/1lB&/4jD&S(n4&VI=Y&4<]-&4?[.&X3^s&[T.C&9GMl&9JKm&]>O]&`^t-&>R>V&>U''3'Al'6Gf<&i;0e&i>.f'822V';RW&&nEvO&nHtP'=xwt'?&uu'bp$e'f;I5'Ek*r'En(t'ib,d'm-Q4'Jup]'Jxn^'nlrN'r8As'P+aG'P._H'swc8'wC2]'U6R1'U9P2($-Sw('MxG'ZABp'ZD@q()8Da(,Xi1'_L3Z'_O1[(.C5K(1cYp'dW$D'dYwE(3N&5(8Uao'kI,C'kL*D(:@.4(=`RY'pSr-'pVp.(?Jss(BkCC'u^bl'ua`m(DUd](Gv4-(%iSV(%lQW(I`UG(M,$l(*tD@(*wBA(NkF1(R6jV(0*5*(0-3+(Sv6p(WA[@(55%i(6t/%(Zh>o(^3c?(<'-h(<*+i(_s/Y(c>T)(A1sR(A4qS(e(uC(hIDh(FVl(r_&<(PREe(PUCf(tIGV(wil&(U]6O(U`4P)$T8@)'t\e(\O>M(\R26w(q%VK(q(TL)?qX<)C='a(v0G5(v3E6)E'I&)HGmK)&;7t)&>5u)J29e)O9uJ)--?s)-0=t)Q$Ad)TDf4)280])2;.^)V/2N)YOVs)7BvG)7EtH)[9x8)^ZG])Xp@)s3R()s6P**B*So*EJx?)x>Bh)xA@i*G5DY*JUi)*(I3R*(L1S*L@5C*O`Yh*-T$<*-Vw=*QK&-*TkJR*2^j&*2ah'*VUkl*Yv;<*7iZe*7lXf*[`\V*_,,&*[8*S2%a*S4xb*w)'R+%IKw*X^&+/_-K*bRLt*d1+.%]Z+.([[+Qq_K+U=.p+4leX+4ocZ+XcgJ+\/6o+9wVC+:%TD+]nX4+a:'Y+?-G-+?0E.+c$Hs+fDmC+D87l+D;5m+h/9]+kO^-+IC(V+IF&W+m:*G+pZNl+NMn@+NPlA+rDp1+ue?V+SX_*+S[]++wO`p,%:P.,&vgC,(^)X,*E@m,,,X-,-hoB,/P1W,17Hl,2s`,,4ZwA,6B9V,8)Pk,9eh+,;M*@,=4AU,>pXj,@Wp*,B?2?,D&IT,Eb`i,H'r1,Id4F,KKK[,M2bp,No%0,PVaQ7[Aa/f5)7xuYSaQ7[Aa794h7l?EtaQ7[Aa9['fzaQ7[Aa:L<8`x/vJaQ7[Aa9['ea/f5'aQ7[Aa794fa794faQ7[Aa/f5&a9['caQ7[A`x/vGa:L<5aQ7[Aza9['caQ7[A7l?Eqa794eaQ7[A7xuYOa/f5%aQ7[A8+HY:`x/vGaQ7[A8-jL7]8wuQaQ7[A8.[`^7l?EmaQ7[A8-jL67xuYLaQ7[A8+HY98+HY8aQ7[A7xuYM8-jL6aQ7[A7l?En8.[`]aQ7[Az85BheaOV5ba+:2Y81k?taOV5ba82J)8,AnSaOV5ba=[pI7tIW-aOV5baA3D9zaOV5baBETaa+:2XaOV5baA3D8a82J'aOV5ba=[pFa=[pEaOV5ba82J&aA3D6aOV5ba+:2UaBET^aOV5bzaA3D6aOV5b7tIW*a=[pDaOV5b8,AnOa82J%aOV5b81k?na+:2UaOV5b85Bh^]@q8xaOV5b86U$17tIW(aOV5b85Bh]8,AnMaOV5b81k?m81k?laOV5b8,AnN85Bh\aOV5b7tIW)86U$/aOV5bz8:_aQaMAiaa/f5)87d&JaMAiaa,;a/f5(aMAiaaFP=%a,8aMAiazaFPcW<8'x-gaJT2f8=h8A84LjgaJT2f8;)%18;)%1aJT2f84Lji8=h8@aJT2f8'x-i8>cW;aJT2fz8@J=naG>,6a794h8=>KTaG>,6aCTVt87d&IaG>,6aI/')8+HY,6aL:nBzaG>,6aMAiga794gaG>,6aL:nAaCTVqaG>,6aI/''aI/'&aG>,6aCTVoaL:n?aG>,6a794eaMAidaG>,6zaL:n?aG>,68+HY:aI/'%aG>,687d&CaCTVnaG>,68=>KNa794eaG>,68@J=g]KmN*aG>,68AQ988+HY7aG>,68@J=g87d&@aG>,68=>KM8=>KMaG>,687d&A8@J=faG>,68+HY88AQ96aG>,6z8BUCkaBETZa8YmK8?.MqaBETZaES@889bdbaBETZaJt)F8,iza-&.3aR7`ga::XDa-&.3aPqK=aG-,<8;MPfzaMAii8.[`bzaQ7[IzzaRT=ha:L<8zaQ7[HaG>,:zaMAifaMAiezaG>,9aQ7[Eza:L<5aRT=fzzaQ7[Ez8.[`_aMAidz8;MPbaG>,8z8AQ98a:L<5z8EG*m]Q*w-z8Fcb:8.[`\z8EG*l8;MP`z8AQ978AQ96z8;MPa8EG*kz8.[`]yzz8E+oj7v5R]a::XE8A:.B7v5R]aG-z7v5R]aR7`ga::XD7v5R]aPqK=aG-KT8;MP`aCTVt87d&I8;MP`aI/')8+HY<8;MP`aL:nBz8;MP`aMAiga794g8;MP`aL:nAaCTVq8;MP`aI/''aI/'&8;MP`aCTVoaL:n?8;MP`a794eaMAid8;MP`zaL:n?8;MP`8+HY:aI/'%8;MP`87d&CaCTVn8;MP`8=>KNa794e8;MP`8@J=g]KmN*8;MP`8AQ988+HY78;MP`8@J=g87d&@8;MP`8=>KM8=>KM8;MP`87d&A8@J=f8;MP`8+HY88AQ968;MP`z8=h8G8>cW;a3h^G8;)%78>cW;a@=FF84Ljp8>cW;aFnUa8'x-p8>cW;aIXhqz8>cW;aJT2la3h^F8>cW;aIXhpa@=FC8>cW;aFnU_aFnU^8>cW;a@=FBaIXhn8>cW;a3h^AaJT2i8>cW;zaIXhn8>cW;8'x-kaFnU^8>cW;84Ljja@=F@8>cW;8;)%2a3h^A8>cW;8=h8A]I*l/8>cW;8>cW<8'x-g8>cW;8=h8A84Ljg8>cW;8;)%18;)%18>cW;84Lji8=h8@8>cW;8'x-i8>cW;8>cW;z8:_aQ8AQ96a/f5)87d&J8AQ96a,;a/f5(8AQ96aFP=%a,88AQ96zaFP8EG*ka/f5)7xuYS8EG*ka794h7l?Et8EG*ka9['fz8EG*ka:L<8`x/vJ8EG*ka9['ea/f5'8EG*ka794fa794f8EG*ka/f5&a9['c8EG*k`x/vGa:L<58EG*kza9['c8EG*k7l?Eqa794e8EG*k7xuYOa/f5%8EG*k8+HY:`x/vG8EG*k8-jL7]8wuQ8EG*k8.[`^7l?Em8EG*k8-jL67xuYL8EG*k8+HY98+HY88EG*k7xuYM8-jL68EG*k7l?En8.[`]8EG*kz7uCHt8FG04`jc&P7rt'w8FG04`wC3.7kRWX8FG04a)dXM7^rJx8FG04a,4$Iz8FG04a-&.?`jc&N8FG04a,4$H`wC3,8FG04a)dXKa)dXJ8FG04`wC3*a,4$F8FG04`jc&Ka-&.=8FG04za,4$F8FG047^rJua)dXJ8FG047kRWS`wC3)8FG047rt's`jc&K8FG047uCHo]+QgX8FG047v5Re7^rJq8FG047uCHn7kRWQ8FG047rt'r7rt'r8FG047kRWR7uCHn8FG047^rJr7v5Rd8FG04zzaRT=dzzyz + nlist 382 1 b85VECTOR +8$sL?aR%6>`p]C(7vj/8aR%6>a($j&8,Oq4aQ$=Ea1Ba1j/2]ZEXpaQ$=Ea;iAh`p]BBaR%6?a0d'ta$guxaQ$=Da:rPna($inaR%6>a-Z`,a1B7dlgqa:rPoaQ$=C7mwEMa-Z_iaR%6?7q49%a8@LcaQ$=C8%Qa:a($iiaR%6@7vj/6a1B7dlgx8/,uEaQ$=A7mwE_8&$SXaR%6@5(Kln8/xfEaQ$=D4n,BY82U=faOAqMa8`53867kIaOAqLa+j;W8,oYWaOAqMa>En;7u$`;aOAqNaB(Fp]^u6:aOAqMaC>G8a+j;saOAqNaB(Fta8`55aOAqLa>En?a>En@aOAqMa8`51aB(FxaOAqMa+j;haC>G@aOAqK4Y^O1aB(G%aOAqK7u$`Fa>EnAaOAqK8,oY]a8`50aOAqL82U=ma+j;kaOAqJ867kP4J,])aOAqJ87Mkl7u$`FaOAqK867kM8,oY\aOAqK82U=k82U=jaOAqJ8,oYb867kOaOAqL7u$`@87MkgaOAqM4i*v)88;[taM-K^a%E_aJ@lva4+;Q84c;FaJ@luaG)&O8(:`VaJ@lsaIjv2]_U%E^]2IK3aJ@lr8>v_'8(:`caJ@lt8>%E]84c;QaJ@lq8;8K%8;8K$aJ@lq84c;K8>%E\aJ@lq8(:`W8>v_'aJ@lq5/=Vk8=HJ&aG,t^aCc,n8@V'DaG,t\a7@i]87rQ>aG,t]aI9%T8+P9HaG,t[aLFWk]hcZA7aG,tY8A]V-8+P9PaG,tY8@V'>87rQFaG,tY8=HJ'8=HJ)aG,tY87rQC8@V'@aG,tY8+P9K8A]V.aG,tY50&a>8?43^aB)a>aEWKc8B\)XaB)a?a8^5`89fp4aB)a@aK$d78,mZJaB)aDaNLZ)]Yd;iaB)aDaO]8ja8^6,aB)aDaNLZ'aEWKeaB)aCaK$d1aK$d5aB)aAaEWK_aNLZ(aB)aBa8^6$aO]8jaB)aG]SCosaNLZ'aB)aF8,mZOaK$d3aB)aD89fp8aEWKaaB)a@8?43_a8^6&aB)a>8B\)S4]4BYaB)a;8Cl]?8,mZTaB)a<8B\)S89fp6aB)a;8?43^8?43`aB)a<89fp78B\)TaB)a>8,mZP8Cl]AaB)a<52v)T8@LmMa:8ZwaFR128D3$9a:8Zwa9\x^8:aUXa:8[$aL=I&8-lHLa:8[&aOxT_]2EE>a:8[$aQ:iJa9]$-a:8ZxaOxT^aFR14a:8[%aL=HvaL=I&a:8[$aFR1/aOxT_a:8Zwa9]$&aQ:iJa:8[']Db/faOxT]a:8[&8-lHRaL=I$a:8Zp8:aU\aFR10a:8Zq8@LmPa9]$$a:8Zu8D3$44e9woa:8Zv8EJ8t8-lHUa:8Zx8D3$38:aU[a:8Zw8@LmN8@LmOa:8Zv8:aU[8D3$4a:8Zt8-lHP8EJ8wa:8Zq53XsU8A:e0a,fiLaG-dd8E,[,68EG*p\jrsaa:L;i8;MP]]I`mKaMAib8.[`S]I`mMaQ7[BzzaRT=da:L<;]I`mPaQ7[@aG>,:]H,4aQ7[A3_-C8a:L<2aRT=c\jrsa3leGaaQ7[?\xUx78.[`_aMAi_z8;MPbaG>,5]FmUA8AQ98a:L<.]LT0e8EG*kzz8Fcb88.[`^\jrsc8EG*k8;MPa\xUx<8AQ978AQ96\jrsc8;MP`8EG*kz8.[`_y3_-C453fkZ8A:e07uv8uaG-dd8E,[<7uv9&a:;,o8;=457uv9(aM+@]8.JQ\7uv9(aPr6cz7uv9$aR8OQa:;-?7uv9%aPr6`aG-dg7uv8waM+@WaM+@\7uv8taG-d`aPr6d7uv8ma:;-6aR8OR7uv8b4%`)+aPr6b7uv8a8.JQcaM+@Z7uv8j8;=49aG-db7uv8t8A:e0a:;-47uv8x8E,[74W=-`7uv9$8FGt&8.JQe7uv9$8E,[68;=487uv8v8A:e/8A:e07uv8w8;=488E,[97uv8t8.JQc8FGt&7uv8x53Dx68@LmM8.H*NaFR138D3$98.H*Na9\x^8:aUX8.H*OaL=I'8-lHL8.H*PaOxT_]2EE>8.H*OaQ:iJa9]$,8.H*NaOxT\aFR138.H*MaL=HvaL=I'8.H*MaFR1/aOxT_8.H*La9]$&aQ:iJ8.H*N]:)QhaOxT_8.H*L8-lHRaL=I$8.H*G8:aU\aFR108.H*F8@LmQa9]$$8.H*J8D3$44eYgJ8.H*K8EJ8t8-lHS8.H*M8D3$28:aU[8.H*M8@LmO8@LmO8.H*K8:aU[8D3$48.H*H8-lHP8EJ8w8.H*I52v;@8?43]8690laEWKc8B\)Y8690ka8^5`89fp48690laK$d68,mZL8690naNLZ*]Yd;i8690naO]8ja8^6+8690oaNLZ'aEWKe8690kaK$d1aK$d68690kaEWK_aNLZ*8690ma8^6&aO]8j8690m]OP%E^8>PPPPPPPPPPPPP%E^]2IK38>Pv_'8(:`c8>P%E]84c;N8>PP%E\8>Pv_(8>PEnF7u$`98CQ@vaB(Fs]`=mC8CQ@xaC>G6a+j;s8CQ@xaB(Foa8`548CQ@wa>En:a>En@8CQ@va8`5-aB(G$8CQ@wa+j;naC>G@8CQ@u4Y^O1aB(Fx8CQ@u7u$`Ua>En@8CQ@v8,oY]a8`518CQ@w82U=ia+j;l8CQ@t867kQ4I`qe8CQ@t87Mkp7u$`H8CQ@u867kP8,oY]8CQ@v82U=k82U=l8CQ@u8,oY`867kL8CQ@t7u$`F87Mkg8CQ@w4piDe8,Oq38E3ama1B=/8/,uC8E3ana$guO8%QaB8E3ala8@Lj7mwE<8E3aoa:rPi]ZEXp8E3aoa;iAaa$guw8E3aoa:rPfa1B0s7_[,H7uNfZ7_[,H8%v5I7_[,H8+HY87_[,H8.1k07_[,H80p((7_[,H83Y9u7_[,H86BKm7_[,H89+]d7_[,H8:Jf`7_[,H8;io\7_[,H8=3xX7_[,H8>S,T7_[,H8?r5P7_[,H8A<>L7_[,H8B[GH7_[,H8D%PD7_[,H8EDY@7_[,H8Fcb:7_[,Hz7m>0s7_[,H!7m>0s$$$$'7uNfZ7m>0s8%v5I7m>0s8+HY87m>0s8.1k07m>0s80p((7m>0s83Y9u7m>0s86BKm7m>0s89+]d7m>0s8:Jf`7m>0s8;io\7m>0s8=3xX7m>0s8>S,T7m>0s8?r5P7m>0s8A<>L7m>0s8B[GH7m>0s8D%PD7m>0s8EDY@7m>0s8Fcb:7m>0sz7uNfZ7_[,H7uNfZ7m>0s!7uNfZ$$$$'8%v5I7uNfZ8+HY87uNfZ8.1k07uNfZ80p((7uNfZ83Y9u7uNfZ86BKm7uNfZ89+]d7uNfZ8:Jf`7uNfZ8;io\7uNfZ8=3xX7uNfZ8>S,T7uNfZ8?r5P7uNfZ8A<>L7uNfZ8B[GH7uNfZ8D%PD7uNfZ8EDY@7uNfZ8Fcb:7uNfZz8%v5I7_[,H8%v5I7m>0s8%v5I7uNfZ!8%v5I$$$$'8+HY88%v5I8.1k08%v5I80p((8%v5I83Y9u8%v5I86BKm8%v5I89+]d8%v5I8:Jf`8%v5I8;io\8%v5I8=3xX8%v5I8>S,T8%v5I8?r5P8%v5I8A<>L8%v5I8B[GH8%v5I8D%PD8%v5I8EDY@8%v5I8Fcb:8%v5Iz8+HY87_[,H8+HY87m>0s8+HY87uNfZ8+HY88%v5I!8+HY8$$$$'8.1k08+HY880p((8+HY883Y9u8+HY886BKm8+HY889+]d8+HY88:Jf`8+HY88;io\8+HY88=3xX8+HY88>S,T8+HY88?r5P8+HY88A<>L8+HY88B[GH8+HY88D%PD8+HY88EDY@8+HY88Fcb:8+HY8z8.1k07_[,H8.1k07m>0s8.1k07uNfZ8.1k08%v5I8.1k08+HY8!8.1k0$$$$'80p((8.1k083Y9u8.1k086BKm8.1k089+]d8.1k08:Jf`8.1k08;io\8.1k08=3xX8.1k08>S,T8.1k08?r5P8.1k08A<>L8.1k08B[GH8.1k08D%PD8.1k08EDY@8.1k08Fcb:8.1k0z80p((7_[,H80p((7m>0s80p((7uNfZ80p((8%v5I80p((8+HY880p((8.1k0!80p(($$$$'83Y9u80p((86BKm80p((89+]d80p((8:Jf`80p((8;io\80p((8=3xX80p((8>S,T80p((8?r5P80p((8A<>L80p((8B[GH80p((8D%PD80p((8EDY@80p((8Fcb:80p((z83Y9u7_[,H83Y9u7m>0s83Y9u7uNfZ83Y9u8%v5I83Y9u8+HY883Y9u8.1k083Y9u80p((83Y9u83Y9u83Y9u86BKm83Y9u89+]d83Y9u8:Jf`83Y9u8;io\83Y9u8=3xX83Y9u8>S,T83Y9u8?r5P83Y9u8A<>L83Y9u8B[GH83Y9u8D%PD83Y9u8EDY@83Y9u8Fcb:83Y9uz86BKm7_[,H86BKm7m>0s86BKm7uNfZ86BKm8%v5I86BKm8+HY886BKm8.1k086BKm80p((86BKm83Y9u!86BKm$$$$'89+]d86BKm8:Jf`86BKm8;io\86BKm8=3xX86BKm8>S,T86BKm8?r5P86BKm8A<>L86BKm8B[GH86BKm8D%PD86BKm8EDY@86BKm8Fcb:86BKmz89+]d7_[,H89+]d7m>0s89+]d7uNfZ89+]d8%v5I89+]d8+HY889+]d8.1k089+]d80p((89+]d83Y9u89+]d86BKm!89+]d$$$$'8:Jf`89+]d8;io\89+]d8=3xX89+]d8>S,T89+]d8?r5P89+]d8A<>L89+]d8B[GH89+]d8D%PD89+]d8EDY@89+]d8Fcb:89+]dz8:Jf`7_[,H8:Jf`7m>0s8:Jf`7uNfZ8:Jf`8%v5I8:Jf`8+HY88:Jf`8.1k08:Jf`80p((8:Jf`83Y9u8:Jf`86BKm8:Jf`89+]d!8:Jf`$$$$'8;io\8:Jf`8=3xX8:Jf`8>S,T8:Jf`8?r5P8:Jf`8A<>L8:Jf`8B[GH8:Jf`8D%PD8:Jf`8EDY@8:Jf`8Fcb:8:Jf`z8;io\7_[,H8;io\7m>0s8;io\7uNfZ8;io\8%v5I8;io\8+HY88;io\8.1k08;io\80p((8;io\83Y9u8;io\86BKm8;io\89+]d8;io\8:Jf`!8;io\$$$$'8=3xX8;io\8>S,T8;io\8?r5P8;io\8A<>L8;io\8B[GH8;io\8D%PD8;io\8EDY@8;io\8Fcb:8;io\z8=3xX7_[,H8=3xX7m>0s8=3xX7uNfZ8=3xX8%v5I8=3xX8+HY88=3xX8.1k08=3xX80p((8=3xX83Y9u8=3xX86BKm8=3xX89+]d8=3xX8:Jf`8=3xX8;io\!8=3xX$$$$'8>S,T8=3xX8?r5P8=3xX8A<>L8=3xX8B[GH8=3xX8D%PD8=3xX8EDY@8=3xX8Fcb:8=3xXz8>S,T7_[,H8>S,T7m>0s8>S,T7uNfZ8>S,T8%v5I8>S,T8+HY88>S,T8.1k08>S,T80p((8>S,T83Y9u8>S,T86BKm8>S,T89+]d8>S,T8:Jf`8>S,T8;io\8>S,T8=3xX!8>S,T$$$$'8?r5P8>S,T8A<>L8>S,T8B[GH8>S,T8D%PD8>S,T8EDY@8>S,T8Fcb:8>S,Tz8?r5P7_[,H8?r5P7m>0s8?r5P7uNfZ8?r5P8%v5I8?r5P8+HY88?r5P8.1k08?r5P80p((8?r5P83Y9u8?r5P86BKm8?r5P89+]d8?r5P8:Jf`8?r5P8;io\8?r5P8=3xX8?r5P8>S,T!8?r5P$$$$'8A<>L8?r5P8B[GH8?r5P8D%PD8?r5P8EDY@8?r5P8Fcb:8?r5Pz8A<>L7_[,H8A<>L7m>0s8A<>L7uNfZ8A<>L8%v5I8A<>L8+HY88A<>L8.1k08A<>L80p((8A<>L83Y9u8A<>L86BKm8A<>L89+]d8A<>L8:Jf`8A<>L8;io\8A<>L8=3xX8A<>L8>S,T8A<>L8?r5P!8A<>L$$$$'8B[GH8A<>L8D%PD8A<>L8EDY@8A<>L8Fcb:8A<>Lz8B[GH7_[,H8B[GH7m>0s8B[GH7uNfZ8B[GH8%v5I8B[GH8+HY88B[GH8.1k08B[GH80p((8B[GH83Y9u8B[GH86BKm8B[GH89+]d8B[GH8:Jf`8B[GH8;io\8B[GH8=3xX8B[GH8>S,T8B[GH8?r5P8B[GH8A<>L!8B[GH$$$$'8D%PD8B[GH8EDY@8B[GH8Fcb:8B[GHz8D%PD7_[,H8D%PD7m>0s8D%PD7uNfZ8D%PD8%v5I8D%PD8+HY88D%PD8.1k08D%PD80p((8D%PD83Y9u8D%PD86BKm8D%PD89+]d8D%PD8:Jf`8D%PD8;io\8D%PD8=3xX8D%PD8>S,T8D%PD8?r5P8D%PD8A<>L8D%PD8B[GH!8D%PD$$$$'8EDY@8D%PD8Fcb:8D%PDz8EDY@7_[,H8EDY@7m>0s8EDY@7uNfZ8EDY@8%v5I8EDY@8+HY88EDY@8.1k08EDY@80p((8EDY@83Y9u8EDY@86BKm8EDY@89+]d8EDY@8:Jf`8EDY@8;io\8EDY@8=3xX8EDY@8>S,T8EDY@8?r5P8EDY@8A<>L8EDY@8B[GH8EDY@8D%PD!8EDY@$$$$'8Fcb:8EDY@7Qx'rz7gkb/z7reTbz7x7xRz8(_GAz8,gb4z8/Pt,z82:0xz84xBpz87aThz89eb6z8;/k2z8 Date: Tue, 20 Jun 2023 17:53:42 +0800 Subject: [PATCH 20/38] allows both meshes and groups for assexport --- .../publish/collect_arnold_scene_source.py | 38 +++++++++++++++---- .../publish/extract_arnold_scene_source.py | 4 +- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index 34db3faa2f..1b8ec27509 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -23,22 +23,44 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): continue if objset.endswith("content_SET"): members = cmds.ls(members, long=True) + members_list = [] + for member in members: + shape = cmds.listRelatives( + member, shapes=True, fullPath=True) + if not shape: + continue + members_list = members + shape + group_name = "|{}".format(member) + if group_name in members_list: + members_list.remove(group_name) + children = get_all_children(members) + + if members_list: + children.extend(members_list) instance.data["contentMembers"] = children - # TODO: include another instance.data for content members - instance.data["contentMembersTransform"] = members self.log.debug("content members: {}".format(children)) - self.log.debug( - "content members transform : {}".format(members)) + elif objset.endswith("proxy_SET"): proxy_members = cmds.ls(members, long=True) + proxy_list = [] + for proxy in proxy_members: + shape = cmds.listRelatives( + proxy, shapes=True, fullPath=True) + if not shape: + continue + proxy_list = proxy_members + shape + group_name = "|{}".format(proxy) + if group_name in proxy_list: + proxy_list.remove(group_name) + set_members = get_all_children(proxy_members) + if proxy_list: + set_members.extend(proxy_list) + instance.data["proxy"] = set_members - instance.data["proxyTransform"] = proxy_members - # TODO: include another instance.data for proxy self.log.debug("proxy members: {}".format(set_members)) - self.log.debug( - "proxy members transform: {}".format(proxy_members)) + # Use camera in object set if present else default to render globals # camera. diff --git a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py index f49d8ece57..8696f5a94b 100644 --- a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py @@ -72,7 +72,7 @@ class ExtractArnoldSceneSource(publish.Extractor): # TODO: dont use instance.data["contentMembers"] # but use the new instance.data["contentMemberTransforms"] filenames, nodes_by_id = self._extract( - instance.data["contentMembersTransform"], attribute_data, kwargs + instance.data["contentMembers"], attribute_data, kwargs ) if "representations" not in instance.data: @@ -113,7 +113,7 @@ class ExtractArnoldSceneSource(publish.Extractor): # TODO: dont use instance.data["proxy"] # but use the new instance.data["proxyTransforms"] filenames, _ = self._extract( - instance.data["proxyTransform"], attribute_data, kwargs + instance.data["proxy"], attribute_data, kwargs ) representation = { From 9cc22939794fb1710c43ca7df28e16f81b07617d Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Tue, 20 Jun 2023 14:04:17 +0200 Subject: [PATCH 21/38] :recycle: make code compatible with 3dsmax 2022 python 3.7 in 3dsmax 2022 is not supporting walrus operator --- openpype/hosts/max/api/plugin.py | 4 +++- .../hosts/max/plugins/create/create_render.py | 3 ++- .../publish/validate_camera_contents.py | 3 ++- .../publish/validate_model_contents.py | 3 ++- .../plugins/publish/validate_pointcloud.py | 19 ++++++++++++------- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/openpype/hosts/max/api/plugin.py b/openpype/hosts/max/api/plugin.py index 4c1dbb2810..71a0b94e1f 100644 --- a/openpype/hosts/max/api/plugin.py +++ b/openpype/hosts/max/api/plugin.py @@ -207,7 +207,9 @@ class MaxCreator(Creator, MaxCreatorBase): """ for instance in instances: - if instance_node := rt.GetNodeByName(instance.data.get("instance_node")): # noqa + instance_node = rt.GetNodeByName( + instance.data.get("instance_node")) + if instance_node: count = rt.custAttributes.count(instance_node) rt.custAttributes.delete(instance_node, count) rt.Delete(instance_node) diff --git a/openpype/hosts/max/plugins/create/create_render.py b/openpype/hosts/max/plugins/create/create_render.py index 41e49f4620..235046684e 100644 --- a/openpype/hosts/max/plugins/create/create_render.py +++ b/openpype/hosts/max/plugins/create/create_render.py @@ -24,7 +24,8 @@ class CreateRender(plugin.MaxCreator): instance_data, pre_create_data) container_name = instance.data.get("instance_node") - if sel_obj := self.selected_nodes: + sel_obj = self.selected_nodes + if sel_obj: # set viewport camera for rendering(mandatory for deadline) RenderSettings(self.project_settings).set_render_camera(sel_obj) # set output paths for rendering(mandatory for deadline) diff --git a/openpype/hosts/max/plugins/publish/validate_camera_contents.py b/openpype/hosts/max/plugins/publish/validate_camera_contents.py index 85be5d59fa..ab13e5dc05 100644 --- a/openpype/hosts/max/plugins/publish/validate_camera_contents.py +++ b/openpype/hosts/max/plugins/publish/validate_camera_contents.py @@ -18,7 +18,8 @@ class ValidateCameraContent(pyblish.api.InstancePlugin): "$Physical_Camera", "$Target"] def process(self, instance): - if invalid := self.get_invalid(instance): # noqa + invalid = self.get_invalid(instance) + if invalid: raise PublishValidationError(("Camera instance must only include" "camera (and camera target). " f"Invalid content {invalid}")) diff --git a/openpype/hosts/max/plugins/publish/validate_model_contents.py b/openpype/hosts/max/plugins/publish/validate_model_contents.py index 1ec08d9c5f..cfe016f03f 100644 --- a/openpype/hosts/max/plugins/publish/validate_model_contents.py +++ b/openpype/hosts/max/plugins/publish/validate_model_contents.py @@ -18,7 +18,8 @@ class ValidateModelContent(pyblish.api.InstancePlugin): label = "Model Contents" def process(self, instance): - if invalid := self.get_invalid(instance): # noqa + invalid = self.get_invalid(instance) + if invalid: raise PublishValidationError(("Model instance must only include" "Geometry and Editable Mesh. " f"Invalid types on: {invalid}")) diff --git a/openpype/hosts/max/plugins/publish/validate_pointcloud.py b/openpype/hosts/max/plugins/publish/validate_pointcloud.py index e1c2151c9d..1ff6eb126f 100644 --- a/openpype/hosts/max/plugins/publish/validate_pointcloud.py +++ b/openpype/hosts/max/plugins/publish/validate_pointcloud.py @@ -35,12 +35,16 @@ class ValidatePointCloud(pyblish.api.InstancePlugin): """ report = [] - if invalid := self.get_tyflow_object(instance): # noqa - report.append(f"Non tyFlow object found: {invalid}") - if invalid := self.get_tyflow_operator(instance): # noqa - report.append( - f"tyFlow ExportParticle operator not found: {invalid}") + invalid_object = self.get_tyflow_object(instance) + if invalid_object: + report.append(f"Non tyFlow object found: {invalid_object}") + + invalid_operator = self.get_tyflow_operator(instance) + if invalid_operator: + report.append(( + "tyFlow ExportParticle operator not " + f"found: {invalid_operator}")) if self.validate_export_mode(instance): report.append("The export mode is not at PRT") @@ -49,9 +53,10 @@ class ValidatePointCloud(pyblish.api.InstancePlugin): report.append(("tyFlow Partition setting is " "not at the default value")) - if invalid := self.validate_custom_attribute(instance): # noqa + invalid_attribute = self.validate_custom_attribute(instance) + if invalid_attribute: report.append(("Custom Attribute not found " - f":{invalid}")) + f":{invalid_attribute}")) if report: raise PublishValidationError(f"{report}") From b94b7ff5de4af8b27a171bfae5c88c0ea46d4d70 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 20 Jun 2023 16:50:49 +0200 Subject: [PATCH 22/38] backward compatibility fix studio could have set host config paths but those were not resolving to custom config OCIO environment path. Instead it was always falling back to global ocio config paths settings --- openpype/pipeline/colorspace.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/pipeline/colorspace.py b/openpype/pipeline/colorspace.py index 1999ad3bed..13846e9f5c 100644 --- a/openpype/pipeline/colorspace.py +++ b/openpype/pipeline/colorspace.py @@ -377,6 +377,10 @@ def get_imageio_config( activate_host_color_management = imageio_host.get( "activate_host_color_management", True) + # TODO: remove this in future - backward compatibility + if activate_host_color_management is None: + activate_host_color_management = host_ocio_config.get("enabled", False) + if not activate_host_color_management: # if host settings are disabled return False because # it is expected that no colorspace management is needed From 6f8d47d36bfb948a09bd79891c739d7179579cc3 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 20 Jun 2023 16:52:03 +0200 Subject: [PATCH 23/38] nuke: user prompt if config path changes environment variable cannot be changed dynamically and user should now that settings had been changed and the nuke should be reopened. --- openpype/hosts/nuke/api/lib.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index c05182ce97..e3b34222d4 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -2069,6 +2069,35 @@ class WorkfileSettings(object): log.debug("nuke.root()['{}'] changed to: {}".format( knob, value_)) + # set ocio config path + if config_data: + current_ocio_path = os.getenv("OCIO") + if current_ocio_path != config_data["path"]: + message = """ +It seems like there's a mismatch between the OCIO config path set in your Nuke +settings and the actual path set in your OCIO environment. + +To resolve this, please follow these steps: +1. Close Nuke if it's currently open. +2. Reopen Nuke. + +Please note the paths for your reference: + +- The OCIO environment path currently set: + `{env_path}` + +- The path in your current Nuke settings: + `{settings_path}` + +Reopening Nuke should synchronize these paths and resolve any discrepancies. +""" + nuke.message( + message.format( + env_path=current_ocio_path, + settings_path=config_data["path"] + ) + ) + def set_writes_colorspace(self): ''' Adds correct colorspace to write node dict From c18afe974bee2e9e8a4bd59c97fda6098b8910e8 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 21 Jun 2023 16:27:17 +0800 Subject: [PATCH 24/38] remove unused text files --- igniter/.ass | 212 --------------------------------------------------- 1 file changed, 212 deletions(-) delete mode 100644 igniter/.ass diff --git a/igniter/.ass b/igniter/.ass deleted file mode 100644 index 599a76d732..0000000000 --- a/igniter/.ass +++ /dev/null @@ -1,212 +0,0 @@ -### exported: Thu Jun 15 17:07:53 2023 -### from: Arnold 7.1.3.2 [2a385cac] windows clang-10.0.1 oiio-2.4.1 osl-1.12.0 vdb-7.1.1 adlsdk-6.3.1.44 clmhub-2.0.0.235 rlm-14.1.3 optix-6.6.0 2022/09/12 08:50:17 -### host app: MtoA 5.2.1.1 6a048927 (fix-5.2.1) Maya 2023 -### bounds: -1.207354 -0.269835 -1.207354 1.207354 2.144874 1.207354 -### user: Kayla -### render_layer: defaultRenderLayer -### scene: D:/dummy_test/test_Project/test/work/test_v002/test_project_test_test_v002_v070.mb -### meters_per_unit: 0.010000 - - - -options -{ - AA_samples 3 - outputs 4 1 STRING - "RGBA RGBA defaultArnoldFilter/gaussian_filter defaultArnoldDriver/driver_exr.RGBA" - "P VECTOR aiAOVFilter1/closest_filter defaultArnoldDriver/driver_exr.RGBA" - "Pref RGB aiAOVFilter2/closest_filter defaultArnoldDriver/driver_exr.RGBA" - "albedo RGB defaultArnoldFilter/gaussian_filter defaultArnoldDriver/driver_exr.RGBA" - xres 1920 - yres 1080 - texture_per_file_stats on - texture_searchpath "[OPENPYPE_PROJECT_ROOT_WORK];D:/dummy_test/test_Project/test/work/test_v002/sourceimages" - texture_automip off - camera "/camera1/cameraShape1" - color_manager "defaultColorMgtGlobals" - operator "aiMerge1" - meters_per_unit 0.00999999978 - frame 1 - fps 25 - procedural_searchpath "[OPENPYPE_PROJECT_ROOT_WORK];D:/dummy_test/test_Project/test/work/test_v002/" - GI_diffuse_depth 1 - GI_specular_depth 1 - GI_transmission_depth 8 - declare render_layer constant STRING - render_layer "defaultRenderLayer" -} - -gaussian_filter -{ - name defaultArnoldFilter/gaussian_filter -} - -driver_exr -{ - name defaultArnoldDriver/driver_exr.RGBA - filename "D:/dummy_test/test_Project/test/work/test_v002/renders/test_project_test_test_v002_v070/masterLayer/masterLayer.exr" - color_space "" -} - -closest_filter -{ - name aiAOVFilter1/closest_filter -} - -closest_filter -{ - name aiAOVFilter2/closest_filter -} - -merge -{ - name aiMerge1 - inputs "test_01_:string_replace_operator" -} - -string_replace -{ - name test_01_:string_replace_operator - selection "*.(@node=='alembic')" - match "resources/test_project_test_modelMain_v067_proxy.abc" - replace "test_project_test_modelMain_v067.abc" -} - -color_manager_ocio -{ - name defaultColorMgtGlobals - config "D:/maya_config/OCIO-configs/Maya2022-default/config.ocio" - color_space_linear "ACEScg" -} - -polymesh -{ - name /proxy/pSphere/pSphereShape - visibility 255 - sidedness 255 - matrix - 2.41470838 0 0 0 - 0 2.41470838 0 0 - 0 0 2.41470838 0 - 0 0.937519372 0 1 - shader "lambert1" - id 2564139679 - nsides 6 1 UINT -4 4 4 4 4 4 - vidxs 24 1 b85UINT -B$ZuK*%:$$-?2$vMr4%:&UObB$w/J=(3BP? - vlist 8 1 b85VECTOR -aDq99aDq9989+]c89+]caDq9989+]caDq99!89+]c$$$$)aDq9989+]caDq9989+]c89+]c!aDq99$$$$(89+]caDq99aDq99 - nlist 24 1 b85VECTOR -zzyzzyzzyzzyzyzzyzzyzzy!$$$$$$$$$'aRT=dzzaRT=dzzaRT=dzzaRT=dzaRT=dzzaRT=dzzaRT=dzzaRT=dzyzzyzzyzzyzzaRT=dzzaRT=dzzaRT=dzzaRT=dzz - uvlist 14 1 b85VECTOR2 -82:0xz80l$K@wi$mMpJ$pnKs$PHvV$PKhS$rXa4$v$<]$USg@$UVY=$wcQs%&/-G$Z^X*$ZaJ'%'nB]%+9s1$_iHi$_l:f%-$3G%0Dcp$dt9S$dw+P%2/$1$h@,s$j**=$j,q:%79ip%:ZED$o4p'$o7b$%j%8uiM%8x[J%[0T+%^Q/T%>+Z7%>.L4%`;Dj%c[u>%C6Jv%C9%mqVg%ML,J%MNsG%o[l(%s'GQ%RVr4%RYd1%tf\g%x28;%5U-2%WdT\&$qMQ&(=)%%\lS]%\oEZ&*'>;&-Gnd%awDG%b%6D&/2/%&2R_N%g-51%g0'.&4RV8&As1a%vM\D%vPNA&C]Fw&$nOd&&XM.&&[?+&Hh7a&L3h5&+c=m&+f/j&Ms(K&Q>Xt&0n.W&0puT&S(n5&VII^&5xtA&6&f>&X3^t&[T:H&;.e+&;1W(&]>O^&`_+2&@9Uj&@x&jta[&JO7>&JR);&l^vq&p*RE&OZ((&O\o%&qig[&u5C/&Tdmg&Tg_d&vtXE'%@3n&Yo^Q&YrPN''*I/'*K$X&_%O;&_(A8',59n'/UjB&d0@%&d31w'1@*X'4`[,&G.Ox&i=wM'6JpB'9kKk&nEvN&nHhK';Ua,'>vb'VriE'Vu[B($*ai('N/L'\(Z/'\+L,()8Db(,Xu6'a3Jn'a6;X'fA-U(3N&6(6nV_'kI,B'kKs?(8Xku(<$GI'pSr,'pVd)(=c\_(A/83'u^bk'uaTh(BnMI(F:(r'X\ri(%lE>(H$>3(KDn\(*tD?(*w6<(M/.r(PO_F(0*5)(0-'&(R9t\(UZP0(55%h(57le(WDeF(Ze@o(:?kR(:B]O(\OV0(_p1Y(?J\<(?MN9(aZFo(e%wC(DUM&(DX>x(fe7Y(Gv@F(I`=e(Ic/b(kp(C(o;Xl(Nk.O(NmuL(q%n-(tFIV(Sut9(Sxf6(v0^l)$Q:@(Y+dx(Y.Vu)&;OV))\+*(^6Ub(^9G_)+F@@).fpi(cAFL(cD8I)0Q1*)3qaS(hL76(hO)3)5Y/Z)9'R=(mW'u(mYnr):fgS)>2C'(ram_(rd_\)?qX=)C=3f(wl^I(woPF)E'I')HH$P)'wO3)(%A0)J29f)MRj:)--?r)-01o)O=*P)R][$)280\)2:wY)TGp:)WhKc(j6@Z)7Eh/)YRa$)\sc`)Kn9C)Kq+@)n(xv)qITJ)Q$*-)Q&q*)s3i`)vTE4)V.ol)V1ai)x>ZJ)YOc7)[9`V)[Z)toi=)tr[:*B*Sp*EK/D*%%Z'*%(L$*G2RK*JUu.**0Jf**3-M*QK&.*TkVW*4F,:*4Hs7*VUkm*YvGA*9Pr$*9Scv*[`\W*_,8+*>[bc*>^T`*`kMA*d7(j*CfSM*CiEJ*ev>+*iAnT*&dcK*Ht5u*k,.j*nL_>*N'4v*N*&s*p6tT*sWP(*S2%`*S4l]*uAe>*xb@g*Xp+/b7Q+3-h%*g]=]*g`/Z+4m(;*k)1(*lh.G*ljuD+9wn%+=CIN*qrt1*quf.+?-^d+BN:8*w(dp*w+Vm+D8ON+GY*w+'3UZ+'6GW+IC@8+Lcpa+,>FD+,A8A+NN0w+QnaK+1I7.+1L)++SXva+W$R5+6T'm+6Vnj+X`u<+Yj%R+Yj1W+Yj=\+YjIa+YjUf+Yjak+Yjmp+Yk$u+Yk1%+Yk=*+YkI/+YkU4+Yka9+Ykm>+Yl$C+Yl0H+Yl$GoW-$IVb>$IVnF$K>Tg$R08V$SlCg$SlOo$UT6;$\Eo*$^-%;$^-1C$_ild$f[PS$$)E7$)3rI$j*)Y$ka82$/uZ&$0%nh$mMp;$plM,$:6;M$:;,-$rXa($uwb%$DKqs$DP>G$wcQj%&-vs$NaSD$NePa%'nBW%+96l$Xw4j$Y%c&%-$3D%0DKe$c7k;$c:u@%2/$1$j$j?$hC+1$hEr-%5R^`%:ZED$o4p'$o7b$%+Z7%>.L4%`;Dj%c[u>%C6Jv%C9%mqVg%ML,J%MNsG%o[l(%s'GQ%RVr4%RYd1%tf\g%x28;%7<8B%YK_m&&XL\&(=)$%\lS\%\oEZ&*'>;&-Gnd%awDG%b%6D&/2/%&2R_N%g-51%g0'.&4RV8&As1a%vM\D%vPNA&C]Fw&&Ufx&$qMw&$t?s&G,,Q&L3h5&+c=m&+f/j&Ms(K&Q>Xt&0n.W&0puT&S(n5&VII^&5xtA&6&f>&X3^t&[T:H&;.e+&;1W(&]>O^&`_+2&@9Uj&@vb'VriE'Vu[B($*mn(%fm9'\(N,'\+@(()8Db(,Xu6'a3Jn'a6;X'fA-U(3N&6(6nV_'kI,B'kKs?(8Xku(<$GI'pSr,'pVd)(=c\_(A/83'u^bk'uaTh(BnMI(F:(r'ZD)$('SPO(I`=>(KDn[(*tD>(*w6<(M/.r(PO_F(0*5)(0-'&(R9t\(UZP0(55%h(57le(WDeF(Ze@o(:?kR(:B]O(\OV0(_p1Y(?J\<(?MN9(aZFo(e%wC(DUM&(DX>x(fe7Y(I]WZ(H$>Y(H'0U(j3r3(o;Xl(Nk.O(NmuL(q%n-(tFIV(Sut9(Sxf6(v0^l)$Q:@(Y+dx(Y.Vu)&;OV))\+*(^6Ub(^9G_)+F@@).fpi(cAFL(cD8I)0Q1*)3qaS(hL76(hO)3)5Y;_)7@;*(mVpr(mYbn):fgS)>2C'(ram_(rd_\)?qX=)C=3f(wl^I(woPF)E'I')HH$P)'wO3)(%A0)J29f)MRj:)--?r)-01o)O=*P)R][$)280\)2:wY)TGp:)WhKc(krKj)9,s@)[9`/)\sc`)Kn9C)Kq+@)n(xv)qITJ)Q$*-)Q&q*)s3i`)vTE4)V.ol)V1ai)x>ZJ)[7%K)YRaJ)YUSF*&b@$*+j&])`DQ@)`GC=*-T;s*0tlG)eOB*)eR4'*2_,]*6*]1)jZ2i)j]$f*7irG*;5Mp)odxS)ogjP*Z)toi=)tr[:*B*Sp*EK/D*%%Z'*%(L$*G2^P*Hn]p**0>c**30_*L@5D*O`em*/;;P*/>-M*QK&.*TkVW*4F,:*4Hs7*VUkm*YvGA*9Pr$*9Scv*[`\W*_,8+*>[bc*>^T`*`kMA*d7(j*CfSM*CiEJ*ev>+*iAnT*(Kn[*J[A1*lh-u*nL_=*N'4u*N*&s*p6tT*sWP(*S2%`*S4l]*uAe>*xb@g*Xp+/b7Q+3-h%*g]=]*g`/Z+4m(;*leH<*k,/;*k.v7+8;bj+=CIN*qrt1*quf.+?-^d+BN:8*w(dp*w+Vm+D8ON+GY*w+'3UZ+'6GW+IC@8+Lcpa+,>FD+,A8A+NN0w+QnaK+1I7.+1L)++SXva+W$R5+6T'm+6Vnj+Xa,A+Yj%R+Yj1Y+YjUg+Yjmq+Yk1&+YkI0+Yka:+Yl$D+YlHN$N^ls$,R7G$,U5H$PI98$Si]]$1](1$1`&2$UT)w$XtNG$6gmp$6jkq$Z^oa$^*?1$;r^Z$;u\[$_i`K$c5/p$A(OD$A+ME$dtQ5$h?uZ$F3@.$GrI?$kfY4$o2(Y$M%H-$M(F.$pqIs$t'W%&2+G%)ROl$\Eo@$\HmA%++Z8%>.X9%aw\)%eC+N%C6Jw%C9Hx%g-Lh%jMq8%HA;a%HD9b%l8=R%oXaw%ML,K%MO*L%qC.<%tcRa%RVr5%RYp6%vMt&&$nCK%Wabt%Wd`u&&Xde&*$45%\lS^%^V\o&-Jld&0k<4%c^[]%caY^&2U]N&5v,s%hiLG%hlJH&7`N8&;+r]%mt=1%mw;2&w&@6cG%s*-p%s-+q&Av/a&EAT1%x4sZ%x7q[&G+uK&JLDp&(?dD&(BbE&L6f5&OW5Z&/1lB&/4jD&S(n4&VI=Y&4<]-&4?[.&X3^s&[T.C&9GMl&9JKm&]>O]&`^t-&>R>V&>U''3'Al'6Gf<&i;0e&i>.f'822V';RW&&nEvO&nHtP'=xwt'?&uu'bp$e'f;I5'Ek*r'En(t'ib,d'm-Q4'Jup]'Jxn^'nlrN'r8As'P+aG'P._H'swc8'wC2]'U6R1'U9P2($-Sw('MxG'ZABp'ZD@q()8Da(,Xi1'_L3Z'_O1[(.C5K(1cYp'dW$D'dYwE(3N&5(8Uao'kI,C'kL*D(:@.4(=`RY'pSr-'pVp.(?Jss(BkCC'u^bl'ua`m(DUd](Gv4-(%iSV(%lQW(I`UG(M,$l(*tD@(*wBA(NkF1(R6jV(0*5*(0-3+(Sv6p(WA[@(55%i(6t/%(Zh>o(^3c?(<'-h(<*+i(_s/Y(c>T)(A1sR(A4qS(e(uC(hIDh(FVl(r_&<(PREe(PUCf(tIGV(wil&(U]6O(U`4P)$T8@)'t\e(\O>M(\R26w(q%VK(q(TL)?qX<)C='a(v0G5(v3E6)E'I&)HGmK)&;7t)&>5u)J29e)O9uJ)--?s)-0=t)Q$Ad)TDf4)280])2;.^)V/2N)YOVs)7BvG)7EtH)[9x8)^ZG])Xp@)s3R()s6P**B*So*EJx?)x>Bh)xA@i*G5DY*JUi)*(I3R*(L1S*L@5C*O`Yh*-T$<*-Vw=*QK&-*TkJR*2^j&*2ah'*VUkl*Yv;<*7iZe*7lXf*[`\V*_,,&*[8*S2%a*S4xb*w)'R+%IKw*X^&+/_-K*bRLt*d1+.%]Z+.([[+Qq_K+U=.p+4leX+4ocZ+XcgJ+\/6o+9wVC+:%TD+]nX4+a:'Y+?-G-+?0E.+c$Hs+fDmC+D87l+D;5m+h/9]+kO^-+IC(V+IF&W+m:*G+pZNl+NMn@+NPlA+rDp1+ue?V+SX_*+S[]++wO`p,%:P.,&vgC,(^)X,*E@m,,,X-,-hoB,/P1W,17Hl,2s`,,4ZwA,6B9V,8)Pk,9eh+,;M*@,=4AU,>pXj,@Wp*,B?2?,D&IT,Eb`i,H'r1,Id4F,KKK[,M2bp,No%0,PVaQ7[Aa/f5)7xuYSaQ7[Aa794h7l?EtaQ7[Aa9['fzaQ7[Aa:L<8`x/vJaQ7[Aa9['ea/f5'aQ7[Aa794fa794faQ7[Aa/f5&a9['caQ7[A`x/vGa:L<5aQ7[Aza9['caQ7[A7l?Eqa794eaQ7[A7xuYOa/f5%aQ7[A8+HY:`x/vGaQ7[A8-jL7]8wuQaQ7[A8.[`^7l?EmaQ7[A8-jL67xuYLaQ7[A8+HY98+HY8aQ7[A7xuYM8-jL6aQ7[A7l?En8.[`]aQ7[Az85BheaOV5ba+:2Y81k?taOV5ba82J)8,AnSaOV5ba=[pI7tIW-aOV5baA3D9zaOV5baBETaa+:2XaOV5baA3D8a82J'aOV5ba=[pFa=[pEaOV5ba82J&aA3D6aOV5ba+:2UaBET^aOV5bzaA3D6aOV5b7tIW*a=[pDaOV5b8,AnOa82J%aOV5b81k?na+:2UaOV5b85Bh^]@q8xaOV5b86U$17tIW(aOV5b85Bh]8,AnMaOV5b81k?m81k?laOV5b8,AnN85Bh\aOV5b7tIW)86U$/aOV5bz8:_aQaMAiaa/f5)87d&JaMAiaa,;a/f5(aMAiaaFP=%a,8aMAiazaFPcW<8'x-gaJT2f8=h8A84LjgaJT2f8;)%18;)%1aJT2f84Lji8=h8@aJT2f8'x-i8>cW;aJT2fz8@J=naG>,6a794h8=>KTaG>,6aCTVt87d&IaG>,6aI/')8+HY,6aL:nBzaG>,6aMAiga794gaG>,6aL:nAaCTVqaG>,6aI/''aI/'&aG>,6aCTVoaL:n?aG>,6a794eaMAidaG>,6zaL:n?aG>,68+HY:aI/'%aG>,687d&CaCTVnaG>,68=>KNa794eaG>,68@J=g]KmN*aG>,68AQ988+HY7aG>,68@J=g87d&@aG>,68=>KM8=>KMaG>,687d&A8@J=faG>,68+HY88AQ96aG>,6z8BUCkaBETZa8YmK8?.MqaBETZaES@889bdbaBETZaJt)F8,iza-&.3aR7`ga::XDa-&.3aPqK=aG-,<8;MPfzaMAii8.[`bzaQ7[IzzaRT=ha:L<8zaQ7[HaG>,:zaMAifaMAiezaG>,9aQ7[Eza:L<5aRT=fzzaQ7[Ez8.[`_aMAidz8;MPbaG>,8z8AQ98a:L<5z8EG*m]Q*w-z8Fcb:8.[`\z8EG*l8;MP`z8AQ978AQ96z8;MPa8EG*kz8.[`]yzz8E+oj7v5R]a::XE8A:.B7v5R]aG-z7v5R]aR7`ga::XD7v5R]aPqK=aG-KT8;MP`aCTVt87d&I8;MP`aI/')8+HY<8;MP`aL:nBz8;MP`aMAiga794g8;MP`aL:nAaCTVq8;MP`aI/''aI/'&8;MP`aCTVoaL:n?8;MP`a794eaMAid8;MP`zaL:n?8;MP`8+HY:aI/'%8;MP`87d&CaCTVn8;MP`8=>KNa794e8;MP`8@J=g]KmN*8;MP`8AQ988+HY78;MP`8@J=g87d&@8;MP`8=>KM8=>KM8;MP`87d&A8@J=f8;MP`8+HY88AQ968;MP`z8=h8G8>cW;a3h^G8;)%78>cW;a@=FF84Ljp8>cW;aFnUa8'x-p8>cW;aIXhqz8>cW;aJT2la3h^F8>cW;aIXhpa@=FC8>cW;aFnU_aFnU^8>cW;a@=FBaIXhn8>cW;a3h^AaJT2i8>cW;zaIXhn8>cW;8'x-kaFnU^8>cW;84Ljja@=F@8>cW;8;)%2a3h^A8>cW;8=h8A]I*l/8>cW;8>cW<8'x-g8>cW;8=h8A84Ljg8>cW;8;)%18;)%18>cW;84Lji8=h8@8>cW;8'x-i8>cW;8>cW;z8:_aQ8AQ96a/f5)87d&J8AQ96a,;a/f5(8AQ96aFP=%a,88AQ96zaFP8EG*ka/f5)7xuYS8EG*ka794h7l?Et8EG*ka9['fz8EG*ka:L<8`x/vJ8EG*ka9['ea/f5'8EG*ka794fa794f8EG*ka/f5&a9['c8EG*k`x/vGa:L<58EG*kza9['c8EG*k7l?Eqa794e8EG*k7xuYOa/f5%8EG*k8+HY:`x/vG8EG*k8-jL7]8wuQ8EG*k8.[`^7l?Em8EG*k8-jL67xuYL8EG*k8+HY98+HY88EG*k7xuYM8-jL68EG*k7l?En8.[`]8EG*kz7uCHt8FG04`jc&P7rt'w8FG04`wC3.7kRWX8FG04a)dXM7^rJx8FG04a,4$Iz8FG04a-&.?`jc&N8FG04a,4$H`wC3,8FG04a)dXKa)dXJ8FG04`wC3*a,4$F8FG04`jc&Ka-&.=8FG04za,4$F8FG047^rJua)dXJ8FG047kRWS`wC3)8FG047rt's`jc&K8FG047uCHo]+QgX8FG047v5Re7^rJq8FG047uCHn7kRWQ8FG047rt'r7rt'r8FG047kRWR7uCHn8FG047^rJr7v5Rd8FG04zzaRT=dzzyz - nlist 382 1 b85VECTOR -8$sL?aR%6>`p]C(7vj/8aR%6>a($j&8,Oq4aQ$=Ea1Ba1j/2]ZEXpaQ$=Ea;iAh`p]BBaR%6?a0d'ta$guxaQ$=Da:rPna($inaR%6>a-Z`,a1B7dlgqa:rPoaQ$=C7mwEMa-Z_iaR%6?7q49%a8@LcaQ$=C8%Qa:a($iiaR%6@7vj/6a1B7dlgx8/,uEaQ$=A7mwE_8&$SXaR%6@5(Kln8/xfEaQ$=D4n,BY82U=faOAqMa8`53867kIaOAqLa+j;W8,oYWaOAqMa>En;7u$`;aOAqNaB(Fp]^u6:aOAqMaC>G8a+j;saOAqNaB(Fta8`55aOAqLa>En?a>En@aOAqMa8`51aB(FxaOAqMa+j;haC>G@aOAqK4Y^O1aB(G%aOAqK7u$`Fa>EnAaOAqK8,oY]a8`50aOAqL82U=ma+j;kaOAqJ867kP4J,])aOAqJ87Mkl7u$`FaOAqK867kM8,oY\aOAqK82U=k82U=jaOAqJ8,oYb867kOaOAqL7u$`@87MkgaOAqM4i*v)88;[taM-K^a%E_aJ@lva4+;Q84c;FaJ@luaG)&O8(:`VaJ@lsaIjv2]_U%E^]2IK3aJ@lr8>v_'8(:`caJ@lt8>%E]84c;QaJ@lq8;8K%8;8K$aJ@lq84c;K8>%E\aJ@lq8(:`W8>v_'aJ@lq5/=Vk8=HJ&aG,t^aCc,n8@V'DaG,t\a7@i]87rQ>aG,t]aI9%T8+P9HaG,t[aLFWk]hcZA7aG,tY8A]V-8+P9PaG,tY8@V'>87rQFaG,tY8=HJ'8=HJ)aG,tY87rQC8@V'@aG,tY8+P9K8A]V.aG,tY50&a>8?43^aB)a>aEWKc8B\)XaB)a?a8^5`89fp4aB)a@aK$d78,mZJaB)aDaNLZ)]Yd;iaB)aDaO]8ja8^6,aB)aDaNLZ'aEWKeaB)aCaK$d1aK$d5aB)aAaEWK_aNLZ(aB)aBa8^6$aO]8jaB)aG]SCosaNLZ'aB)aF8,mZOaK$d3aB)aD89fp8aEWKaaB)a@8?43_a8^6&aB)a>8B\)S4]4BYaB)a;8Cl]?8,mZTaB)a<8B\)S89fp6aB)a;8?43^8?43`aB)a<89fp78B\)TaB)a>8,mZP8Cl]AaB)a<52v)T8@LmMa:8ZwaFR128D3$9a:8Zwa9\x^8:aUXa:8[$aL=I&8-lHLa:8[&aOxT_]2EE>a:8[$aQ:iJa9]$-a:8ZxaOxT^aFR14a:8[%aL=HvaL=I&a:8[$aFR1/aOxT_a:8Zwa9]$&aQ:iJa:8[']Db/faOxT]a:8[&8-lHRaL=I$a:8Zp8:aU\aFR10a:8Zq8@LmPa9]$$a:8Zu8D3$44e9woa:8Zv8EJ8t8-lHUa:8Zx8D3$38:aU[a:8Zw8@LmN8@LmOa:8Zv8:aU[8D3$4a:8Zt8-lHP8EJ8wa:8Zq53XsU8A:e0a,fiLaG-dd8E,[,68EG*p\jrsaa:L;i8;MP]]I`mKaMAib8.[`S]I`mMaQ7[BzzaRT=da:L<;]I`mPaQ7[@aG>,:]H,4aQ7[A3_-C8a:L<2aRT=c\jrsa3leGaaQ7[?\xUx78.[`_aMAi_z8;MPbaG>,5]FmUA8AQ98a:L<.]LT0e8EG*kzz8Fcb88.[`^\jrsc8EG*k8;MPa\xUx<8AQ978AQ96\jrsc8;MP`8EG*kz8.[`_y3_-C453fkZ8A:e07uv8uaG-dd8E,[<7uv9&a:;,o8;=457uv9(aM+@]8.JQ\7uv9(aPr6cz7uv9$aR8OQa:;-?7uv9%aPr6`aG-dg7uv8waM+@WaM+@\7uv8taG-d`aPr6d7uv8ma:;-6aR8OR7uv8b4%`)+aPr6b7uv8a8.JQcaM+@Z7uv8j8;=49aG-db7uv8t8A:e0a:;-47uv8x8E,[74W=-`7uv9$8FGt&8.JQe7uv9$8E,[68;=487uv8v8A:e/8A:e07uv8w8;=488E,[97uv8t8.JQc8FGt&7uv8x53Dx68@LmM8.H*NaFR138D3$98.H*Na9\x^8:aUX8.H*OaL=I'8-lHL8.H*PaOxT_]2EE>8.H*OaQ:iJa9]$,8.H*NaOxT\aFR138.H*MaL=HvaL=I'8.H*MaFR1/aOxT_8.H*La9]$&aQ:iJ8.H*N]:)QhaOxT_8.H*L8-lHRaL=I$8.H*G8:aU\aFR108.H*F8@LmQa9]$$8.H*J8D3$44eYgJ8.H*K8EJ8t8-lHS8.H*M8D3$28:aU[8.H*M8@LmO8@LmO8.H*K8:aU[8D3$48.H*H8-lHP8EJ8w8.H*I52v;@8?43]8690laEWKc8B\)Y8690ka8^5`89fp48690laK$d68,mZL8690naNLZ*]Yd;i8690naO]8ja8^6+8690oaNLZ'aEWKe8690kaK$d1aK$d68690kaEWK_aNLZ*8690ma8^6&aO]8j8690m]OP%E^8>PPPPPPPPPPPPP%E^]2IK38>Pv_'8(:`c8>P%E]84c;N8>PP%E\8>Pv_(8>PEnF7u$`98CQ@vaB(Fs]`=mC8CQ@xaC>G6a+j;s8CQ@xaB(Foa8`548CQ@wa>En:a>En@8CQ@va8`5-aB(G$8CQ@wa+j;naC>G@8CQ@u4Y^O1aB(Fx8CQ@u7u$`Ua>En@8CQ@v8,oY]a8`518CQ@w82U=ia+j;l8CQ@t867kQ4I`qe8CQ@t87Mkp7u$`H8CQ@u867kP8,oY]8CQ@v82U=k82U=l8CQ@u8,oY`867kL8CQ@t7u$`F87Mkg8CQ@w4piDe8,Oq38E3ama1B=/8/,uC8E3ana$guO8%QaB8E3ala8@Lj7mwE<8E3aoa:rPi]ZEXp8E3aoa;iAaa$guw8E3aoa:rPfa1B0s7_[,H7uNfZ7_[,H8%v5I7_[,H8+HY87_[,H8.1k07_[,H80p((7_[,H83Y9u7_[,H86BKm7_[,H89+]d7_[,H8:Jf`7_[,H8;io\7_[,H8=3xX7_[,H8>S,T7_[,H8?r5P7_[,H8A<>L7_[,H8B[GH7_[,H8D%PD7_[,H8EDY@7_[,H8Fcb:7_[,Hz7m>0s7_[,H!7m>0s$$$$'7uNfZ7m>0s8%v5I7m>0s8+HY87m>0s8.1k07m>0s80p((7m>0s83Y9u7m>0s86BKm7m>0s89+]d7m>0s8:Jf`7m>0s8;io\7m>0s8=3xX7m>0s8>S,T7m>0s8?r5P7m>0s8A<>L7m>0s8B[GH7m>0s8D%PD7m>0s8EDY@7m>0s8Fcb:7m>0sz7uNfZ7_[,H7uNfZ7m>0s!7uNfZ$$$$'8%v5I7uNfZ8+HY87uNfZ8.1k07uNfZ80p((7uNfZ83Y9u7uNfZ86BKm7uNfZ89+]d7uNfZ8:Jf`7uNfZ8;io\7uNfZ8=3xX7uNfZ8>S,T7uNfZ8?r5P7uNfZ8A<>L7uNfZ8B[GH7uNfZ8D%PD7uNfZ8EDY@7uNfZ8Fcb:7uNfZz8%v5I7_[,H8%v5I7m>0s8%v5I7uNfZ!8%v5I$$$$'8+HY88%v5I8.1k08%v5I80p((8%v5I83Y9u8%v5I86BKm8%v5I89+]d8%v5I8:Jf`8%v5I8;io\8%v5I8=3xX8%v5I8>S,T8%v5I8?r5P8%v5I8A<>L8%v5I8B[GH8%v5I8D%PD8%v5I8EDY@8%v5I8Fcb:8%v5Iz8+HY87_[,H8+HY87m>0s8+HY87uNfZ8+HY88%v5I!8+HY8$$$$'8.1k08+HY880p((8+HY883Y9u8+HY886BKm8+HY889+]d8+HY88:Jf`8+HY88;io\8+HY88=3xX8+HY88>S,T8+HY88?r5P8+HY88A<>L8+HY88B[GH8+HY88D%PD8+HY88EDY@8+HY88Fcb:8+HY8z8.1k07_[,H8.1k07m>0s8.1k07uNfZ8.1k08%v5I8.1k08+HY8!8.1k0$$$$'80p((8.1k083Y9u8.1k086BKm8.1k089+]d8.1k08:Jf`8.1k08;io\8.1k08=3xX8.1k08>S,T8.1k08?r5P8.1k08A<>L8.1k08B[GH8.1k08D%PD8.1k08EDY@8.1k08Fcb:8.1k0z80p((7_[,H80p((7m>0s80p((7uNfZ80p((8%v5I80p((8+HY880p((8.1k0!80p(($$$$'83Y9u80p((86BKm80p((89+]d80p((8:Jf`80p((8;io\80p((8=3xX80p((8>S,T80p((8?r5P80p((8A<>L80p((8B[GH80p((8D%PD80p((8EDY@80p((8Fcb:80p((z83Y9u7_[,H83Y9u7m>0s83Y9u7uNfZ83Y9u8%v5I83Y9u8+HY883Y9u8.1k083Y9u80p((83Y9u83Y9u83Y9u86BKm83Y9u89+]d83Y9u8:Jf`83Y9u8;io\83Y9u8=3xX83Y9u8>S,T83Y9u8?r5P83Y9u8A<>L83Y9u8B[GH83Y9u8D%PD83Y9u8EDY@83Y9u8Fcb:83Y9uz86BKm7_[,H86BKm7m>0s86BKm7uNfZ86BKm8%v5I86BKm8+HY886BKm8.1k086BKm80p((86BKm83Y9u!86BKm$$$$'89+]d86BKm8:Jf`86BKm8;io\86BKm8=3xX86BKm8>S,T86BKm8?r5P86BKm8A<>L86BKm8B[GH86BKm8D%PD86BKm8EDY@86BKm8Fcb:86BKmz89+]d7_[,H89+]d7m>0s89+]d7uNfZ89+]d8%v5I89+]d8+HY889+]d8.1k089+]d80p((89+]d83Y9u89+]d86BKm!89+]d$$$$'8:Jf`89+]d8;io\89+]d8=3xX89+]d8>S,T89+]d8?r5P89+]d8A<>L89+]d8B[GH89+]d8D%PD89+]d8EDY@89+]d8Fcb:89+]dz8:Jf`7_[,H8:Jf`7m>0s8:Jf`7uNfZ8:Jf`8%v5I8:Jf`8+HY88:Jf`8.1k08:Jf`80p((8:Jf`83Y9u8:Jf`86BKm8:Jf`89+]d!8:Jf`$$$$'8;io\8:Jf`8=3xX8:Jf`8>S,T8:Jf`8?r5P8:Jf`8A<>L8:Jf`8B[GH8:Jf`8D%PD8:Jf`8EDY@8:Jf`8Fcb:8:Jf`z8;io\7_[,H8;io\7m>0s8;io\7uNfZ8;io\8%v5I8;io\8+HY88;io\8.1k08;io\80p((8;io\83Y9u8;io\86BKm8;io\89+]d8;io\8:Jf`!8;io\$$$$'8=3xX8;io\8>S,T8;io\8?r5P8;io\8A<>L8;io\8B[GH8;io\8D%PD8;io\8EDY@8;io\8Fcb:8;io\z8=3xX7_[,H8=3xX7m>0s8=3xX7uNfZ8=3xX8%v5I8=3xX8+HY88=3xX8.1k08=3xX80p((8=3xX83Y9u8=3xX86BKm8=3xX89+]d8=3xX8:Jf`8=3xX8;io\!8=3xX$$$$'8>S,T8=3xX8?r5P8=3xX8A<>L8=3xX8B[GH8=3xX8D%PD8=3xX8EDY@8=3xX8Fcb:8=3xXz8>S,T7_[,H8>S,T7m>0s8>S,T7uNfZ8>S,T8%v5I8>S,T8+HY88>S,T8.1k08>S,T80p((8>S,T83Y9u8>S,T86BKm8>S,T89+]d8>S,T8:Jf`8>S,T8;io\8>S,T8=3xX!8>S,T$$$$'8?r5P8>S,T8A<>L8>S,T8B[GH8>S,T8D%PD8>S,T8EDY@8>S,T8Fcb:8>S,Tz8?r5P7_[,H8?r5P7m>0s8?r5P7uNfZ8?r5P8%v5I8?r5P8+HY88?r5P8.1k08?r5P80p((8?r5P83Y9u8?r5P86BKm8?r5P89+]d8?r5P8:Jf`8?r5P8;io\8?r5P8=3xX8?r5P8>S,T!8?r5P$$$$'8A<>L8?r5P8B[GH8?r5P8D%PD8?r5P8EDY@8?r5P8Fcb:8?r5Pz8A<>L7_[,H8A<>L7m>0s8A<>L7uNfZ8A<>L8%v5I8A<>L8+HY88A<>L8.1k08A<>L80p((8A<>L83Y9u8A<>L86BKm8A<>L89+]d8A<>L8:Jf`8A<>L8;io\8A<>L8=3xX8A<>L8>S,T8A<>L8?r5P!8A<>L$$$$'8B[GH8A<>L8D%PD8A<>L8EDY@8A<>L8Fcb:8A<>Lz8B[GH7_[,H8B[GH7m>0s8B[GH7uNfZ8B[GH8%v5I8B[GH8+HY88B[GH8.1k08B[GH80p((8B[GH83Y9u8B[GH86BKm8B[GH89+]d8B[GH8:Jf`8B[GH8;io\8B[GH8=3xX8B[GH8>S,T8B[GH8?r5P8B[GH8A<>L!8B[GH$$$$'8D%PD8B[GH8EDY@8B[GH8Fcb:8B[GHz8D%PD7_[,H8D%PD7m>0s8D%PD7uNfZ8D%PD8%v5I8D%PD8+HY88D%PD8.1k08D%PD80p((8D%PD83Y9u8D%PD86BKm8D%PD89+]d8D%PD8:Jf`8D%PD8;io\8D%PD8=3xX8D%PD8>S,T8D%PD8?r5P8D%PD8A<>L8D%PD8B[GH!8D%PD$$$$'8EDY@8D%PD8Fcb:8D%PDz8EDY@7_[,H8EDY@7m>0s8EDY@7uNfZ8EDY@8%v5I8EDY@8+HY88EDY@8.1k08EDY@80p((8EDY@83Y9u8EDY@86BKm8EDY@89+]d8EDY@8:Jf`8EDY@8;io\8EDY@8=3xX8EDY@8>S,T8EDY@8?r5P8EDY@8A<>L8EDY@8B[GH8EDY@8D%PD!8EDY@$$$$'8Fcb:8EDY@7Qx'rz7gkb/z7reTbz7x7xRz8(_GAz8,gb4z8/Pt,z82:0xz84xBpz87aThz89eb6z8;/k2z8 Date: Wed, 21 Jun 2023 16:42:52 +0800 Subject: [PATCH 25/38] toke's comment --- .../publish/collect_arnold_scene_source.py | 49 +++++-------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index 1b8ec27509..d93811c23e 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -18,49 +18,24 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): for objset in objsets: objset = str(objset) members = cmds.sets(objset, query=True) + members = cmds.ls(members, long=True) if members is None: self.log.warning("Skipped empty instance: \"%s\" " % objset) continue if objset.endswith("content_SET"): - members = cmds.ls(members, long=True) - members_list = [] - for member in members: - shape = cmds.listRelatives( - member, shapes=True, fullPath=True) - if not shape: - continue - members_list = members + shape - group_name = "|{}".format(member) - if group_name in members_list: - members_list.remove(group_name) - children = get_all_children(members) - - if members_list: - children.extend(members_list) - instance.data["contentMembers"] = children - self.log.debug("content members: {}".format(children)) - + instance.data["contentMembers"] = children + members + self.log.debug( + "content members: {}".format( + instance.data["contentMembers"] + ) + ) elif objset.endswith("proxy_SET"): - proxy_members = cmds.ls(members, long=True) - proxy_list = [] - for proxy in proxy_members: - shape = cmds.listRelatives( - proxy, shapes=True, fullPath=True) - if not shape: - continue - proxy_list = proxy_members + shape - group_name = "|{}".format(proxy) - if group_name in proxy_list: - proxy_list.remove(group_name) - - set_members = get_all_children(proxy_members) - if proxy_list: - set_members.extend(proxy_list) - - instance.data["proxy"] = set_members - self.log.debug("proxy members: {}".format(set_members)) - + children = get_all_children(cmds.ls(members, long=True)) + instance.data["proxy"] = children + members + self.log.debug( + "proxy members: {}".format(instance.data["proxy"]) + ) # Use camera in object set if present else default to render globals # camera. From 1c2955a90aa027b0611197ddaa741dcceb2eaca7 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 21 Jun 2023 16:50:08 +0800 Subject: [PATCH 26/38] remove docstring --- .../maya/plugins/publish/extract_arnold_scene_source.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py index 8696f5a94b..102f0e46a2 100644 --- a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py @@ -69,8 +69,7 @@ class ExtractArnoldSceneSource(publish.Extractor): "camera": instance.data["camera"], "mask": mask } - # TODO: dont use instance.data["contentMembers"] - # but use the new instance.data["contentMemberTransforms"] + filenames, nodes_by_id = self._extract( instance.data["contentMembers"], attribute_data, kwargs ) @@ -110,8 +109,7 @@ class ExtractArnoldSceneSource(publish.Extractor): return kwargs["filename"] = file_path.replace(".ass", "_proxy.ass") - # TODO: dont use instance.data["proxy"] - # but use the new instance.data["proxyTransforms"] + filenames, _ = self._extract( instance.data["proxy"], attribute_data, kwargs ) From 29c8cfe99236faf3a0723e7b064c34226d19c925 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 21 Jun 2023 18:48:25 +0800 Subject: [PATCH 27/38] roy's comment --- .../publish/collect_arnold_scene_source.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index d93811c23e..69a07b4aaf 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -23,19 +23,9 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): self.log.warning("Skipped empty instance: \"%s\" " % objset) continue if objset.endswith("content_SET"): - children = get_all_children(members) - instance.data["contentMembers"] = children + members - self.log.debug( - "content members: {}".format( - instance.data["contentMembers"] - ) - ) - elif objset.endswith("proxy_SET"): - children = get_all_children(cmds.ls(members, long=True)) - instance.data["proxy"] = children + members - self.log.debug( - "proxy members: {}".format(instance.data["proxy"]) - ) + instance.data["contentMembers"] = self.get_hierarchy(members) + if objset.endswith("content_SET"): + instance.data["proxy"] = self.get_hierarchy(members) # Use camera in object set if present else default to render globals # camera. @@ -54,3 +44,13 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): self.log.debug("No renderable cameras found.") self.log.debug("data: {}".format(instance.data)) + + def get_hierarchy(self, nodes): + """Return nodes with all their children""" + nodes = cmds.ls(nodes, long=True) + if not nodes: + return [] + children = get_all_children(nodes) + # Make sure nodes merged with children only + # contains unique entries + return list(set(nodes + children)) From 223a3338f3b5a02daf3b7172ab3161a3b95414c4 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Wed, 21 Jun 2023 19:25:47 +0800 Subject: [PATCH 28/38] Update openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py Co-authored-by: Toke Jepsen --- .../hosts/maya/plugins/publish/collect_arnold_scene_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index 69a07b4aaf..90079c715a 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -24,7 +24,7 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): continue if objset.endswith("content_SET"): instance.data["contentMembers"] = self.get_hierarchy(members) - if objset.endswith("content_SET"): + if objset.endswith("proxy_SET"): instance.data["proxy"] = self.get_hierarchy(members) # Use camera in object set if present else default to render globals From 2d1fc8e72857a63510fb9e6e27fe2ddea85527e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Je=C5=BEek?= Date: Wed, 21 Jun 2023 14:09:29 +0200 Subject: [PATCH 29/38] Update openpype/pipeline/colorspace.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- openpype/pipeline/colorspace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/pipeline/colorspace.py b/openpype/pipeline/colorspace.py index 13846e9f5c..269825f85f 100644 --- a/openpype/pipeline/colorspace.py +++ b/openpype/pipeline/colorspace.py @@ -375,7 +375,7 @@ def get_imageio_config( # This is for backward compatibility. # TODO: in future rewrite this to be more explicit activate_host_color_management = imageio_host.get( - "activate_host_color_management", True) + "activate_host_color_management") # TODO: remove this in future - backward compatibility if activate_host_color_management is None: From 43ece88f02bf1b35b22d35d3ceeef82241fe2ef3 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 22 Jun 2023 09:40:19 +0100 Subject: [PATCH 30/38] Include workfile family to import. --- openpype/hosts/maya/plugins/load/actions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/actions.py b/openpype/hosts/maya/plugins/load/actions.py index ba69debc40..4855f3eed0 100644 --- a/openpype/hosts/maya/plugins/load/actions.py +++ b/openpype/hosts/maya/plugins/load/actions.py @@ -105,7 +105,8 @@ class ImportMayaLoader(load.LoaderPlugin): "camera", "rig", "camerarig", - "staticMesh" + "staticMesh", + "workfile" ] label = "Import" From 39d2159ed462e3e84236ba4497277d2a7f65016a Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Thu, 22 Jun 2023 10:57:23 +0100 Subject: [PATCH 31/38] Blender: Add support for custom path for app templates (#5137) * Add support for custom path for app templates * Use same env variable as scripts and assure correct path exist --- openpype/hosts/blender/api/lib.py | 21 +++++++++++++++++++++ openpype/hosts/blender/api/pipeline.py | 1 + 2 files changed, 22 insertions(+) diff --git a/openpype/hosts/blender/api/lib.py b/openpype/hosts/blender/api/lib.py index 6526f1fb87..9bb560c364 100644 --- a/openpype/hosts/blender/api/lib.py +++ b/openpype/hosts/blender/api/lib.py @@ -134,6 +134,27 @@ def append_user_scripts(): traceback.print_exc() +def set_app_templates_path(): + # Blender requires the app templates to be in `BLENDER_USER_SCRIPTS`. + # After running Blender, we set that variable to our custom path, so + # that the user can use their custom app templates. + + # We look among the scripts paths for one of the paths that contains + # the app templates. The path must contain the subfolder + # `startup/bl_app_templates_user`. + paths = os.environ.get("OPENPYPE_BLENDER_USER_SCRIPTS").split(os.pathsep) + + app_templates_path = None + for path in paths: + if os.path.isdir( + os.path.join(path, "startup", "bl_app_templates_user")): + app_templates_path = path + break + + if app_templates_path and os.path.isdir(app_templates_path): + os.environ["BLENDER_USER_SCRIPTS"] = app_templates_path + + def imprint(node: bpy.types.bpy_struct_meta_idprop, data: Dict): r"""Write `data` to `node` as userDefined attributes diff --git a/openpype/hosts/blender/api/pipeline.py b/openpype/hosts/blender/api/pipeline.py index 9cc557c01a..0f756d8cb6 100644 --- a/openpype/hosts/blender/api/pipeline.py +++ b/openpype/hosts/blender/api/pipeline.py @@ -60,6 +60,7 @@ def install(): register_creator_plugin_path(str(CREATE_PATH)) lib.append_user_scripts() + lib.set_app_templates_path() register_event_callback("new", on_new) register_event_callback("open", on_open) From 97f3bdf5ec7483932ba4550bfab7c4a75795a831 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 22 Jun 2023 12:02:23 +0200 Subject: [PATCH 32/38] Color Management- added color management support for simple expected files on Deadline (#5122) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * OP-5864 - added color management support for simple expected files Previously implemented only for AOVs. * OP-5864 - fix colorspace query colorspace might be not on instance.data * OP-5864 - refactore name to more descriptive one It is actually instance.data, not proper `instance`. --------- Co-authored-by: Jakub Ježek --- .../plugins/publish/submit_publish_job.py | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/openpype/modules/deadline/plugins/publish/submit_publish_job.py b/openpype/modules/deadline/plugins/publish/submit_publish_job.py index 590acf86c2..69e9fb6449 100644 --- a/openpype/modules/deadline/plugins/publish/submit_publish_job.py +++ b/openpype/modules/deadline/plugins/publish/submit_publish_job.py @@ -21,6 +21,7 @@ from openpype.pipeline import ( from openpype.tests.lib import is_in_tests from openpype.pipeline.farm.patterning import match_aov_pattern from openpype.lib import is_running_from_build +from openpype.pipeline import publish def get_resources(project_name, version, extension=None): @@ -79,7 +80,8 @@ def get_resource_files(resources, frame_range=None): return list(res_collection) -class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): +class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, + publish.ColormanagedPyblishPluginMixin): """Process Job submitted on farm. These jobs are dependent on a deadline or muster job @@ -598,7 +600,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): self.log.debug("instances:{}".format(instances)) return instances - def _get_representations(self, instance, exp_files, do_not_add_review): + def _get_representations(self, instance_data, exp_files, + do_not_add_review): """Create representations for file sequences. This will return representations of expected files if they are not @@ -606,7 +609,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): most cases, but if not - we create representation from each of them. Arguments: - instance (dict): instance data for which we are + instance_data (dict): instance.data for which we are setting representations exp_files (list): list of expected files do_not_add_review (bool): explicitly skip review @@ -628,9 +631,9 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): # expected files contains more explicitly and from what # should be review made. # - "review" tag is never added when is set to 'False' - if instance["useSequenceForReview"]: + if instance_data["useSequenceForReview"]: # toggle preview on if multipart is on - if instance.get("multipartExr", False): + if instance_data.get("multipartExr", False): self.log.debug( "Adding preview tag because its multipartExr" ) @@ -655,8 +658,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): " This may cause issues on farm." ).format(staging)) - frame_start = int(instance.get("frameStartHandle")) - if instance.get("slate"): + frame_start = int(instance_data.get("frameStartHandle")) + if instance_data.get("slate"): frame_start -= 1 preview = preview and not do_not_add_review @@ -665,10 +668,10 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): "ext": ext, "files": [os.path.basename(f) for f in list(collection)], "frameStart": frame_start, - "frameEnd": int(instance.get("frameEndHandle")), + "frameEnd": int(instance_data.get("frameEndHandle")), # If expectedFile are absolute, we need only filenames "stagingDir": staging, - "fps": instance.get("fps"), + "fps": instance_data.get("fps"), "tags": ["review"] if preview else [], } @@ -676,17 +679,17 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): if ext in self.skip_integration_repre_list: rep["tags"].append("delete") - if instance.get("multipartExr", False): + if instance_data.get("multipartExr", False): rep["tags"].append("multipartExr") # support conversion from tiled to scanline - if instance.get("convertToScanline"): + if instance_data.get("convertToScanline"): self.log.info("Adding scanline conversion.") rep["tags"].append("toScanline") representations.append(rep) - self._solve_families(instance, preview) + self._solve_families(instance_data, preview) # add remainders as representations for remainder in remainders: @@ -717,13 +720,13 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): preview = preview and not do_not_add_review if preview: rep.update({ - "fps": instance.get("fps"), + "fps": instance_data.get("fps"), "tags": ["review"] }) - self._solve_families(instance, preview) + self._solve_families(instance_data, preview) already_there = False - for repre in instance.get("representations", []): + for repre in instance_data.get("representations", []): # might be added explicitly before by publish_on_farm already_there = repre.get("files") == rep["files"] if already_there: @@ -733,6 +736,13 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): if not already_there: representations.append(rep) + for rep in representations: + # inject colorspace data + self.set_representation_colorspace( + rep, self.context, + colorspace=instance_data["colorspace"] + ) + return representations def _solve_families(self, instance, preview=False): @@ -861,7 +871,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): "jobBatchName": data.get("jobBatchName", ""), "useSequenceForReview": data.get("useSequenceForReview", True), # map inputVersions `ObjectId` -> `str` so json supports it - "inputVersions": list(map(str, data.get("inputVersions", []))) + "inputVersions": list(map(str, data.get("inputVersions", []))), + "colorspace": instance.data.get("colorspace") } # skip locking version if we are creating v01 From 40cf531cb12bf6a042d4535b08bc3139ed415cac Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 22 Jun 2023 12:55:17 +0100 Subject: [PATCH 33/38] Adding support for excluded families. --- openpype/hosts/maya/plugins/load/actions.py | 17 ++--------------- openpype/pipeline/load/plugins.py | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/actions.py b/openpype/hosts/maya/plugins/load/actions.py index 4855f3eed0..57d1039245 100644 --- a/openpype/hosts/maya/plugins/load/actions.py +++ b/openpype/hosts/maya/plugins/load/actions.py @@ -93,21 +93,8 @@ class ImportMayaLoader(load.LoaderPlugin): """ representations = ["ma", "mb", "obj"] - families = [ - "model", - "pointcache", - "proxyAbc", - "animation", - "mayaAscii", - "mayaScene", - "setdress", - "layout", - "camera", - "rig", - "camerarig", - "staticMesh", - "workfile" - ] + families = ["*"] + excluded_families = ["xgen"] label = "Import" order = 10 diff --git a/openpype/pipeline/load/plugins.py b/openpype/pipeline/load/plugins.py index e380d65bbe..433d7f671a 100644 --- a/openpype/pipeline/load/plugins.py +++ b/openpype/pipeline/load/plugins.py @@ -28,6 +28,7 @@ class LoaderPlugin(list): """ families = [] + excluded_families = [] representations = [] extensions = {"*"} order = 0 @@ -159,7 +160,10 @@ class LoaderPlugin(list): return False plugin_families = set(plugin_families) - if "*" in plugin_families: + + # Return if all families are allowed and no excluded families are + # defined. + if "*" in plugin_families and not cls.excluded_families: return True subset_doc = context["subset"] @@ -175,6 +179,17 @@ class LoaderPlugin(list): if not families: return False + + # Return if there are intersections between the subsets families and + # the loaders excluded families. + if list(set(families) & set(cls.excluded_families)): + return False + + # Return if all families are allowed since excluded families have + # already been considered. + if "*" in plugin_families: + return True + return any(family in plugin_families for family in families) @classmethod From ecc152ffe1efe3689877be9bdd4051d4438539ea Mon Sep 17 00:00:00 2001 From: kaa Date: Thu, 22 Jun 2023 15:56:20 +0200 Subject: [PATCH 34/38] fix ftrack ignore sync filter (#5176) --- openpype/modules/ftrack/lib/avalon_sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/modules/ftrack/lib/avalon_sync.py b/openpype/modules/ftrack/lib/avalon_sync.py index 8b4c4619a1..7c3ba1a30c 100644 --- a/openpype/modules/ftrack/lib/avalon_sync.py +++ b/openpype/modules/ftrack/lib/avalon_sync.py @@ -890,7 +890,7 @@ class SyncEntitiesFactory: else: parent_dict = self.entities_dict.get(parent_id, {}) - for child_id in parent_dict.get("children", []): + for child_id in list(parent_dict.get("children", [])): # keep original `remove` value for all children _remove = (remove is True) if not _remove: From f76e32940ad67194c37b88c7507386dd90d87b4e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 22 Jun 2023 17:39:21 +0200 Subject: [PATCH 35/38] Burnins: Refactored burnins script (#5094) * refactored list value for burnins * fix formatting of listed values * formatting fix * separated values preparation into function * added some docstrings and comments * minor changes * handle fps in burnin options * formatting fix * Fix typo Co-authored-by: Roy Nieterau * move lines logic before writing to file * fill 'fps' in burnin options from representation * fix missing 'handles' variable --------- Co-authored-by: Roy Nieterau --- openpype/plugins/publish/extract_burnin.py | 20 +- openpype/scripts/otio_burnin.py | 358 ++++++++++++++------- 2 files changed, 251 insertions(+), 127 deletions(-) diff --git a/openpype/plugins/publish/extract_burnin.py b/openpype/plugins/publish/extract_burnin.py index 6a8ae958d2..41d6cf81fc 100644 --- a/openpype/plugins/publish/extract_burnin.py +++ b/openpype/plugins/publish/extract_burnin.py @@ -266,6 +266,16 @@ class ExtractBurnin(publish.Extractor): first_output = True files_to_delete = [] + + repre_burnin_options = copy.deepcopy(burnin_options) + # Use fps from representation for output in options + fps = repre.get("fps") + if fps is not None: + repre_burnin_options["fps"] = fps + # TODO Should we use fps from source representation to fill + # it in review? + # burnin_data["fps"] = fps + for filename_suffix, burnin_def in repre_burnin_defs.items(): new_repre = copy.deepcopy(repre) new_repre["stagingDir"] = src_repre_staging_dir @@ -308,7 +318,7 @@ class ExtractBurnin(publish.Extractor): "input": temp_data["full_input_path"], "output": temp_data["full_output_path"], "burnin_data": burnin_data, - "options": copy.deepcopy(burnin_options), + "options": repre_burnin_options, "values": burnin_values, "full_input_path": temp_data["full_input_paths"][0], "first_frame": temp_data["first_frame"], @@ -463,15 +473,11 @@ class ExtractBurnin(publish.Extractor): handle_start = instance.data.get("handleStart") if handle_start is None: - handle_start = context.data.get("handleStart") - if handle_start is None: - handle_start = handles + handle_start = context.data.get("handleStart") or 0 handle_end = instance.data.get("handleEnd") if handle_end is None: - handle_end = context.data.get("handleEnd") - if handle_end is None: - handle_end = handles + handle_end = context.data.get("handleEnd") or 0 frame_start_handle = frame_start - handle_start frame_end_handle = frame_end + handle_end diff --git a/openpype/scripts/otio_burnin.py b/openpype/scripts/otio_burnin.py index d0a4266941..581734a789 100644 --- a/openpype/scripts/otio_burnin.py +++ b/openpype/scripts/otio_burnin.py @@ -1,6 +1,5 @@ import os import sys -import re import subprocess import platform import json @@ -13,6 +12,7 @@ from openpype.lib import ( get_ffmpeg_codec_args, get_ffmpeg_format_args, convert_ffprobe_fps_value, + convert_ffprobe_fps_to_float, ) @@ -41,45 +41,6 @@ TIMECODE_KEY = "{timecode}" SOURCE_TIMECODE_KEY = "{source_timecode}" -def convert_list_to_command(list_to_convert, fps, label=""): - """Convert a list of values to a drawtext command file for ffmpeg `sendcmd` - - The list of values is expected to have a value per frame. If the video - file ends up being longer than the amount of samples per frame than the - last value will be held. - - Args: - list_to_convert (list): List of values per frame. - fps (float or int): The expected frame per seconds of the output file. - label (str): Label for the drawtext, if specific drawtext filter is - required - - Returns: - str: Filepath to the temporary drawtext command file. - - """ - - with tempfile.NamedTemporaryFile(mode="w", delete=False) as f: - for i, value in enumerate(list_to_convert): - seconds = i / fps - - # Escape special character - value = str(value).replace(":", "\\:") - - filter = "drawtext" - if label: - filter += "@" + label - - line = ( - "{start} {filter} reinit text='{value}';" - "\n".format(start=seconds, filter=filter, value=value) - ) - - f.write(line) - f.flush() - return f.name - - def _get_ffprobe_data(source): """Reimplemented from otio burnins to be able use full path to ffprobe :param str source: source media file @@ -178,6 +139,7 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): self.ffprobe_data = ffprobe_data self.first_frame = first_frame self.input_args = [] + self.cleanup_paths = [] super().__init__(source, source_streams) @@ -191,7 +153,6 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): frame_start=None, frame_end=None, options=None, - cmd="" ): """ Adding static text to a filter. @@ -212,13 +173,9 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): if frame_end is not None: options["frame_end"] = frame_end - draw_text = DRAWTEXT - if cmd: - draw_text = "{}, {}".format(cmd, DRAWTEXT) options["label"] = align - - self._add_burnin(text, align, options, draw_text) + self._add_burnin(text, align, options, DRAWTEXT) def add_timecode( self, align, frame_start=None, frame_end=None, frame_start_tc=None, @@ -263,6 +220,139 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): self._add_burnin(text, align, options, TIMECODE) + def add_per_frame_text( + self, + text, + align, + frame_start, + frame_end, + listed_keys, + options=None + ): + """Add text that changes per frame. + + Args: + text (str): Template string with unfilled keys that are changed + per frame. + align (str): Alignment of text. + frame_start (int): Starting frame for burnins current frame. + frame_end (int): Ending frame for burnins current frame. + listed_keys (list): List of keys that are changed per frame. + options (Optional[dict]): Options to affect style of burnin. + """ + + if not options: + options = ffmpeg_burnins.TimeCodeOptions(**self.options_init) + + options = options.copy() + if frame_start is None: + frame_start = options["frame_offset"] + + # `frame_end` is only for meassurements of text position + if frame_end is None: + frame_end = options["frame_end"] + + fps = options.get("fps") + if not fps: + fps = self.frame_rate + + text_for_size = text + if CURRENT_FRAME_SPLITTER in text: + expr = self._get_current_frame_expression(frame_start, frame_end) + if expr is None: + expr = MISSING_KEY_VALUE + text_for_size = text_for_size.replace( + CURRENT_FRAME_SPLITTER, MISSING_KEY_VALUE) + text = text.replace(CURRENT_FRAME_SPLITTER, expr) + + # Find longest list with values + longest_list_len = max( + len(item["values"]) for item in listed_keys.values() + ) + # Where to store formatted values per frame by key + new_listed_keys = [{} for _ in range(longest_list_len)] + # Find the longest value per fill key. + # The longest value is used to determine size of burnin box. + longest_value_by_key = {} + for key, item in listed_keys.items(): + values = item["values"] + # Fill the missing values from the longest list with the last + # value to make sure all values have same "frame count" + last_value = values[-1] if values else "" + for _ in range(longest_list_len - len(values)): + values.append(last_value) + + # Prepare dictionary structure for nestes values + # - last key is overriden on each frame loop + item_keys = list(item["keys"]) + fill_data = {} + sub_value = fill_data + last_item_key = item_keys.pop(-1) + for item_key in item_keys: + sub_value[item_key] = {} + sub_value = sub_value[item_key] + + # Fill value per frame + key_max_len = 0 + key_max_value = "" + for value, new_values in zip(values, new_listed_keys): + sub_value[last_item_key] = value + try: + value = key.format(**sub_value) + except (TypeError, KeyError, ValueError): + value = MISSING_KEY_VALUE + new_values[key] = value + + value_len = len(value) + if value_len > key_max_len: + key_max_value = value + key_max_len = value_len + + # Store the longest value + longest_value_by_key[key] = key_max_value + + # Make sure the longest value of each key is replaced for text size + # calculation + for key, value in longest_value_by_key.items(): + text_for_size = text_for_size.replace(key, value) + + # Create temp file with instructions for each frame of text + lines = [] + for frame, value in enumerate(new_listed_keys): + seconds = float(frame) / fps + # Escape special character + new_text = text + for _key, _value in value.items(): + _value = str(_value) + new_text = new_text.replace(_key, str(_value)) + + new_text = ( + str(new_text) + .replace("\\", "\\\\") + .replace(",", "\\,") + .replace(":", "\\:") + ) + lines.append( + f"{seconds} drawtext@{align} reinit text='{new_text}';") + + with tempfile.NamedTemporaryFile(mode="w", delete=False) as temp: + path = temp.name + temp.write("\n".join(lines)) + + self.cleanup_paths.append(path) + self.filters["drawtext"].append("sendcmd=f='{}'".format( + path.replace("\\", "/").replace(":", "\\:") + )) + self.add_text(text_for_size, align, frame_start, frame_end, options) + + def _get_current_frame_expression(self, frame_start, frame_end): + if frame_start is None: + return None + return ( + "%{eif:n+" + str(frame_start) + + ":d:" + str(len(str(frame_end))) + "}" + ) + def _add_burnin(self, text, align, options, draw): """ Generic method for building the filter flags. @@ -276,18 +366,19 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): if CURRENT_FRAME_SPLITTER in text: frame_start = options["frame_offset"] frame_end = options.get("frame_end", frame_start) - if frame_start is None: - replacement_final = replacement_size = str(MISSING_KEY_VALUE) + expr = self._get_current_frame_expression(frame_start, frame_end) + if expr is not None: + max_length = len(str(frame_end)) + # Use number '8' length times for replacement + size_replacement = max_length * "8" else: - replacement_final = "%{eif:n+" + str(frame_start) + ":d:" + \ - str(len(str(frame_end))) + "}" - replacement_size = str(frame_end) + expr = size_replacement = MISSING_KEY_VALUE final_text = final_text.replace( - CURRENT_FRAME_SPLITTER, replacement_final + CURRENT_FRAME_SPLITTER, expr ) text_for_size = text_for_size.replace( - CURRENT_FRAME_SPLITTER, replacement_size + CURRENT_FRAME_SPLITTER, size_replacement ) resolution = self.resolution @@ -314,13 +405,11 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): ffmpeg_burnins._drawtext(align, resolution, text_for_size, options) ) - arg_font_path = font_path - if platform.system().lower() == "windows": - arg_font_path = ( - arg_font_path - .replace(os.sep, r'\\' + os.sep) - .replace(':', r'\:') - ) + arg_font_path = ( + font_path + .replace("\\", "\\\\") + .replace(':', r'\:') + ) data["font"] = arg_font_path self.filters['drawtext'].append(draw % data) @@ -347,9 +436,15 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): if overwrite: output = '-y {}'.format(output) - filters = '' - if self.filter_string: - filters = '-vf "{}"'.format(self.filter_string) + filters = "" + filter_string = self.filter_string + if filter_string: + with tempfile.NamedTemporaryFile(mode="w", delete=False) as temp: + temp.write(filter_string) + filters_path = temp.name + filters = '-filter_script "{}"'.format(filters_path) + print("Filters:", filter_string) + self.cleanup_paths.append(filters_path) if self.first_frame is not None: start_number_arg = "-start_number {}".format(self.first_frame) @@ -420,6 +515,10 @@ class ModifiedBurnins(ffmpeg_burnins.Burnins): "Failed to generate this f*cking file '%s'" % output ) + for path in self.cleanup_paths: + if os.path.exists(path): + os.remove(path) + def example(input_path, output_path): options_init = { @@ -440,6 +539,51 @@ def example(input_path, output_path): burnin.render(output_path, overwrite=True) +def prepare_fill_values(burnin_template, data): + """Prepare values that will be filled instead of burnin template. + + Args: + burnin_template (str): Burnin template string. + data (dict[str, Any]): Data that will be used to fill template. + + Returns: + tuple[dict[str, dict[str, Any]], dict[str, Any], set[str]]: Filled + values that can be used as are, listed values that have different + value per frame and missing keys that are not present in data. + """ + + fill_values = {} + listed_keys = {} + missing_keys = set() + for item in Formatter().parse(burnin_template): + _, field_name, format_spec, conversion = item + if not field_name: + continue + # Calculate nested keys '{project[name]}' -> ['project', 'name'] + keys = [key.rstrip("]") for key in field_name.split("[")] + # Calculate original full key for replacement + conversion = "!{}".format(conversion) if conversion else "" + format_spec = ":{}".format(format_spec) if format_spec else "" + orig_key = "{{{}{}{}}}".format( + field_name, conversion, format_spec) + + key_value = data + try: + for key in keys: + key_value = key_value[key] + + if isinstance(key_value, list): + listed_keys[orig_key] = { + "values": key_value, + "keys": keys} + else: + fill_values[orig_key] = orig_key.format(**data) + except (KeyError, TypeError): + missing_keys.add(orig_key) + continue + return fill_values, listed_keys, missing_keys + + def burnins_from_data( input_path, output_path, data, codec_data=None, options=None, burnin_values=None, overwrite=True, @@ -512,17 +656,26 @@ def burnins_from_data( frame_end = data.get("frame_end") frame_start_tc = data.get('frame_start_tc', frame_start) - stream = burnin._streams[0] + video_stream = None + for stream in burnin._streams: + if stream.get("codec_type") == "video": + video_stream = stream + break + + if video_stream is None: + raise ValueError("Source didn't have video stream.") + if "resolution_width" not in data: - data["resolution_width"] = stream.get("width", MISSING_KEY_VALUE) + data["resolution_width"] = video_stream.get( + "width", MISSING_KEY_VALUE) if "resolution_height" not in data: - data["resolution_height"] = stream.get("height", MISSING_KEY_VALUE) + data["resolution_height"] = video_stream.get( + "height", MISSING_KEY_VALUE) + r_frame_rate = video_stream.get("r_frame_rate", "0/0") if "fps" not in data: - data["fps"] = convert_ffprobe_fps_value( - stream.get("r_frame_rate", "0/0") - ) + data["fps"] = convert_ffprobe_fps_value(r_frame_rate) # Check frame start and add expression if is available if frame_start is not None: @@ -531,9 +684,9 @@ def burnins_from_data( if frame_start_tc is not None: data[TIMECODE_KEY[1:-1]] = TIMECODE_KEY - source_timecode = stream.get("timecode") + source_timecode = video_stream.get("timecode") if source_timecode is None: - source_timecode = stream.get("tags", {}).get("timecode") + source_timecode = video_stream.get("tags", {}).get("timecode") # Use "format" key from ffprobe data # - this is used e.g. in mxf extension @@ -589,59 +742,24 @@ def burnins_from_data( print("Source does not have set timecode value.") value = value.replace(SOURCE_TIMECODE_KEY, MISSING_KEY_VALUE) - # Convert lists. - cmd = "" - text = None - keys = [i[1] for i in Formatter().parse(value) if i[1] is not None] - list_to_convert = [] - - # Warn about nested dictionary support for lists. Ei. we dont support - # it. - if "[" in "".join(keys): - print( - "We dont support converting nested dictionaries to lists," - " so skipping {}".format(value) - ) - else: - for key in keys: - data_value = data[key] - - # Multiple lists are not supported. - if isinstance(data_value, list) and list_to_convert: - raise ValueError( - "Found multiple lists to convert, which is not " - "supported: {}".format(value) - ) - - if isinstance(data_value, list): - print("Found list to convert: {}".format(data_value)) - for v in data_value: - data[key] = v - list_to_convert.append(value.format(**data)) - - if list_to_convert: - value = list_to_convert[0] - path = convert_list_to_command( - list_to_convert, data["fps"], label=align - ) - cmd = "sendcmd=f='{}'".format(path) - cmd = cmd.replace("\\", "/") - cmd = cmd.replace(":", "\\:") - clean_up_paths.append(path) - # Failsafe for missing keys. - key_pattern = re.compile(r"(\{.*?[^{0]*\})") - missing_keys = [] - for group in key_pattern.findall(value): - try: - group.format(**data) - except (TypeError, KeyError): - missing_keys.append(group) + fill_values, listed_keys, missing_keys = prepare_fill_values( + value, data + ) - missing_keys = list(set(missing_keys)) for key in missing_keys: value = value.replace(key, MISSING_KEY_VALUE) + if listed_keys: + for key, key_value in fill_values.items(): + if key == CURRENT_FRAME_KEY: + key_value = CURRENT_FRAME_SPLITTER + value = value.replace(key, str(key_value)) + burnin.add_per_frame_text( + value, align, frame_start, frame_end, listed_keys + ) + continue + # Handle timecode differently if has_source_timecode: args = [align, frame_start, frame_end, source_timecode] @@ -665,7 +783,7 @@ def burnins_from_data( text = value.format(**data) - burnin.add_text(text, align, frame_start, frame_end, cmd=cmd) + burnin.add_text(text, align, frame_start, frame_end) ffmpeg_args = [] if codec_data: From cca689e48f3c915e8f760f949e013696cb80f3f2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 22 Jun 2023 20:17:56 +0200 Subject: [PATCH 36/38] Webpublisher - headless publish shouldn't be blocking operation (#5177) * OP-6239 - headless publish from webpublisher shouldn't be blocking subprocess.call is blocking, which resulted in UI non responsiveness as it was waiting for publish to finish. * OP-6239 - revert of typo --- .../hosts/webpublisher/webserver_service/webpublish_routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/webpublisher/webserver_service/webpublish_routes.py b/openpype/hosts/webpublisher/webserver_service/webpublish_routes.py index 4039d2c8ec..9fe4b4d3c1 100644 --- a/openpype/hosts/webpublisher/webserver_service/webpublish_routes.py +++ b/openpype/hosts/webpublisher/webserver_service/webpublish_routes.py @@ -293,7 +293,7 @@ class BatchPublishEndpoint(WebpublishApiEndpoint): log.debug("Adding to queue") self.resource.studio_task_queue.append(args) else: - subprocess.call(args) + subprocess.Popen(args) return Response( status=200, From 15c7978e2819afc1bcc2e2b49e3b579f84d6607f Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 23 Jun 2023 07:38:35 +0100 Subject: [PATCH 37/38] Revert "Adding support for excluded families." This reverts commit 40cf531cb12bf6a042d4535b08bc3139ed415cac. --- openpype/hosts/maya/plugins/load/actions.py | 17 +++++++++++++++-- openpype/pipeline/load/plugins.py | 17 +---------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/actions.py b/openpype/hosts/maya/plugins/load/actions.py index 57d1039245..4855f3eed0 100644 --- a/openpype/hosts/maya/plugins/load/actions.py +++ b/openpype/hosts/maya/plugins/load/actions.py @@ -93,8 +93,21 @@ class ImportMayaLoader(load.LoaderPlugin): """ representations = ["ma", "mb", "obj"] - families = ["*"] - excluded_families = ["xgen"] + families = [ + "model", + "pointcache", + "proxyAbc", + "animation", + "mayaAscii", + "mayaScene", + "setdress", + "layout", + "camera", + "rig", + "camerarig", + "staticMesh", + "workfile" + ] label = "Import" order = 10 diff --git a/openpype/pipeline/load/plugins.py b/openpype/pipeline/load/plugins.py index 433d7f671a..e380d65bbe 100644 --- a/openpype/pipeline/load/plugins.py +++ b/openpype/pipeline/load/plugins.py @@ -28,7 +28,6 @@ class LoaderPlugin(list): """ families = [] - excluded_families = [] representations = [] extensions = {"*"} order = 0 @@ -160,10 +159,7 @@ class LoaderPlugin(list): return False plugin_families = set(plugin_families) - - # Return if all families are allowed and no excluded families are - # defined. - if "*" in plugin_families and not cls.excluded_families: + if "*" in plugin_families: return True subset_doc = context["subset"] @@ -179,17 +175,6 @@ class LoaderPlugin(list): if not families: return False - - # Return if there are intersections between the subsets families and - # the loaders excluded families. - if list(set(families) & set(cls.excluded_families)): - return False - - # Return if all families are allowed since excluded families have - # already been considered. - if "*" in plugin_families: - return True - return any(family in plugin_families for family in families) @classmethod From dcf3b2749326d173a9a6b635f51f213b83baa6ab Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Fri, 23 Jun 2023 14:49:46 +0100 Subject: [PATCH 38/38] Update openpype/pipeline/workfile/workfile_template_builder.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- openpype/pipeline/workfile/workfile_template_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/pipeline/workfile/workfile_template_builder.py b/openpype/pipeline/workfile/workfile_template_builder.py index 83d602fa79..489297efe4 100644 --- a/openpype/pipeline/workfile/workfile_template_builder.py +++ b/openpype/pipeline/workfile/workfile_template_builder.py @@ -1574,7 +1574,7 @@ class PlaceholderLoadMixin(object): "population." ) return - if not placeholder.data["keep_placeholder"]: + if not placeholder.data.get("keep_placeholder", True): self.delete_placeholder(placeholder) def load_failed(self, placeholder, representation):