From efc1cc257258da3e024d2db2609f1dbc83288de9 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 16 Jan 2024 18:00:34 +0800 Subject: [PATCH 1/8] refactor the validate deadline publish and rename to validate render passes --- .../publish/validate_deadline_publish.py | 43 ------ .../plugins/publish/validate_renderpasses.py | 137 ++++++++++++++++++ .../defaults/project_settings/max.json | 5 + .../schemas/schema_max_publish.json | 25 ++++ .../max/server/settings/publishers.py | 9 ++ server_addon/max/server/version.py | 2 +- 6 files changed, 177 insertions(+), 44 deletions(-) delete mode 100644 openpype/hosts/max/plugins/publish/validate_deadline_publish.py create mode 100644 openpype/hosts/max/plugins/publish/validate_renderpasses.py diff --git a/openpype/hosts/max/plugins/publish/validate_deadline_publish.py b/openpype/hosts/max/plugins/publish/validate_deadline_publish.py deleted file mode 100644 index b2f0e863f4..0000000000 --- a/openpype/hosts/max/plugins/publish/validate_deadline_publish.py +++ /dev/null @@ -1,43 +0,0 @@ -import os -import pyblish.api -from pymxs import runtime as rt -from openpype.pipeline.publish import ( - RepairAction, - ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) -from openpype.hosts.max.api.lib_rendersettings import RenderSettings - - -class ValidateDeadlinePublish(pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin): - """Validates Render File Directory is - not the same in every submission - """ - - order = ValidateContentsOrder - families = ["maxrender"] - hosts = ["max"] - label = "Render Output for Deadline" - optional = True - actions = [RepairAction] - - def process(self, instance): - if not self.is_active(instance.data): - return - file = rt.maxFileName - filename, ext = os.path.splitext(file) - if filename not in rt.rendOutputFilename: - raise PublishValidationError( - "Render output folder " - "doesn't match the max scene name! " - "Use Repair action to " - "fix the folder file path.." - ) - - @classmethod - def repair(cls, instance): - container = instance.data.get("instance_node") - RenderSettings().render_output(container) - cls.log.debug("Reset the render output folder...") diff --git a/openpype/hosts/max/plugins/publish/validate_renderpasses.py b/openpype/hosts/max/plugins/publish/validate_renderpasses.py new file mode 100644 index 0000000000..9e65f305a2 --- /dev/null +++ b/openpype/hosts/max/plugins/publish/validate_renderpasses.py @@ -0,0 +1,137 @@ +import os +import pyblish.api +from pymxs import runtime as rt +from openpype.pipeline.publish import ( + RepairAction, + ValidateContentsOrder, + PublishValidationError, + OptionalPyblishPluginMixin +) +from openpype.hosts.max.api.lib import get_current_renderer +from openpype.hosts.max.api.lib_rendersettings import RenderSettings + + +class ValidateRenderPasses(OptionalPyblishPluginMixin, + pyblish.api.InstancePlugin): + """Validates Render Passes before Deadline Submission + """ + + order = ValidateContentsOrder + families = ["maxrender"] + hosts = ["max"] + label = "Validate Render Passes" + optional = True + actions = [RepairAction] + + def process(self, instance): + if not self.is_active(instance.data): + return + invalid = self.get_invalid(instance) + if invalid: + bullet_point_invalid_statement = "\n".join( + f"- {err_type}: {filepath}" for err_type, filepath + in invalid + ) + report = ( + "Invalid render passes found.\n\n" + f"{bullet_point_invalid_statement}\n\n" + "You can use repair action to fix the invalid filepath." + ) + raise PublishValidationError( + report, title="Invalid Render Passes") + + @classmethod + def get_invalid(cls, instance): + """Function to get invalid beauty render outputs and + render elements + + Args: + instance (pyblish.api.Instance): instance + filename (str): filename of the Max scene + + Returns: + list: list of invalid filename which doesn't match + with the project name + """ + invalid = [] + file = rt.maxFileName + filename, ext = os.path.splitext(file) + if filename not in rt.rendOutputFilename: + cls.log.error( + "Render output folder " + "doesn't match the max scene name! " + ) + invalid_folder_name = os.path.dirname( + rt.rendOutputFilename).replace( + "\\", "/").split("/")[-1] + invalid.append(("Invalid Render Output Folder", + invalid_folder_name)) + beauty_fname = os.path.basename(rt.rendOutputFilename) + ext = os.path.splitext(beauty_fname)[-1].lstrip(".") + invalid_image_format = cls.get_invalid_image_format( + cls, instance, ext) + invalid.extend(invalid_image_format) + renderer_class = get_current_renderer() + renderer = str(renderer_class).split(":")[0] + if renderer in [ + "ART_Renderer", + "Redshift_Renderer", + "V_Ray_6_Hotfix_3", + "V_Ray_GPU_6_Hotfix_3", + "Default_Scanline_Renderer", + "Quicksilver_Hardware_Renderer", + ]: + render_elem = rt.maxOps.GetCurRenderElementMgr() + render_elem_num = render_elem.NumRenderElements() + for i in range(render_elem_num): + renderlayer_name = render_elem.GetRenderElement(i) + renderpass = str(renderlayer_name).split(":")[-1] + rend_file = render_elem.GetRenderElementFilename(i) + if not rend_file: + cls.log.error(f"No filepath for {renderpass}") + invalid.append((f"Invalid {renderpass}", + "No filepath")) + rend_fname, ext = os.path.splitext( + os.path.basename(rend_file)) + if not rend_fname.lstrip(".").endswith(renderpass): + err_msg = ( + f"Filename for {renderpass} should be " + f"ended with {renderpass}" + ) + cls.log.error(err_msg) + invalid.append((f"Invalid {renderpass}", + os.path.basename(rend_file))) + invalid_image_format = cls.get_invalid_image_format( + cls, instance, ext) + invalid.extend(invalid_image_format) + elif renderer == "Arnold": + cls.log.debug( + "Temporarily not support to check on Arnold render.") + + return invalid + + def get_invalid_image_format(self, instance, ext): + """Function to check if the image format of the render outputs + aligns with that in the setting. + + Args: + instance (pyblish.api.Instance): instance + ext (str): image extension + + Returns: + list: list of files with invalid image format + """ + invalid = [] + settings = instance.context.data["project_settings"].get("max") + image_format = settings["RenderSettings"]["image_format"] + if ext.lstrip(".") != image_format: + msg = "Invalid image format for render outputs" + self.log.error(msg) + invalid.append((msg, ext.lstrip("."))) + return invalid + + @classmethod + def repair(cls, instance): + container = instance.data.get("instance_node") + RenderSettings().render_output(container) + cls.log.debug("Reset the render output folder...") diff --git a/openpype/settings/defaults/project_settings/max.json b/openpype/settings/defaults/project_settings/max.json index d1610610dc..293515f1a2 100644 --- a/openpype/settings/defaults/project_settings/max.json +++ b/openpype/settings/defaults/project_settings/max.json @@ -61,6 +61,11 @@ "optional": true, "family_plugins_mapping": [] }, + "ValidateRenderPasses": { + "enabled": true, + "optional": true, + "active": true + }, "ExtractModelObj": { "enabled": true, "optional": true, diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json index b4d85bda98..4dd3d519e8 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json @@ -88,6 +88,31 @@ } ] } + }, + { + "type": "dict", + "collapsible": true, + "checkbox_key": "enabled", + "key": "ValidateRenderPasses", + "label": "Validate Render Passes", + "is_group": true, + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "type": "boolean", + "key": "optional", + "label": "Optional" + }, + { + "type": "boolean", + "key": "active", + "label": "Active" + } + ] } ] }, diff --git a/server_addon/max/server/settings/publishers.py b/server_addon/max/server/settings/publishers.py index d40d85a99b..a10e72b36a 100644 --- a/server_addon/max/server/settings/publishers.py +++ b/server_addon/max/server/settings/publishers.py @@ -68,6 +68,10 @@ class PublishersModel(BaseSettingsModel): default_factory=ValidateLoadedPluginModel, title="Validate Loaded Plugin" ) + ValidateRenderPasses: BasicValidateModel = Field( + default_factory=BasicValidateModel, + title="Validate Render Passes" + ) ExtractModelObj: BasicValidateModel = Field( default_factory=BasicValidateModel, title="Extract OBJ", @@ -106,6 +110,11 @@ DEFAULT_PUBLISH_SETTINGS = { "optional": True, "family_plugins_mapping": [] }, + "ValidateRenderPasses": { + "enabled": True, + "optional": True, + "active": True + }, "ExtractModelObj": { "enabled": True, "optional": True, diff --git a/server_addon/max/server/version.py b/server_addon/max/server/version.py index bbab0242f6..1276d0254f 100644 --- a/server_addon/max/server/version.py +++ b/server_addon/max/server/version.py @@ -1 +1 @@ -__version__ = "0.1.4" +__version__ = "0.1.5" From f0b8f254a113b51e96bfbc7f70ed1d440684412c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 16 Jan 2024 18:33:37 +0800 Subject: [PATCH 2/8] add docstrings & fix the bug on the setting of validate render pass in legacy OP --- .../plugins/publish/validate_renderpasses.py | 21 ++++++++- .../schemas/schema_max_publish.json | 46 +++++++++---------- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/openpype/hosts/max/plugins/publish/validate_renderpasses.py b/openpype/hosts/max/plugins/publish/validate_renderpasses.py index 9e65f305a2..f1bba81ecc 100644 --- a/openpype/hosts/max/plugins/publish/validate_renderpasses.py +++ b/openpype/hosts/max/plugins/publish/validate_renderpasses.py @@ -43,7 +43,26 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, @classmethod def get_invalid(cls, instance): """Function to get invalid beauty render outputs and - render elements + render elements. + + 1. Checking Render Output Folder matches the name of + the current Max Scene + e.g. The name of the current Max scene: + John_Doe.max + The expected render output directory: + {root[work]}/{project[name]}/{hierarchy} + /{asset}/work/{task[name]}/render/3dsmax/John_Doe/ + + 2. Checking the image extension(s) of the render output(s) + does not match with image format in OP/AYON setting. + e.g. The current image format in the setting: png + The expected render outputs: Joe_Doe.png + + 3. Checking the filename of render element is not ended + with the name of render element from the 3dsMax Render + Element Manager. + e.g. The name of render element: RsCryptomatte + The expected filename: {InstanceName}_RsCryptomatte.png Args: instance (pyblish.api.Instance): instance diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json index 4dd3d519e8..d0da4029f5 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json @@ -88,31 +88,31 @@ } ] } + } + ] + }, + { + "type": "dict", + "collapsible": true, + "checkbox_key": "enabled", + "key": "ValidateRenderPasses", + "label": "Validate Render Passes", + "is_group": true, + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" }, { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateRenderPasses", - "label": "Validate Render Passes", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] + "type": "boolean", + "key": "optional", + "label": "Optional" + }, + { + "type": "boolean", + "key": "active", + "label": "Active" } ] }, From 2590648f93e8f99e82ff0f6fcdd1af8abe134eb6 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 16 Jan 2024 19:27:01 +0800 Subject: [PATCH 3/8] big roy's comment - docstring tweaks and some log message tweaks --- .../plugins/publish/validate_renderpasses.py | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/openpype/hosts/max/plugins/publish/validate_renderpasses.py b/openpype/hosts/max/plugins/publish/validate_renderpasses.py index f1bba81ecc..8472b56336 100644 --- a/openpype/hosts/max/plugins/publish/validate_renderpasses.py +++ b/openpype/hosts/max/plugins/publish/validate_renderpasses.py @@ -7,7 +7,6 @@ from openpype.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from openpype.hosts.max.api.lib import get_current_renderer from openpype.hosts.max.api.lib_rendersettings import RenderSettings @@ -45,23 +44,22 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, """Function to get invalid beauty render outputs and render elements. - 1. Checking Render Output Folder matches the name of - the current Max Scene - e.g. The name of the current Max scene: - John_Doe.max - The expected render output directory: - {root[work]}/{project[name]}/{hierarchy} - /{asset}/work/{task[name]}/render/3dsmax/John_Doe/ + 1. Check Render Output Folder matches the name of + the current Max Scene, e.g. + The name of the current Max scene: + John_Doe.max + The expected render output directory: + {root[work]}/{project[name]}/{hierarchy}/{asset}/ + work/{task[name]}/render/3dsmax/John_Doe/ - 2. Checking the image extension(s) of the render output(s) - does not match with image format in OP/AYON setting. - e.g. The current image format in the setting: png - The expected render outputs: Joe_Doe.png + 2. Check image extension(s) of the render output(s) + matches the image format in OP/AYON setting, e.g. + The current image format in settings: png + The expected render outputs: John_Doe.png - 3. Checking the filename of render element is not ended - with the name of render element from the 3dsMax Render - Element Manager. - e.g. The name of render element: RsCryptomatte + 3. Check filename of render element ends with the name of + render element from the 3dsMax Render Element Manager. + e.g. The name of render element: RsCryptomatte The expected filename: {InstanceName}_RsCryptomatte.png Args: @@ -90,8 +88,7 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, invalid_image_format = cls.get_invalid_image_format( cls, instance, ext) invalid.extend(invalid_image_format) - renderer_class = get_current_renderer() - renderer = str(renderer_class).split(":")[0] + renderer = instance.data["renderer"] if renderer in [ "ART_Renderer", "Redshift_Renderer", @@ -107,17 +104,17 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, renderpass = str(renderlayer_name).split(":")[-1] rend_file = render_elem.GetRenderElementFilename(i) if not rend_file: - cls.log.error(f"No filepath for {renderpass}") + cls.log.error( + f"No filepath for render element {renderpass}") invalid.append((f"Invalid {renderpass}", "No filepath")) rend_fname, ext = os.path.splitext( os.path.basename(rend_file)) if not rend_fname.lstrip(".").endswith(renderpass): - err_msg = ( - f"Filename for {renderpass} should be " - f"ended with {renderpass}" + cls.log.error( + f"Filename for {renderpass} should " + f"end with {renderpass}" ) - cls.log.error(err_msg) invalid.append((f"Invalid {renderpass}", os.path.basename(rend_file))) invalid_image_format = cls.get_invalid_image_format( @@ -125,7 +122,8 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, invalid.extend(invalid_image_format) elif renderer == "Arnold": cls.log.debug( - "Temporarily not support to check on Arnold render.") + "Renderpass validation not supported Arnold yet," + " validation skipped...") return invalid @@ -143,10 +141,13 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, invalid = [] settings = instance.context.data["project_settings"].get("max") image_format = settings["RenderSettings"]["image_format"] - if ext.lstrip(".") != image_format: - msg = "Invalid image format for render outputs" + ext = ext.lstrip(".") + if ext != image_format: + msg = ( + f"Invalid image format {ext} for render outputs" + f"Should be : {image_format}") self.log.error(msg) - invalid.append((msg, ext.lstrip("."))) + invalid.append((msg, ext)) return invalid @classmethod From 38c6683756b4dbfd3dd9e276cbcdcc9070a91296 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 16 Jan 2024 20:13:12 +0800 Subject: [PATCH 4/8] codes tweaks on log message if it errors out --- .../max/plugins/publish/validate_renderpasses.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/max/plugins/publish/validate_renderpasses.py b/openpype/hosts/max/plugins/publish/validate_renderpasses.py index 8472b56336..2ad8f5601a 100644 --- a/openpype/hosts/max/plugins/publish/validate_renderpasses.py +++ b/openpype/hosts/max/plugins/publish/validate_renderpasses.py @@ -76,7 +76,7 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, if filename not in rt.rendOutputFilename: cls.log.error( "Render output folder " - "doesn't match the max scene name! " + f"doesn't match the max scene name {filename} " ) invalid_folder_name = os.path.dirname( rt.rendOutputFilename).replace( @@ -85,8 +85,7 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, invalid_folder_name)) beauty_fname = os.path.basename(rt.rendOutputFilename) ext = os.path.splitext(beauty_fname)[-1].lstrip(".") - invalid_image_format = cls.get_invalid_image_format( - cls, instance, ext) + invalid_image_format = cls.get_invalid_image_format(instance, ext) invalid.extend(invalid_image_format) renderer = instance.data["renderer"] if renderer in [ @@ -117,8 +116,7 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, ) invalid.append((f"Invalid {renderpass}", os.path.basename(rend_file))) - invalid_image_format = cls.get_invalid_image_format( - cls, instance, ext) + invalid_image_format = cls.get_invalid_image_format(instance, ext) invalid.extend(invalid_image_format) elif renderer == "Arnold": cls.log.debug( @@ -127,7 +125,8 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, return invalid - def get_invalid_image_format(self, instance, ext): + @classmethod + def get_invalid_image_format(cls, instance, ext): """Function to check if the image format of the render outputs aligns with that in the setting. @@ -146,12 +145,13 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, msg = ( f"Invalid image format {ext} for render outputs" f"Should be : {image_format}") - self.log.error(msg) + cls.log.error(msg) invalid.append((msg, ext)) return invalid @classmethod def repair(cls, instance): container = instance.data.get("instance_node") + # TODO: need to rename the function of render_output RenderSettings().render_output(container) - cls.log.debug("Reset the render output folder...") + cls.log.debug("Finished repairing the render output folder and filenames.") From 204504b6406c14a3cec118756ba7d530f6c3366c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 16 Jan 2024 20:15:05 +0800 Subject: [PATCH 5/8] hound shut --- openpype/hosts/max/plugins/publish/validate_renderpasses.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/max/plugins/publish/validate_renderpasses.py b/openpype/hosts/max/plugins/publish/validate_renderpasses.py index 2ad8f5601a..9b3064c393 100644 --- a/openpype/hosts/max/plugins/publish/validate_renderpasses.py +++ b/openpype/hosts/max/plugins/publish/validate_renderpasses.py @@ -116,7 +116,8 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, ) invalid.append((f"Invalid {renderpass}", os.path.basename(rend_file))) - invalid_image_format = cls.get_invalid_image_format(instance, ext) + invalid_image_format = cls.get_invalid_image_format( + instance, ext) invalid.extend(invalid_image_format) elif renderer == "Arnold": cls.log.debug( @@ -154,4 +155,5 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, container = instance.data.get("instance_node") # TODO: need to rename the function of render_output RenderSettings().render_output(container) - cls.log.debug("Finished repairing the render output folder and filenames.") + cls.log.debug("Finished repairing the render output " + "folder and filenames.") From bb6155738398f2e71c27f4012b72601d7ab3d911 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 17 Jan 2024 20:13:28 +0800 Subject: [PATCH 6/8] Debug message code tweaks --- openpype/hosts/max/plugins/publish/validate_renderpasses.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/max/plugins/publish/validate_renderpasses.py b/openpype/hosts/max/plugins/publish/validate_renderpasses.py index 9b3064c393..7b85763c74 100644 --- a/openpype/hosts/max/plugins/publish/validate_renderpasses.py +++ b/openpype/hosts/max/plugins/publish/validate_renderpasses.py @@ -144,8 +144,8 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, ext = ext.lstrip(".") if ext != image_format: msg = ( - f"Invalid image format {ext} for render outputs" - f"Should be : {image_format}") + f"Invalid image format {ext} for render outputs.\n" + f"Should be: {image_format}") cls.log.error(msg) invalid.append((msg, ext)) return invalid From 9a8700977df33ccd239a1c6d4f091636d76ca649 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 26 Jan 2024 18:26:41 +0800 Subject: [PATCH 7/8] make sure also validate the instance name inside the filename and make sure renderpass validated right --- .../plugins/publish/validate_renderpasses.py | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/openpype/hosts/max/plugins/publish/validate_renderpasses.py b/openpype/hosts/max/plugins/publish/validate_renderpasses.py index 7b85763c74..b3f5c0325b 100644 --- a/openpype/hosts/max/plugins/publish/validate_renderpasses.py +++ b/openpype/hosts/max/plugins/publish/validate_renderpasses.py @@ -84,8 +84,12 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, invalid.append(("Invalid Render Output Folder", invalid_folder_name)) beauty_fname = os.path.basename(rt.rendOutputFilename) - ext = os.path.splitext(beauty_fname)[-1].lstrip(".") - invalid_image_format = cls.get_invalid_image_format(instance, ext) + beauty_name, ext = os.path.splitext(beauty_fname) + invalid_filenames = cls.get_invalid_filenames( + instance, beauty_name) + invalid.extend(invalid_filenames) + invalid_image_format = cls.get_invalid_image_format( + instance, ext.lstrip(".")) invalid.extend(invalid_image_format) renderer = instance.data["renderer"] if renderer in [ @@ -109,13 +113,9 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, "No filepath")) rend_fname, ext = os.path.splitext( os.path.basename(rend_file)) - if not rend_fname.lstrip(".").endswith(renderpass): - cls.log.error( - f"Filename for {renderpass} should " - f"end with {renderpass}" - ) - invalid.append((f"Invalid {renderpass}", - os.path.basename(rend_file))) + invalid_filenames = cls.get_invalid_filenames( + instance, rend_fname, renderpass=renderpass) + invalid.extend(invalid_filenames) invalid_image_format = cls.get_invalid_image_format( instance, ext) invalid.extend(invalid_image_format) @@ -126,6 +126,33 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, return invalid + @classmethod + def get_invalid_filenames(cls, instance, file_name, renderpass=None): + """Function to get invalid filenames from render outputs. + + Args: + instance (pyblish.api.Instance): instance + file_name (str): name of the file + renderpass (str, optional): name of the renderpass. Defaults to None. + + Returns: + list: invalid filenames + """ + invalid = [] + if instance.name not in file_name: + cls.log.error("The renderpass should have instance name inside.") + invalid.append((f"Invalid instance name", + file_name)) + if renderpass is not None: + if not file_name.rstrip(".").endswith(renderpass): + cls.log.error( + f"Filename for {renderpass} should " + f"end with {renderpass}" + ) + invalid.append((f"Invalid {renderpass}", + os.path.basename(file_name))) + return invalid + @classmethod def get_invalid_image_format(cls, instance, ext): """Function to check if the image format of the render outputs From 2b6f47035b1e9b21dc15c975c9ceb8584855ef57 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 26 Jan 2024 18:29:13 +0800 Subject: [PATCH 8/8] hound shut --- openpype/hosts/max/plugins/publish/validate_renderpasses.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/max/plugins/publish/validate_renderpasses.py b/openpype/hosts/max/plugins/publish/validate_renderpasses.py index b3f5c0325b..e636b4e8fe 100644 --- a/openpype/hosts/max/plugins/publish/validate_renderpasses.py +++ b/openpype/hosts/max/plugins/publish/validate_renderpasses.py @@ -133,7 +133,8 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, Args: instance (pyblish.api.Instance): instance file_name (str): name of the file - renderpass (str, optional): name of the renderpass. Defaults to None. + renderpass (str, optional): name of the renderpass. + Defaults to None. Returns: list: invalid filenames