diff --git a/pype/hosts/harmony/js/PypeHarmony.js b/pype/hosts/harmony/js/PypeHarmony.js index 9d05384461..94c3236ab9 100644 --- a/pype/hosts/harmony/js/PypeHarmony.js +++ b/pype/hosts/harmony/js/PypeHarmony.js @@ -42,8 +42,8 @@ PypeHarmony.setSceneSettings = function(settings) { scene.setFrameRate(settings.fps); } - if (settings.frameStart && settings.frameEnd) { - var duration = settings.frameEnd - settings.frameStart + 1; + if (settings.frameStartHandle && settings.frameEndHandle) { + var duration = settings.frameEndHandle - settings.frameStartHandle + 1; if (frame.numberOf() > duration) { frame.remove(duration, frame.numberOf() - duration); diff --git a/pype/hosts/harmony/plugins/publish/collect_farm_render.py b/pype/hosts/harmony/plugins/publish/collect_farm_render.py index f05703c5f2..a3c51c7b7a 100644 --- a/pype/hosts/harmony/plugins/publish/collect_farm_render.py +++ b/pype/hosts/harmony/plugins/publish/collect_farm_render.py @@ -52,8 +52,8 @@ class CollectFarmRender(pype.lib.abstract_collect_render. This returns full path with file name determined by Write node settings. """ - start = render_instance.frameStart - end = render_instance.frameEnd + start = render_instance.frameStart - render_instance.handleStart + end = render_instance.frameEnd + render_instance.handleEnd node = render_instance.setMembers[0] self_name = self.__class__.__name__ # 0 - filename / 1 - type / 2 - zeros / 3 - start @@ -90,7 +90,7 @@ class CollectFarmRender(pype.lib.abstract_collect_render. ext ) ) - self.log.info("expected_files::{}".format(expected_files)) + self.log.debug("expected_files::{}".format(expected_files)) return expected_files def get_instances(self, context): @@ -131,7 +131,21 @@ class CollectFarmRender(pype.lib.abstract_collect_render. # capitalized task name subset_name = node.split("/")[1].replace( 'Farm', - context.data["task"].capitalize()) + context.data["anatomyData"]["task"].capitalize()) + + # harmony always starts from 1. frame + # 1001 - 10010 >> 1 - 10 + offset = context.data["frameStart"] - 1 + frame_start = context.data["frameStart"] - offset + frame_end = context.data["frameEnd"] - \ + context.data["frameStart"] + 1 + + # increase by handleStart - real frame range + # frameStart != frameStartHandle with handle presence + context.data["frameStart"] = int(frame_start) + \ + context.data["handleStart"] + context.data["frameEnd"] = int(frame_end) + \ + context.data["handleStart"] render_instance = HarmonyRenderInstance( version=version, time=api.time(), @@ -160,8 +174,8 @@ class CollectFarmRender(pype.lib.abstract_collect_render. convertToScanline=False, # time settings - frameStart=context.data["frameStart"], # from timeline - frameEnd=context.data["frameEnd"], # from timeline + frameStart=context.data["frameStart"], + frameEnd=context.data["frameEnd"], handleStart=context.data["handleStart"], # from DB handleEnd=context.data["handleEnd"], # from DB frameStep=1, @@ -169,7 +183,8 @@ class CollectFarmRender(pype.lib.abstract_collect_render. outputFormat=info[1], outputStartFrame=info[3], leadingZeros=info[2], - toBeRenderedOn='deadline' + toBeRenderedOn='deadline', + ignoreFrameHandleCheck=True ) self.log.debug(render_instance) diff --git a/pype/hosts/harmony/plugins/publish/collect_instances.py b/pype/hosts/harmony/plugins/publish/collect_instances.py index c3e551271f..bed9c4392b 100644 --- a/pype/hosts/harmony/plugins/publish/collect_instances.py +++ b/pype/hosts/harmony/plugins/publish/collect_instances.py @@ -20,7 +20,7 @@ class CollectInstances(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder hosts = ["harmony"] families_mapping = { - "render": ["imagesequence", "review", "ftrack"], + "render": ["review", "ftrack"], "harmony.template": [], "palette": ["palette", "ftrack"] } diff --git a/pype/hosts/harmony/plugins/publish/submit_harmony_deadline..py b/pype/hosts/harmony/plugins/publish/submit_harmony_deadline..py index e40ff02d08..584c1035e7 100644 --- a/pype/hosts/harmony/plugins/publish/submit_harmony_deadline..py +++ b/pype/hosts/harmony/plugins/publish/submit_harmony_deadline..py @@ -254,8 +254,8 @@ class HarmonySubmitDeadline( job_info.Name = self._instance.data["name"] job_info.Plugin = "HarmonyPype" job_info.Frames = "{}-{}".format( - self._instance.data["frameStart"], - self._instance.data["frameEnd"] + self._instance.data["frameStartHandle"], + self._instance.data["frameEndHandle"] ) # for now, get those from presets. Later on it should be # configurable in Harmony UI directly. diff --git a/pype/hosts/harmony/plugins/publish/validate_scene_settings.py b/pype/hosts/harmony/plugins/publish/validate_scene_settings.py index 1f53b515be..eaa4c35f5d 100644 --- a/pype/hosts/harmony/plugins/publish/validate_scene_settings.py +++ b/pype/hosts/harmony/plugins/publish/validate_scene_settings.py @@ -18,7 +18,7 @@ class ValidateSceneSettingsRepair(pyblish.api.Action): def process(self, context, plugin): """Repair action entry point.""" - asset_settings = _update_frames_with_handles( + asset_settings = _update_frames( pype.hosts.harmony.get_asset_settings()) pype.hosts.harmony.set_scene_settings(asset_settings) if not os.path.exists(context.data["scenePath"]): @@ -48,10 +48,9 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin): expected_settings = pype.hosts.harmony.get_asset_settings() self.log.info(expected_settings) - # Harmony is expected to start at 1. - expected_settings = _update_frames_with_handles(expected_settings) - - self.log.info(instance.context.data['anatomyData']['asset']) + expected_settings = _update_frames(dict.copy(expected_settings)) + expected_settings["frameEndHandle"] = expected_settings["frameEnd"] +\ + expected_settings["handleEnd"] if any(string in instance.context.data['anatomyData']['asset'] for string in self.frame_check_filter): @@ -70,16 +69,19 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin): expected_settings.pop("resolutionWidth") expected_settings.pop("resolutionHeight") - # values on instance.context collected by collect_scene.py + self.log.debug(expected_settings) + current_settings = { "fps": fps, - "frameStart": instance.context.data.get("frameStart"), - "frameEnd": instance.context.data.get("frameEnd"), + "frameStart": instance.context.data["frameStart"], + "frameEnd": instance.context.data["frameEnd"], "handleStart": instance.context.data.get("handleStart"), "handleEnd": instance.context.data.get("handleEnd"), + "frameEndHandle": instance.context.data.get("frameEndHandle"), "resolutionWidth": instance.context.data.get("resolutionWidth"), "resolutionHeight": instance.context.data.get("resolutionHeight"), } + self.log.debug("curr:: {}".format(current_settings)) invalid_settings = [] for key, value in expected_settings.items(): @@ -93,7 +95,9 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin): if ((expected_settings["handleStart"] or expected_settings["handleEnd"]) and invalid_settings): - invalid_settings[-1]["reason"] = "Handles included in calculation" + msg = "Handles included in calculation. Remove handles in DB " +\ + "or extend frame range in timeline." + invalid_settings[-1]["reason"] = msg msg = "Found invalid settings:\n{}".format( json.dumps(invalid_settings, sort_keys=True, indent=4) @@ -104,7 +108,7 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin): ) -def _update_frames_with_handles(expected_settings): +def _update_frames(expected_settings): """ Calculate proper frame range including handles set in DB. @@ -116,11 +120,10 @@ def _update_frames_with_handles(expected_settings): Returns: modified expected_setting (dict) """ - frame_start = expected_settings["frameStart"] - \ - expected_settings["handleStart"] - frame_end = expected_settings["frameEnd"] + \ - expected_settings["handleEnd"] - expected_settings["frameEnd"] = frame_end - frame_start + 1 - expected_settings["frameStart"] = 1 + frame_end = expected_settings["frameEnd"] - \ + expected_settings["frameStart"] + expected_settings["frameStart"] = 1.0 + expected_settings["handleStart"] + expected_settings["frameEnd"] = \ + frame_end + 1 + expected_settings["handleStart"] return expected_settings diff --git a/pype/lib/abstract_collect_render.py b/pype/lib/abstract_collect_render.py index 458ad9d971..cd81d8a490 100644 --- a/pype/lib/abstract_collect_render.py +++ b/pype/lib/abstract_collect_render.py @@ -49,6 +49,10 @@ class RenderInstance(object): handleStart = attr.ib() # start frame handleEnd = attr.ib() # start frame + # for softwares (like Harmony) where frame range cannot be set by DB + # handles need to be propagated if exist + ignoreFrameHandleCheck = attr.ib(default=False) + # -------------------- # With default values # metadata @@ -157,8 +161,8 @@ class AbstractCollectRender(pyblish.api.ContextPlugin): frame_start_render = int(render_instance.frameStart) frame_end_render = int(render_instance.frameEnd) - - if (int(context.data['frameStartHandle']) == frame_start_render + if (render_instance.ignoreFrameHandleCheck or + int(context.data['frameStartHandle']) == frame_start_render and int(context.data['frameEndHandle']) == frame_end_render): # noqa: W503, E501 handle_start = context.data['handleStart'] diff --git a/pype/lib/avalon_context.py b/pype/lib/avalon_context.py index a5728dba22..3d3a288b10 100644 --- a/pype/lib/avalon_context.py +++ b/pype/lib/avalon_context.py @@ -80,6 +80,7 @@ def any_outdated(): "database".format(**container)) checked.add(representation) + return False