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

Hiero: loading effect family to timeline #4055

Merged
merged 27 commits into from
Nov 21, 2022
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
57b81b4
hiero: loading effects
jakubjezek001 Oct 28, 2022
0b577dc
Merge branch 'develop' into feature/OP-4201_Load-effectPlates-from-Hiero
jakubjezek001 Oct 28, 2022
b04fc48
hiero: fix - skip audio in collect effects
jakubjezek001 Oct 28, 2022
21a3d20
hiero: load effects update
jakubjezek001 Oct 28, 2022
49ebb5a
hiero: abstraction for effect loader tag operations
jakubjezek001 Oct 31, 2022
dcf4688
hiero: renaming functions, with backward compatibility
jakubjezek001 Oct 31, 2022
a9ab5ba
hiero: improving bckw compatibility after rename
jakubjezek001 Oct 31, 2022
04d1016
hiero: update api
jakubjezek001 Oct 31, 2022
66571cc
hiero: update parse_container and ls to new functionality
jakubjezek001 Oct 31, 2022
25b61d3
hiero: refactor plugin to new abstracted functionality
jakubjezek001 Oct 31, 2022
b12bb87
hiero: refactor update container function
jakubjezek001 Oct 31, 2022
4ab8fd1
hiero: updating doc strings
jakubjezek001 Oct 31, 2022
65e7c45
hiero: wip updating effect containers
jakubjezek001 Oct 31, 2022
17125a6
hiero: adding fallback if incompatible knobs from version to version
jakubjezek001 Oct 31, 2022
72ce97a
general: fixing loader for multiselection
jakubjezek001 Nov 1, 2022
3dd115f
hiero: return specific container name
jakubjezek001 Nov 1, 2022
3936925
hiero: deep copy dicts
jakubjezek001 Nov 1, 2022
5b77f92
hiero: removing obsolete code
jakubjezek001 Nov 1, 2022
8c715a9
hiero: update effects finish
jakubjezek001 Nov 1, 2022
8e0f298
Merge branch 'develop' into feature/OP-4201_Load-effectPlates-from-Hiero
jakubjezek001 Nov 1, 2022
f3b038e
hiero: removing unused attribute
jakubjezek001 Nov 1, 2022
3ee3865
hiero: adding animated knobs also making track per subset
jakubjezek001 Nov 9, 2022
756bb9d
hiero: improving management of versions
jakubjezek001 Nov 9, 2022
ddd4e65
hiero: unification of openpype tags
jakubjezek001 Nov 10, 2022
c5d3e8a
hiero: loading effects not able delete previous nodes
jakubjezek001 Nov 10, 2022
69ddc20
include secrets module to python_2 vendor
jakubjezek001 Nov 18, 2022
e81fd2d
Merge branch 'develop' into feature/OP-4201_Load-effectPlates-from-Hiero
jakubjezek001 Nov 18, 2022
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
19 changes: 16 additions & 3 deletions openpype/hosts/hiero/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,15 @@
get_timeline_selection,
get_current_track,
get_track_item_tags,
get_track_openpype_tag,
set_track_openpype_tag,
get_track_openpype_data,
get_track_item_pype_tag,
set_track_item_pype_tag,
get_track_item_pype_data,
get_trackitem_openpype_tag,
set_trackitem_openpype_tag,
get_trackitem_openpype_data,
set_publish_attribute,
get_publish_attribute,
imprint,
Expand Down Expand Up @@ -85,9 +91,12 @@
"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",
"get_track_openpype_tag",
"set_track_openpype_tag",
"get_track_openpype_data",
"get_trackitem_openpype_tag",
"set_trackitem_openpype_tag",
"get_trackitem_openpype_data",
"set_publish_attribute",
"get_publish_attribute",
"imprint",
Expand All @@ -99,6 +108,10 @@
"apply_colorspace_project",
"apply_colorspace_clips",
"get_sequence_pattern_and_padding",
# depricated
"get_track_item_pype_tag",
"set_track_item_pype_tag",
"get_track_item_pype_data",

# plugins
"CreatorWidget",
Expand Down
203 changes: 174 additions & 29 deletions openpype/hosts/hiero/api/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@
import re
import sys
import platform
import functools
import warnings
import json
import ast
import shutil
import hiero

from Qt import QtWidgets
from Qt import QtWidgets, QtCore, QtXml

from openpype.client import get_project
from openpype.settings import get_project_settings
Expand All @@ -20,15 +23,51 @@
from openpype.lib import Logger
from . import tags

try:
from PySide.QtCore import QFile, QTextStream
from PySide.QtXml import QDomDocument
except ImportError:
from PySide2.QtCore import QFile, QTextStream
from PySide2.QtXml import QDomDocument

# from opentimelineio import opentime
# from pprint import pformat
class DeprecatedWarning(DeprecationWarning):
pass


def deprecated(new_destination):
"""Mark functions as deprecated.

It will result in a warning being emitted when the function is used.
"""

func = None
if callable(new_destination):
func = new_destination
new_destination = None

def _decorator(decorated_func):
if new_destination is None:
warning_message = (
" Please check content of deprecated function to figure out"
" possible replacement."
)
else:
warning_message = " Please replace your usage with '{}'.".format(
new_destination
)

@functools.wraps(decorated_func)
def wrapper(*args, **kwargs):
warnings.simplefilter("always", DeprecatedWarning)
warnings.warn(
(
"Call to deprecated function '{}'"
"\nFunction was moved or removed.{}"
).format(decorated_func.__name__, warning_message),
category=DeprecatedWarning,
stacklevel=4
)
return decorated_func(*args, **kwargs)
return wrapper

if func is None:
return _decorator
return _decorator(func)


log = Logger.get_logger(__name__)

Expand Down Expand Up @@ -301,7 +340,41 @@ def get_track_item_tags(track_item):
return returning_tag_data


def get_track_item_pype_tag(track_item):
def set_track_openpype_tag(track, data=None):
"""
Set openpype track tag to input track object.

Attributes:
track (hiero.core.VideoTrack): hiero object

Returns:
hiero.core.Tag
"""
data = data or {}

# basic Tag's attribute
tag_data = {
"editable": "0",
"note": "OpenPype data container",
"icon": "openpype_icon.png",
"metadata": dict(data.items())
}
# get available pype tag if any
_tag = get_track_openpype_tag(track)

if _tag:
# it not tag then create one
tag = tags.update_tag(_tag, tag_data)
else:
# if pype tag available then update with input data
tag = tags.create_tag(self.pype_tag_name, tag_data)
# add it to the input track item
track.addTag(tag)

return tag


def get_track_openpype_tag(track):
"""
Get pype track item tag created by creator or loader plugin.

Expand All @@ -312,7 +385,7 @@ def get_track_item_pype_tag(track_item):
hiero.core.Tag: hierarchy, orig clip attributes
"""
# get all tags from track item
_tags = track_item.tags()
_tags = track.tags()
if not _tags:
return None
for tag in _tags:
Expand All @@ -321,13 +394,85 @@ def get_track_item_pype_tag(track_item):
return tag


def get_track_openpype_data(track, container_name=None):
"""
Get track's openpype tag data.

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

Returns:
dict: data found on pype tag
"""
return_data = {}
# get pype data tag from track item
tag = get_track_openpype_tag(track)

if not tag:
return None

# get tag metadata attribute
tag_data = deepcopy(dict(tag.metadata()))

for obj_name, obj_data in tag_data.items():
obj_name = obj_name.replace("tag.", "")

if obj_name in ["applieswhole", "note", "label"]:
continue
return_data[obj_name] = json.loads(obj_data)

return (
return_data[container_name]
if container_name
else return_data
)


@deprecated("openpype.hosts.hiero.api.lib.get_trackitem_openpype_tag")
def get_track_item_pype_tag(track_item):
# backward compatibility alias
return get_trackitem_openpype_tag(track_item)


@deprecated("openpype.hosts.hiero.api.lib.set_trackitem_openpype_tag")
def set_track_item_pype_tag(track_item, data=None):
# backward compatibility alias
return set_trackitem_openpype_tag(track_item, data)


@deprecated("openpype.hosts.hiero.api.lib.get_trackitem_openpype_data")
def get_track_item_pype_data(track_item):
# backward compatibility alias
return get_trackitem_openpype_data(track_item)


def get_trackitem_openpype_tag(track_item):
"""
Set pype track item tag to input track_item.
Get pype track item tag created by creator or loader plugin.

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

Returns:
hiero.core.Tag: hierarchy, orig clip attributes
"""
# get all tags from track item
_tags = track_item.tags()
if not _tags:
return None
for tag in _tags:
# return only correct tag defined by global name
if tag.name() == self.pype_tag_name:
return tag


def set_trackitem_openpype_tag(track_item, data=None):
"""
Set openpype track tag to input track object.

Attributes:
track (hiero.core.VideoTrack): hiero object

Returns:
hiero.core.Tag
"""
Expand All @@ -341,7 +486,7 @@ def set_track_item_pype_tag(track_item, data=None):
"metadata": dict(data.items())
}
# get available pype tag if any
_tag = get_track_item_pype_tag(track_item)
_tag = get_trackitem_openpype_tag(track_item)

if _tag:
# it not tag then create one
Expand All @@ -355,7 +500,7 @@ def set_track_item_pype_tag(track_item, data=None):
return tag


def get_track_item_pype_data(track_item):
def get_trackitem_openpype_data(track_item):
"""
Get track item's pype tag data.

Expand All @@ -367,7 +512,7 @@ def get_track_item_pype_data(track_item):
"""
data = {}
# get pype data tag from track item
tag = get_track_item_pype_tag(track_item)
tag = get_trackitem_openpype_tag(track_item)

if not tag:
return None
Expand Down Expand Up @@ -420,7 +565,7 @@ def imprint(track_item, data=None):
"""
data = data or {}

tag = set_track_item_pype_tag(track_item, data)
tag = set_trackitem_openpype_tag(track_item, data)

# add publish attribute
set_publish_attribute(tag, True)
Expand Down Expand Up @@ -832,22 +977,22 @@ def set_selected_track_items(track_items_list, sequence=None):


def _read_doc_from_path(path):
# reading QDomDocument from HROX path
hrox_file = QFile(path)
if not hrox_file.open(QFile.ReadOnly):
# reading QtXml.QDomDocument from HROX path
hrox_file = QtCore.QFile(path)
if not hrox_file.open(QtCore.QFile.ReadOnly):
raise RuntimeError("Failed to open file for reading")
doc = QDomDocument()
doc = QtXml.QDomDocument()
doc.setContent(hrox_file)
hrox_file.close()
return doc


def _write_doc_to_path(doc, path):
# write QDomDocument to path as HROX
hrox_file = QFile(path)
if not hrox_file.open(QFile.WriteOnly):
# write QtXml.QDomDocument to path as HROX
hrox_file = QtCore.QFile(path)
if not hrox_file.open(QtCore.QFile.WriteOnly):
raise RuntimeError("Failed to open file for writing")
stream = QTextStream(hrox_file)
stream = QtCore.QTextStream(hrox_file)
doc.save(stream, 1)
hrox_file.close()

Expand Down Expand Up @@ -1030,7 +1175,7 @@ def sync_clip_name_to_data_asset(track_items_list):

# get name and data
ti_name = track_item.name()
data = get_track_item_pype_data(track_item)
data = get_trackitem_openpype_data(track_item)

# ignore if no data on the clip or not publish instance
if not data:
Expand All @@ -1042,10 +1187,10 @@ def sync_clip_name_to_data_asset(track_items_list):
if data["asset"] != ti_name:
data["asset"] = ti_name
# remove the original tag
tag = get_track_item_pype_tag(track_item)
tag = get_trackitem_openpype_tag(track_item)
track_item.removeTag(tag)
# create new tag with updated data
set_track_item_pype_tag(track_item, data)
set_trackitem_openpype_tag(track_item, data)
print("asset was changed in clip: {}".format(ti_name))


Expand Down Expand Up @@ -1083,10 +1228,10 @@ def check_inventory_versions(track_items=None):
project_name = legacy_io.active_project()
filter_result = filter_containers(containers, project_name)
for container in filter_result.latest:
set_track_color(container["_track_item"], clip_color)
set_track_color(container["_item"], clip_color)

for container in filter_result.outdated:
set_track_color(container["_track_item"], clip_color_last)
set_track_color(container["_item"], clip_color_last)


def selection_changed_timeline(event):
Expand Down
Loading