Harmony Handles implementation

This commit is contained in:
Petr Kalis 2021-01-28 17:27:33 +01:00
parent e97f90854c
commit 05bd3efcff
7 changed files with 53 additions and 30 deletions

View file

@ -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);

View file

@ -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)

View file

@ -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"]
}

View file

@ -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.

View file

@ -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

View file

@ -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']

View file

@ -80,6 +80,7 @@ def any_outdated():
"database".format(**container))
checked.add(representation)
return False