mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
feat(nukestudio): plugins work and basic Tags integration
This commit is contained in:
parent
2cf60c1fbb
commit
35e5e7319f
18 changed files with 740 additions and 123 deletions
|
|
@ -9,7 +9,7 @@ class CollectAssumedDestination(pyblish.api.ContextPlugin):
|
|||
|
||||
label = "Collect Assumed Destination"
|
||||
order = pyblish.api.CollectorOrder + 0.498
|
||||
exclude_families = ["clip", "trackItem"]
|
||||
exclude_families = ["clip"]
|
||||
|
||||
def process(self, context):
|
||||
for instance in context:
|
||||
|
|
|
|||
14
pype/plugins/global/publish/collect_presets.py
Normal file
14
pype/plugins/global/publish/collect_presets.py
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
from pyblish import api
|
||||
from pypeapp import config
|
||||
|
||||
|
||||
class CollectPresets(api.ContextPlugin):
|
||||
"""Collect Presets."""
|
||||
|
||||
order = api.CollectorOrder
|
||||
label = "Collect Presets"
|
||||
|
||||
def process(self, context):
|
||||
context.data["presets"] = config.get_presets()
|
||||
self.log.info(context.data["presets"])
|
||||
return
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
from pyblish import api
|
||||
|
||||
|
||||
class CollectTrackItemTags(api.InstancePlugin):
|
||||
"""Collect Tags from selected track items."""
|
||||
|
||||
order = api.CollectorOrder
|
||||
label = "Collect Tags"
|
||||
hosts = ["nukestudio"]
|
||||
|
||||
def process(self, instance):
|
||||
instance.data["tags"] = instance.data["item"].tags()
|
||||
self.log.info(instance.data["tags"])
|
||||
return
|
||||
|
|
@ -1,28 +1,14 @@
|
|||
from pyblish import api
|
||||
|
||||
class CollectFramerate(api.ContextPlugin):
|
||||
"""Collect framerate from selected sequence."""
|
||||
|
||||
order = api.CollectorOrder
|
||||
label = "Collect Framerate"
|
||||
hosts = ["nukestudio"]
|
||||
|
||||
def process(self, context):
|
||||
for item in context.data.get("selection", []):
|
||||
context.data["framerate"] = item.sequence().framerate().toFloat()
|
||||
return
|
||||
|
||||
|
||||
class CollectTrackItems(api.ContextPlugin):
|
||||
class CollectClips(api.ContextPlugin):
|
||||
"""Collect all Track items selection."""
|
||||
|
||||
order = api.CollectorOrder
|
||||
label = "Collect Track Items"
|
||||
label = "Collect Clips"
|
||||
hosts = ["nukestudio"]
|
||||
|
||||
def process(self, context):
|
||||
import os
|
||||
|
||||
data = {}
|
||||
for item in context.data.get("selection", []):
|
||||
self.log.info("__ item: {}".format(item))
|
||||
|
|
@ -43,13 +29,13 @@ class CollectTrackItems(api.ContextPlugin):
|
|||
}
|
||||
|
||||
for key, value in data.items():
|
||||
|
||||
family = "clip"
|
||||
context.create_instance(
|
||||
name=key,
|
||||
subset="trackItem",
|
||||
subset="{0}{1}".format(family, 'Default'),
|
||||
asset=value["item"].name(),
|
||||
item=value["item"],
|
||||
family="trackItem",
|
||||
family=family,
|
||||
tasks=value["tasks"],
|
||||
startFrame=value["startFrame"],
|
||||
endFrame=value["endFrame"],
|
||||
13
pype/plugins/nukestudio/publish/collect_framerate.py
Normal file
13
pype/plugins/nukestudio/publish/collect_framerate.py
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
from pyblish import api
|
||||
|
||||
class CollectFramerate(api.ContextPlugin):
|
||||
"""Collect framerate from selected sequence."""
|
||||
|
||||
order = api.CollectorOrder
|
||||
label = "Collect Framerate"
|
||||
hosts = ["nukestudio"]
|
||||
|
||||
def process(self, context):
|
||||
for item in context.data.get("selection", []):
|
||||
context.data["framerate"] = item.sequence().framerate().toFloat()
|
||||
return
|
||||
72
pype/plugins/nukestudio/publish/collect_hierarchy_context.py
Normal file
72
pype/plugins/nukestudio/publish/collect_hierarchy_context.py
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
import pyblish.api
|
||||
from avalon import api
|
||||
|
||||
|
||||
class CollectHierarchyContext(pyblish.api.ContextPlugin):
|
||||
"""Collecting hierarchy context from `parents` and `hierarchy` data
|
||||
present in `clip` family instances coming from the request json data file
|
||||
|
||||
It will add `hierarchical_context` into each instance for integrate
|
||||
plugins to be able to create needed parents for the context if they
|
||||
don't exist yet
|
||||
"""
|
||||
|
||||
label = "Collect Hierarchy Context"
|
||||
order = pyblish.api.CollectorOrder + 0.1
|
||||
|
||||
def update_dict(self, ex_dict, new_dict):
|
||||
for key in ex_dict:
|
||||
if key in new_dict and isinstance(ex_dict[key], dict):
|
||||
new_dict[key] = self.update_dict(ex_dict[key], new_dict[key])
|
||||
else:
|
||||
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
|
||||
|
||||
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"]))
|
||||
30
pype/plugins/nukestudio/publish/collect_metadata.py
Normal file
30
pype/plugins/nukestudio/publish/collect_metadata.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
from pyblish import api
|
||||
|
||||
|
||||
class CollectClipMetadata(api.InstancePlugin):
|
||||
"""Collect Metadata from selected track items."""
|
||||
|
||||
order = api.CollectorOrder + 0.01
|
||||
label = "Collect Metadata"
|
||||
hosts = ["nukestudio"]
|
||||
|
||||
def process(self, instance):
|
||||
item = instance.data["item"]
|
||||
ti_metadata = self.metadata_to_string(dict(item.metadata()))
|
||||
ms_metadata = self.metadata_to_string(
|
||||
dict(item.source().mediaSource().metadata()))
|
||||
|
||||
instance.data["clipMetadata"] = ti_metadata
|
||||
instance.data["mediaSourceMetadata"] = ms_metadata
|
||||
|
||||
self.log.info(instance.data["clipMetadata"])
|
||||
self.log.info(instance.data["mediaSourceMetadata"])
|
||||
return
|
||||
|
||||
def metadata_to_string(self, metadata):
|
||||
data = dict()
|
||||
for k, v in metadata.items():
|
||||
if v not in ["-", ""]:
|
||||
data[str(k)] = v
|
||||
|
||||
return data
|
||||
45
pype/plugins/nukestudio/publish/collect_subsets.py
Normal file
45
pype/plugins/nukestudio/publish/collect_subsets.py
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
from pyblish import api
|
||||
|
||||
|
||||
class CollectClipSubsets(api.InstancePlugin):
|
||||
"""Collect Subsets from selected Clips, Tags, Preset."""
|
||||
|
||||
order = api.CollectorOrder + 0.01
|
||||
label = "Collect Subsets"
|
||||
hosts = ["nukestudio"]
|
||||
families = ['clip']
|
||||
|
||||
def process(self, instance):
|
||||
tags = instance.data.get('tags', None)
|
||||
presets = instance.context.data['presets'][
|
||||
instance.context.data['host']]
|
||||
if tags:
|
||||
self.log.info(tags)
|
||||
|
||||
if presets:
|
||||
self.log.info(presets)
|
||||
|
||||
# get presets and tags
|
||||
# iterate tags and get task family
|
||||
# iterate tags and get host family
|
||||
# iterate tags and get handles family
|
||||
|
||||
instance = instance.context.create_instance(instance_name)
|
||||
|
||||
instance.data.update({
|
||||
"subset": subset_name,
|
||||
"stagingDir": staging_dir,
|
||||
"task": task,
|
||||
"representation": ext[1:],
|
||||
"host": host,
|
||||
"asset": asset_name,
|
||||
"label": label,
|
||||
"name": name,
|
||||
# "hierarchy": hierarchy,
|
||||
# "parents": parents,
|
||||
"family": family,
|
||||
"families": [families, 'ftrack'],
|
||||
"publish": True,
|
||||
# "files": files_list
|
||||
})
|
||||
instances.append(instance)
|
||||
30
pype/plugins/nukestudio/publish/collect_tags.py
Normal file
30
pype/plugins/nukestudio/publish/collect_tags.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
from pyblish import api
|
||||
|
||||
|
||||
class CollectClipTags(api.InstancePlugin):
|
||||
"""Collect Tags from selected track items."""
|
||||
|
||||
order = api.CollectorOrder
|
||||
label = "Collect Tags"
|
||||
hosts = ["nukestudio"]
|
||||
families = ['clip']
|
||||
|
||||
def process(self, instance):
|
||||
tags = instance.data["item"].tags()
|
||||
|
||||
tags_d = []
|
||||
if tags:
|
||||
for t in tags:
|
||||
tag_data = {
|
||||
"name": t.name(),
|
||||
"object": t,
|
||||
"metadata": t.metadata(),
|
||||
"inTime": t.inTime(),
|
||||
"outTime": t.outTime(),
|
||||
}
|
||||
tags_d.append(tag_data)
|
||||
|
||||
instance.data["tags"] = tags_d
|
||||
|
||||
self.log.info(instance.data["tags"])
|
||||
return
|
||||
132
pype/plugins/nukestudio/publish/integrate_assumed_destination.py
Normal file
132
pype/plugins/nukestudio/publish/integrate_assumed_destination.py
Normal file
|
|
@ -0,0 +1,132 @@
|
|||
import pyblish.api
|
||||
import os
|
||||
|
||||
from avalon import io, api
|
||||
|
||||
|
||||
class IntegrateAssumedDestination(pyblish.api.InstancePlugin):
|
||||
"""Generate the assumed destination path where the file will be stored"""
|
||||
|
||||
label = "Integrate Assumed Destination"
|
||||
order = pyblish.api.IntegratorOrder - 0.05
|
||||
families = ["clip", "projectfile"]
|
||||
|
||||
def process(self, instance):
|
||||
|
||||
self.create_destination_template(instance)
|
||||
|
||||
template_data = instance.data["assumedTemplateData"]
|
||||
# template = instance.data["template"]
|
||||
|
||||
anatomy = instance.context.data['anatomy']
|
||||
# template = anatomy.publish.path
|
||||
anatomy_filled = anatomy.format(template_data)
|
||||
mock_template = anatomy_filled.publish.path
|
||||
|
||||
# For now assume resources end up in a "resources" folder in the
|
||||
# published folder
|
||||
mock_destination = os.path.join(os.path.dirname(mock_template),
|
||||
"resources")
|
||||
|
||||
# Clean the path
|
||||
mock_destination = os.path.abspath(os.path.normpath(mock_destination))
|
||||
|
||||
# Define resource destination and transfers
|
||||
resources = instance.data.get("resources", list())
|
||||
transfers = instance.data.get("transfers", list())
|
||||
for resource in resources:
|
||||
|
||||
# Add destination to the resource
|
||||
source_filename = os.path.basename(resource["source"])
|
||||
destination = os.path.join(mock_destination, source_filename)
|
||||
|
||||
# Force forward slashes to fix issue with software unable
|
||||
# to work correctly with backslashes in specific scenarios
|
||||
# (e.g. escape characters in PLN-151 V-Ray UDIM)
|
||||
destination = destination.replace("\\", "/")
|
||||
|
||||
resource['destination'] = destination
|
||||
|
||||
# Collect transfers for the individual files of the resource
|
||||
# e.g. all individual files of a cache or UDIM textures.
|
||||
files = resource['files']
|
||||
for fsrc in files:
|
||||
fname = os.path.basename(fsrc)
|
||||
fdest = os.path.join(mock_destination, fname)
|
||||
transfers.append([fsrc, fdest])
|
||||
|
||||
instance.data["resources"] = resources
|
||||
instance.data["transfers"] = transfers
|
||||
|
||||
def create_destination_template(self, instance):
|
||||
"""Create a filepath based on the current data available
|
||||
|
||||
Example template:
|
||||
{root}/{project}/{silo}/{asset}/publish/{subset}/v{version:0>3}/
|
||||
{subset}.{representation}
|
||||
Args:
|
||||
instance: the instance to publish
|
||||
|
||||
Returns:
|
||||
file path (str)
|
||||
"""
|
||||
|
||||
# get all the stuff from the database
|
||||
subset_name = instance.data["subset"]
|
||||
self.log.info(subset_name)
|
||||
asset_name = instance.data["asset"]
|
||||
project_name = api.Session["AVALON_PROJECT"]
|
||||
|
||||
project = io.find_one({"type": "project",
|
||||
"name": project_name},
|
||||
projection={"config": True, "data": True})
|
||||
|
||||
template = project["config"]["template"]["publish"]
|
||||
# anatomy = instance.context.data['anatomy']
|
||||
|
||||
asset = io.find_one({"type": "asset",
|
||||
"name": asset_name,
|
||||
"parent": project["_id"]})
|
||||
|
||||
assert asset, ("No asset found by the name '{}' "
|
||||
"in project '{}'".format(asset_name, project_name))
|
||||
silo = asset['silo']
|
||||
|
||||
subset = io.find_one({"type": "subset",
|
||||
"name": subset_name,
|
||||
"parent": asset["_id"]})
|
||||
|
||||
# assume there is no version yet, we start at `1`
|
||||
version = None
|
||||
version_number = 1
|
||||
if subset is not None:
|
||||
version = io.find_one({"type": "version",
|
||||
"parent": subset["_id"]},
|
||||
sort=[("name", -1)])
|
||||
|
||||
# if there is a subset there ought to be version
|
||||
if version is not None:
|
||||
version_number += version["name"]
|
||||
|
||||
if instance.data.get('version'):
|
||||
version_number = int(instance.data.get('version'))
|
||||
|
||||
hierarchy = asset['data']['parents']
|
||||
if hierarchy:
|
||||
# hierarchy = os.path.sep.join(hierarchy)
|
||||
hierarchy = os.path.join(*hierarchy)
|
||||
|
||||
template_data = {"root": api.Session["AVALON_PROJECTS"],
|
||||
"project": {"name": project_name,
|
||||
"code": project['data']['code']},
|
||||
"silo": silo,
|
||||
"family": instance.data['family'],
|
||||
"asset": asset_name,
|
||||
"subset": subset_name,
|
||||
"version": version_number,
|
||||
"hierarchy": hierarchy,
|
||||
"representation": "TEMP"}
|
||||
|
||||
instance.data["assumedTemplateData"] = template_data
|
||||
self.log.info(template_data)
|
||||
instance.data["template"] = template
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
import pyblish.api
|
||||
|
||||
|
||||
class IntegrateFtrackComponentOverwrite(pyblish.api.InstancePlugin):
|
||||
"""
|
||||
Set `component_overwrite` to True on all instances `ftrackComponentsList`
|
||||
"""
|
||||
|
||||
order = pyblish.api.IntegratorOrder + 0.49
|
||||
label = 'Overwrite ftrack created versions'
|
||||
families = ["clip"]
|
||||
optional = True
|
||||
active = False
|
||||
|
||||
def process(self, instance):
|
||||
component_list = instance.data['ftrackComponentsList']
|
||||
|
||||
for cl in component_list:
|
||||
cl['component_overwrite'] = True
|
||||
self.log.debug('Component {} overwriting'.format(
|
||||
cl['component_data']['name']))
|
||||
140
pype/plugins/nukestudio/publish/integrate_hierarchy_avalon.py
Normal file
140
pype/plugins/nukestudio/publish/integrate_hierarchy_avalon.py
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
import pyblish.api
|
||||
from avalon import io
|
||||
|
||||
|
||||
class IntegrateHierarchyToAvalon(pyblish.api.ContextPlugin):
|
||||
"""
|
||||
Create entities in ftrack based on collected data from premiere
|
||||
|
||||
"""
|
||||
|
||||
order = pyblish.api.IntegratorOrder - 0.1
|
||||
label = 'Integrate Hierarchy To Avalon'
|
||||
families = ['clip']
|
||||
|
||||
def process(self, context):
|
||||
if "hierarchyContext" not in context.data:
|
||||
return
|
||||
|
||||
self.db = io
|
||||
if not self.db.Session:
|
||||
self.db.install()
|
||||
|
||||
input_data = context.data["hierarchyContext"]
|
||||
self.import_to_avalon(input_data)
|
||||
|
||||
def import_to_avalon(self, input_data, parent=None):
|
||||
|
||||
for name in input_data:
|
||||
self.log.info('input_data[name]: {}'.format(input_data[name]))
|
||||
entity_data = input_data[name]
|
||||
entity_type = entity_data['entity_type']
|
||||
|
||||
data = {}
|
||||
# Process project
|
||||
if entity_type.lower() == 'project':
|
||||
entity = self.db.find_one({'type': 'project'})
|
||||
# TODO: should be in validator?
|
||||
assert (entity is not None), "Didn't find project in DB"
|
||||
|
||||
# get data from already existing project
|
||||
for key, value in entity.get('data', {}).items():
|
||||
data[key] = value
|
||||
|
||||
self.av_project = entity
|
||||
# Raise error if project or parent are not set
|
||||
elif self.av_project is None or parent is None:
|
||||
raise AssertionError(
|
||||
"Collected items are not in right order!"
|
||||
)
|
||||
# Else process assset
|
||||
else:
|
||||
entity = self.db.find_one({'type': 'asset', 'name': name})
|
||||
# Create entity if doesn't exist
|
||||
if entity is None:
|
||||
if self.av_project['_id'] == parent['_id']:
|
||||
silo = None
|
||||
elif parent['silo'] is None:
|
||||
silo = parent['name']
|
||||
else:
|
||||
silo = parent['silo']
|
||||
entity = self.create_avalon_asset(name, silo)
|
||||
self.log.info('entity: {}'.format(entity))
|
||||
self.log.info('data: {}'.format(entity.get('data', {})))
|
||||
self.log.info('____1____')
|
||||
data['entityType'] = entity_type
|
||||
# TASKS
|
||||
tasks = entity_data.get('tasks', [])
|
||||
if tasks is not None or len(tasks) > 0:
|
||||
data['tasks'] = tasks
|
||||
parents = []
|
||||
visualParent = None
|
||||
data = input_data[name]
|
||||
if self.av_project['_id'] != parent['_id']:
|
||||
visualParent = parent['_id']
|
||||
parents.extend(parent.get('data', {}).get('parents', []))
|
||||
parents.append(parent['name'])
|
||||
data['visualParent'] = visualParent
|
||||
data['parents'] = parents
|
||||
|
||||
self.db.update_many(
|
||||
{'_id': entity['_id']},
|
||||
{'$set': {
|
||||
'data': data,
|
||||
}})
|
||||
|
||||
entity = self.db.find_one({'type': 'asset', 'name': name})
|
||||
self.log.info('entity: {}'.format(entity))
|
||||
self.log.info('data: {}'.format(entity.get('data', {})))
|
||||
self.log.info('____2____')
|
||||
|
||||
# Else get data from already existing
|
||||
else:
|
||||
self.log.info('entity: {}'.format(entity))
|
||||
self.log.info('data: {}'.format(entity.get('data', {})))
|
||||
self.log.info('________')
|
||||
for key, value in entity.get('data', {}).items():
|
||||
data[key] = value
|
||||
|
||||
data['entityType'] = entity_type
|
||||
# TASKS
|
||||
tasks = entity_data.get('tasks', [])
|
||||
if tasks is not None or len(tasks) > 0:
|
||||
data['tasks'] = tasks
|
||||
parents = []
|
||||
visualParent = None
|
||||
# do not store project's id as visualParent (silo asset)
|
||||
|
||||
if self.av_project['_id'] != parent['_id']:
|
||||
visualParent = parent['_id']
|
||||
parents.extend(parent.get('data', {}).get('parents', []))
|
||||
parents.append(parent['name'])
|
||||
data['visualParent'] = visualParent
|
||||
data['parents'] = parents
|
||||
|
||||
# CUSTOM ATTRIBUTES
|
||||
for k, val in entity_data.get('custom_attributes', {}).items():
|
||||
data[k] = val
|
||||
|
||||
# Update entity data with input data
|
||||
self.db.update_many(
|
||||
{'_id': entity['_id']},
|
||||
{'$set': {
|
||||
'data': data,
|
||||
}})
|
||||
|
||||
if 'childs' in entity_data:
|
||||
self.import_to_avalon(entity_data['childs'], entity)
|
||||
|
||||
def create_avalon_asset(self, name, silo):
|
||||
item = {
|
||||
'schema': 'avalon-core:asset-2.0',
|
||||
'name': name,
|
||||
'silo': silo,
|
||||
'parent': self.av_project['_id'],
|
||||
'type': 'asset',
|
||||
'data': {}
|
||||
}
|
||||
entity_id = self.db.insert_one(item).inserted_id
|
||||
|
||||
return self.db.find_one({'_id': entity_id})
|
||||
155
pype/plugins/nukestudio/publish/integrate_hierarchy_ftrack.py
Normal file
155
pype/plugins/nukestudio/publish/integrate_hierarchy_ftrack.py
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
import pyblish.api
|
||||
|
||||
|
||||
class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin):
|
||||
"""
|
||||
Create entities in ftrack based on collected data from premiere
|
||||
Example of entry data:
|
||||
{
|
||||
"ProjectXS": {
|
||||
"entity_type": "Project",
|
||||
"custom_attributes": {
|
||||
"fps": 24,...
|
||||
},
|
||||
"tasks": [
|
||||
"Compositing",
|
||||
"Lighting",... *task must exist as task type in project schema*
|
||||
],
|
||||
"childs": {
|
||||
"sq01": {
|
||||
"entity_type": "Sequence",
|
||||
...
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
order = pyblish.api.IntegratorOrder
|
||||
label = 'Integrate Hierarchy To Ftrack'
|
||||
families = ["clip"]
|
||||
optional = False
|
||||
|
||||
def process(self, context):
|
||||
self.context = context
|
||||
if "hierarchyContext" not in context.data:
|
||||
return
|
||||
|
||||
self.ft_project = None
|
||||
self.session = context.data["ftrackSession"]
|
||||
|
||||
input_data = context.data["hierarchyContext"]
|
||||
|
||||
# adding ftrack types from presets
|
||||
ftrack_types = context.data['ftrackTypes']
|
||||
|
||||
self.import_to_ftrack(input_data, ftrack_types)
|
||||
|
||||
def import_to_ftrack(self, input_data, ftrack_types, parent=None):
|
||||
for entity_name in input_data:
|
||||
entity_data = input_data[entity_name]
|
||||
entity_type = entity_data['entity_type'].capitalize()
|
||||
|
||||
if entity_type.lower() == 'project':
|
||||
query = 'Project where full_name is "{}"'.format(entity_name)
|
||||
entity = self.session.query(query).one()
|
||||
self.ft_project = entity
|
||||
self.task_types = self.get_all_task_types(entity)
|
||||
|
||||
elif self.ft_project is None or parent is None:
|
||||
raise AssertionError(
|
||||
"Collected items are not in right order!"
|
||||
)
|
||||
|
||||
# try to find if entity already exists
|
||||
else:
|
||||
query = '{} where name is "{}" and parent_id is "{}"'.format(
|
||||
entity_type, entity_name, parent['id']
|
||||
)
|
||||
try:
|
||||
entity = self.session.query(query).one()
|
||||
except Exception:
|
||||
entity = None
|
||||
|
||||
# Create entity if not exists
|
||||
if entity is None:
|
||||
entity = self.create_entity(
|
||||
name=entity_name,
|
||||
type=entity_type,
|
||||
parent=parent
|
||||
)
|
||||
# self.log.info('entity: {}'.format(dict(entity)))
|
||||
# CUSTOM ATTRIBUTES
|
||||
custom_attributes = entity_data.get('custom_attributes', [])
|
||||
instances = [
|
||||
i for i in self.context.data["instances"] if i.data['asset'] in entity['name']]
|
||||
for key in custom_attributes:
|
||||
assert (key in entity['custom_attributes']), (
|
||||
'Missing custom attribute')
|
||||
|
||||
entity['custom_attributes'][key] = custom_attributes[key]
|
||||
for instance in instances:
|
||||
instance.data['ftrackShotId'] = entity['id']
|
||||
|
||||
self.session.commit()
|
||||
|
||||
# TASKS
|
||||
tasks = entity_data.get('tasks', [])
|
||||
existing_tasks = []
|
||||
tasks_to_create = []
|
||||
for child in entity['children']:
|
||||
if child.entity_type.lower() == 'task':
|
||||
existing_tasks.append(child['name'])
|
||||
# existing_tasks.append(child['type']['name'])
|
||||
|
||||
for task in tasks:
|
||||
if task in existing_tasks:
|
||||
print("Task {} already exists".format(task))
|
||||
continue
|
||||
tasks_to_create.append(task)
|
||||
|
||||
for task in tasks_to_create:
|
||||
self.create_task(
|
||||
name=task,
|
||||
task_type=ftrack_types[task],
|
||||
parent=entity
|
||||
)
|
||||
self.session.commit()
|
||||
|
||||
if 'childs' in entity_data:
|
||||
self.import_to_ftrack(
|
||||
entity_data['childs'], ftrack_types, entity)
|
||||
|
||||
def get_all_task_types(self, project):
|
||||
tasks = {}
|
||||
proj_template = project['project_schema']
|
||||
temp_task_types = proj_template['_task_type_schema']['types']
|
||||
|
||||
for type in temp_task_types:
|
||||
if type['name'] not in tasks:
|
||||
tasks[type['name']] = type
|
||||
|
||||
return tasks
|
||||
|
||||
def create_task(self, name, task_type, parent):
|
||||
task = self.session.create('Task', {
|
||||
'name': name,
|
||||
'parent': parent
|
||||
})
|
||||
# TODO not secured!!! - check if task_type exists
|
||||
self.log.info(task_type)
|
||||
self.log.info(self.task_types)
|
||||
task['type'] = self.task_types[task_type]
|
||||
|
||||
self.session.commit()
|
||||
|
||||
return task
|
||||
|
||||
def create_entity(self, name, type, parent):
|
||||
entity = self.session.create(type, {
|
||||
'name': name,
|
||||
'parent': parent
|
||||
})
|
||||
self.session.commit()
|
||||
|
||||
return entity
|
||||
|
|
@ -10,7 +10,7 @@ class ValidateNames(api.InstancePlugin):
|
|||
"""
|
||||
|
||||
order = api.ValidatorOrder
|
||||
families = ["trackItem"]
|
||||
families = ["clip"]
|
||||
match = api.Exact
|
||||
label = "Names"
|
||||
hosts = ["nukestudio"]
|
||||
|
|
@ -39,4 +39,4 @@ class ValidateNamesFtrack(ValidateNames):
|
|||
"""
|
||||
|
||||
order = api.ValidatorOrder
|
||||
families = ["trackItem", "ftrack"]
|
||||
families = ["clip", "ftrack"]
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
from pyblish import api
|
||||
|
||||
class ValidateTrackItem(api.InstancePlugin):
|
||||
class ValidateClip(api.InstancePlugin):
|
||||
"""Validate the track item to the sequence.
|
||||
|
||||
Exact matching to optimize processing.
|
||||
"""
|
||||
|
||||
order = api.ValidatorOrder
|
||||
families = ["trackItem"]
|
||||
families = ["clip"]
|
||||
match = api.Exact
|
||||
label = "Validate Track Item"
|
||||
hosts = ["nukestudio"]
|
||||
|
|
@ -44,14 +44,3 @@ class ValidateTrackItem(api.InstancePlugin):
|
|||
assert sequence.framerate() == source_framerate, msg.format(
|
||||
"framerate", source_framerate, sequence.framerate()
|
||||
)
|
||||
|
||||
#
|
||||
# class ValidateTrackItemFtrack(ValidateTrackItem):
|
||||
# """Validate the track item to the sequence.
|
||||
#
|
||||
# Because we are matching the families exactly, we need this plugin to
|
||||
# accommodate for the ftrack family addition.
|
||||
# """
|
||||
#
|
||||
# order = api.ValidatorOrder
|
||||
# families = ["trackItem", "ftrack"]
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE hieroXML>
|
||||
<hieroXML version="11" release="11.2v2" revision="4" name="NukeStudio">
|
||||
<Project eightBitLut="sRGB" viewerLut="sRGB" logLut="Cineon" redVideoDecodeMode="0" posterFrameSetting="First" ocioConfigName="custom" timedisplayformat="0" exportRootPathMode="ProjectDirectory" customExportRootPath="" timelineReformatResizeType="Width" useViewColors="0" samplerate="48000/1" timelineReformatCenter="1" editable="1" shotPresetName="Basic Nuke Shot With Annotations" name="SharedTags" floatLut="linear" nukeUseOCIO="0" project_directory="" workingSpace="linear" framerate="24/1" sixteenBitLut="sRGB" buildTrackName="VFX" timelineReformatType="To Format" thumbnailLut="sRGB" posterCustomFrame="0" guid="{ba9eb7de-26cc-7146-a12b-b59ab35d5469}" ocioconfigpath="" ocioConfigCustom="0" starttimecode="86400">
|
||||
<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" name="Sequences" guid="{a3ba3ce5-8d61-6240-a7b3-b99e4a8bbe9d}">
|
||||
<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" name="Tags" guid="{74723746-d7a9-884f-9489-bf0cfe2137fa}">
|
||||
<RootBinProjectItem editable="1" guid="{74723746-d7a9-884f-9489-bf0cfe2137fa}" name="Tags">
|
||||
<items>
|
||||
<TagClassProjectItem editable="1" name="audio" guid="{30184e7c-e9d0-ba40-8627-f3600b3c7d0b}">
|
||||
<TagClass editable="1" icon="Y:/bait-conda-git-deployment/repositories/bait-environment/pyblish-bumpybox/pyblish_bumpybox/environment_variables/hiero_plugin_path/StartupProjects/Hiero/volume.png" visible="1" name="audio" guid="1978e3db-6ad6-af41-87e6-88a8c1a2ef6c" objName="tag">
|
||||
<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>
|
||||
|
|
@ -23,10 +23,10 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<BinProjectItem editable="1" name="task" guid="{c26fe4a3-ea9b-e446-92c3-4f2d1e5c5c47}">
|
||||
<BinProjectItem editable="1" guid="{c26fe4a3-ea9b-e446-92c3-4f2d1e5c5c47}" name="task">
|
||||
<items>
|
||||
<TagClassProjectItem editable="1" name="Editing" guid="{b5885be5-d09b-244b-b4a4-dec427a534a7}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Editing" guid="4b652e43-47ef-6c4e-871d-18cdc3299f0f" objName="tag">
|
||||
<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>
|
||||
|
|
@ -37,8 +37,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Blocking" guid="{2d8da183-0d62-344e-810f-133153ea9a42}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Blocking" guid="9d6fb373-166a-684c-a5d2-d9d6bd6ca0ca" objName="tag">
|
||||
<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>
|
||||
|
|
@ -49,8 +49,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Tracking" guid="{eb2f8f5f-4e80-2046-9aa5-cf49e3f44dc2}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Tracking" guid="aa977a57-886d-ed4b-b91a-aeb1e25ddabc" objName="tag">
|
||||
<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>
|
||||
|
|
@ -61,8 +61,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Animation" guid="{bd84a0a6-454a-e346-8cfc-b32719aac901}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Animation" guid="4128ded5-cf1d-7249-9d2c-ddbe52d2e4e7" objName="tag">
|
||||
<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>
|
||||
|
|
@ -73,8 +73,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Texturing" guid="{b3236005-6f9b-ef4a-bb5d-0df15637e9a5}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Texturing" guid="3a00a983-f8a1-d44e-8446-48fd5ba2e7c4" objName="tag">
|
||||
<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>
|
||||
|
|
@ -85,8 +85,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Layout" guid="{459777c3-87e1-b648-9f9e-48c63318e458}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Layout" guid="4289d2cd-5328-6b40-a897-f3ede4e816c7" objName="tag">
|
||||
<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>
|
||||
|
|
@ -97,8 +97,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Build" guid="{9151f675-6785-d74f-9fcb-5ba1d3975213}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Build" guid="ad57f46d-7f01-8b46-a42d-e4f166d6c5a2" objName="tag">
|
||||
<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>
|
||||
|
|
@ -109,8 +109,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Painting" guid="{3f6a2f81-38ed-3a40-8dc1-8795d046ceb0}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Painting" guid="92531993-b3ef-f049-94da-0290fcb43877" objName="tag">
|
||||
<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>
|
||||
|
|
@ -121,8 +121,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Rigging" guid="{32c40ffe-b951-db45-a06f-96aa1ee886c9}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Rigging" guid="ef53b66c-6389-f341-a548-98ab0f5dfd36" objName="tag">
|
||||
<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>
|
||||
|
|
@ -133,8 +133,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Match Move" guid="{458175b6-56c8-6241-a3c5-3bb15c7b4321}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Match Move" guid="2da532f7-6102-e648-9cc9-f897adde24fa" objName="tag">
|
||||
<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>
|
||||
|
|
@ -145,8 +145,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Compositing" guid="{4f432ee8-08b9-1541-b724-16da8d326575}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Compositing" guid="6dfee79f-109e-6943-86ee-e4868eebf885" objName="tag">
|
||||
<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>
|
||||
|
|
@ -157,8 +157,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Lighting" guid="{3bc6599b-7095-f744-8f96-74a2fbbaba51}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Lighting" guid="2e295a1d-0730-4544-bc28-471e217295cf" objName="tag">
|
||||
<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>
|
||||
|
|
@ -169,8 +169,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Lookdev" guid="{59cc88aa-30fb-d94b-9c6b-860585be1c5a}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Lookdev" guid="728df9b6-afc7-8d4f-b85e-0d944d484c73" objName="tag">
|
||||
<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>
|
||||
|
|
@ -181,8 +181,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="Modeling" guid="{f3a97406-c1af-fe4a-a607-da3872d15f1b}">
|
||||
<TagClass editable="1" icon="icons:Tag.png" visible="1" name="Modeling" guid="8440a540-145b-6b47-b935-18dcc0ca5766" objName="tag">
|
||||
<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>
|
||||
|
|
@ -199,10 +199,10 @@
|
|||
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
|
||||
<BinViewSortOrder>0</BinViewSortOrder>
|
||||
</BinProjectItem>
|
||||
<BinProjectItem editable="1" name="handles" guid="{d9f52354-348b-b940-b9d8-fb902c94a9be}">
|
||||
<BinProjectItem editable="1" guid="{d9f52354-348b-b940-b9d8-fb902c94a9be}" name="handles">
|
||||
<items>
|
||||
<TagClassProjectItem editable="1" name="25 frames" guid="{ecd238d1-6d38-a740-ae24-b2ba84d1360c}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="25 frames" guid="172ca2e6-9351-f346-968c-cbcd72adcd43" objName="tag">
|
||||
<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>
|
||||
|
|
@ -214,8 +214,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="20 frames" guid="{3c1da268-6255-5e43-8564-14f5c4483c7d}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="20 frames" guid="e2918655-a7f2-fc42-9cb7-f402c95ace69" objName="tag">
|
||||
<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>
|
||||
|
|
@ -227,8 +227,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="15 frames" guid="{5b502d49-cd75-3741-aa78-4f178049e9cd}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="15 frames" guid="36e70c47-29a8-9340-912c-1a1f70257618" objName="tag">
|
||||
<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>
|
||||
|
|
@ -240,8 +240,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="10 frames" guid="{eae75001-3b2f-1443-9687-dfbb6a381c55}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="10 frames" guid="a45bd02c-5f1e-c040-ad8c-0c6e124f55c0" objName="tag">
|
||||
<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>
|
||||
|
|
@ -253,8 +253,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="start: add 20 frames" guid="{39e0a5dc-9f30-8d45-b497-59af4a4e8f7d}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="start: add 20 frames" guid="8bfb4e13-42e7-4344-8b33-1df55ed5cc19" objName="tag">
|
||||
<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>
|
||||
|
|
@ -268,8 +268,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="start: add 15 frames" guid="{02801652-2e46-f04e-a9bb-0be47591d731}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="start: add 15 frames" guid="9d2f5078-5ded-ab47-9be7-8f30b9362b0c" objName="tag">
|
||||
<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>
|
||||
|
|
@ -283,8 +283,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="start: add 10 frames" guid="{b7415b6d-3b9c-924b-a6b9-0b4b20917c28}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="start: add 10 frames" guid="be4ae97e-d647-9145-bfd2-521a0ca48f80" objName="tag">
|
||||
<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>
|
||||
|
|
@ -298,8 +298,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="end: add 15 frames" guid="{4c146343-8f3d-6c43-9d49-6fc2fc8d860c}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="end: add 15 frames" guid="b07bda39-5339-b548-ae2f-54d791110cbe" objName="tag">
|
||||
<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>
|
||||
|
|
@ -313,8 +313,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="end: add 10 frames" guid="{1218eaee-7065-fa42-857d-3337a25d6a97}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="end: add 10 frames" guid="9c2bed9c-064a-3243-ad0f-8b7ac147a427" objName="tag">
|
||||
<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>
|
||||
|
|
@ -328,8 +328,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="end: add 5 frames" guid="{b9b0373d-1461-094c-a1e1-26408b68378f}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="end: add 5 frames" guid="2466e187-aa71-804e-9ffb-1c1c57d5673c" objName="tag">
|
||||
<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>
|
||||
|
|
@ -343,8 +343,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="end: add 20 frames" guid="{81446970-d7b7-a142-970e-d7d48073b74a}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="end: add 20 frames" guid="8f2d87d5-47c3-154e-8236-4f0fe3e24216" objName="tag">
|
||||
<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>
|
||||
|
|
@ -358,8 +358,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="start: add 5 frames" guid="{383f69df-2421-d848-a4a6-8ed17386cb67}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="start: add 5 frames" guid="aec1eac2-1257-e64d-9fed-78afbee0dd31" objName="tag">
|
||||
<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>
|
||||
|
|
@ -373,8 +373,8 @@
|
|||
</sets>
|
||||
</TagClass>
|
||||
</TagClassProjectItem>
|
||||
<TagClassProjectItem editable="1" name="5 frames" guid="{36e7472b-2ea6-8747-8181-f3bf46cfe04a}">
|
||||
<TagClass editable="1" icon="icons:TagClapperBoard.png" visible="1" name="5 frames" guid="46e4f25b-b92f-414f-9c50-798f1905879f" objName="tag">
|
||||
<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>
|
||||
|
|
@ -392,47 +392,51 @@
|
|||
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
|
||||
<BinViewSortOrder>0</BinViewSortOrder>
|
||||
</BinProjectItem>
|
||||
<BinProjectItem editable="1" name="software" guid="{2896f84a-7b81-0a45-af56-01df16a42c80}">
|
||||
<BinProjectItem editable="1" guid="{2896f84a-7b81-0a45-af56-01df16a42c80}" name="software">
|
||||
<items>
|
||||
<TagClassProjectItem editable="1" name="houdini" guid="{e56c84f8-4958-9d4b-b712-c752daa20d87}">
|
||||
<TagClass editable="1" icon="houdini.png" visible="1" name="houdini" guid="bfcba753-4337-6549-a6bb-db96e67261f0" objName="tag">
|
||||
<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" name="fusion" guid="{bcebc8dc-2725-2045-bfe3-678cd0cc14b2}">
|
||||
<TagClass editable="1" icon="fusion.png" visible="1" name="fusion" guid="516c1100-11be-844d-842a-9e2f00a807d5" objName="tag">
|
||||
<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" name="maya" guid="{1e8d1e85-7844-8c43-a0b1-be4fa10da068}">
|
||||
<TagClass editable="1" icon="maya.png" visible="1" name="maya" guid="4bfb4372-c31d-6e4e-aedb-ff1611a487f8" objName="tag">
|
||||
<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" name="nuke" guid="{569a163e-3e00-3242-8be9-41aa4a9cbf5c}">
|
||||
<TagClass editable="1" icon="nuke.png" visible="1" name="nuke" guid="1674dcb2-28b2-fe4d-8cc5-d979c3fa0ddd" objName="tag">
|
||||
<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>
|
||||
|
|
@ -457,9 +461,9 @@
|
|||
<BinViewSortColumnIndex>0</BinViewSortColumnIndex>
|
||||
<BinViewSortOrder>0</BinViewSortOrder>
|
||||
<AllowedItems>2</AllowedItems>
|
||||
<RootBinProjectItem link="internal" guid="{a3ba3ce5-8d61-6240-a7b3-b99e4a8bbe9d}" objName="sequencesBin"/>
|
||||
<RootBinProjectItem link="internal" guid="{74723746-d7a9-884f-9489-bf0cfe2137fa}" objName="tagsBin"/>
|
||||
<MediaFormatValue name="" objName="outputformat" default="0" value="1,[ 0, 0, 1920, 1080],[ 0, 0, 1920, 1080],HD 1080"/>
|
||||
<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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue