Merged in 2.0/PYPE-333-nks-publishing-workflow (pull request #149)
2.0/PYPE-333 nks publishing workflow Approved-by: Milan Kolar <milan@orbi.tools>
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
148
pype/nukestudio/precomp_clip.py
Normal 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
|
|
@ -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)
|
||||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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"]))
|
||||
|
|
|
|||
12
pype/plugins/nukestudio/publish/collect_project_root.py
Normal 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()
|
||||
|
|
@ -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']
|
||||
|
|
|
|||
BIN
setup/nukestudio/hiero_plugin_path/Icons/2D.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
setup/nukestudio/hiero_plugin_path/Icons/3D.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
setup/nukestudio/hiero_plugin_path/Icons/add_handles.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
setup/nukestudio/hiero_plugin_path/Icons/add_handles_end.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
setup/nukestudio/hiero_plugin_path/Icons/add_handles_start.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
setup/nukestudio/hiero_plugin_path/Icons/edit.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 190 KiB |
BIN
setup/nukestudio/hiero_plugin_path/Icons/hierarchy.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
|
@ -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>
|
||||