From 9b8265a3da1751d1616aedb2e5778315d9bf4c13 Mon Sep 17 00:00:00 2001 From: aardschok Date: Fri, 29 Sep 2017 17:25:27 +0200 Subject: [PATCH 1/9] stripped rs_ from renderlayer node --- colorbleed/plugins/maya/publish/collect_renderlayers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/colorbleed/plugins/maya/publish/collect_renderlayers.py b/colorbleed/plugins/maya/publish/collect_renderlayers.py index aa0bdb58fe..0026a7347c 100644 --- a/colorbleed/plugins/maya/publish/collect_renderlayers.py +++ b/colorbleed/plugins/maya/publish/collect_renderlayers.py @@ -28,6 +28,7 @@ class CollectMindbenderMayaRenderlayers(pyblish.api.ContextPlugin): if layer.endswith("defaultRenderLayer"): continue + layername = layer.split("rs_", 1)[-1] data = {"family": "Render Layers", "families": ["colorbleed.renderlayer"], "publish": cmds.getAttr("{}.renderable".format(layer)), @@ -39,7 +40,7 @@ class CollectMindbenderMayaRenderlayers(pyblish.api.ContextPlugin): # instance subset "asset": asset_name, - "subset": layer, + "subset": layername, "setMembers": layer, "time": api.time(), @@ -69,7 +70,7 @@ class CollectMindbenderMayaRenderlayers(pyblish.api.ContextPlugin): _globals = maya.read(avalon_globals) data["renderGlobals"] = self.get_global_overrides(_globals) - instance = context.create_instance(layer) + instance = context.create_instance(layername) instance.data.update(data) def get_render_attribute(self, attr): From ddb0e600e9847ce4c6b5195c6b51f296f2afa0a8 Mon Sep 17 00:00:00 2001 From: aardschok Date: Fri, 29 Sep 2017 17:25:56 +0200 Subject: [PATCH 2/9] ensure renderlayer node is passed on --- colorbleed/plugins/maya/publish/submit_deadline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/colorbleed/plugins/maya/publish/submit_deadline.py b/colorbleed/plugins/maya/publish/submit_deadline.py index 72dca12c33..e267c42dce 100644 --- a/colorbleed/plugins/maya/publish/submit_deadline.py +++ b/colorbleed/plugins/maya/publish/submit_deadline.py @@ -179,7 +179,7 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): "UsingRenderLayers": True, # Render only this layer - "RenderLayer": instance.name, + "RenderLayer": instance.data["setMembers"], # Determine which renderer to use from the file itself "Renderer": "file", From ab3a6de69c330d37e7cb8e7ada83c02666048197 Mon Sep 17 00:00:00 2001 From: aardschok Date: Mon, 2 Oct 2017 09:36:05 +0200 Subject: [PATCH 3/9] Added renderlayer context function --- colorbleed/maya/lib.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/colorbleed/maya/lib.py b/colorbleed/maya/lib.py index c6f9fc2a6d..b035e9b037 100644 --- a/colorbleed/maya/lib.py +++ b/colorbleed/maya/lib.py @@ -106,6 +106,19 @@ def _maintained_selection_context(): noExpand=True) +@contextlib.contextmanager +def renderlayer(layer): + """Set the renderlayer during the context""" + + original = cmds.editRenderLayerGlobals(query=True, currentRenderLayer=True) + + try: + cmds.editRenderLayerGlobals(currentRenderLayer=layer) + yield + finally: + cmds.editRenderLayerGlobals(currentRenderLayer=original) + + def unique(name): assert isinstance(name, basestring), "`name` must be string" From 980a3b884c7138ca840b96b04010e27976749b1f Mon Sep 17 00:00:00 2001 From: aardschok Date: Mon, 2 Oct 2017 10:13:31 +0200 Subject: [PATCH 4/9] added get_renderer fucntion --- colorbleed/maya/lib.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/colorbleed/maya/lib.py b/colorbleed/maya/lib.py index b035e9b037..437daf7625 100644 --- a/colorbleed/maya/lib.py +++ b/colorbleed/maya/lib.py @@ -119,6 +119,11 @@ def renderlayer(layer): cmds.editRenderLayerGlobals(currentRenderLayer=original) +def get_renderer(layer): + renderlayer(layer) + return cmds.getAttr("defaultRenderGlobals.currentRenderer") + + def unique(name): assert isinstance(name, basestring), "`name` must be string" From dbec37f3e1bdb77ac6c4704dc6c0a654297cf792 Mon Sep 17 00:00:00 2001 From: aardschok Date: Mon, 2 Oct 2017 10:14:00 +0200 Subject: [PATCH 5/9] make use of context managed function for renderer query --- colorbleed/plugins/maya/publish/collect_renderlayers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/colorbleed/plugins/maya/publish/collect_renderlayers.py b/colorbleed/plugins/maya/publish/collect_renderlayers.py index 0026a7347c..971c9b582f 100644 --- a/colorbleed/plugins/maya/publish/collect_renderlayers.py +++ b/colorbleed/plugins/maya/publish/collect_renderlayers.py @@ -4,6 +4,7 @@ from maya import cmds import pyblish.api from avalon import maya, api +import colorbleed.maya.lib as lib class CollectMindbenderMayaRenderlayers(pyblish.api.ContextPlugin): @@ -36,7 +37,7 @@ class CollectMindbenderMayaRenderlayers(pyblish.api.ContextPlugin): "startFrame": self.get_render_attribute("startFrame"), "endFrame": self.get_render_attribute("endFrame"), "byFrameStep": self.get_render_attribute("byFrameStep"), - "renderer": self.get_render_attribute("currentRenderer"), + "renderer": lib.get_renderer(layer), # instance subset "asset": asset_name, From 1631a20cdee097796692376b891f0e20be159300 Mon Sep 17 00:00:00 2001 From: aardschok Date: Mon, 2 Oct 2017 11:33:58 +0200 Subject: [PATCH 6/9] generate preview filename for deadlin --- .../plugins/maya/publish/submit_deadline.py | 130 ++++++------------ 1 file changed, 41 insertions(+), 89 deletions(-) diff --git a/colorbleed/plugins/maya/publish/submit_deadline.py b/colorbleed/plugins/maya/publish/submit_deadline.py index e267c42dce..7561d300c5 100644 --- a/colorbleed/plugins/maya/publish/submit_deadline.py +++ b/colorbleed/plugins/maya/publish/submit_deadline.py @@ -1,5 +1,4 @@ import os -import re import json import shutil import getpass @@ -11,34 +10,18 @@ from avalon.vendor import requests import pyblish.api +import colorbleed.maya.lib as lib -def get_padding_length(filename): - """ - >>> get_padding_length("sequence.v004.0001.exr", default=None) - 4 - >>> get_padding_length("sequence.-001.exr", default=None) - 4 - >>> get_padding_length("sequence.v005.exr", default=None) - None - - Retrieve the padding length by retrieving the frame number from a file. - - Args: - filename (str): the explicit filename, e.g.: sequence.0001.exr - - Returns: - int - """ - - padding_match = re.search(r"\.(-?\d+)", filename) - if padding_match: - length = len(padding_match.group()) - else: - raise AttributeError("Could not find padding length in " - "'{}'".format(filename)) - - return length +RENDER_ATTRIBUTES = {"vray": + {"node": "vraySettings", + "prefix": "fileNamePrefix", + "padding": "fileNamePadding"}, + "arnold": + {"node": "defaultRenderGlobals", + "prefix": "imageFilePrefix", + "padding": "extensionPadding"} + } def get_renderer_variables(): @@ -50,48 +33,26 @@ def get_renderer_variables(): dict """ - ext = "" - filename_prefix = "" - # padding = 4 + renderer = lib.get_renderer(lib.get_current_renderlayer()) + render_attrs = RENDER_ATTRIBUTES[renderer] - renderer = cmds.getAttr("defaultRenderGlobals.currentRenderer") - if renderer == "vray": + filename_prefix = cmds.getAttr("{}.{}".format(render_attrs["node"], + render_attrs["prefix"])) - # padding = cmds.getAttr("vraySettings.fileNamePadding") + filename_padding = cmds.getAttr("{}.{}".format(render_attrs["node"], + render_attrs["padding"])) - # check for vray settings node - settings_node = cmds.ls("vraySettings", type="VRaySettingsNode") - if not settings_node: - raise AttributeError("Could not find a VRay Settings Node, " - "to ensure the node exists open the " - "Render Settings window") + filename_0 = cmds.renderSettings(fullPath=True, firstImageName=True)[0] - # get the extension - image_format = cmds.getAttr("vraySettings.imageFormatStr") - if image_format: - ext = "{}".format(image_format.split(" ")[0]) + # get the extension, getAttr defaultRenderGlobals.imageFormat + # returns index number + filename_base = os.path.basename(filename_0) + extension = os.path.splitext(filename_base)[-1].strip(".") - prefix = cmds.getAttr("vraySettings.fileNamePrefix") - if prefix: - filename_prefix = prefix - - # insert other renderer logic here - - # fall back to default - if renderer.lower().startswith("maya"): - # get the extension, getAttr defaultRenderGlobals.imageFormat - # returns index number - first_filename = cmds.renderSettings(fullPath=True, - firstImageName=True)[0] - ext = os.path.splitext(os.path.basename(first_filename))[-1].strip(".") - - # get padding and filename prefix - # padding = cmds.getAttr("defaultRenderGlobals.extensionPadding") - prefix = cmds.getAttr("defaultRenderGlobals.fileNamePrefix") - if prefix: - filename_prefix = prefix - - return {"ext": ext, "filename_prefix": filename_prefix} + return {"ext": extension, + "filename_prefix": filename_prefix, + "padding": filename_padding, + "filename_0": filename_0} class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): @@ -117,9 +78,8 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): workspace = context.data["workspaceDir"] fpath = context.data["currentFile"] fname = os.path.basename(fpath) - name, ext = os.path.splitext(fname) comment = context.data.get("comment", "") - dirname = os.path.join(workspace, "renders", name) + dirname = os.path.join(workspace, "renders", instance.name) try: os.makedirs(dirname) @@ -128,9 +88,9 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): # get the variables depending on the renderer render_variables = get_renderer_variables() - output_file_prefix = render_variables["filename_prefix"] output_filename_0 = self.preview_fname(instance, dirname, + render_variables["padding"], render_variables["ext"]) # E.g. http://192.168.0.1:8082/api/jobs @@ -170,7 +130,7 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): # Output directory and filename "OutputFilePath": dirname, - "OutputFilePrefix": output_file_prefix, + "OutputFilePrefix": render_variables["filename_prefix"], # Mandatory for Deadline "Version": cmds.about(version=True), @@ -245,7 +205,7 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): raise Exception(response.text) - def preview_fname(self, instance, dirname, extension): + def preview_fname(self, instance, folder, padding, ext): """Return outputted filename with #### for padding Passing the absolute path to Deadline enables Deadline Monitor @@ -258,29 +218,21 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): To /path/to/render.####.png + Args: + instance: instance to be published + folder (str): folder to which will be written + padding (int): padding length + ext(str): file extension + + Returns: + str + """ - # We'll need to take tokens into account - fname = cmds.renderSettings(firstImageName=True, - fullPath=True, - layer=instance.name)[0] + padded_basename = "{}.{}.{}".format(instance.name, "#" * padding, ext) + preview_fname = os.path.join(folder, padded_basename) - try: - # Assume `c:/some/path/filename.0001.exr` - # TODO(marcus): Bulletproof this, the user may have - # chosen a different format for the outputted filename. - basename = os.path.basename(fname) - name, padding, ext = basename.rsplit(".", 2) - - padding_format = "#" * len(padding) - fname = ".".join([name, padding_format, extension]) - self.log.info("Assuming renders end up @ %s" % fname) - file_name = os.path.join(dirname, instance.name, fname) - except ValueError: - file_name = "" - self.log.info("Couldn't figure out where renders go") - - return file_name + return preview_fname def preflight_check(self, instance): """Ensure the startFrame, endFrame and byFrameStep are integers""" From e8baa358bcea6f5cdbfde36ad22c08e58001c264 Mon Sep 17 00:00:00 2001 From: aardschok Date: Mon, 2 Oct 2017 12:44:40 +0200 Subject: [PATCH 7/9] hardcodes output file prefix --- .../plugins/maya/publish/submit_deadline.py | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/colorbleed/plugins/maya/publish/submit_deadline.py b/colorbleed/plugins/maya/publish/submit_deadline.py index 7561d300c5..03663231c2 100644 --- a/colorbleed/plugins/maya/publish/submit_deadline.py +++ b/colorbleed/plugins/maya/publish/submit_deadline.py @@ -2,6 +2,7 @@ import os import json import shutil import getpass +import pprint from maya import cmds @@ -16,7 +17,8 @@ import colorbleed.maya.lib as lib RENDER_ATTRIBUTES = {"vray": {"node": "vraySettings", "prefix": "fileNamePrefix", - "padding": "fileNamePadding"}, + "padding": "fileNamePadding", + "ext": "imageFormatStr"}, "arnold": {"node": "defaultRenderGlobals", "prefix": "imageFilePrefix", @@ -36,9 +38,6 @@ def get_renderer_variables(): renderer = lib.get_renderer(lib.get_current_renderlayer()) render_attrs = RENDER_ATTRIBUTES[renderer] - filename_prefix = cmds.getAttr("{}.{}".format(render_attrs["node"], - render_attrs["prefix"])) - filename_padding = cmds.getAttr("{}.{}".format(render_attrs["node"], render_attrs["padding"])) @@ -47,7 +46,15 @@ def get_renderer_variables(): # get the extension, getAttr defaultRenderGlobals.imageFormat # returns index number filename_base = os.path.basename(filename_0) - extension = os.path.splitext(filename_base)[-1].strip(".") + if renderer == "vray": + # Maya's renderSettings function does not resolved V-Ray extension + # in the + extension = cmds.getAttr("{}.{}".format(render_attrs["node"], + render_attrs["ext"])) + filename_prefix = "//" + else: + extension = os.path.splitext(filename_base)[-1].strip(".") + filename_prefix = "//" return {"ext": extension, "filename_prefix": filename_prefix, @@ -72,6 +79,7 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): AVALON_DEADLINE = api.Session.get("AVALON_DEADLINE", "http://localhost:8082") + assert AVALON_DEADLINE is not None, "Requires AVALON_DEADLINE" context = instance.context @@ -79,7 +87,10 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): fpath = context.data["currentFile"] fname = os.path.basename(fpath) comment = context.data.get("comment", "") - dirname = os.path.join(workspace, "renders", instance.name) + # force a folder depth with + layer = instance.name + scene = os.path.splitext(fname)[0] + dirname = os.path.join(workspace, "renders") try: os.makedirs(dirname) @@ -88,7 +99,9 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): # get the variables depending on the renderer render_variables = get_renderer_variables() - output_filename_0 = self.preview_fname(instance, + # following hardcoded "//" + output_filename_0 = self.preview_fname(scene, + layer, dirname, render_variables["padding"], render_variables["ext"]) @@ -205,7 +218,7 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): raise Exception(response.text) - def preview_fname(self, instance, folder, padding, ext): + def preview_fname(self, scene, layer, folder, padding, ext): """Return outputted filename with #### for padding Passing the absolute path to Deadline enables Deadline Monitor @@ -219,7 +232,7 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): /path/to/render.####.png Args: - instance: instance to be published + layer: name of the current layer to be rendered folder (str): folder to which will be written padding (int): padding length ext(str): file extension @@ -229,8 +242,8 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): """ - padded_basename = "{}.{}.{}".format(instance.name, "#" * padding, ext) - preview_fname = os.path.join(folder, padded_basename) + padded_basename = "{}.{}.{}".format(layer, "#" * padding, ext) + preview_fname = os.path.join(folder, scene, layer, padded_basename) return preview_fname From db42d603db86aee7eedada7c46148b086cd67756 Mon Sep 17 00:00:00 2001 From: aardschok Date: Mon, 2 Oct 2017 12:49:14 +0200 Subject: [PATCH 8/9] cosmetics --- colorbleed/plugins/maya/publish/submit_deadline.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/colorbleed/plugins/maya/publish/submit_deadline.py b/colorbleed/plugins/maya/publish/submit_deadline.py index 03663231c2..f1a2288b08 100644 --- a/colorbleed/plugins/maya/publish/submit_deadline.py +++ b/colorbleed/plugins/maya/publish/submit_deadline.py @@ -43,18 +43,19 @@ def get_renderer_variables(): filename_0 = cmds.renderSettings(fullPath=True, firstImageName=True)[0] - # get the extension, getAttr defaultRenderGlobals.imageFormat - # returns index number - filename_base = os.path.basename(filename_0) if renderer == "vray": # Maya's renderSettings function does not resolved V-Ray extension - # in the + # Getting the extension for VRay settings node extension = cmds.getAttr("{}.{}".format(render_attrs["node"], render_attrs["ext"])) filename_prefix = "//" else: + # Get the extension, getAttr defaultRenderGlobals.imageFormat + # returns an index number. + filename_base = os.path.basename(filename_0) extension = os.path.splitext(filename_base)[-1].strip(".") - filename_prefix = "//" + filename_prefix = cmds.getAttr("{}.{}".format(render_attrs["node"], + render_attrs["prefix"])) return {"ext": extension, "filename_prefix": filename_prefix, From 9d60ba753a121e35df59ac03d249e176fd37995c Mon Sep 17 00:00:00 2001 From: aardschok Date: Mon, 2 Oct 2017 12:53:50 +0200 Subject: [PATCH 9/9] cosmetics --- colorbleed/plugins/maya/publish/submit_deadline.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/colorbleed/plugins/maya/publish/submit_deadline.py b/colorbleed/plugins/maya/publish/submit_deadline.py index f1a2288b08..19d935a97f 100644 --- a/colorbleed/plugins/maya/publish/submit_deadline.py +++ b/colorbleed/plugins/maya/publish/submit_deadline.py @@ -2,7 +2,6 @@ import os import json import shutil import getpass -import pprint from maya import cmds @@ -88,8 +87,6 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): fpath = context.data["currentFile"] fname = os.path.basename(fpath) comment = context.data.get("comment", "") - # force a folder depth with - layer = instance.name scene = os.path.splitext(fname)[0] dirname = os.path.join(workspace, "renders") @@ -98,11 +95,11 @@ class MindbenderSubmitDeadline(pyblish.api.InstancePlugin): except OSError: pass - # get the variables depending on the renderer + # Get the variables depending on the renderer render_variables = get_renderer_variables() # following hardcoded "//" output_filename_0 = self.preview_fname(scene, - layer, + instance.name, dirname, render_variables["padding"], render_variables["ext"])