Merge branch 'develop' into feature/PYPE-323-consolidate_integrator

This commit is contained in:
Milan Kolar 2019-05-23 23:54:14 +02:00
commit 65481e5c79
25 changed files with 537 additions and 637 deletions

View file

@ -43,7 +43,8 @@ from .lib import (
get_asset_data,
modified_environ,
add_tool_to_environment,
get_data_hierarchical_attr
get_data_hierarchical_attr,
get_avalon_project_template
)
__all__ = [
@ -81,6 +82,7 @@ __all__ = [
"set_hierarchy",
"set_project_code",
"get_data_hierarchical_attr",
"get_avalon_project_template",
# preloaded templates
"Anatomy",

View file

@ -109,12 +109,6 @@ def install():
# api.set_avalon_workdir()
# reload_config()
# import sys
# for path in sys.path:
# if path.startswith("C:\\Users\\Public"):
# sys.path.remove(path)
log.info("Registering Nuke plug-ins..")
pyblish.register_plugin_path(PUBLISH_PATH)
avalon.register_plugin_path(avalon.Loader, LOAD_PATH)

View file

@ -3,7 +3,6 @@ import sys
import os
from collections import OrderedDict
from pprint import pprint
from avalon.vendor.Qt import QtGui
from avalon import api, io, lib
import avalon.nuke
import pype.api as pype
@ -20,6 +19,12 @@ self = sys.modules[__name__]
self._project = None
for path in sys.path:
log.info(os.path.normpath(path))
if "C:\\Users\\Public" in os.path.normpath(path):
log.info("_ removing from sys.path: `{}`".format(path))
sys.path.remove(path)
def onScriptLoad():
if nuke.env['LINUX']:
nuke.tcl('load ffmpegReader')
@ -472,30 +477,30 @@ def update_frame_range(start, end, root=None):
else:
nuke.root()[key].setValue(value)
def get_additional_data(container):
"""Get Nuke's related data for the container
Args:
container(dict): the container found by the ls() function
Returns:
dict
"""
node = container["_tool"]
tile_color = node['tile_color'].value()
if tile_color is None:
return {}
hex = '%08x' % tile_color
rgba = [
float(int(hex[0:2], 16)) / 255.0,
float(int(hex[2:4], 16)) / 255.0,
float(int(hex[4:6], 16)) / 255.0
]
return {"color": QtGui.QColor().fromRgbF(rgba[0], rgba[1], rgba[2])}
#
# def get_additional_data(container):
# """Get Nuke's related data for the container
#
# Args:
# container(dict): the container found by the ls() function
#
# Returns:
# dict
# """
#
# node = container["_tool"]
# tile_color = node['tile_color'].value()
# if tile_color is None:
# return {}
#
# hex = '%08x' % tile_color
# rgba = [
# float(int(hex[0:2], 16)) / 255.0,
# float(int(hex[2:4], 16)) / 255.0,
# float(int(hex[4:6], 16)) / 255.0
# ]
#
# return {"color": Qt.QtGui.QColor().fromRgbF(rgba[0], rgba[1], rgba[2])}
def get_write_node_template_attr(node):

View file

@ -5,18 +5,13 @@ from pyblish import api as pyblish
from .. import api
from .menu import install as menu_install
from .lib import (
show,
setup,
add_to_filemenu
from .menu import (
install as menu_install,
_update_menu_task_label
)
from pypeapp import Logger
log = Logger().get_logger(__name__, "nukestudio")
AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype")
@ -35,41 +30,9 @@ if os.getenv("PYBLISH_GUI", None):
pyblish.register_gui(os.getenv("PYBLISH_GUI", None))
def reload_config():
"""Attempt to reload pipeline at run-time.
CAUTION: This is primarily for development and debugging purposes.
"""
import importlib
for module in (
"pypeapp",
"{}.api".format(AVALON_CONFIG),
"{}.templates".format(AVALON_CONFIG),
"{}.nukestudio.inventory".format(AVALON_CONFIG),
"{}.nukestudio.lib".format(AVALON_CONFIG),
"{}.nukestudio.menu".format(AVALON_CONFIG),
):
log.info("Reloading module: {}...".format(module))
try:
module = importlib.import_module(module)
reload(module)
except Exception as e:
log.warning("Cannot reload module: {}".format(e))
importlib.reload(module)
def install(config):
# api.set_avalon_workdir()
# reload_config()
# import sys
# for path in sys.path:
# if path.startswith("C:\\Users\\Public"):
# sys.path.remove(path)
_register_events()
log.info("Registering NukeStudio plug-ins..")
pyblish.register_host("nukestudio")
@ -104,6 +67,11 @@ def uninstall():
api.reset_data_from_templates()
def _register_events():
avalon.on("taskChanged", _update_menu_task_label)
log.info("Installed event callback for 'taskChanged'..")
def ls():
"""List available containers.

View file

@ -8,7 +8,11 @@ import pyblish.api
# Host libraries
import hiero
from PySide2 import (QtWidgets, QtGui)
from pypeapp import Logger
log = Logger().get_logger(__name__, "nukestudio")
from avalon.vendor.Qt import (QtWidgets, QtGui)
cached_process = None
@ -19,6 +23,35 @@ self._has_been_setup = False
self._has_menu = False
self._registered_gui = None
AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype")
def reload_config():
"""Attempt to reload pipeline at run-time.
CAUTION: This is primarily for development and debugging purposes.
"""
import importlib
for module in (
"avalon.lib",
"avalon.pipeline",
"pypeapp",
"{}.api".format(AVALON_CONFIG),
"{}.templates".format(AVALON_CONFIG),
"{}.nukestudio.lib".format(AVALON_CONFIG),
"{}.nukestudio.menu".format(AVALON_CONFIG),
"{}.nukestudio.tags".format(AVALON_CONFIG)
):
log.info("Reloading module: {}...".format(module))
try:
module = importlib.import_module(module)
reload(module)
except Exception as e:
log.warning("Cannot reload module: {}".format(e))
importlib.reload(module)
def setup(console=False, port=None, menu=True):
"""Setup integration

View file

@ -1,7 +1,5 @@
import os
from avalon.api import Session
from pprint import pprint
import sys
import hiero.core
try:
@ -12,8 +10,39 @@ except Exception:
from hiero.ui import findMenuAction
from avalon.api import Session
from .tags import add_tags_from_presets
from .lib import (
reload_config
)
from pypeapp import Logger
log = Logger().get_logger(__name__, "nukestudio")
self = sys.modules[__name__]
self._change_context_menu = None
def _update_menu_task_label(*args):
"""Update the task label in Avalon menu to current session"""
object_name = self._change_context_menu
found_menu = findMenuAction(object_name)
if not found_menu:
log.warning("Can't find menuItem: {}".format(object_name))
return
label = "{}, {}".format(Session["AVALON_ASSET"],
Session["AVALON_TASK"])
menu = found_menu.menu()
self._change_context_menu = label
menu.setTitle(label)
#
def install():
# here is the best place to add menu
from avalon.tools import (
@ -26,13 +55,17 @@ def install():
libraryloader
)
menu_name = os.environ['PYPE_STUDIO_NAME']
menu_name = os.environ['AVALON_LABEL']
context_label = "{0}, {1}".format(
Session["AVALON_ASSET"], Session["AVALON_TASK"]
)
self._change_context_menu = context_label
# Grab Hiero's MenuBar
M = hiero.ui.menuBar()
# Add a Menu to the MenuBar
file_action = None
try:
check_made_menu = findMenuAction(menu_name)
except Exception:
@ -43,50 +76,83 @@ def install():
else:
menu = check_made_menu.menu()
actions = [{
'action': QAction('Set Context', None),
'function': contextmanager.show,
'icon': QIcon('icons:Position.png')
},
actions = [
{
'action': QAction('Create...', None),
'function': creator.show,
'icon': QIcon('icons:ColorAdd.png')
},
'parent': context_label,
'action': QAction('Set Context', None),
'function': contextmanager.show,
'icon': QIcon('icons:Position.png')
},
"separator",
{
'action': QAction('Load...', None),
'function': cbloader.show,
'icon': QIcon('icons:CopyRectangle.png')
},
'action': QAction("Work Files...", None),
'function': (lambda: workfiles.show(os.environ["AVALON_WORKDIR"])),
'icon': QIcon('icons:Position.png')
},
{
'action': QAction('Publish...', None),
'function': publish.show,
'icon': QIcon('icons:Output.png')
},
'action': QAction('Create Default Tags..', None),
'function': add_tags_from_presets,
'icon': QIcon('icons:Position.png')
},
"separator",
{
'action': QAction('Manage...', None),
'function': cbsceneinventory.show,
'icon': QIcon('icons:ModifyMetaData.png')
},
'action': QAction('Create...', None),
'function': creator.show,
'icon': QIcon('icons:ColorAdd.png')
},
{
'action': QAction('Library...', None),
'function': libraryloader.show,
'icon': QIcon('icons:ColorAdd.png')
}]
'action': QAction('Load...', None),
'function': cbloader.show,
'icon': QIcon('icons:CopyRectangle.png')
},
{
'action': QAction('Publish...', None),
'function': publish.show,
'icon': QIcon('icons:Output.png')
},
{
'action': QAction('Manage...', None),
'function': cbsceneinventory.show,
'icon': QIcon('icons:ModifyMetaData.png')
},
{
'action': QAction('Library...', None),
'function': libraryloader.show,
'icon': QIcon('icons:ColorAdd.png')
},
"separator",
{
'action': QAction('Reload pipeline...', None),
'function': reload_config,
'icon': QIcon('icons:ColorAdd.png')
}]
# Create menu items
for a in actions:
pprint(a)
# create action
for k in a.keys():
if 'action' in k:
action = a[k]
elif 'function' in k:
action.triggered.connect(a[k])
elif 'icon' in k:
action.setIcon(a[k])
add_to_menu = menu
if isinstance(a, dict):
# create action
for k in a.keys():
if 'parent' in k:
submenus = [sm for sm in a[k].split('/')]
submenu = None
for sm in submenus:
if submenu:
submenu.addMenu(sm)
else:
submenu = menu.addMenu(sm)
add_to_menu = submenu
if 'action' in k:
action = a[k]
elif 'function' in k:
action.triggered.connect(a[k])
elif 'icon' in k:
action.setIcon(a[k])
# add action to menu
menu.addAction(action)
hiero.ui.registerAction(action)
# add action to menu
add_to_menu.addAction(action)
hiero.ui.registerAction(action)
elif isinstance(a, str):
add_to_menu.addSeparator()

View file

@ -0,0 +1,148 @@
from hiero.core import *
from hiero.ui import *
import ft_utils
import re
import os
def create_nk_script_clips(script_lst, seq=None):
'''
nk_scripts is list of dictionaries like:
[{
'path': 'P:/Jakub_testy_pipeline/test_v01.nk',
'name': 'test',
'timeline_frame_in': 10,
'handles': 10,
'source_start': 0,
'source_end': 54,
'task': 'Comp-tracking',
'work_dir': 'VFX_PR',
'shot': '00010'
}]
'''
env = ft_utils.Env()
proj = projects()[-1]
root = proj.clipsBin()
if not seq:
seq = Sequence('NewSequences')
root.addItem(BinItem(seq))
# todo will ned to define this better
# track = seq[1] # lazy example to get a destination# track
clips_lst = []
for nk in script_lst:
task_short = env.task_codes[nk['task']]
script_file = task_short
task_path = '/'.join([nk['work_dir'], nk['shot'], nk['task']])
bin = create_bin_in_project(task_path, proj)
task_path += script_file
if nk['task'] not in seq.videoTracks():
track = hiero.core.VideoTrack(nk['task'])
seq.addTrack(track)
else:
track = seq.tracks(nk['task'])
# create slip media
print nk['path']
media = MediaSource(nk['path'])
print media
source = Clip(media)
print source
name = os.path.basename(os.path.splitext(nk['path'])[0])
split_name = split_by_client_version(name, env)[0] or name
print split_name
# print source
# add to bin as clip item
items_in_bin = [b.name() for b in bin.items()]
if split_name not in items_in_bin:
binItem = BinItem(source)
bin.addItem(binItem)
print bin.items()
new_source = [
item for item in bin.items() if split_name in item.name()
][0].items()[0].item()
print new_source
# add to track as clip item
trackItem = TrackItem(split_name, TrackItem.kVideo)
trackItem.setSource(new_source)
trackItem.setSourceIn(nk['source_start'] + nk['handles'])
trackItem.setSourceOut(nk['source_end'] - nk['handles'])
trackItem.setTimelineIn(nk['source_start'] + nk['timeline_frame_in'])
trackItem.setTimelineOut(
(nk['source_end'] - (nk['handles'] * 2)) + nk['timeline_frame_in'])
track.addTrackItem(trackItem)
track.addTrackItem(trackItem)
clips_lst.append(trackItem)
return clips_lst
def create_bin_in_project(bin_name='', project=''):
'''
create bin in project and
if the bin_name is "bin1/bin2/bin3" it will create whole depth
'''
if not project:
# get the first loaded project
project = projects()[0]
if not bin_name:
return None
if '/' in bin_name:
bin_name = bin_name.split('/')
else:
bin_name = [bin_name]
clipsBin = project.clipsBin()
done_bin_lst = []
for i, b in enumerate(bin_name):
if i == 0 and len(bin_name) > 1:
if b in [bin.name() for bin in clipsBin.bins()]:
bin = [bin for bin in clipsBin.bins() if b in bin.name()][0]
done_bin_lst.append(bin)
else:
create_bin = Bin(b)
clipsBin.addItem(create_bin)
done_bin_lst.append(create_bin)
elif i >= 1 and i < len(bin_name) - 1:
if b in [bin.name() for bin in done_bin_lst[i - 1].bins()]:
bin = [
bin for bin in done_bin_lst[i - 1].bins()
if b in bin.name()
][0]
done_bin_lst.append(bin)
else:
create_bin = Bin(b)
done_bin_lst[i - 1].addItem(create_bin)
done_bin_lst.append(create_bin)
elif i == len(bin_name) - 1:
if b in [bin.name() for bin in done_bin_lst[i - 1].bins()]:
bin = [
bin for bin in done_bin_lst[i - 1].bins()
if b in bin.name()
][0]
done_bin_lst.append(bin)
else:
create_bin = Bin(b)
done_bin_lst[i - 1].addItem(create_bin)
done_bin_lst.append(create_bin)
# print [bin.name() for bin in clipsBin.bins()]
return done_bin_lst[-1]
def split_by_client_version(string, env=None):
if not env:
env = ft_utils.Env()
client_letter, client_digits = env.get_version_type('client')
regex = "[/_.]" + client_letter + "\d+"
try:
matches = re.findall(regex, string, re.IGNORECASE)
return string.split(matches[0])
except Exception, e:
print e
return None

108
pype/nukestudio/tags.py Normal file
View file

@ -0,0 +1,108 @@
import hiero
import re
from pypeapp import config
def create_tag(key, value):
"""
Creating Tag object.
Args:
key (str): name of tag
value (dict): parameters of tag
Returns:
object: Tag object
"""
tag = hiero.core.Tag(str(key))
tag.setNote(value['note'])
tag.setIcon(value['icon']['path'])
mtd = tag.metadata()
pres_mtd = value.get('metadata', None)
if pres_mtd:
[mtd.setValue("tag.{}".format(k), v)
for k, v in pres_mtd.items()]
return tag
def update_tag(tag, value):
"""
Fixing Tag object.
Args:
tag (obj): Tag object
value (dict): parameters of tag
"""
tag.setNote(value['note'])
tag.setIcon(value['icon']['path'])
mtd = tag.metadata()
pres_mtd = value.get('metadata', None)
if pres_mtd:
[mtd.setValue("tag.{}".format(k), v)
for k, v in pres_mtd.items()]
def add_tags_from_presets():
"""
Will create default tags from presets.
"""
# get all presets
presets = config.get_presets()
# get nukestudio tag.json from presets
nks_pres = presets['nukestudio']
nks_pres_tags = nks_pres.get("tags", None)
# get project and root bin object
project = hiero.core.projects()[-1]
root_bin = project.tagsBin()
for _k, _val in nks_pres_tags.items():
pattern = re.compile(r"\[(.*)\]")
bin_find = pattern.findall(_k)
if bin_find:
# check what is in root bin
bins = [b for b in root_bin.items()
if b.name() in str(bin_find[0])]
if bins:
bin = bins[0]
else:
# create Bin object
bin = hiero.core.Bin(str(bin_find[0]))
for k, v in _val.items():
tags = [t for t in bin.items()
if str(k) in t.name()]
if not tags:
# create Tag obj
tag = create_tag(k, v)
# adding Tag to Bin
bin.addItem(tag)
else:
# update Tag if already exists
update_tag(tags[0], v)
if not bins:
# adding Tag to Root Bin
root_bin.addItem(bin)
else:
tags = None
tags = [t for t in root_bin.items()
if str(_k) in t.name()]
if not tags:
# create Tag
tag = create_tag(_k, _val)
# adding Tag to Root Bin
root_bin.addItem(tag)
else:
# update Tag if already exists
update_tag(tags[0], _val)

View file

@ -4,6 +4,7 @@ import pyblish.api
class CollectActiveProject(pyblish.api.ContextPlugin):
"""Inject the active project into context"""
label = "Collect Active Project"
order = pyblish.api.CollectorOrder - 0.2
def process(self, context):

View file

@ -2,7 +2,7 @@ import pyblish.api
from avalon import api
class CollectHierarchyContext(pyblish.api.ContextPlugin):
class CollectHierarchyContext(pyblish.api.InstancePlugin):
"""Collecting hierarchy context from `parents` and `hierarchy` data
present in `clip` family instances coming from the request json data file
@ -13,6 +13,7 @@ class CollectHierarchyContext(pyblish.api.ContextPlugin):
label = "Collect Hierarchy Context"
order = pyblish.api.CollectorOrder + 0.1
families = ["clip"]
def update_dict(self, ex_dict, new_dict):
for key in ex_dict:
@ -22,51 +23,85 @@ class CollectHierarchyContext(pyblish.api.ContextPlugin):
new_dict[key] = ex_dict[key]
return new_dict
def process(self, context):
json_data = context.data.get("jsonData", None)
temp_context = {}
for instance in json_data['instances']:
if instance['family'] in 'projectfile':
continue
def convert_to_entity(self, key, value):
types = {"shot": "Shot",
"folder": "Folder",
"episode": "Episode",
"Sequence": "Sequence",
}
return {"entity_type": types.get(key, None), "entity_name": value}
in_info = {}
name = instance['name']
# suppose that all instances are Shots
in_info['entity_type'] = 'Shot'
def process(self, instance):
context = instance.context
tags = instance.data.get("tags", None)
self.log.info(tags)
if tags:
for t in tags:
t_metadata = dict(t["metadata"])
t_type = t_metadata.get("tag._type", "")
if "hierarchy" in t_type:
self.log.info("__ type: {}".format(t_type))
d_metadata = dict()
for k, v in t_metadata.items():
new_k = k.split(".")[1]
try:
d_metadata[new_k] = str(v).format(**context.data)
except Exception:
d_metadata[new_k] = v
instance_pyblish = [
i for i in context.data["instances"] if i.data['asset'] in name][0]
in_info['custom_attributes'] = {
'fend': instance_pyblish.data['endFrame'],
'fstart': instance_pyblish.data['startFrame'],
'fps': instance_pyblish.data['fps']
}
in_info['tasks'] = instance['tasks']
self.log.info("__ projectroot: {}".format(context.data["projectroot"]))
self.log.info("__ d_metadata: {}".format(d_metadata))
self.log.info(
"__ hierarchy: {}".format(d_metadata["note"]))
# self.log.info("__ hierarchy.format: {}".format(d_metadata["note"].format(
# **d_metadata)))
parents = instance.get('parents', [])
actual = {name: in_info}
for parent in reversed(parents):
next_dict = {}
parent_name = parent["entityName"]
next_dict[parent_name] = {}
next_dict[parent_name]["entity_type"] = parent["entityType"]
next_dict[parent_name]["childs"] = actual
actual = next_dict
temp_context = self.update_dict(temp_context, actual)
self.log.debug(temp_context)
# TODO: 100% sure way of get project! Will be Name or Code?
project_name = api.Session["AVALON_PROJECT"]
final_context = {}
final_context[project_name] = {}
final_context[project_name]['entity_type'] = 'Project'
final_context[project_name]['childs'] = temp_context
# adding hierarchy context to instance
context.data["hierarchyContext"] = final_context
self.log.debug("context.data[hierarchyContext] is: {}".format(
context.data["hierarchyContext"]))
#
# json_data = context.data.get("jsonData", None)
# temp_context = {}
# for instance in json_data['instances']:
# if instance['family'] in 'projectfile':
# continue
#
# in_info = {}
# name = instance['name']
# # suppose that all instances are Shots
# in_info['entity_type'] = 'Shot'
#
# instance_pyblish = [
# i for i in context.data["instances"] if i.data['asset'] in name][0]
# in_info['custom_attributes'] = {
# 'fend': instance_pyblish.data['endFrame'],
# 'fstart': instance_pyblish.data['startFrame'],
# 'fps': instance_pyblish.data['fps']
# }
#
# in_info['tasks'] = instance['tasks']
#
# parents = instance.get('parents', [])
#
# actual = {name: in_info}
#
# for parent in reversed(parents):
# next_dict = {}
# parent_name = parent["entityName"]
# next_dict[parent_name] = {}
# next_dict[parent_name]["entity_type"] = parent["entityType"]
# next_dict[parent_name]["childs"] = actual
# actual = next_dict
#
# temp_context = self.update_dict(temp_context, actual)
# self.log.debug(temp_context)
#
# # TODO: 100% sure way of get project! Will be Name or Code?
# project_name = api.Session["AVALON_PROJECT"]
# final_context = {}
# final_context[project_name] = {}
# final_context[project_name]['entity_type'] = 'Project'
# final_context[project_name]['childs'] = temp_context
#
# # adding hierarchy context to instance
# context.data["hierarchyContext"] = final_context
# self.log.debug("context.data[hierarchyContext] is: {}".format(
# context.data["hierarchyContext"]))

View file

@ -0,0 +1,12 @@
import pyblish.api
class CollectActiveProjectRoot(pyblish.api.ContextPlugin):
"""Inject the active project into context"""
label = "Collect Project Root"
order = pyblish.api.CollectorOrder - 0.1
def process(self, context):
project = context.data["activeProject"]
context.data["projectroot"] = project.projectRoot()

View file

@ -4,7 +4,7 @@ from pyblish import api
class CollectClipTags(api.InstancePlugin):
"""Collect Tags from selected track items."""
order = api.CollectorOrder
order = api.CollectorOrder + 0.005
label = "Collect Tags"
hosts = ["nukestudio"]
families = ['clip']

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View file

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 190 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Before After
Before After

View file

@ -1,472 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hieroXML>
<hieroXML release="11.2v2" revision="4" name="NukeStudio" version="11">
<Project useViewColors="0" customExportRootPath="" eightBitLut="sRGB" nukeUseOCIO="0" shotPresetName="Basic Nuke Shot With Annotations" timedisplayformat="0" exportRootPathMode="ProjectDirectory" redVideoDecodeMode="0" samplerate="48000/1" name="SharedTags" timelineReformatResizeType="Width" viewerLut="sRGB" framerate="24/1" logLut="Cineon" ocioConfigName="custom" timelineReformatCenter="1" floatLut="linear" posterCustomFrame="0" sixteenBitLut="sRGB" workingSpace="linear" editable="1" thumbnailLut="sRGB" timelineReformatType="To Format" ocioConfigCustom="0" starttimecode="86400" buildTrackName="VFX" guid="{ba9eb7de-26cc-7146-a12b-b59ab35d5469}" ocioconfigpath="" posterFrameSetting="First" project_directory="">
<items>
<RootBinProjectItem editable="1" guid="{a3ba3ce5-8d61-6240-a7b3-b99e4a8bbe9d}" name="Sequences">
<BinViewType>2</BinViewType>
<BinViewZoom>70</BinViewZoom>
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
<BinViewSortOrder>0</BinViewSortOrder>
<AllowedItems>13</AllowedItems>
</RootBinProjectItem>
<RootBinProjectItem editable="1" guid="{74723746-d7a9-884f-9489-bf0cfe2137fa}" name="Tags">
<items>
<TagClassProjectItem editable="1" guid="{30184e7c-e9d0-ba40-8627-f3600b3c7d0b}" name="audio">
<TagClass icon="Y:/bait-conda-git-deployment/repositories/bait-environment/pyblish-bumpybox/pyblish_bumpybox/environment_variables/hiero_plugin_path/StartupProjects/Hiero/volume.png" objName="tag" editable="1" guid="1978e3db-6ad6-af41-87e6-88a8c1a2ef6c" visible="1" name="audio">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="audio"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<BinProjectItem editable="1" guid="{c26fe4a3-ea9b-e446-92c3-4f2d1e5c5c47}" name="task">
<items>
<TagClassProjectItem editable="1" guid="{b5885be5-d09b-244b-b4a4-dec427a534a7}" name="Editing">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="4b652e43-47ef-6c4e-871d-18cdc3299f0f" visible="1" name="Editing">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Editing"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{2d8da183-0d62-344e-810f-133153ea9a42}" name="Blocking">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="9d6fb373-166a-684c-a5d2-d9d6bd6ca0ca" visible="1" name="Blocking">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Blocking"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{eb2f8f5f-4e80-2046-9aa5-cf49e3f44dc2}" name="Tracking">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="aa977a57-886d-ed4b-b91a-aeb1e25ddabc" visible="1" name="Tracking">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Tracking"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{bd84a0a6-454a-e346-8cfc-b32719aac901}" name="Animation">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="4128ded5-cf1d-7249-9d2c-ddbe52d2e4e7" visible="1" name="Animation">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Animation"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{b3236005-6f9b-ef4a-bb5d-0df15637e9a5}" name="Texturing">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="3a00a983-f8a1-d44e-8446-48fd5ba2e7c4" visible="1" name="Texturing">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Texturing"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{459777c3-87e1-b648-9f9e-48c63318e458}" name="Layout">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="4289d2cd-5328-6b40-a897-f3ede4e816c7" visible="1" name="Layout">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Layout"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{9151f675-6785-d74f-9fcb-5ba1d3975213}" name="Build">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="ad57f46d-7f01-8b46-a42d-e4f166d6c5a2" visible="1" name="Build">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Build"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{3f6a2f81-38ed-3a40-8dc1-8795d046ceb0}" name="Painting">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="92531993-b3ef-f049-94da-0290fcb43877" visible="1" name="Painting">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Painting"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{32c40ffe-b951-db45-a06f-96aa1ee886c9}" name="Rigging">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="ef53b66c-6389-f341-a548-98ab0f5dfd36" visible="1" name="Rigging">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Rigging"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{458175b6-56c8-6241-a3c5-3bb15c7b4321}" name="Match Move">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="2da532f7-6102-e648-9cc9-f897adde24fa" visible="1" name="Match Move">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Match Move"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{4f432ee8-08b9-1541-b724-16da8d326575}" name="Compositing">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="6dfee79f-109e-6943-86ee-e4868eebf885" visible="1" name="Compositing">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Compositing"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{3bc6599b-7095-f744-8f96-74a2fbbaba51}" name="Lighting">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="2e295a1d-0730-4544-bc28-471e217295cf" visible="1" name="Lighting">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Lighting"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{59cc88aa-30fb-d94b-9c6b-860585be1c5a}" name="Lookdev">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="728df9b6-afc7-8d4f-b85e-0d944d484c73" visible="1" name="Lookdev">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Lookdev"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{f3a97406-c1af-fe4a-a607-da3872d15f1b}" name="Modeling">
<TagClass icon="icons:Tag.png" objName="tag" editable="1" guid="8440a540-145b-6b47-b935-18dcc0ca5766" visible="1" name="Modeling">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="Modeling"/>
<StringValue name="tag.family" default="1" value="task"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
</items>
<BinViewType>2</BinViewType>
<BinViewZoom>70</BinViewZoom>
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
<BinViewSortOrder>0</BinViewSortOrder>
</BinProjectItem>
<BinProjectItem editable="1" guid="{d9f52354-348b-b940-b9d8-fb902c94a9be}" name="handles">
<items>
<TagClassProjectItem editable="1" guid="{ecd238d1-6d38-a740-ae24-b2ba84d1360c}" name="25 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="172ca2e6-9351-f346-968c-cbcd72adcd43" visible="1" name="25 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="25 frames"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="25"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{3c1da268-6255-5e43-8564-14f5c4483c7d}" name="20 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="e2918655-a7f2-fc42-9cb7-f402c95ace69" visible="1" name="20 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="20 frames"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="20"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{5b502d49-cd75-3741-aa78-4f178049e9cd}" name="15 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="36e70c47-29a8-9340-912c-1a1f70257618" visible="1" name="15 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="15 frames"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="15"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{eae75001-3b2f-1443-9687-dfbb6a381c55}" name="10 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="a45bd02c-5f1e-c040-ad8c-0c6e124f55c0" visible="1" name="10 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="10 frames"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="10"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{39e0a5dc-9f30-8d45-b497-59af4a4e8f7d}" name="start: add 20 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="8bfb4e13-42e7-4344-8b33-1df55ed5cc19" visible="1" name="start: add 20 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="start: add 20 frames"/>
<StringValue name="tag.note" default="1" value="adding frames to start of selected clip"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="20"/>
<StringValue name="tag.args" default="1" value="{'op':'add','where':'start'}"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{02801652-2e46-f04e-a9bb-0be47591d731}" name="start: add 15 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="9d2f5078-5ded-ab47-9be7-8f30b9362b0c" visible="1" name="start: add 15 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="start: add 15 frames"/>
<StringValue name="tag.note" default="1" value="adding frames to start of selected clip"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="15"/>
<StringValue name="tag.args" default="1" value="{'op':'add','where':'start'}"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{b7415b6d-3b9c-924b-a6b9-0b4b20917c28}" name="start: add 10 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="be4ae97e-d647-9145-bfd2-521a0ca48f80" visible="1" name="start: add 10 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="start: add 10 frames"/>
<StringValue name="tag.note" default="1" value="adding frames to start of selected clip"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="10"/>
<StringValue name="tag.args" default="1" value="{'op':'add','where':'start'}"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{4c146343-8f3d-6c43-9d49-6fc2fc8d860c}" name="end: add 15 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="b07bda39-5339-b548-ae2f-54d791110cbe" visible="1" name="end: add 15 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="end: add 15 frames"/>
<StringValue name="tag.note" default="1" value="adding frames to end of selected clip"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="15"/>
<StringValue name="tag.args" default="1" value="{'op':'add','where':'end'}"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{1218eaee-7065-fa42-857d-3337a25d6a97}" name="end: add 10 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="9c2bed9c-064a-3243-ad0f-8b7ac147a427" visible="1" name="end: add 10 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="end: add 10 frames"/>
<StringValue name="tag.note" default="1" value="adding frames to end of selected clip"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="10"/>
<StringValue name="tag.args" default="1" value="{'op':'add','where':'end'}"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{b9b0373d-1461-094c-a1e1-26408b68378f}" name="end: add 5 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="2466e187-aa71-804e-9ffb-1c1c57d5673c" visible="1" name="end: add 5 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="end: add 5 frames"/>
<StringValue name="tag.note" default="1" value="adding frames to end of selected clip"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="5"/>
<StringValue name="tag.args" default="1" value="{'op':'add','where':'end'}"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{81446970-d7b7-a142-970e-d7d48073b74a}" name="end: add 20 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="8f2d87d5-47c3-154e-8236-4f0fe3e24216" visible="1" name="end: add 20 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="end: add 20 frames"/>
<StringValue name="tag.note" default="1" value="adding frames to end of selected clip"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="20"/>
<StringValue name="tag.args" default="1" value="{'op':'add','where':'end'}"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{383f69df-2421-d848-a4a6-8ed17386cb67}" name="start: add 5 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="aec1eac2-1257-e64d-9fed-78afbee0dd31" visible="1" name="start: add 5 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="start: add 5 frames"/>
<StringValue name="tag.note" default="1" value="adding frames to start of selected clip"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="5"/>
<StringValue name="tag.args" default="1" value="{'op':'add','where':'start'}"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{36e7472b-2ea6-8747-8181-f3bf46cfe04a}" name="5 frames">
<TagClass icon="icons:TagClapperBoard.png" objName="tag" editable="1" guid="46e4f25b-b92f-414f-9c50-798f1905879f" visible="1" name="5 frames">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="5 frames"/>
<StringValue name="tag.family" default="1" value="handles"/>
<StringValue name="tag.value" default="1" value="5"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
</items>
<BinViewType>1</BinViewType>
<BinViewZoom>70</BinViewZoom>
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
<BinViewSortOrder>0</BinViewSortOrder>
</BinProjectItem>
<BinProjectItem editable="1" guid="{2896f84a-7b81-0a45-af56-01df16a42c80}" name="software">
<items>
<TagClassProjectItem editable="1" guid="{e56c84f8-4958-9d4b-b712-c752daa20d87}" name="houdini">
<TagClass icon="houdini.png" objName="tag" editable="1" guid="bfcba753-4337-6549-a6bb-db96e67261f0" visible="1" name="houdini">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="houdini"/>
<StringValue name="tag.family" default="1" value="host"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{bcebc8dc-2725-2045-bfe3-678cd0cc14b2}" name="fusion">
<TagClass icon="fusion.png" objName="tag" editable="1" guid="516c1100-11be-844d-842a-9e2f00a807d5" visible="1" name="fusion">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="fusion"/>
<StringValue name="tag.family" default="1" value="host"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{1e8d1e85-7844-8c43-a0b1-be4fa10da068}" name="maya">
<TagClass icon="maya.png" objName="tag" editable="1" guid="4bfb4372-c31d-6e4e-aedb-ff1611a487f8" visible="1" name="maya">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="maya"/>
<StringValue name="tag.family" default="1" value="host"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
<TagClassProjectItem editable="1" guid="{569a163e-3e00-3242-8be9-41aa4a9cbf5c}" name="nuke">
<TagClass icon="nuke.png" objName="tag" editable="1" guid="1674dcb2-28b2-fe4d-8cc5-d979c3fa0ddd" visible="1" name="nuke">
<sets>
<Set title="" domainroot="tag">
<values>
<StringValue name="tag.label" default="1" value="nuke"/>
<StringValue name="tag.family" default="1" value="host"/>
</values>
</Set>
</sets>
</TagClass>
</TagClassProjectItem>
</items>
<BinViewType>2</BinViewType>
<BinViewZoom>70</BinViewZoom>
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
<BinViewSortOrder>0</BinViewSortOrder>
</BinProjectItem>
</items>
<BinViewType>2</BinViewType>
<BinViewZoom>70</BinViewZoom>
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
<BinViewSortOrder>0</BinViewSortOrder>
<AllowedItems>17</AllowedItems>
</RootBinProjectItem>
</items>
<BinViewType>2</BinViewType>
<BinViewZoom>70</BinViewZoom>
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
<BinViewSortOrder>0</BinViewSortOrder>
<AllowedItems>2</AllowedItems>
<RootBinProjectItem link="internal" objName="sequencesBin" guid="{a3ba3ce5-8d61-6240-a7b3-b99e4a8bbe9d}"/>
<RootBinProjectItem link="internal" objName="tagsBin" guid="{74723746-d7a9-884f-9489-bf0cfe2137fa}"/>
<MediaFormatValue objName="outputformat" name="" default="0" value="1,[ 0, 0, 1920, 1080],[ 0, 0, 1920, 1080],HD 1080"/>
<Views>
<View color="#ffffff" name="main"/>
</Views>
</Project>
<UIState/>
</hieroXML>