Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nuke: resolve hashes in file name only for frame token #4074

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
72 changes: 42 additions & 30 deletions openpype/hosts/nuke/plugins/load/load_clip.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import os
import nuke
import qargparse

from pprint import pformat
from copy import deepcopy
from openpype.lib import Logger
from openpype.client import (
get_version_by_id,
get_last_version_by_subset_id,
Expand All @@ -28,6 +29,7 @@ class LoadClip(plugin.NukeLoader):

Either it is image sequence or video file.
"""
log = Logger.get_logger(__name__)

families = [
"source",
Expand Down Expand Up @@ -85,24 +87,19 @@ def get_representations(cls):
+ plugin.get_review_presets_config()
)

def _fix_path_for_knob(self, filepath, repre_cont):
basename = os.path.basename(filepath)
dirname = os.path.dirname(filepath)
frame = repre_cont.get("frame")
assert frame, "Representation is not sequence"

padding = len(str(frame))
basename = basename.replace(frame, "#" * padding)
return os.path.join(dirname, basename).replace("\\", "/")

def load(self, context, name, namespace, options):
repre = context["representation"]
representation = context["representation"]
# reste container id so it is always unique for each instance
self.reset_container_id()

is_sequence = len(repre["files"]) > 1
is_sequence = len(representation["files"]) > 1

filepath = self.fname.replace("\\", "/")
if is_sequence:
representation = self._representation_with_hash_in_frame(
representation
)
filepath = get_representation_path(representation).replace("\\", "/")
self.log.debug("_ filepath: {}".format(filepath))

start_at_workfile = options.get(
"start_at_workfile", self.options_defaults["start_at_workfile"])
Expand All @@ -112,11 +109,10 @@ def load(self, context, name, namespace, options):

version = context['version']
version_data = version.get("data", {})
repre_id = repre["_id"]

repre_cont = repre["context"]
repre_id = representation["_id"]

self.log.info("version_data: {}\n".format(version_data))
self.log.debug("_ version_data: {}\n".format(
pformat(version_data)))
self.log.debug(
"Representation id `{}` ".format(repre_id))

Expand All @@ -132,8 +128,6 @@ def load(self, context, name, namespace, options):
duration = last - first
first = 1
last = first + duration
elif "#" not in filepath:
filepath = self._fix_path_for_knob(filepath, repre_cont)

# Fallback to asset name when namespace is None
if namespace is None:
Expand All @@ -144,7 +138,7 @@ def load(self, context, name, namespace, options):
"Representation id `{}` is failing to load".format(repre_id))
return

read_name = self._get_node_name(repre)
read_name = self._get_node_name(representation)

# Create the Loader with the filename path set
read_node = nuke.createNode(
Expand All @@ -157,7 +151,7 @@ def load(self, context, name, namespace, options):
read_node["file"].setValue(filepath)

used_colorspace = self._set_colorspace(
read_node, version_data, repre["data"])
read_node, version_data, representation["data"])

self._set_range_to_node(read_node, first, last, start_at_workfile)

Expand All @@ -179,7 +173,7 @@ def load(self, context, name, namespace, options):
data_imprint[k] = version

elif k == 'colorspace':
colorspace = repre["data"].get(k)
colorspace = representation["data"].get(k)
colorspace = colorspace or version_data.get(k)
data_imprint["db_colorspace"] = colorspace
if used_colorspace:
Expand Down Expand Up @@ -213,6 +207,20 @@ def load(self, context, name, namespace, options):
def switch(self, container, representation):
self.update(container, representation)

def _representation_with_hash_in_frame(self, representation):
"""Convert frame key value to padded hash

Args:
representation (dict): representation data

Returns:
dict: altered representation data
"""
representation = deepcopy(representation)
frame = representation["context"]["frame"]
representation["context"]["frame"] = "#" * len(str(frame))
return representation

def update(self, container, representation):
"""Update the Loader's path

Expand All @@ -225,7 +233,13 @@ def update(self, container, representation):
is_sequence = len(representation["files"]) > 1

read_node = nuke.toNode(container['objectName'])

if is_sequence:
representation = self._representation_with_hash_in_frame(
representation
)
filepath = get_representation_path(representation).replace("\\", "/")
self.log.debug("_ filepath: {}".format(filepath))

start_at_workfile = "start at" in read_node['frame_mode'].value()

Expand All @@ -240,8 +254,6 @@ def update(self, container, representation):
version_data = version_doc.get("data", {})
repre_id = representation["_id"]

repre_cont = representation["context"]

# colorspace profile
colorspace = representation["data"].get("colorspace")
colorspace = colorspace or version_data.get("colorspace")
Expand All @@ -258,8 +270,6 @@ def update(self, container, representation):
duration = last - first
first = 1
last = first + duration
elif "#" not in filepath:
filepath = self._fix_path_for_knob(filepath, repre_cont)

if not filepath:
self.log.warning(
Expand Down Expand Up @@ -348,8 +358,10 @@ def _make_retimes(self, parent_node, version_data):
time_warp_nodes = version_data.get('timewarps', [])
last_node = None
source_id = self.get_container_id(parent_node)
self.log.info("__ source_id: {}".format(source_id))
self.log.info("__ members: {}".format(self.get_members(parent_node)))
self.log.debug("__ source_id: {}".format(source_id))
self.log.debug("__ members: {}".format(
self.get_members(parent_node)))

dependent_nodes = self.clear_members(parent_node)

with maintained_selection():
Expand Down