mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
resolve some comments and add frame range validator
This commit is contained in:
parent
cc7f152404
commit
0c63b26915
11 changed files with 98 additions and 39 deletions
|
|
@ -548,7 +548,7 @@ def get_template_from_value(key, value):
|
|||
return parm
|
||||
|
||||
|
||||
def get_frame_data(self, node, asset_data=None):
|
||||
def get_frame_data(node, asset_data=None, log=None):
|
||||
"""Get the frame data: start frame, end frame and steps.
|
||||
|
||||
Args:
|
||||
|
|
@ -561,28 +561,31 @@ def get_frame_data(self, node, asset_data=None):
|
|||
if asset_data is None:
|
||||
asset_data = {}
|
||||
|
||||
if log is None:
|
||||
log = self.log
|
||||
|
||||
data = {}
|
||||
|
||||
if node.parm("trange") is None:
|
||||
self.log.debug(
|
||||
log.debug(
|
||||
"Node has no 'trange' parameter: {}".format(node.path())
|
||||
)
|
||||
return data
|
||||
|
||||
if node.evalParm("trange") == 0:
|
||||
self.log.debug(
|
||||
log.debug(
|
||||
"Node '{}' has 'Render current frame' set. "
|
||||
"Time range data ignored.".format(node.path())
|
||||
)
|
||||
return data
|
||||
|
||||
data["frameStartHandle"] = node.evalParm("f1")
|
||||
data["frameStart"] = node.evalParm("f1") + asset_data.get("handleStart", 0)
|
||||
data["handleStart"] = asset_data.get("handleStart", 0)
|
||||
data["frameStart"] = data["frameStartHandle"] + data["handleStart"]
|
||||
|
||||
data["frameEndHandle"] = node.evalParm("f2")
|
||||
data["frameEnd"] = node.evalParm("f2") - asset_data.get("handleEnd", 0)
|
||||
data["handleEnd"] = asset_data.get("handleEnd", 0)
|
||||
data["frameEnd"] = data["frameEndHandle"] - data["handleEnd"]
|
||||
|
||||
data["byFrameStep"] = node.evalParm("f3")
|
||||
|
||||
|
|
|
|||
|
|
@ -126,11 +126,8 @@ class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin):
|
|||
return path
|
||||
|
||||
expected_files = []
|
||||
start = instance.data.get("frameStartHandle") or \
|
||||
instance.data["frameStart"]
|
||||
|
||||
end = instance.data.get("frameEndHandle") or \
|
||||
instance.data["frameEnd"]
|
||||
start = instance.data.get("frameStartHandle")
|
||||
end = instance.data.get("frameEndHandle")
|
||||
|
||||
for i in range(int(start), (int(end) + 1)):
|
||||
expected_files.append(
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ class CollectInstanceNodeFrameRange(pyblish.api.InstancePlugin):
|
|||
return
|
||||
|
||||
asset_data = instance.context.data["assetEntity"]["data"]
|
||||
frame_data = lib.get_frame_data(self, node, asset_data)
|
||||
frame_data = lib.get_frame_data(node, asset_data, self.log)
|
||||
|
||||
if not frame_data:
|
||||
return
|
||||
|
|
|
|||
|
|
@ -102,4 +102,4 @@ class CollectInstances(pyblish.api.ContextPlugin):
|
|||
|
||||
"""
|
||||
|
||||
return lib.get_frame_data(self, node)
|
||||
return lib.get_frame_data(node)
|
||||
|
|
|
|||
|
|
@ -95,11 +95,8 @@ class CollectKarmaROPRenderProducts(pyblish.api.InstancePlugin):
|
|||
return path
|
||||
|
||||
expected_files = []
|
||||
start = instance.data.get("frameStartHandle") or \
|
||||
instance.data["frameStart"]
|
||||
|
||||
end = instance.data.get("frameEndHandle") or \
|
||||
instance.data["frameEnd"]
|
||||
start = instance.data.get("frameStartHandle")
|
||||
end = instance.data.get("frameEndHandle")
|
||||
|
||||
for i in range(int(start), (int(end) + 1)):
|
||||
expected_files.append(
|
||||
|
|
|
|||
|
|
@ -118,11 +118,8 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin):
|
|||
return path
|
||||
|
||||
expected_files = []
|
||||
start = instance.data.get("frameStartHandle") or \
|
||||
instance.data["frameStart"]
|
||||
|
||||
end = instance.data.get("frameEndHandle") or \
|
||||
instance.data["frameEnd"]
|
||||
start = instance.data.get("frameStartHandle")
|
||||
end = instance.data.get("frameEndHandle")
|
||||
|
||||
for i in range(int(start), (int(end) + 1)):
|
||||
expected_files.append(
|
||||
|
|
|
|||
|
|
@ -132,11 +132,8 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin):
|
|||
return path
|
||||
|
||||
expected_files = []
|
||||
start = instance.data.get("frameStartHandle") or \
|
||||
instance.data["frameStart"]
|
||||
|
||||
end = instance.data.get("frameEndHandle") or \
|
||||
instance.data["frameEnd"]
|
||||
start = instance.data.get("frameStartHandle")
|
||||
end = instance.data.get("frameEndHandle")
|
||||
|
||||
for i in range(int(start), (int(end) + 1)):
|
||||
expected_files.append(
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ class CollectRopFrameRange(pyblish.api.InstancePlugin):
|
|||
ropnode = hou.node(node_path)
|
||||
|
||||
asset_data = instance.context.data["assetEntity"]["data"]
|
||||
frame_data = lib.get_frame_data(self, ropnode, asset_data)
|
||||
frame_data = lib.get_frame_data(ropnode, asset_data, self.log)
|
||||
|
||||
if "frameStart" in frame_data and "frameEnd" in frame_data:
|
||||
|
||||
|
|
|
|||
|
|
@ -115,11 +115,8 @@ class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin):
|
|||
return path
|
||||
|
||||
expected_files = []
|
||||
start = instance.data.get("frameStartHandle") or \
|
||||
instance.data["frameStart"]
|
||||
|
||||
end = instance.data.get("frameEndHandle") or \
|
||||
instance.data["frameEnd"]
|
||||
start = instance.data.get("frameStartHandle")
|
||||
end = instance.data.get("frameEndHandle")
|
||||
|
||||
for i in range(int(start), (int(end) + 1)):
|
||||
expected_files.append(
|
||||
|
|
|
|||
|
|
@ -0,0 +1,75 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import pyblish.api
|
||||
from openpype.pipeline import PublishValidationError
|
||||
from openpype.pipeline.publish import RepairAction
|
||||
from openpype.hosts.houdini.api.action import SelectInvalidAction
|
||||
|
||||
import hou
|
||||
|
||||
|
||||
class HotFixAction(RepairAction):
|
||||
"""Set End frame to the minimum valid value."""
|
||||
|
||||
label = "End frame hotfix"
|
||||
|
||||
|
||||
class ValidateFrameRange(pyblish.api.InstancePlugin):
|
||||
"""Validate Frame Range.
|
||||
|
||||
Due to the usage of start and end handles,
|
||||
then Frame Range must be >= (start handle + end handle)
|
||||
which results that frameEnd be smaller than frameStart
|
||||
"""
|
||||
|
||||
order = pyblish.api.ValidatorOrder - 0.1
|
||||
hosts = ["houdini"]
|
||||
label = "Validate Frame Range"
|
||||
actions = [HotFixAction, SelectInvalidAction]
|
||||
|
||||
def process(self, instance):
|
||||
|
||||
invalid = self.get_invalid(instance)
|
||||
if invalid:
|
||||
nodes = [n.path() for n in invalid]
|
||||
raise PublishValidationError(
|
||||
"Invalid Frame Range on: {0}".format(nodes),
|
||||
title="Invalid Frame Range"
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def get_invalid(cls, instance):
|
||||
|
||||
if not instance.data.get("instance_node"):
|
||||
return
|
||||
|
||||
rop_node = hou.node(instance.data["instance_node"])
|
||||
if instance.data["frameStart"] > instance.data["frameEnd"]:
|
||||
cls.log.error(
|
||||
"Wrong frame range, please consider handle start and end.\n"
|
||||
"frameEnd should at least be {}.\n"
|
||||
"Use \"End frame hotfix\" action to do that."
|
||||
.format(
|
||||
instance.data["handleEnd"] +
|
||||
instance.data["handleStart"] +
|
||||
instance.data["frameStartHandle"]
|
||||
)
|
||||
)
|
||||
return [rop_node]
|
||||
|
||||
@classmethod
|
||||
def repair(cls, instance):
|
||||
rop_node = hou.node(instance.data["instance_node"])
|
||||
|
||||
frame_start = int(instance.data["frameStartHandle"])
|
||||
frame_end = int(
|
||||
instance.data["frameStartHandle"] +
|
||||
instance.data["handleStart"] +
|
||||
instance.data["handleEnd"]
|
||||
)
|
||||
|
||||
if rop_node.parm("f2").rawValue() == "$FEND":
|
||||
hou.playbar.setFrameRange(frame_start, frame_end)
|
||||
hou.playbar.setPlaybackRange(frame_start, frame_end)
|
||||
hou.setFrame(frame_start)
|
||||
else:
|
||||
rop_node.parm("f2").set(frame_end)
|
||||
|
|
@ -65,12 +65,8 @@ class HoudiniSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline):
|
|||
job_info.BatchName += datetime.now().strftime("%d%m%Y%H%M%S")
|
||||
|
||||
# Deadline requires integers in frame range
|
||||
start = instance.data.get("frameStartHandle") or \
|
||||
instance.data["frameStart"]
|
||||
|
||||
end = instance.data.get("frameEndHandle") or \
|
||||
instance.data["frameEnd"]
|
||||
|
||||
start = instance.data.get("frameStartHandle")
|
||||
end = instance.data.get("frameEndHandle")
|
||||
frames = "{start}-{end}x{step}".format(
|
||||
start=int(start),
|
||||
end=int(end),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue