From 9eb7dc3d150435902d05192c3cc2ddaf570dfc6c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 21 Aug 2019 16:15:09 +0200 Subject: [PATCH] fix(nks): refactoring way clips and effects are collected --- .../nukestudio/publish/collect_clips.py | 193 +++++++++--------- 1 file changed, 99 insertions(+), 94 deletions(-) diff --git a/pype/plugins/nukestudio/publish/collect_clips.py b/pype/plugins/nukestudio/publish/collect_clips.py index 86a28aae48..7a400909fd 100644 --- a/pype/plugins/nukestudio/publish/collect_clips.py +++ b/pype/plugins/nukestudio/publish/collect_clips.py @@ -21,108 +21,113 @@ class CollectClips(api.ContextPlugin): projectdata = context.data["projectData"] version = context.data.get("version", "001") sequence = context.data.get("activeSequence") - instances_data = [] + selection = context.data.get("selection") - # get all subTrackItems and add it to context - effects_on_tracks = [] - sub_track_items = [] + track_effects = dict() - # looop trough all tracks and search for subtreacks + # collect all trackItems as instances for track_index, video_track in enumerate(sequence.videoTracks()): + items = video_track.items() sub_items = video_track.subTrackItems() - if not sub_items: - continue - for si in sub_items: - selected_track = [(indx, vt) for indx, vt in enumerate(sequence.videoTracks()) - if vt.name() in si[0].parentTrack().name()] - # if filtered track index is the same as \ - # actual track there is match - if (selected_track[0][0] == track_index): - sub_track_items += si - if (track_index not in effects_on_tracks): - effects_on_tracks.append(track_index) - - # add it to context - context.data["subTrackUsedTracks"] = effects_on_tracks - context.data["subTrackItems"] = sub_track_items - - for item in context.data.get("selection", []): - # Skip audio track items - # Try/Except is to handle items types, like EffectTrackItem - try: - media_type = "core.Hiero.Python.TrackItem.MediaType.kVideo" - if str(item.mediaType()) != media_type: + for item in items: + # compare with selection or if disabled + if item not in selection or not item.isEnabled(): continue - except Exception: + + # Skip audio track items + # Try/Except is to handle items types, like EffectTrackItem + try: + media_type = "core.Hiero.Python.TrackItem.MediaType.kVideo" + if str(item.mediaType()) != media_type: + continue + except Exception: + continue + + asset = item.name() + track = item.parent() + source = item.source().mediaSource() + source_path = source.firstpath() + effects = [f for f in item.linkedItems() if f.isEnabled()] + + # If source is *.nk its a comp effect and we need to fetch the + # write node output. This should be improved by parsing the script + # rather than opening it. + if source_path.endswith(".nk"): + nuke.scriptOpen(source_path) + # There should noly be one. + write_node = nuke.allNodes(filter="Write")[0] + path = nuke.filename(write_node) + + if "%" in path: + # Get start frame from Nuke script and use the item source + # in/out, because you can have multiple shots covered with + # one nuke script. + start_frame = int(nuke.root()["first_frame"].getValue()) + if write_node["use_limit"].getValue(): + start_frame = int(write_node["first"].getValue()) + + path = path % (start_frame + item.sourceIn()) + + source_path = path + self.log.debug( + "Fetched source path \"{}\" from \"{}\" in " + "\"{}\".".format( + source_path, write_node.name(), source.firstpath() + ) + ) + + try: + head, padding, ext = os.path.basename(source_path).split(".") + source_first_frame = int(padding) + except Exception: + source_first_frame = 0 + + data = {"name": "{0}_{1}".format(track.name(), item.name()), + "item": item, + "source": source, + "sourcePath": source_path, + "track": track.name(), + "trackIndex": track_index, + "sourceFirst": source_first_frame, + "effects": effects, + "sourceIn": int(item.sourceIn()), + "sourceOut": int(item.sourceOut()), + "clipIn": int(item.timelineIn()), + "clipOut": int(item.timelineOut()), + "asset": asset, + "family": "clip", + "families": [], + "handles": 0, + "handleStart": projectdata.get("handles", 0), + "handleEnd": projectdata.get("handles", 0), + "version": int(version)} + + instance = context.create_instance(**data) + + self.log.info("Created instance: {}".format(instance)) + self.log.debug(">> effects: {}".format(instance.data["effects"])) + + context.data["assetsShared"][asset] = dict() + + # from now we are collecting only subtrackitems on + # track with no video items + if len(items) > 0: continue - track = item.parent() - source = item.source().mediaSource() - source_path = source.firstpath() + # create list in track key + # get all subTrackItems and add it to context + track_effects[track_index] = list() - # If source is *.nk its a comp effect and we need to fetch the - # write node output. This should be improved by parsing the script - # rather than opening it. - if source_path.endswith(".nk"): - nuke.scriptOpen(source_path) - # There should noly be one. - write_node = nuke.allNodes(filter="Write")[0] - path = nuke.filename(write_node) + # collect all subtrack items + for sitem in sub_items: + # unwrap from tuple >> it is always tuple with one item + sitem = sitem[0] + # checking if not enabled + if not sitem.isEnabled(): + continue - if "%" in path: - # Get start frame from Nuke script and use the item source - # in/out, because you can have multiple shots covered with - # one nuke script. - start_frame = int(nuke.root()["first_frame"].getValue()) - if write_node["use_limit"].getValue(): - start_frame = int(write_node["first"].getValue()) + track_effects[track_index].append(sitem) - path = path % (start_frame + item.sourceIn()) - - source_path = path - self.log.debug( - "Fetched source path \"{}\" from \"{}\" in " - "\"{}\".".format( - source_path, write_node.name(), source.firstpath() - ) - ) - - try: - head, padding, ext = os.path.basename(source_path).split(".") - source_first_frame = int(padding) - except Exception: - source_first_frame = 0 - - instances_data.append( - { - "name": "{0}_{1}".format(track.name(), item.name()), - "item": item, - "source": source, - "sourcePath": source_path, - "track": track.name(), - "sourceFirst": source_first_frame, - "sourceIn": int(item.sourceIn()), - "sourceOut": int(item.sourceOut()), - "clipIn": int(item.timelineIn()), - "clipOut": int(item.timelineOut()) - } - ) - - for data in instances_data: - data.update( - { - "asset": data["item"].name(), - "family": "clip", - "families": [], - "handles": 0, - "handleStart": projectdata.get("handles", 0), - "handleEnd": projectdata.get("handles", 0), - "version": int(version) - } - ) - instance = context.create_instance(**data) - self.log.debug( - "Created instance with data: {}".format(instance.data) - ) - context.data["assetsShared"][data["asset"]] = dict() + context.data["trackEffects"] = track_effects + self.log.debug(">> sub_track_items: `{}`".format(track_effects))