diff --git a/pype/plugins/ftrack/publish/integrate_ftrack_instances.py b/pype/plugins/ftrack/publish/integrate_ftrack_instances.py index 492271d844..a815d9ff9b 100644 --- a/pype/plugins/ftrack/publish/integrate_ftrack_instances.py +++ b/pype/plugins/ftrack/publish/integrate_ftrack_instances.py @@ -26,7 +26,7 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): 'render': 'render', 'nukescript': 'comp', 'review': 'mov', - 'plates': 'img' + 'plate': 'img' } def process(self, instance): diff --git a/pype/plugins/global/publish/collect_assumed_destination.py b/pype/plugins/global/publish/collect_assumed_destination.py index a04933b8c6..46c68bc199 100644 --- a/pype/plugins/global/publish/collect_assumed_destination.py +++ b/pype/plugins/global/publish/collect_assumed_destination.py @@ -9,7 +9,7 @@ class CollectAssumedDestination(pyblish.api.ContextPlugin): label = "Collect Assumed Destination" order = pyblish.api.CollectorOrder + 0.498 - exclude_families = ["clip"] + exclude_families = ["plate"] def process(self, context): diff --git a/pype/plugins/nuke/load/load_sequence.py b/pype/plugins/nuke/load/load_sequence.py index 45e476554a..a757d929c5 100644 --- a/pype/plugins/nuke/load/load_sequence.py +++ b/pype/plugins/nuke/load/load_sequence.py @@ -75,8 +75,8 @@ def loader_shift(node, frame, relative=True): class LoadSequence(api.Loader): """Load image sequence into Nuke""" - families = ["write", "source", "plates"] - representations = ["exr", "dpx"] + families = ["write", "source", "plate"] + representations = ["exr", "dpx"] label = "Load sequence" order = -10 diff --git a/pype/plugins/nukestudio/publish/collect_clips.py b/pype/plugins/nukestudio/publish/collect_clips.py index e0bc7ed99f..b369504aa1 100644 --- a/pype/plugins/nukestudio/publish/collect_clips.py +++ b/pype/plugins/nukestudio/publish/collect_clips.py @@ -1,3 +1,4 @@ +import os from pyblish import api @@ -26,11 +27,19 @@ class CollectClips(api.ContextPlugin): source = item.source().mediaSource() source_path = source.firstpath() instance_name = "{0}_{1}".format(track.name(), item.name()) + + try: + head, padding, ext = os.path.basename(source_path).split('.') + source_first_frame = int(padding) + except: + source_first_frame = 0 + data[instance_name] = { "item": item, "source": source, "sourcePath": source_path, "track": track.name(), + "sourceFirst": source_first_frame, "sourceIn": int(item.sourceIn()), "sourceOut": int(item.sourceOut()), "startFrame": int(item.timelineIn()), @@ -47,6 +56,7 @@ class CollectClips(api.ContextPlugin): sourcePath=value["sourcePath"], family=family, families=[], + sourceFirst=value["sourceFirst"], sourceIn=value["sourceIn"], sourceOut=value["sourceOut"], startFrame=value["startFrame"], diff --git a/pype/plugins/nukestudio/publish/collect_handles.py b/pype/plugins/nukestudio/publish/collect_handles.py index c148550a1a..d5bea9da3e 100644 --- a/pype/plugins/nukestudio/publish/collect_handles.py +++ b/pype/plugins/nukestudio/publish/collect_handles.py @@ -1,6 +1,7 @@ import json from pyblish import api + class CollectClipHandles(api.InstancePlugin): """Collect Handles from selected track items.""" diff --git a/pype/plugins/nukestudio/publish/collect_hierarchy_context.py b/pype/plugins/nukestudio/publish/collect_hierarchy_context.py index 4426127eb4..d4046e8920 100644 --- a/pype/plugins/nukestudio/publish/collect_hierarchy_context.py +++ b/pype/plugins/nukestudio/publish/collect_hierarchy_context.py @@ -13,7 +13,7 @@ class CollectHierarchyInstance(pyblish.api.InstancePlugin): """ label = "Collect Hierarchy Clip" - order = pyblish.api.CollectorOrder + 0.1 + order = pyblish.api.CollectorOrder + 0.101 families = ["clip"] def convert_to_entity(self, key, value): @@ -170,6 +170,21 @@ class CollectHierarchyContext(pyblish.api.ContextPlugin): name = instance.data["asset"] + # get handles + handles = int(instance.data["handles"]) + handle_start = int(instance.data["handleStart"] + handles) + handle_end = int(instance.data["handleEnd"] + handles) + + # get source frames + source_first = int(instance.data["sourceFirst"]) + source_in = int(instance.data["sourceIn"]) + source_out = int(instance.data["sourceOut"]) + + instance.data['startFrame'] = int( + source_first + source_in - handle_start) + instance.data['endFrame'] = int( + (source_first + source_out + handle_end)) + # inject assetsSharedHierarchy to other plates types assets_shared = context.data.get("assetsSharedHierarchy") @@ -180,6 +195,8 @@ class CollectHierarchyContext(pyblish.api.ContextPlugin): instance.data["parents"] = s_asset_data["parents"] instance.data["hierarchy"] = s_asset_data["hierarchy"] + if "main" not in instance.data["name"]: + continue in_info = {} # suppose that all instances are Shots @@ -187,11 +204,24 @@ class CollectHierarchyContext(pyblish.api.ContextPlugin): # get custom attributes of the shot in_info['custom_attributes'] = { - 'fend': instance.data['endFrame'], - 'fstart': instance.data['startFrame'], + 'handles': int(instance.data.get('handles')), + 'fend': int( + (source_first + source_out)), + 'fstart': int( + source_first + source_in), 'fps': context.data["framerate"] } + # handle_start = instance.data.get('handleStart') + # handle_end = instance.data.get('handleEnd') + # self.log.debug("__ handle_start: {}".format(handle_start)) + # self.log.debug("__ handle_end: {}".format(handle_end)) + # if handle_start and handle_end: + # in_info['custom_attributes'].update({ + # "handle_start": handle_start, + # "handle_end": handle_end + # }) + in_info['tasks'] = instance.data['tasks'] parents = instance.data.get('parents', []) diff --git a/pype/plugins/nukestudio/publish/collect_plates.py b/pype/plugins/nukestudio/publish/collect_plates.py index 28012afece..1499ac2d33 100644 --- a/pype/plugins/nukestudio/publish/collect_plates.py +++ b/pype/plugins/nukestudio/publish/collect_plates.py @@ -8,12 +8,10 @@ class CollectPlates(api.InstancePlugin): order = api.CollectorOrder + 0.49 label = "Extract Plates" hosts = ["nukestudio"] - families = ["plates"] + families = ["plate"] def process(self, instance): import os - import hiero.core - # from hiero.ui.nuke_bridge import FnNsFrameServer # add to representations if not instance.data.get("representations"): @@ -34,10 +32,9 @@ class CollectPlates(api.InstancePlugin): source_file = os.path.basename(source_path) # staging dir creation - staging_dir = instance.data['stagingDir'] = os.path.dirname( + staging_dir = os.path.dirname( source_path) - item = instance.data["item"] # get handles @@ -61,7 +58,6 @@ class CollectPlates(api.InstancePlugin): timeline_frame_start = int(instance.data["timelineInHandles"]) timeline_frame_end = int(instance.data["timelineOutHandles"]) - # get colorspace colorspace = item.sourceMediaColourTransform() @@ -87,6 +83,12 @@ class CollectPlates(api.InstancePlugin): self.log.debug("__ source_file: {}".format(source_file)) self.log.debug("__ staging_dir: {}".format(staging_dir)) + self.log.debug("__ before family: {}".format(family)) + self.log.debug("__ before families: {}".format(families)) + # + # this is just workaround because 'clip' family is filtered + instance.data["family"] = families[-1] + instance.data["families"].append(family) # add to data of representation version_data.update({ @@ -101,8 +103,7 @@ class CollectPlates(api.InstancePlugin): "timelineOutHandles": timeline_frame_end, "fps": fps, "colorspace": colorspace, - "family": family, - "families": families, + "families": [f for f in families if 'ftrack' not in f], "asset": asset, "subset": name, "track": track, @@ -119,6 +120,8 @@ class CollectPlates(api.InstancePlugin): padding=padding, ext=ext ) + start_frame = source_first_frame + end_frame = source_first_frame + source_out files = [file % i for i in range( (source_first_frame + source_in_h), ((source_first_frame + source_out_h) + 1), 1)] @@ -127,7 +130,45 @@ class CollectPlates(api.InstancePlugin): head, ext = source_file.split('.') files = source_file + if isinstance(files, list): + mov_file = head + ".mov" + mov_path = os.path.normpath(os.path.join(staging_dir, mov_file)) + if os.path.exists(mov_path): + # adding mov into the representations + self.log.debug("__ mov_path: {}".format(mov_path)) + plates_mov_representation = { + 'files': mov_file, + 'stagingDir': staging_dir, + 'startFrame': start_frame, + 'endFrame': end_frame, + 'step': 1, + 'frameRate': fps, + 'preview': True, + 'thumbnail': False, + 'name': "preview", + 'ext': "mov", + } + instance.data["representations"].append( + plates_mov_representation) + # thumb_file = head + ".png" + # thumb_path = os.path.join(staging_dir, thumb_file) + # self.log.debug("__ thumb_path: {}".format(thumb_path)) + # thumbnail = item.thumbnail(timeline_in).save( + # thumb_path, + # format='png' + # ) + # self.log.debug("__ thumbnail: {}".format(thumbnail)) + # + # thumb_representation = { + # 'files': thumb_file, + # 'stagingDir': staging_dir, + # 'name': "thumbnail", + # 'thumbnail': True, + # 'ext': "png" + # } + # instance.data["representations"].append( + # thumb_representation) # adding representation for plates plates_representation = { @@ -138,11 +179,6 @@ class CollectPlates(api.InstancePlugin): } instance.data["representations"].append(plates_representation) - - # this is just workaround because 'clip' family is filtered - instance.data["family"] = families[-1] - instance.data["families"].append(family) - # testing families family = instance.data["family"] families = instance.data["families"] diff --git a/pype/plugins/nukestudio/publish/collect_subsets.py b/pype/plugins/nukestudio/publish/collect_subsets.py index 61a4a8322a..ddef6d80b6 100644 --- a/pype/plugins/nukestudio/publish/collect_subsets.py +++ b/pype/plugins/nukestudio/publish/collect_subsets.py @@ -40,6 +40,7 @@ class CollectClipSubsets(api.InstancePlugin): handle_end = int(instance.data["handleEnd"] + handles) # get source frames + source_first = int(instance.data["sourceFirst"]) source_in = int(instance.data["sourceIn"]) source_out = int(instance.data["sourceOut"]) @@ -56,9 +57,8 @@ class CollectClipSubsets(api.InstancePlugin): timeline_frame_end = timeline_out + handle_end # creating comp frame range - frame_start = instance.data["frameStart"] - handle_start - frame_end = frame_start + \ - (timeline_frame_end - timeline_frame_start) + frame_start = instance.data["frameStart"] + frame_end = frame_start + timeline_frame_end # get sequence from context, and fps sequence = context.data["activeSequence"] @@ -74,6 +74,7 @@ class CollectClipSubsets(api.InstancePlugin): sourcePath=instance.data.get("sourcePath"), family=family, families=families, + sourceFirst=source_first, sourceIn=source_in, sourceOut=source_out, sourceInH=source_in_h, @@ -121,6 +122,7 @@ class CollectClipSubsets(api.InstancePlugin): subsets_collect = dict() # iterate tags and collect subset properities from presets for task in tag_tasks: + self.log.info("__ task: {}".format(task)) try: # get host for task host = None @@ -201,6 +203,7 @@ class CollectClipSubsets(api.InstancePlugin): subs_data[sub]["nodes"][k].pop("presets") # add all into dictionary + self.log.info("__ subs_data[sub]: {}".format(subs_data[sub])) subs_data[sub]["task"] = task.lower() subsets_collect.update(subs_data)