From 464d6635f0cbb474af3275d4278f4d0bab17c958 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 25 May 2019 15:27:47 +0200 Subject: [PATCH 1/8] fix(nukestudio): wrong shot asset name build --- .../publish/collect_hierarchy_context.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pype/plugins/nukestudio/publish/collect_hierarchy_context.py b/pype/plugins/nukestudio/publish/collect_hierarchy_context.py index 09676c344a..f8fef24f81 100644 --- a/pype/plugins/nukestudio/publish/collect_hierarchy_context.py +++ b/pype/plugins/nukestudio/publish/collect_hierarchy_context.py @@ -41,7 +41,7 @@ class CollectHierarchyInstance(pyblish.api.InstancePlugin): data = { "sequence": context.data['activeSequence'].name().replace(' ', '_'), "track": clip.parent().name().replace(' ', '_'), - "shot": asset + "clip": asset } self.log.debug("__ data: {}".format(data)) @@ -65,16 +65,18 @@ class CollectHierarchyInstance(pyblish.api.InstancePlugin): # if shot in template then remove it if "shot" in template.lower(): + instance.data["asset"] = [t for t in template.split('/')][-1] template = "/".join([t for t in template.split('/')][0:-1]) # take template from Tag.note and break it into parts - patern = re.compile(r"^\{([a-z]*?)\}") + patern = re.compile(r"\{([a-z]*?)\}") par_split = [patern.findall(t)[0] for t in template.split("/")] # format all {} in two layers for k, v in t_metadata.items(): new_k = k.split(".")[1] + # self.log.info("__ new_k: `{}`".format(new_k)) try: # first try all data and context data to # add to individual properties @@ -82,9 +84,6 @@ class CollectHierarchyInstance(pyblish.api.InstancePlugin): **dict(context.data, **data)) d_metadata[new_k] = new_v - if 'shot' in new_k: - instance.data["asset"] = new_v - # create parents # find matching index of order p_match_i = [i for i, p in enumerate(par_split) @@ -97,6 +96,10 @@ class CollectHierarchyInstance(pyblish.api.InstancePlugin): except Exception: d_metadata[new_k] = v + # create new shot asset name + instance.data["asset"] = instance.data["asset"].format( + **d_metadata) + # lastly fill those individual properties itno # format the string with collected data hierarchy = template.format( @@ -105,7 +108,6 @@ class CollectHierarchyInstance(pyblish.api.InstancePlugin): # check if hierarchy attribute is already created # it should not be so return warning if it is hd = instance.data.get("hierarchy") - self.log.info("__ hd: {}".format(hd)) assert not hd, "Only one Hierarchy Tag is \ allowed. Clip: `{}`".format(asset) @@ -143,7 +145,6 @@ class CollectHierarchyContext(pyblish.api.ContextPlugin): if 'projectfile' in instance.data.get('family', ''): continue - in_info = {} name = instance.data["asset"] # suppose that all instances are Shots From d1b6defe18a9706a4abf56d8405fcbffb4061044 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 25 May 2019 16:38:29 +0200 Subject: [PATCH 2/8] feat(nuke): adding set_frame_range with handles and irregular handles --- pype/nuke/lib.py | 102 ++++++++++++++++++++++++++++++++++------------ pype/nuke/menu.py | 14 ++++++- 2 files changed, 88 insertions(+), 28 deletions(-) diff --git a/pype/nuke/lib.py b/pype/nuke/lib.py index 06735fc8b0..1ceb075cb9 100644 --- a/pype/nuke/lib.py +++ b/pype/nuke/lib.py @@ -335,6 +335,54 @@ def set_colorspace(): "contact your supervisor!") +def reset_frame_range_handles(): + """Set frame range to current asset""" + + fps = float(api.Session.get("AVALON_FPS", 25)) + nuke.root()["fps"].setValue(fps) + name = api.Session["AVALON_ASSET"] + asset = io.find_one({"name": name, "type": "asset"}) + + if "data" not in asset: + msg = "Asset {} don't have set any 'data'".format(name) + log.warning(msg) + nuke.message(msg) + return + data = asset["data"] + + missing_cols = [] + check_cols = ["fstart", "fend"] + + for col in check_cols: + if col not in data: + missing_cols.append(col) + + if len(missing_cols) > 0: + missing = ", ".join(missing_cols) + msg = "'{}' are not set for asset '{}'!".format(missing, name) + log.warning(msg) + nuke.message(msg) + return + + # get handles values + handles = avalon.nuke.get_handles(asset) + handle_start, handle_end = pype.get_handle_irregular(asset) + + edit_in = int(asset["data"]["fstart"]) - handles - handle_start + edit_out = int(asset["data"]["fend"]) + handles + handle_end + + nuke.root()["first_frame"].setValue(edit_in) + nuke.root()["last_frame"].setValue(edit_out) + + # setting active viewers + vv = nuke.activeViewer().node() + vv['frame_range_lock'].setValue(True) + vv['frame_range'].setValue('{0}-{1}'.format( + int(asset["data"]["fstart"]), + int(asset["data"]["fend"])) + ) + + def get_avalon_knob_data(node): import toml try: @@ -451,33 +499,33 @@ def make_format(**args): # TODO: bellow functions are wip and needs to be check where they are used # ------------------------------------ - -def update_frame_range(start, end, root=None): - """Set Nuke script start and end frame range - - Args: - start (float, int): start frame - end (float, int): end frame - root (object, Optional): root object from nuke's script - - Returns: - None - - """ - - knobs = { - "first_frame": start, - "last_frame": end - } - - with avalon.nuke.viewer_update_and_undo_stop(): - for key, value in knobs.items(): - if root: - root[key].setValue(value) - else: - nuke.root()[key].setValue(value) - -# +# +# def update_frame_range(start, end, root=None): +# """Set Nuke script start and end frame range +# +# Args: +# start (float, int): start frame +# end (float, int): end frame +# root (object, Optional): root object from nuke's script +# +# Returns: +# None +# +# """ +# +# knobs = { +# "first_frame": start, +# "last_frame": end +# } +# +# with avalon.nuke.viewer_update_and_undo_stop(): +# for key, value in knobs.items(): +# if root: +# root[key].setValue(value) +# else: +# nuke.root()[key].setValue(value) +# +# # # def get_additional_data(container): # """Get Nuke's related data for the container # diff --git a/pype/nuke/menu.py b/pype/nuke/menu.py index 1fb38e389d..fa50f69fa3 100644 --- a/pype/nuke/menu.py +++ b/pype/nuke/menu.py @@ -17,5 +17,17 @@ def install(): menu.removeItem(rm_item[1].name()) menu.addCommand(rm_item[1].name(), lib.reset_resolution, index=rm_item[0]) + # replace reset resolution from avalon core to pype's + name = "Reset Frame Range" + rm_item = [(i, item) + for i, item in enumerate(menu.items()) + if name in item.name()][0] + menu.removeItem(rm_item[1].name()) + menu.addCommand( + rm_item[1].name(), + lib.reset_frame_range_handles, + index=rm_item[0]) + # add colorspace menu item - menu.addCommand("Set colorspace...", lib.set_colorspace, index=rm_item[0]+1) + menu.addCommand("Set colorspace...", lib.set_colorspace, + index=rm_item[0] + 1) From dadbffaee5cec64a476e265995425750b7f46c98 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 25 May 2019 16:38:43 +0200 Subject: [PATCH 3/8] feat(pype): adding set_frame_range with handles and irregular handles --- pype/api.py | 2 ++ pype/lib.py | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/pype/api.py b/pype/api.py index 83d52cbc03..1ab7a91955 100644 --- a/pype/api.py +++ b/pype/api.py @@ -39,6 +39,7 @@ from .templates import ( ) from .lib import ( + get_handle_irregular, get_project_data, get_asset_data, modified_environ, @@ -67,6 +68,7 @@ __all__ = [ "reset_data_from_templates", # get contextual data + "get_handle_irregular", "get_project_data", "get_asset_data", "get_project_name", diff --git a/pype/lib.py b/pype/lib.py index 176ef45967..1a140a5a07 100644 --- a/pype/lib.py +++ b/pype/lib.py @@ -15,6 +15,13 @@ import avalon log = logging.getLogger(__name__) +def get_handle_irregular(asset): + data = asset["data"] + handle_start = data.get("handle_start", 0) + handle_end = asset.get("handle_end", 0) + return (handle_start, handle_end) + + def add_tool_to_environment(tools): """ It is adding dynamic environment to os environment. From 2955ba181f37fc7b4e92bdfc53f1f8c0c90a4811 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 25 May 2019 16:39:39 +0200 Subject: [PATCH 4/8] fix(nukestudio): importing at top --- pype/nukestudio/lib.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pype/nukestudio/lib.py b/pype/nukestudio/lib.py index 4c7dffdb38..06320f2717 100644 --- a/pype/nukestudio/lib.py +++ b/pype/nukestudio/lib.py @@ -5,17 +5,16 @@ import sys # Pyblish libraries import pyblish.api -# Host libraries -import hiero - -from pypeapp import Logger -log = Logger().get_logger(__name__, "nukestudio") - import avalon.api as avalon import pype.api as pype from avalon.vendor.Qt import (QtWidgets, QtGui) +# Host libraries +import hiero + +from pypeapp import Logger +log = Logger().get_logger(__name__, "nukestudio") cached_process = None From 4be7396a615af473626c3d4bf103580a036bd504 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 25 May 2019 16:40:05 +0200 Subject: [PATCH 5/8] feat(nukestudio): collecting project data from db --- .../global/publish/collect_project_data.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 pype/plugins/global/publish/collect_project_data.py diff --git a/pype/plugins/global/publish/collect_project_data.py b/pype/plugins/global/publish/collect_project_data.py new file mode 100644 index 0000000000..0e9a64af81 --- /dev/null +++ b/pype/plugins/global/publish/collect_project_data.py @@ -0,0 +1,16 @@ +import pyblish.api +import pype.api as pype + + + +class CollectProjectData(pyblish.api.ContextPlugin): + """Collecting project data from avalon db""" + + label = "Collect Project Data" + order = pyblish.api.CollectorOrder + + def process(self, context): + # get project data from avalon db + context.data["projectData"] = pype.get_project_data() + + return From 6a2f94ee9caff979460152e1fd38473267b2be18 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 25 May 2019 16:40:58 +0200 Subject: [PATCH 6/8] fix(pype): redistributing plugins to correct folders --- .../{nukestudio => ftrack}/publish/integrate_hierarchy_ftrack.py | 0 .../publish/integrate_assumed_destination.py | 0 .../publish/integrate_ftrack_component_overwrite.py | 0 .../{nukestudio => global}/publish/integrate_hierarchy_avalon.py | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename pype/plugins/{nukestudio => ftrack}/publish/integrate_hierarchy_ftrack.py (100%) rename pype/plugins/{nukestudio => global}/publish/integrate_assumed_destination.py (100%) rename pype/plugins/{nukestudio => global}/publish/integrate_ftrack_component_overwrite.py (100%) rename pype/plugins/{nukestudio => global}/publish/integrate_hierarchy_avalon.py (100%) diff --git a/pype/plugins/nukestudio/publish/integrate_hierarchy_ftrack.py b/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py similarity index 100% rename from pype/plugins/nukestudio/publish/integrate_hierarchy_ftrack.py rename to pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py diff --git a/pype/plugins/nukestudio/publish/integrate_assumed_destination.py b/pype/plugins/global/publish/integrate_assumed_destination.py similarity index 100% rename from pype/plugins/nukestudio/publish/integrate_assumed_destination.py rename to pype/plugins/global/publish/integrate_assumed_destination.py diff --git a/pype/plugins/nukestudio/publish/integrate_ftrack_component_overwrite.py b/pype/plugins/global/publish/integrate_ftrack_component_overwrite.py similarity index 100% rename from pype/plugins/nukestudio/publish/integrate_ftrack_component_overwrite.py rename to pype/plugins/global/publish/integrate_ftrack_component_overwrite.py diff --git a/pype/plugins/nukestudio/publish/integrate_hierarchy_avalon.py b/pype/plugins/global/publish/integrate_hierarchy_avalon.py similarity index 100% rename from pype/plugins/nukestudio/publish/integrate_hierarchy_avalon.py rename to pype/plugins/global/publish/integrate_hierarchy_avalon.py From 104b62861b38bbbc62a15aecc70a635afef4c736 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 25 May 2019 16:41:56 +0200 Subject: [PATCH 7/8] feat(nukestudio): collecting handles from tags --- .../nukestudio/publish/collect_handles.py | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 pype/plugins/nukestudio/publish/collect_handles.py diff --git a/pype/plugins/nukestudio/publish/collect_handles.py b/pype/plugins/nukestudio/publish/collect_handles.py new file mode 100644 index 0000000000..cb20f97442 --- /dev/null +++ b/pype/plugins/nukestudio/publish/collect_handles.py @@ -0,0 +1,52 @@ +import json +from pyblish import api + +class CollectClipHandles(api.InstancePlugin): + """Collect Handles from selected track items.""" + + order = api.CollectorOrder + 0.006 + label = "Collect Handles" + hosts = ["nukestudio"] + families = ['clip'] + + def process(self, instance): + # gets tags + tags = instance.data["tags"] + + for t in tags: + t_metadata = dict(t["metadata"]) + t_family = t_metadata.get("tag.family", "") + + # gets only task family tags and collect labels + if "handles" in t_family: + # gets value of handles + t_value = int(t_metadata.get("tag.value", "")) + + # gets arguments if there are any + t_args = t_metadata.get("tag.args", "") + + # distribute handles + if not t_args: + # add handles to both sides + instance.data['handles'] = t_value + self.log.info("Collected Handles: `{}`".format( + instance.data['handles'])) + else: + t_args = json.loads(t_args.replace("'", "\"")) + # add in start + if 'start' in t_args['where']: + hs = instance.data.get('handle_start') + if not hs: + instance.data['handle_start'] = 0 + instance.data['handle_start'] += t_value + self.log.info("Collected Handle Start: `{}`".format( + instance.data['handle_start'])) + + # add in end + if 'end' in t_args['where']: + hs = instance.data.get('handle_end') + if not hs: + instance.data['handle_end'] = 0 + instance.data['handle_end'] += t_value + self.log.info("Collected Handle End: `{}`".format( + instance.data['handle_end'])) From c450e38858acfefcdf69184afd5b6ba093d3fa6c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 25 May 2019 16:42:30 +0200 Subject: [PATCH 8/8] fix(nukestudio): getting default handles from project data db --- pype/plugins/nukestudio/publish/collect_clips.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pype/plugins/nukestudio/publish/collect_clips.py b/pype/plugins/nukestudio/publish/collect_clips.py index 6d443c03ec..117ceea603 100644 --- a/pype/plugins/nukestudio/publish/collect_clips.py +++ b/pype/plugins/nukestudio/publish/collect_clips.py @@ -9,9 +9,10 @@ class CollectClips(api.ContextPlugin): hosts = ["nukestudio"] def process(self, context): + projectdata = context.data["projectData"] data = {} for item in context.data.get("selection", []): - self.log.info("__ item: {}".format(item)) + self.log.debug("__ item: {}".format(item)) # Skip audio track items # Try/Except is to handle items types, like EffectTrackItem try: @@ -37,5 +38,5 @@ class CollectClips(api.ContextPlugin): family=family, startFrame=value["startFrame"], endFrame=value["endFrame"], - handles=0 + handles=projectdata['handles'] )