diff --git a/openpype/modules/royalrender/plugins/publish/create_maya_royalrender_job.py b/openpype/modules/royalrender/plugins/publish/create_maya_royalrender_job.py index 1bb2785dd6..5ad3c90bdc 100644 --- a/openpype/modules/royalrender/plugins/publish/create_maya_royalrender_job.py +++ b/openpype/modules/royalrender/plugins/publish/create_maya_royalrender_job.py @@ -1,156 +1,42 @@ # -*- coding: utf-8 -*- """Submitting render job to RoyalRender.""" +# -*- coding: utf-8 -*- +"""Submitting render job to RoyalRender.""" import os -import sys -import platform -from maya.OpenMaya import MGlobal # noqa -import pyblish.api -from openpype.lib import is_running_from_build -from openpype.pipeline.publish.lib import get_published_workfile_instance -from openpype.pipeline.publish import KnownPublishError -from openpype.modules.royalrender.api import Api as rrApi -from openpype.modules.royalrender.rr_job import RRJob, CustomAttribute +from maya.OpenMaya import MGlobal + +from openpype.modules.royalrender import lib from openpype.pipeline.farm.tools import iter_expected_files -class CreateMayaRoyalRenderJob(pyblish.api.InstancePlugin): +class CreateMayaRoyalRenderJob(lib.BaseCreateRoyalRenderJob): label = "Create Maya Render job in RR" - order = pyblish.api.IntegratorOrder + 0.1 families = ["renderlayer"] - targets = ["local"] - use_published = True - def __init__(self, *args, **kwargs): - self._instance = None - self._rrRoot = None - self.scene_path = None - self.job = None - self.submission_parameters = None - self.rr_api = None - - def get_job(self): - """Prepare job payload. - - Returns: - RRJob: RoyalRender job payload. - """ - def get_rr_platform(): - if sys.platform.lower() in ["win32", "win64"]: - return "windows" - elif sys.platform.lower() == "darwin": - return "mac" - else: - return "linux" - - expected_files = self._instance.data["expectedFiles"] - first_file = next(iter_expected_files(expected_files)) - output_dir = os.path.dirname(first_file) - self._instance.data["outputDir"] = output_dir - workspace = self._instance.context.data["workspaceDir"] - default_render_file = ( - self._instance.context.data - ['project_settings'] - ['maya'] - ['RenderSettings'] - ['default_render_image_folder'] - ) - # file_name = os.path.basename(self.scene_path) - dir_name = os.path.join(workspace, default_render_file) - layer = self._instance.data["setMembers"] # type: str - layer_name = layer.removeprefix("rs_") - - custom_attributes = [] - if is_running_from_build(): - custom_attributes = [ - CustomAttribute( - name="OpenPypeVersion", - value=os.environ.get("OPENPYPE_VERSION")) - ] - - job = RRJob( - Software="Maya", - Renderer=self._instance.data["renderer"], - SeqStart=int(self._instance.data["frameStartHandle"]), - SeqEnd=int(self._instance.data["frameEndHandle"]), - SeqStep=int(self._instance.data["byFrameStep"]), - SeqFileOffset=0, - Version="{0:.2f}".format(MGlobal.apiVersion() / 10000), - SceneName=self.scene_path, - IsActive=True, - ImageDir=dir_name, - ImageFilename="{}.".format(layer_name), - ImageExtension=os.path.splitext(first_file)[1], - ImagePreNumberLetter=".", - ImageSingleOutputFile=False, - SceneOS=get_rr_platform(), - Camera=self._instance.data["cameras"][0], - Layer=layer_name, - SceneDatabaseDir=workspace, - CustomSHotName=self._instance.context.data["asset"], - CompanyProjectName=self._instance.context.data["projectName"], - ImageWidth=self._instance.data["resolutionWidth"], - ImageHeight=self._instance.data["resolutionHeight"], - CustomAttributes=custom_attributes - ) + def update_job_with_host_specific(self, instance, job): + job.Software = "Maya" + job.Version = "{0:.2f}".format(MGlobal.apiVersion() / 10000) + job.Camera = instance.data["cameras"][0], + workspace = instance.context.data["workspaceDir"] + job.SceneDatabaseDir = workspace return job def process(self, instance): """Plugin entry point.""" - self._instance = instance - context = instance.context + super(CreateMayaRoyalRenderJob, self).process(instance) - self._rr_root = self._resolve_rr_path(context, instance.data.get("rrPathName")) # noqa - self.log.debug(self._rr_root) - if not self._rr_root: - raise KnownPublishError( - ("Missing RoyalRender root. " - "You need to configure RoyalRender module.")) + expected_files = self._instance.data["expectedFiles"] + first_file_path = next(iter_expected_files(expected_files)) + output_dir = os.path.dirname(first_file_path) + self._instance.data["outputDir"] = output_dir - self.rr_api = rrApi(self._rr_root) + layer = self._instance.data["setMembers"] # type: str + layer_name = layer.removeprefix("rs_") - file_path = None - if self.use_published: - file_path = get_published_workfile_instance(context) + job = self.get_job(instance, self.scene_path, first_file_path, + layer_name) + job = self.update_job_with_host_specific(instance, job) - # fallback if nothing was set - if not file_path: - self.log.warning("Falling back to workfile") - file_path = context.data["currentFile"] - - self.scene_path = file_path - - if not self._instance.data.get("rrJobs"): - self._instance.data["rrJobs"] = [] - - self._instance.data["rrJobs"] += self.get_job() - - @staticmethod - def _resolve_rr_path(context, rr_path_name): - # type: (pyblish.api.Context, str) -> str - rr_settings = ( - context.data - ["system_settings"] - ["modules"] - ["royalrender"] - ) - try: - default_servers = rr_settings["rr_paths"] - project_servers = ( - context.data - ["project_settings"] - ["royalrender"] - ["rr_paths"] - ) - rr_servers = { - k: default_servers[k] - for k in project_servers - if k in default_servers - } - - except (AttributeError, KeyError): - # Handle situation were we had only one url for royal render. - return context.data["defaultRRPath"][platform.system().lower()] - - return rr_servers[rr_path_name][platform.system().lower()] + instance.data["rrJobs"] += job