Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Hiero: add support for task tags 3.10.x #3279

Merged
merged 2 commits into from
Jun 6, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions openpype/hosts/hiero/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
get_current_sequence,
get_timeline_selection,
get_current_track,
get_track_item_tags,
get_track_item_pype_tag,
set_track_item_pype_tag,
get_track_item_pype_data,
Expand Down Expand Up @@ -83,6 +84,7 @@
"get_current_sequence",
"get_timeline_selection",
"get_current_track",
"get_track_item_tags",
"get_track_item_pype_tag",
"set_track_item_pype_tag",
"get_track_item_pype_data",
Expand Down
25 changes: 25 additions & 0 deletions openpype/hosts/hiero/api/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,31 @@ def _validate_type_track_item():
])


def get_track_item_tags(track_item):
"""
Get track item tags excluded openpype tag

Attributes:
trackItem (hiero.core.TrackItem): hiero object

Returns:
hiero.core.Tag: hierarchy, orig clip attributes
"""
returning_tag_data = []
# get all tags from track item
_tags = track_item.tags()
if not _tags:
return []

# collect all tags which are not openpype tag
returning_tag_data.extend(
tag for tag in _tags
if tag.name() != self.pype_tag_name
)

return returning_tag_data


def get_track_item_pype_tag(track_item):
"""
Get pype track item tag created by creator or loader plugin.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@
class CollectClipTagTasks(api.InstancePlugin):
"""Collect Tags from selected track items."""

order = api.CollectorOrder
order = api.CollectorOrder - 0.077
label = "Collect Tag Tasks"
hosts = ["hiero"]
families = ['clip']
families = ["shot"]

def process(self, instance):
# gets tags
tags = instance.data["tags"]

tasks = dict()
tasks = {}
for tag in tags:
t_metadata = dict(tag.metadata())
t_family = t_metadata.get("tag.family", "")
Expand Down
5 changes: 4 additions & 1 deletion openpype/hosts/hiero/plugins/publish/precollect_instances.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,10 @@ def process(self, context):

# clip's effect
"clipEffectItems": subtracks,
"clipAnnotations": annotations
"clipAnnotations": annotations,

# add all additional tags
"tags": phiero.get_track_item_tags(track_item)
})

# otio clip data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import collections
import six
import pyblish.api

from copy import deepcopy
from openpype.pipeline import legacy_io

# Copy of constant `openpype_modules.ftrack.lib.avalon_sync.CUST_ATTR_AUTO_SYNC`
Expand Down Expand Up @@ -72,7 +72,8 @@ def process(self, context):
if "hierarchyContext" not in self.context.data:
return

hierarchy_context = self.context.data["hierarchyContext"]
hierarchy_context = self._get_active_assets(context)
self.log.debug("__ hierarchy_context: {}".format(hierarchy_context))

self.session = self.context.data["ftrackSession"]
project_name = self.context.data["projectEntity"]["name"]
Expand All @@ -86,15 +87,13 @@ def process(self, context):

self.ft_project = None

input_data = hierarchy_context

# disable termporarily ftrack project's autosyncing
if auto_sync_state:
self.auto_sync_off(project)

try:
# import ftrack hierarchy
self.import_to_ftrack(input_data)
self.import_to_ftrack(hierarchy_context)
except Exception:
raise
finally:
Expand Down Expand Up @@ -355,3 +354,41 @@ def auto_sync_on(self, project):
self.session.rollback()
self.session._configure_locations()
six.reraise(tp, value, tb)

def _get_active_assets(self, context):
""" Returns only asset dictionary.
Usually the last part of deep dictionary which
is not having any children
"""
def get_pure_hierarchy_data(input_dict):
input_dict_copy = deepcopy(input_dict)
for key in input_dict.keys():
self.log.debug("__ key: {}".format(key))
# check if child key is available
if input_dict[key].get("childs"):
# loop deeper
input_dict_copy[
key]["childs"] = get_pure_hierarchy_data(
input_dict[key]["childs"])
elif key not in active_assets:
input_dict_copy.pop(key, None)
return input_dict_copy

hierarchy_context = context.data["hierarchyContext"]

active_assets = []
# filter only the active publishing insatnces
for instance in context:
if instance.data.get("publish") is False:
continue

if not instance.data.get("asset"):
continue

active_assets.append(instance.data["asset"])

# remove duplicity in list
active_assets = list(set(active_assets))
self.log.debug("__ active_assets: {}".format(active_assets))

return get_pure_hierarchy_data(hierarchy_context)
4 changes: 0 additions & 4 deletions openpype/plugins/publish/collect_hierarchy.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,6 @@ def process(self, context):
family = instance.data["family"]
families = instance.data["families"]

# filter out all unepropriate instances
if not instance.data["publish"]:
continue

# exclude other families then self.families with intersection
if not set(self.families).intersection(set(families + [family])):
continue
Expand Down
70 changes: 34 additions & 36 deletions openpype/plugins/publish/extract_hierarchy_avalon.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from copy import deepcopy

import pyblish.api

from openpype.pipeline import legacy_io


Expand All @@ -17,33 +15,16 @@ def process(self, context):
if "hierarchyContext" not in context.data:
self.log.info("skipping IntegrateHierarchyToAvalon")
return
hierarchy_context = deepcopy(context.data["hierarchyContext"])

if not legacy_io.Session:
legacy_io.install()

active_assets = []
# filter only the active publishing insatnces
for instance in context:
if instance.data.get("publish") is False:
continue

if not instance.data.get("asset"):
continue

active_assets.append(instance.data["asset"])

# remove duplicity in list
self.active_assets = list(set(active_assets))
self.log.debug("__ self.active_assets: {}".format(self.active_assets))

hierarchy_context = self._get_assets(hierarchy_context)

hierarchy_context = self._get_active_assets(context)
self.log.debug("__ hierarchy_context: {}".format(hierarchy_context))
input_data = context.data["hierarchyContext"] = hierarchy_context

self.project = None
self.import_to_avalon(input_data)
self.import_to_avalon(hierarchy_context)


def import_to_avalon(self, input_data, parent=None):
for name in input_data:
Expand Down Expand Up @@ -183,23 +164,40 @@ def create_avalon_asset(self, name, data):

return legacy_io.find_one({"_id": entity_id})

def _get_assets(self, input_dict):
def _get_active_assets(self, context):
""" Returns only asset dictionary.
Usually the last part of deep dictionary which
is not having any children
"""
input_dict_copy = deepcopy(input_dict)

for key in input_dict.keys():
self.log.debug("__ key: {}".format(key))
# check if child key is available
if input_dict[key].get("childs"):
# loop deeper
input_dict_copy[key]["childs"] = self._get_assets(
input_dict[key]["childs"])
else:
# filter out unwanted assets
if key not in self.active_assets:
def get_pure_hierarchy_data(input_dict):
input_dict_copy = deepcopy(input_dict)
for key in input_dict.keys():
self.log.debug("__ key: {}".format(key))
# check if child key is available
if input_dict[key].get("childs"):
# loop deeper
input_dict_copy[
key]["childs"] = get_pure_hierarchy_data(
input_dict[key]["childs"])
elif key not in active_assets:
input_dict_copy.pop(key, None)
return input_dict_copy

hierarchy_context = context.data["hierarchyContext"]

active_assets = []
# filter only the active publishing insatnces
for instance in context:
if instance.data.get("publish") is False:
continue

if not instance.data.get("asset"):
continue

active_assets.append(instance.data["asset"])

# remove duplicity in list
active_assets = list(set(active_assets))
self.log.debug("__ active_assets: {}".format(active_assets))

return input_dict_copy
return get_pure_hierarchy_data(hierarchy_context)