Merge branch 'develop' into release/3.15.x

# Conflicts:
#	openpype/hosts/photoshop/api/workio.py
#	openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py
#	pyproject.toml
#	website/docs/artist_hosts_aftereffects.md
This commit is contained in:
Jakub Trllo 2023-01-24 12:31:32 +01:00
commit b0a6be63ac
51 changed files with 920 additions and 800 deletions

View file

@ -1,29 +0,0 @@
import pyblish.api
class ValidateUniqueSubsets(pyblish.api.InstancePlugin):
"""Ensure all instances have a unique subset name"""
order = pyblish.api.ValidatorOrder
label = "Validate Unique Subsets"
families = ["render"]
hosts = ["fusion"]
@classmethod
def get_invalid(cls, instance):
context = instance.context
subset = instance.data["subset"]
for other_instance in context:
if other_instance == instance:
continue
if other_instance.data["subset"] == subset:
return [instance] # current instance is invalid
return []
def process(self, instance):
invalid = self.get_invalid(instance)
if invalid:
raise RuntimeError("Animation content is invalid. See log.")

View file

@ -106,7 +106,7 @@ class CollectUpstreamInputs(pyblish.api.InstancePlugin):
# If no valid output node is set then ignore it as validation
# will be checking those cases.
self.log.debug(
"No output node found, skipping " "collecting of inputs.."
"No output node found, skipping collecting of inputs.."
)
return

View file

@ -22,7 +22,7 @@ class ValidateAlembicInputNode(pyblish.api.InstancePlugin):
invalid = self.get_invalid(instance)
if invalid:
raise PublishValidationError(
("Primitive types found that are not supported"
("Primitive types found that are not supported "
"for Alembic output."),
title=self.label
)

View file

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<root>
<error id="main">
<title>Review subsets not unique</title>
<description>
## Non unique subset name found
Non unique subset names: '{non_unique}'
<detail>
### __Detailed Info__ (optional)
This might happen if you already published for this asset
review subset with legacy name {task}Review.
This legacy name limits possibility of publishing of multiple
reviews from a single workfile. Proper review subset name should
now
contain variant also (as 'Main', 'Default' etc.). That would
result in completely new subset though, so this situation must
be handled manually.
</detail>
### How to repair?
Legacy subsets must be removed from Openpype DB, please ask admin
to do that. Please provide them asset and subset names.
</description>
</error>
</root>

View file

@ -1,38 +0,0 @@
# -*- coding: utf-8 -*-
import collections
import pyblish.api
from openpype.pipeline.publish import (
ValidateContentsOrder,
PublishXmlValidationError,
)
class ValidateReviewSubsetUniqueness(pyblish.api.ContextPlugin):
"""Validates that review subset has unique name."""
order = ValidateContentsOrder
hosts = ["maya"]
families = ["review"]
label = "Validate Review Subset Unique"
def process(self, context):
subset_names = []
for instance in context:
self.log.debug("Instance: {}".format(instance.data))
if instance.data.get('publish'):
subset_names.append(instance.data.get('subset'))
non_unique = \
[item
for item, count in collections.Counter(subset_names).items()
if count > 1]
msg = ("Instance subset names {} are not unique. ".format(non_unique) +
"Ask admin to remove subset from DB for multiple reviews.")
formatting_data = {
"non_unique": ",".join(non_unique)
}
if non_unique:
raise PublishXmlValidationError(self, msg,
formatting_data=formatting_data)

View file

@ -1,39 +0,0 @@
import collections
import pyblish.api
from openpype.pipeline.publish import (
ValidateContentsOrder,
PublishXmlValidationError,
)
class ValidateSubsetUniqueness(pyblish.api.ContextPlugin):
"""
Validate that all subset's names are unique.
"""
label = "Validate Subset Uniqueness"
hosts = ["photoshop"]
order = ValidateContentsOrder
families = ["image"]
def process(self, context):
subset_names = []
for instance in context:
self.log.info("instance:: {}".format(instance.data))
if instance.data.get('publish'):
subset_names.append(instance.data.get('subset'))
non_unique = \
[item
for item, count in collections.Counter(subset_names).items()
if count > 1]
msg = ("Instance subset names {} are not unique. ".format(non_unique) +
"Remove duplicates via Publisher.")
formatting_data = {
"non_unique": ",".join(non_unique)
}
if non_unique:
raise PublishXmlValidationError(self, msg,
formatting_data=formatting_data)

View file

@ -4,9 +4,7 @@ from pathlib import Path
import unreal
from unreal import EditorLevelLibrary
from bson.objectid import ObjectId
from openpype import pipeline
from openpype.client import get_representations
from openpype.pipeline import (
discover_loader_plugins,
loaders_from_representation,
@ -15,7 +13,6 @@ from openpype.pipeline import (
AVALON_CONTAINER_ID,
legacy_io,
)
from openpype.api import get_current_project_settings
from openpype.hosts.unreal.api import plugin
from openpype.hosts.unreal.api import pipeline as upipeline
@ -33,6 +30,17 @@ class ExistingLayoutLoader(plugin.Loader):
color = "orange"
ASSET_ROOT = "/Game/OpenPype"
delete_unmatched_assets = True
@classmethod
def apply_settings(cls, project_settings, *args, **kwargs):
super(ExistingLayoutLoader, cls).apply_settings(
project_settings, *args, **kwargs
)
cls.delete_unmatched_assets = (
project_settings["unreal"]["delete_unmatched_assets"]
)
@staticmethod
def _create_container(
asset_name, asset_dir, asset, representation, parent, family
@ -179,14 +187,7 @@ class ExistingLayoutLoader(plugin.Loader):
return None
def _load_asset(self, representation, version, instance_name, family):
valid_formats = ['fbx', 'abc']
repr_data = legacy_io.find_one({
"type": "representation",
"parent": ObjectId(version),
"name": {"$in": valid_formats}
})
def _load_asset(self, repr_data, representation, instance_name, family):
repr_format = repr_data.get('name')
all_loaders = discover_loader_plugins()
@ -221,10 +222,21 @@ class ExistingLayoutLoader(plugin.Loader):
return assets
def _process(self, lib_path):
data = get_current_project_settings()
delete_unmatched = data["unreal"]["delete_unmatched_assets"]
def _get_valid_repre_docs(self, project_name, version_ids):
valid_formats = ['fbx', 'abc']
repre_docs = list(get_representations(
project_name,
representation_names=valid_formats,
version_ids=version_ids
))
repre_doc_by_version_id = {}
for repre_doc in repre_docs:
version_id = str(repre_doc["parent"])
repre_doc_by_version_id[version_id] = repre_doc
return repre_doc_by_version_id
def _process(self, lib_path, project_name):
ar = unreal.AssetRegistryHelpers.get_asset_registry()
actors = EditorLevelLibrary.get_all_level_actors()
@ -232,30 +244,44 @@ class ExistingLayoutLoader(plugin.Loader):
with open(lib_path, "r") as fp:
data = json.load(fp)
layout_data = []
elements = []
repre_ids = set()
# Get all the representations in the JSON from the database.
for element in data:
if element.get('representation'):
layout_data.append((
pipeline.legacy_io.find_one({
"_id": ObjectId(element.get('representation'))
}),
element
))
repre_id = element.get('representation')
if repre_id:
repre_ids.add(repre_id)
elements.append(element)
repre_docs = get_representations(
project_name, representation_ids=repre_ids
)
repre_docs_by_id = {
str(repre_doc["_id"]): repre_doc
for repre_doc in repre_docs
}
layout_data = []
version_ids = set()
for element in elements:
repre_id = element.get("representation")
repre_doc = repre_docs_by_id.get(repre_id)
if not repre_doc:
raise AssertionError("Representation not found")
if not (repre_doc.get('data') or repre_doc['data'].get('path')):
raise AssertionError("Representation does not have path")
if not repre_doc.get('context'):
raise AssertionError("Representation does not have context")
layout_data.append((repre_doc, element))
version_ids.add(repre_doc["parent"])
# Prequery valid repre documents for all elements at once
valid_repre_doc_by_version_id = self._get_valid_repre_docs(
project_name, version_ids)
containers = []
actors_matched = []
for (repr_data, lasset) in layout_data:
if not repr_data:
raise AssertionError("Representation not found")
if not (repr_data.get('data') or
repr_data.get('data').get('path')):
raise AssertionError("Representation does not have path")
if not repr_data.get('context'):
raise AssertionError("Representation does not have context")
# For every actor in the scene, check if it has a representation in
# those we got from the JSON. If so, create a container for it.
# Otherwise, remove it from the scene.
@ -339,8 +365,8 @@ class ExistingLayoutLoader(plugin.Loader):
continue
assets = self._load_asset(
valid_repre_doc_by_version_id.get(lasset.get('version')),
lasset.get('representation'),
lasset.get('version'),
lasset.get('instance_name'),
lasset.get('family')
)
@ -360,7 +386,7 @@ class ExistingLayoutLoader(plugin.Loader):
continue
if actor not in actors_matched:
self.log.warning(f"Actor {actor.get_name()} not matched.")
if delete_unmatched:
if self.delete_unmatched_assets:
EditorLevelLibrary.destroy_actor(actor)
return containers
@ -377,7 +403,8 @@ class ExistingLayoutLoader(plugin.Loader):
if not curr_level:
raise AssertionError("Current level not saved")
containers = self._process(self.fname)
project_name = context["project"]["name"]
containers = self._process(self.fname, project_name)
curr_level_path = Path(
curr_level.get_outer().get_path_name()).parent.as_posix()
@ -407,7 +434,8 @@ class ExistingLayoutLoader(plugin.Loader):
asset_dir = container.get('namespace')
source_path = get_representation_path(representation)
containers = self._process(source_path)
project_name = legacy_io.active_project()
containers = self._process(source_path, project_name)
data = {
"representation": str(representation["_id"]),

View file

@ -1126,7 +1126,7 @@ class RootItem(FormatObject):
if _mod_path.startswith(root_path):
result = True
replacement = "{" + self.full_key() + "}"
output = replacement + _mod_path[len(root_path):]
output = replacement + mod_path[len(root_path):]
break
return (result, output)

View file

@ -73,7 +73,7 @@ class ExplicitCleanUp(pyblish.api.ContextPlugin):
)
# Delete folders with it's content
succeded_dirs = set()
succeeded = set()
for dirpath in dirpaths:
# Check if directory still exists
# - it is possible that directory was already deleted with
@ -81,13 +81,13 @@ class ExplicitCleanUp(pyblish.api.ContextPlugin):
if os.path.exists(dirpath):
try:
shutil.rmtree(dirpath)
succeded_dirs.add(dirpath)
succeeded.add(dirpath)
except Exception:
failed.append(dirpath)
if succeded_dirs:
if succeeded:
self.log.info(
"Removed direcoties:\n{}".format("\n".join(succeded_dirs))
"Removed directories:\n{}".format("\n".join(succeeded))
)
# Prepare lines for report of failed removements

View file

@ -144,7 +144,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
None
"""
self.log.debug("Qeurying latest versions for instances.")
self.log.debug("Querying latest versions for instances.")
hierarchy = {}
names_by_asset_ids = collections.defaultdict(set)
@ -153,7 +153,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
latest_version = instance.data.get("latestVersion")
instance.data["latestVersion"] = latest_version
# Skip instances withou "assetEntity"
# Skip instances without "assetEntity"
asset_doc = instance.data.get("assetEntity")
if not asset_doc:
continue
@ -162,7 +162,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
asset_id = asset_doc["_id"]
subset_name = instance.data["subset"]
# Prepare instance hiearchy for faster filling latest versions
# Prepare instance hierarchy for faster filling latest versions
if asset_id not in hierarchy:
hierarchy[asset_id] = {}
if subset_name not in hierarchy[asset_id]:
@ -226,7 +226,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
"version": version_number
}
# Hiearchy
# Hierarchy
asset_doc = instance.data.get("assetEntity")
if (
asset_doc

View file

@ -1,4 +1,3 @@
# TODO: this head doc string
"""
Requires:
instance -> otio_clip
@ -153,6 +152,8 @@ class CollectOtioSubsetResources(pyblish.api.InstancePlugin):
self.log.debug(collection)
repre = self._create_representation(
frame_start, frame_end, collection=collection)
instance.data["originalBasename"] = collection.format("{head}")
else:
_trim = False
dirname, filename = os.path.split(media_ref.target_url)
@ -167,6 +168,10 @@ class CollectOtioSubsetResources(pyblish.api.InstancePlugin):
repre = self._create_representation(
frame_start, frame_end, file=filename, trim=_trim)
instance.data["originalBasename"] = os.path.splitext(filename)[0]
instance.data["originalDirname"] = self.staging_dir
if repre:
# add representation to instance data
instance.data["representations"].append(repre)

View file

@ -3,12 +3,15 @@
<error id="main">
<title>Subset not unique</title>
<description>
## Non unique subset name found
## Clashing subset names found
Multiples instances from your scene are set to publish into the same asset > subset.
Non unique subset names: '{non_unique}'
### How to repair?
Remove offending instance, rename it to have unique name. Maybe layer name wasn't used for multiple instances?
Remove the offending instances or rename to have a unique name.
</description>
</error>
</root>

View file

@ -639,8 +639,13 @@ class IntegrateAsset(pyblish.api.InstancePlugin):
# that `frameStart` index instead. Thus if that frame start
# differs from the collection we want to shift the destination
# frame indices from the source collection.
# In case source are published in place we need to
# skip renumbering
repre_frame_start = repre.get("frameStart")
if repre_frame_start is not None:
if (
"originalBasename" not in template
and repre_frame_start is not None
):
index_frame_start = int(repre["frameStart"])
# Shift destination sequence to the start frame
destination_indexes = [

View file

@ -65,7 +65,7 @@ class IntegrateHeroVersion(pyblish.api.InstancePlugin):
published_repres = instance.data.get("published_representations")
if not published_repres:
self.log.debug(
"*** There are not published representations on the instance."
"*** There are no published representations on the instance."
)
return

View file

@ -23,7 +23,7 @@ class ValidateContainers(OptionalPyblishPluginMixin,
"""Containers are must be updated to latest version on publish."""
label = "Validate Containers"
label = "Validate Outdated Containers"
order = pyblish.api.ValidatorOrder
hosts = ["maya", "houdini", "nuke", "harmony", "photoshop", "aftereffects"]
optional = True

View file

@ -0,0 +1,76 @@
from collections import defaultdict
import pyblish.api
from openpype.pipeline.publish import (
PublishXmlValidationError,
)
class ValidateSubsetUniqueness(pyblish.api.ContextPlugin):
"""Validate all subset names are unique.
This only validates whether the instances currently set to publish from
the workfile overlap one another for the asset + subset they are publishing
to.
This does not perform any check against existing publishes in the database
since it is allowed to publish into existing subsets resulting in
versioning.
A subset may appear twice to publish from the workfile if one
of them is set to publish to another asset than the other.
"""
label = "Validate Subset Uniqueness"
order = pyblish.api.ValidatorOrder
families = ["*"]
def process(self, context):
# Find instance per (asset,subset)
instance_per_asset_subset = defaultdict(list)
for instance in context:
# Ignore disabled instances
if not instance.data.get('publish', True):
continue
# Ignore instance without asset data
asset = instance.data.get("asset")
if asset is None:
self.log.warning("Instance found without `asset` data: "
"{}".format(instance.name))
continue
# Ignore instance without subset data
subset = instance.data.get("subset")
if subset is None:
self.log.warning("Instance found without `subset` data: "
"{}".format(instance.name))
continue
instance_per_asset_subset[(asset, subset)].append(instance)
non_unique = []
for (asset, subset), instances in instance_per_asset_subset.items():
# A single instance per asset, subset is fine
if len(instances) < 2:
continue
non_unique.append("{asset} > {subset}".format(asset=asset,
subset=subset))
if not non_unique:
# All is ok
return
msg = ("Instance subset names {} are not unique. ".format(non_unique) +
"Please remove or rename duplicates.")
formatting_data = {
"non_unique": ",".join(non_unique)
}
if non_unique:
raise PublishXmlValidationError(self, msg,
formatting_data=formatting_data)

View file

@ -1,10 +1,11 @@
import pyblish.api
from openpype.pipeline.publish import PublishValidationError
class ValidateVersion(pyblish.api.InstancePlugin):
"""Validate instance version.
Pype is not allowing overwiting previously published versions.
OpenPype does not allow overwriting previously published versions.
"""
order = pyblish.api.ValidatorOrder
@ -20,11 +21,25 @@ class ValidateVersion(pyblish.api.InstancePlugin):
version = instance.data.get("version")
latest_version = instance.data.get("latestVersion")
if latest_version is not None:
if latest_version is not None and int(version) <= int(latest_version):
# TODO: Remove full non-html version upon drop of old publisher
msg = (
"Version `{0}` from instance `{1}` that you are trying to"
" publish, already exists in the database. Version in"
" database: `{2}`. Please version up your workfile to a higher"
" version number than: `{2}`."
"Version '{0}' from instance '{1}' that you are "
" trying to publish is lower or equal to an existing version "
" in the database. Version in database: '{2}'."
"Please version up your workfile to a higher version number "
"than: '{2}'."
).format(version, instance.data["name"], latest_version)
assert (int(version) > int(latest_version)), msg
msg_html = (
"Version <b>{0}</b> from instance <b>{1}</b> that you are "
" trying to publish is lower or equal to an existing version "
" in the database. Version in database: <b>{2}</b>.<br><br>"
"Please version up your workfile to a higher version number "
"than: <b>{2}</b>."
).format(version, instance.data["name"], latest_version)
raise PublishValidationError(
title="Higher version of publish already exists",
message=msg,
description=msg_html
)

View file

@ -34,6 +34,11 @@
"optional": false,
"active": true
},
"ValidateNoColonsInName": {
"enabled": true,
"optional": false,
"active": true
},
"ExtractBlend": {
"enabled": true,
"optional": true,

View file

@ -37,6 +37,10 @@
{
"key": "ValidateTransformZero",
"label": "Validate Transform Zero"
},
{
"key": "ValidateNoColonsInName",
"label": "Validate No Colons In Name"
}
]
}

View file

@ -581,7 +581,7 @@ def load_jsons_from_dir(path, *args, **kwargs):
Data are loaded recursively from a directory and recreate the
hierarchy as a dictionary.
Entered path hiearchy:
Entered path hierarchy:
|_ folder1
| |_ data1.json
|_ folder2

View file

@ -41,6 +41,7 @@ class CreatorsModel(QtGui.QStandardItemModel):
item.setData(False, QtCore.Qt.ItemIsEnabled)
items.append(item)
items.sort(key=lambda item: item.text())
self.invisibleRootItem().appendRows(items)
def get_creator_by_id(self, item_id):

View file

@ -86,9 +86,9 @@ class CreateWidgetAssetsWidget(SingleSelectAssetsWidget):
class AssetsHierarchyModel(QtGui.QStandardItemModel):
"""Assets hiearrchy model.
"""Assets hierarchy model.
For selecting asset for which should beinstance created.
For selecting asset for which an instance should be created.
Uses controller to load asset hierarchy. All asset documents are stored by
their parents.

View file

@ -84,6 +84,12 @@ class ResourceFile(FileItem):
def __repr__(self):
return "<{}> '{}'".format(self.__class__.__name__, self.relative_path)
@property
def is_valid_file(self):
if not self.relative_path:
return False
return super(ResourceFile, self).is_valid_file
class ProjectPushItem:
def __init__(
@ -326,6 +332,26 @@ class ProjectPushRepreItem:
self.get_source_files()
return self._resource_files
@staticmethod
def _clean_path(path):
new_value = path.replace("\\", "/")
while "//" in new_value:
new_value = new_value.replace("//", "/")
return new_value
@staticmethod
def _get_relative_path(path, src_dirpath):
dirpath, basename = os.path.split(path)
if not dirpath.lower().startswith(src_dirpath.lower()):
return None
relative_dir = dirpath[len(src_dirpath):].lstrip("/")
if relative_dir:
relative_path = "/".join([relative_dir, basename])
else:
relative_path = basename
return relative_path
@property
def frame(self):
"""First frame of representation files.
@ -407,9 +433,9 @@ class ProjectPushRepreItem:
fill_roots = fill_repre_context["root"]
for root_name in tuple(fill_roots.keys()):
fill_roots[root_name] = "{{root[{}]}}".format(root_name)
repre_path = StringTemplate.format_template(template,
fill_repre_context)
repre_path = repre_path.replace("\\", "/")
repre_path = StringTemplate.format_template(
template, fill_repre_context)
repre_path = self._clean_path(repre_path)
src_dirpath, src_basename = os.path.split(repre_path)
src_basename = (
re.escape(src_basename)
@ -418,21 +444,20 @@ class ProjectPushRepreItem:
)
src_basename_regex = re.compile("^{}$".format(src_basename))
for file_info in self._repre_doc["files"]:
filepath_template = file_info["path"].replace("\\", "/")
filepath = filepath_template.format(root=self._roots)
filepath_template = self._clean_path(file_info["path"])
filepath = self._clean_path(
filepath_template.format(root=self._roots)
)
dirpath, basename = os.path.split(filepath_template)
if (
dirpath != src_dirpath
dirpath.lower() != src_dirpath.lower()
or not src_basename_regex.match(basename)
):
relative_dir = dirpath.replace(src_dirpath, "")
if relative_dir:
relative_path = "/".join([relative_dir, basename])
else:
relative_path = basename
relative_path = self._get_relative_path(filepath, src_dirpath)
resource_files.append(ResourceFile(filepath, relative_path))
continue
filepath = os.path.join(src_dirpath, basename)
frame = None
udim = None
for item in src_basename_regex.finditer(basename):
@ -458,21 +483,21 @@ class ProjectPushRepreItem:
fill_roots[root_name] = "{{root[{}]}}".format(root_name)
repre_path = StringTemplate.format_template(template,
fill_repre_context)
repre_path = repre_path.replace("\\", "/")
repre_path = self._clean_path(repre_path)
src_dirpath = os.path.dirname(repre_path)
for file_info in self._repre_doc["files"]:
filepath_template = file_info["path"].replace("\\", "/")
filepath = filepath_template.format(root=self._roots)
if filepath_template == repre_path:
src_files.append(SourceFile(filepath))
else:
dirpath, basename = os.path.split(filepath_template)
relative_dir = dirpath.replace(src_dirpath, "")
if relative_dir:
relative_path = "/".join([relative_dir, basename])
else:
relative_path = basename
filepath_template = self._clean_path(file_info["path"])
filepath = self._clean_path(
filepath_template.format(root=self._roots))
if filepath_template.lower() == repre_path.lower():
src_files.append(
SourceFile(repre_path.format(root=self._roots))
)
else:
relative_path = self._get_relative_path(
filepath_template, src_dirpath
)
resource_files.append(
ResourceFile(filepath, relative_path)
)

View file

@ -230,9 +230,13 @@ class AssetsModel(QtGui.QStandardItemModel):
item = self._items.pop(item_id, None)
if item is None:
continue
row = item.row()
if row < 0:
continue
parent = item.parent()
if parent is not None:
parent.takeRow(item.row())
if parent is None:
parent = root_item
parent.takeRow(row)
self.items_changed.emit()

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring Pype version."""
__version__ = "3.14.11-nightly.2"
__version__ = "3.14.11-nightly.3"

View file

@ -1,6 +1,6 @@
[tool.poetry]
name = "OpenPype"
version = "3.14.10" # OpenPype
version = "3.14.11-nightly.3" # OpenPype
description = "Open VFX and Animation pipeline with support."
authors = ["OpenPype Team <info@openpype.io>"]
license = "MIT License"

View file

@ -6,12 +6,12 @@ sidebar_label: AfterEffects
<!-- based on PS implementation, same principle and menu -->
## Available Tools
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Publish](artist_tools.md#publisher)
- [Manage](artist_tools.md#inventory)
- [Subset Manager](artist_tools.md#subset-manager)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Publish](artist_tools_publisher)
- [Manage](artist_tools_inventory)
- [Subset Manager](artist_tools_subset_manager)
## Setup
@ -150,4 +150,4 @@ New publishing process should be backward compatible, eg. if you have a workfile
could be used right away.
If you hit on unexpected behaviour with old instances, contact support first, then you could try to delete and recreate instances from scratch.
Nuclear option is to purge workfile metadata in `Window > Metadata > Basic > Label`. This is only for most determined daredevils though!
Nuclear option is to purge workfile metadata in `Window > Metadata > Basic > Label`. This is only for most determined daredevils though!

View file

@ -6,13 +6,13 @@ sidebar_label: Blender
## OpenPype global tools
- [Set Context](artist_tools.md#set-context)
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Manage (Inventory)](artist_tools.md#inventory)
- [Publish](artist_tools.md#publisher)
- [Library Loader](artist_tools.md#library-loader)
- [Set Context](artist_tools_context_manager)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Manage (Inventory)](artist_tools_inventory)
- [Publish](artist_tools_publisher)
- [Library Loader](artist_tools_library_loader)
## Working with OpenPype in Blender
@ -60,7 +60,7 @@ low resolution stuff. See [Subset](artist_concepts.md#subset).
<!-- :::note LOD support
By changing subset name you can take advantage of _LOD support_ in OpenPype. Your
asset can contain various resolution defined by different subsets. You can then
switch between them very easy using [Inventory (Manage)](artist_tools.md#inventory).
switch between them very easy using [Inventory (Manage)](artist_tools_inventory).
There LODs are conveniently grouped so they don't clutter Inventory view.
Name your subset like `main_LOD1`. Important part is that `_LOD1`. You can have as many LODs as you need.
@ -96,7 +96,7 @@ Now let's publish it. Go **OpenPype → Publish...**. You will be presented with
![Model publish](assets/blender-model_pre_publish.jpg)
Note that content of this window can differs by your pipeline configuration.
For more detail see [Publisher](artist_tools.md#publisher).
For more detail see [Publisher](artist_tools_publisher).
Items in left column are instances you will be publishing. You can disable them
by clicking on square next to them. White filled square indicate they are ready for
@ -150,12 +150,12 @@ it can take a while. You should end up with everything green and message
**Finished successfully ...** You can now close publisher window.
To check for yourself that model is published, open
[Asset Loader](artist_tools.md#loader) - **OpenPype → Load...**.
[Asset Loader](artist_tools_loader) - **OpenPype → Load...**.
There you should see your model, named `modelDefault`.
### Loading models
You can load model with [Loader](artist_tools.md#loader). Go **OpenPype → Load...**,
You can load model with [Loader](artist_tools_loader). Go **OpenPype → Load...**,
select your rig, right click on it and click **Link model (blend)**.
## Creating Rigs
@ -195,11 +195,11 @@ this:
### Publishing rigs
Publishing rig is done in same way as publishing everything else. Save your scene
and go **OpenPype → Publish**. For more detail see [Publisher](artist_tools.md#publisher).
and go **OpenPype → Publish**. For more detail see [Publisher](artist_tools_publisher).
### Loading rigs
You can load rig with [Loader](artist_tools.md#loader). Go **OpenPype → Load...**,
You can load rig with [Loader](artist_tools_loader). Go **OpenPype → Load...**,
select your rig, right click on it and click **Link rig (blend)**.
## Layouts in Blender
@ -210,7 +210,7 @@ and manage those sets.
### Publishing a layout
Working with Layout is easy. Just load your assets into scene with
[Loader](artist_tools.md#loader) (**OpenPype → Load...**). Populate your scene as
[Loader](artist_tools_loader) (**OpenPype → Load...**). Populate your scene as
you wish, translate each piece to fit your need. When ready, select all imported
stuff and go **OpenPype → Create...** and select **Layout**. When selecting rigs,
you need to select only the armature, the geometry will automatically be included.
@ -220,7 +220,7 @@ Now you can publish is with **OpenPype → Publish**.
### Loading layouts
You can load a Layout using [Loader](artist_tools.md#loader)
You can load a Layout using [Loader](artist_tools_loader)
(**OpenPype → Load...**). Select your layout, right click on it and
select **Link Layout (blend)**. This will populate your scene with all those
models you've put into layout.
models you've put into layout.

View file

@ -6,11 +6,11 @@ sidebar_label: Harmony
## Available Tools
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Publish](artist_tools.md#publisher)
- [Manage](artist_tools.md#inventory)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Publish](artist_tools_publisher)
- [Manage](artist_tools_inventory)
:::note
Only one tool can be open at a time. If you open a tool while another tool is open, it will wait in queue for the existing tool to be closed. Once the existing tool is closed, the new tool will open.

View file

@ -15,11 +15,11 @@ All the information also applies to **_Nuke Studio_**(NKS), but for simplicity w
## OpenPype global tools
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Manage (Inventory)](artist_tools.md#inventory)
- [Publish](artist_tools.md#publisher)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Manage (Inventory)](artist_tools_inventory)
- [Publish](artist_tools_publisher)
## Hiero specific tools
@ -265,4 +265,4 @@ This tool can be used to check if some instances were published after the last b
:::note
Imported instances must not be deleted because they contain extra attributes that will be used to update the workfile since the place holder is been deleted.
:::
:::

View file

@ -6,12 +6,12 @@ sidebar_label: Houdini
## OpenPype global tools
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Manage (Inventory)](artist_tools.md#inventory)
- [Publish](artist_tools.md#publisher)
- [Library Loader](artist_tools.md#library-loader)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Manage (Inventory)](artist_tools_inventory)
- [Publish](artist_tools_publisher)
- [Library Loader](artist_tools_library-loader)
## Publishing Alembic Cameras
You can publish baked camera in Alembic format. Select your camera and go **OpenPype -> Create** and select **Camera (abc)**.
@ -100,4 +100,4 @@ switch versions between different hda types.
## Loading HDA
When you load hda, it will install its type in your hip file and add published version as its definition file. When
you switch version via Scene Manager, it will add its definition and set it as preferred.
you switch version via Scene Manager, it will add its definition and set it as preferred.

View file

@ -6,13 +6,13 @@ sidebar_label: Maya
## OpenPype global tools
- [Set Context](artist_tools.md#set-context)
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Manage (Inventory)](artist_tools.md#inventory)
- [Publish](artist_tools.md#publisher)
- [Library Loader](artist_tools.md#library-loader)
- [Set Context](artist_tools_context_manager)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Manage (Inventory)](artist_tools_inventory)
- [Publish](artist_tools_publisher)
- [Library Loader](artist_tools_library_loader)
## Working with OpenPype in Maya
@ -55,7 +55,7 @@ low resolution stuff. See [Subset](artist_concepts.md#subset).
:::note LOD support
By changing subset name you can take advantage of _LOD support_ in OpenPype. Your
asset can contain various resolution defined by different subsets. You can then
switch between them very easy using [Inventory (Manage)](artist_tools.md#inventory).
switch between them very easy using [Inventory (Manage)](artist_tools_inventory).
There LODs are conveniently grouped so they don't clutter Inventory view.
Name your subset like `main_LOD1`. Important part is that `_LOD1`. You can have as many LODs as you need.
@ -85,7 +85,7 @@ Now let's publish it. Go **OpenPype → Publish...**. You will be presented with
![Model publish](assets/maya-model_pre_publish.jpg)
Note that content of this window can differs by your pipeline configuration.
For more detail see [Publisher](artist_tools.md#publisher).
For more detail see [Publisher](artist_tools_publisher).
Items in left column are instances you will be publishing. You can disable them
by clicking on square next to them. Green square indicate they are ready for
@ -139,7 +139,7 @@ it can take a while. You should end up with everything green and message
**Finished successfully ...** You can now close publisher window.
To check for yourself that model is published, open
[Asset Loader](artist_tools.md#loader) - **OpenPype → Load...**.
[Asset Loader](artist_tools_loader) - **OpenPype → Load...**.
There you should see your model, named `modelMain`.
## Look development
@ -200,8 +200,8 @@ there are few yellow icons in left shelf:
![Maya - shortcut icons](assets/maya-shortcut_buttons.jpg)
Those are shortcuts for **Look Manager**, [Work Files](artist_tools.md#workfiles),
[Load](artist_tools.md#loader), and [Manage (Inventory)](artist_tools.md#inventory).
Those are shortcuts for **Look Manager**, [Work Files](artist_tools_workfiles),
[Load](artist_tools_loader), and [Manage (Inventory)](artist_tools_inventory).
Those can be found even in top menu, but that depends on your studio setup.
@ -294,7 +294,7 @@ have any missing dependencies.
### Loading rigs
You can load rig with [Loader](artist_tools.md#loader). Go **OpenPype → Load...**,
You can load rig with [Loader](artist_tools_loader). Go **OpenPype → Load...**,
select your rig, right click on it and **Reference** it.
## Point caches
@ -332,7 +332,7 @@ OpenPype allows to version and manage those sets.
### Publishing Set dress / Layout
Working with Set dresses is very easy. Just load your assets into scene with
[Loader](artist_tools.md#loader) (**OpenPype → Load...**). Populate your scene as
[Loader](artist_tools_loader) (**OpenPype → Load...**). Populate your scene as
you wish, translate each piece to fit your need. When ready, select all imported
stuff and go **OpenPype → Create...** and select **Set Dress** or **Layout**.
This will create set containing your selection and marking it for publishing.
@ -345,7 +345,7 @@ Now you can publish is with **OpenPype → Publish**.
### Loading Set dress / Layout
You can load Set dress / Layout using [Loader](artist_tools.md#loader)
You can load Set dress / Layout using [Loader](artist_tools_loader)
(**OpenPype → Load...**). Select you layout or set dress, right click on it and
select **Reference Maya Ascii (ma)**. This will populate your scene with all those
models you've put into layout.

View file

@ -10,13 +10,13 @@ OpenPype supports Nuke version **`11.0`** and above.
## OpenPype global tools
- [Set Context](artist_tools.md#set-context)
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Manage (Inventory)](artist_tools.md#inventory)
- [Publish](artist_tools.md#publisher)
- [Library Loader](artist_tools.md#library-loader)
- [Set Context](artist_tools_context_manager)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Manage (Inventory)](artist_tools_inventory)
- [Publish](artist_tools_publisher)
- [Library Loader](artist_tools_library_loader)
## Nuke specific tools
@ -186,7 +186,7 @@ The Next Available Version checks the work folder for already used versions and
Subversion can be used to distinguish or name versions. For example used to add shortened artist name.
More about [workfiles](artist_tools.md#workfiles).
More about [workfiles](artist_tools_workfiles).
:::tip Admin Tips
@ -214,7 +214,7 @@ Note that the Read node created by OpenPype is green. Green color indicates the
![Asset Load](assets/nuke_tut/nuke_AssetLoadOutOfDate.png)
More about [Asset loader](artist_tools.md#loader).
More about [Asset loader](artist_tools_loader).
### Create Write Node
To create OpenPype managed Write node, select the Read node you just created, from OpenPype menu, pick Create.
@ -273,7 +273,7 @@ Pyblish Dialog tries to pack a lot of info in a small area. One of the more tric
If you run the publish and decide to not publish the Nuke script, you can turn it off right in the Pyblish dialog by clicking on the checkbox. If you decide to render and publish the shot in lower resolution to speed up the turnaround, you have to turn off the Write Resolution validator. If you want to use an older version of the asset (older version of the plate...), you have to turn off the Validate containers, and so on.
More info about [Using Pyblish](artist_tools.md#publisher)
More info about [Using Pyblish](artist_tools_publisher)
:::tip Admin Tip - Configuring validators
You can configure Nuke validators like Output Resolution in **Studio Settings → Project → Nuke → Publish plugins**

View file

@ -6,11 +6,11 @@ sidebar_label: Photoshop
## Available Tools
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Publish](artist_tools.md#publisher)
- [Manage](artist_tools.md#inventory)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Publish](artist_tools_publisher)
- [Manage](artist_tools_inventory)
## Setup

View file

@ -16,18 +16,18 @@ Before you are able to start with OpenPype tools in DaVinci Resolve, installatio
## OpenPype global tools
- [Work Files](artist_tools.md#workfiles)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Manage (Inventory)](artist_tools.md#inventory)
- [Publish](artist_tools.md#publisher)
- [Work Files](artist_tools_workfiles)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Manage (Inventory)](artist_tools_inventory)
- [Publish](artist_tools_publisher)
<div class="row markdown">
## Creating Shots from timeline items
Before a clip can be published with [Publisher](artist_tools.md#publisher) timeline item has to be marked with OpenPype metadata markers. This way it is converted to a publishable subset.
Before a clip can be published with [Publisher](artist_tools_publisher) timeline item has to be marked with OpenPype metadata markers. This way it is converted to a publishable subset.
Lets do it step by step.

View file

@ -4,13 +4,13 @@ title: TVPaint
sidebar_label: TVPaint
---
- [Work Files](artist_tools.md#workfiles)
- [Load](artist_tools.md#loader)
- [Create](artist_tools.md#creator)
- [Subset Manager](artist_tools.md#subset-manager)
- [Scene Inventory](artist_tools.md#scene-inventory)
- [Publish](artist_tools.md#publisher)
- [Library](artist_tools.md#library)
- [Work Files](artist_tools_workfiles)
- [Load](artist_tools_loader)
- [Create](artist_tools_creator)
- [Subset Manager](artist_tools_subset_manager)
- [Scene Inventory](artist_tools_inventory)
- [Publish](artist_tools_publisher)
- [Library](artist_tools_library)
## Setup

View file

@ -33,11 +33,11 @@ OpenPype global tools can be found in Unreal's toolbar and in the *Tools* main m
![Unreal OpenPype Menu](assets/unreal_openpype_tools.png)
- [Create](artist_tools.md#creator)
- [Load](artist_tools.md#loader)
- [Manage (Inventory)](artist_tools.md#inventory)
- [Publish](artist_tools.md#publisher)
- [Library Loader](artist_tools.md#library-loader)
- [Create](artist_tools_creator)
- [Load](artist_tools_loader)
- [Manage (Inventory)](artist_tools_inventory)
- [Publish](artist_tools_publisher)
- [Library Loader](artist_tools_library_loader)
## Static Mesh

View file

@ -4,483 +4,18 @@ title: Tools
sidebar_label: Tools
---
## Set Context
# Tools
OpenPype offers a collection of core tools in tandem with the Integrations:
<div class="row markdown">
<div class="col col--6 markdown">
- [Context Manager](artist_tools_context_manager)
- [Creator](artist_tools_creator)
- [Loader](artist_tools_loader)
- [Library Loader](artist_tools_library_loader)
- [Publisher](artist_tools_publisher)
- [Inventory](artist_tools_inventory)
- [Workfiles](artist_tools_workfiles)
- [Look Assigner](artist_tools_look_assigner)
- [Subset Manager](artist_tools_subset_manager)
- [Sync Queue](artist_tools_sync_queue)
Any time your host app is open in defined context it can be changed to different hierarchy, asset or task within a project. This will allow you to change your opened session to any other asset, shot and tasks within the same project. This is useful particularly in cases where your host takes long time to start.
</div>
<div class="col col--6 markdown">
![workfiles_1](assets/tools_context_manager.png)
</div>
</div>
:::note
Notice that the window doesn't close after hitting `Accept` and confirming the change of context. This behaviour let's you keep the window open and change the context multiple times in a row.
:::
## Creator
### Details
Despite the name, Creator isn't for making new content in your scene, but rather taking what's already in it and creating all the metadata your content needs to be published.
In Maya this means creating a set with everything you want to publish and assigning custom attributes to it so it gets picked up during publishing stage.
In Nuke it's either converting an existing write node to a publishable one, or simply creating a write node with all the correct settings and outputs already set.
### Usage
1. select what you want to publish from your scenes
2. Open *Creator* from OpenPype menu
3. Choose what family (data type) you need to export
4. Type the name for you export. This name is how others are going to be able to refer to this particular subset when loading it into their scenes. Every assets should have a Main subset, but can have any number of other variants.
5. Click on *Create*
* * *
## Loader
Loader loads published subsets into your current scene or script.
### Usage
1. open *Loader* from OpenPype menu
2. select the asset where the subset you want to load is published
3. from subset list select the subset you want
4. right-click the subset
5. from action menu select what you want to do *(load, reference, ...)*
![tools_loader_1](assets/tools/tools_loader_1.png) <!-- picture needs to be changed -->
<div class="row markdown">
<div class="col col--6 markdown">
### Refresh data
Data are not auto-refreshed to avoid database issues. To refresh assets or subsets press refresh button.
</div>
<div class="col col--6 markdown">
![tools_loader_50](assets/tools/tools_loader_50.png)
</div>
</div>
### Load another version
Loader by default load last version, but you can of course load another versions. Double-click on the subset in the version column to expose the drop down, choose version you want to load and continue from point 4 of the [Usage](#usage-1).
<div class="row markdown">
<div class="col col--6 markdown">
![tools_loader_21](assets/tools/tools_loader_21.png)
</div>
<div class="col col--6 markdown">
![tools_loader_22](assets/tools/tools_loader_22.png)
</div>
</div>
### Filtering
#### Filter Assets and Subsets by name
To filter assets/subsets by name just type name or part of name to filter text input. Only assets/subsets containing the entered string remain.
- **Assets filtering example** *(it works the same for subsets)*:
<div class="row markdown">
<div class="col col--6 markdown">
![tools_loader_4](assets/tools/tools_loader_4-small.png)
</div>
<div class="col col--6 markdown">
![tools_loader_5](assets/tools/tools_loader_5-small.png)
</div>
</div>
#### Filter Subsets by Family
<div class="row markdown">
<div class="col col--6 markdown">
To filter [subsets](artist_concepts.md#subset) by their [families](artist_publish.md#families) you can use families list where you can check families you want to see or uncheck families you are not interested in.
</div>
<div class="col col--6 markdown">
![tools_loader_30](assets/tools/tools_loader_30-small.png)
</div>
</div>
### Subset groups
Subsets may be grouped which can help to make the subset list more transparent. You can toggle visibility of groups with `Enable Grouping` checkbox.
![tools_loader_40](assets/tools/tools_loader_40-small.png)
#### Add to group or change current group
You can set group of selected subsets with shortcut `Ctrl + G`.
![tools_loader_41](assets/tools/tools_loader_41-small.png)
:::warning
You'll set the group in Avalon database so your changes will take effect for all users.
:::
### Site Sync support
If **Site Sync** is enabled additional widget is shown in right bottom corner.
It contains list of all representations of selected version(s). It also shows availability of representation files
on particular site (*active* - mine, *remote* - theirs).
![site_sync_support](assets/site_sync_loader.png)
On this picture you see that representation files are available only on remote site (could be GDrive or other).
If artist wants to work with the file(s) they need to be downloaded first. That could be done by right mouse click on
particular representation (or multiselect all) and select *Download*.
This will mark representation to be download which will happen in the background if OpenPype Tray is running.
For more details of progress, state or possible error details artist should open **[Sync Queue](#Sync-Queue)** item in Tray app.
Work in progress...
## Library Loader
Library loader is extended [loader](#loader) which allows to load published subsets from Library projects. Controls are same but library loader has extra Combo Box which allows you to choose project you want to load from.
<div class="row markdown">
<div class="col col--6 markdown">
![tools_library_1](assets/tools/tools_library_1-small.png) <!-- picture needs to be changed -->
</div>
<div class="col col--6 markdown">
![tools_library_2](assets/tools/tools_library_2-small.png) <!-- picture needs to be changed -->
</div>
</div>
### Delivery Action ###
Library Loader contains functionality to export any selected asset, subsets and their version to configurable folder.
Delivery follows structure based on defined template, this template must be configured first by Admin in the Settings.
![delivery_action](assets/tools/tools_delivery_loader.png)
* Usage
- Select all required subsets for export (you can change theirs versions by double clicking on 'Version' value)
- Right click and select **Deliver Versions** from context menu
- Select predefined Delivery template (must be configured by Admin system or project wide)
- Fill value for root folder (folder will be created if it doesn't exist)
- Filter out type of representation you are not interested in
- Push **Deliver** button
- Dialog must be kept open until export is finished
- In a case of problems with any of the representation, that one will be skipped, description of error will be provided in the dialog
* * *
## Publisher
> Use publish to share your work with others. It collects, validates and exports the data in standardized way.
### Details
When you run pyblish, the UI is made of 2 main parts. On the left, you see all the items pyblish will be working with (called instances), and on the right a list of actions that are going to process these items.
Even though every task type has some pre-defined settings of what should be collected from the scene and what items will be published by default. You can technically publish any output type from any task type.
Each item is passed through multiple plugins, each doing a small piece of work. These are organized into 4 areas and run in sequence.
### Using Pyblish
In the best case scenario, you open pyblish from the Avalon menu, press play, wait for it to finish, and youre done.
These are the steps in detail, for cases, where the default settings dont work for you or you know that the task youre working on, requires a different treatment.
#### Collect
Finds all the important data in the scene and makes it ready for publishing
#### Validate
Each validator makes sure your output complies to one particular condition. This could be anything from naming conventions, scene setting, to plugin usage. An item can only be published if all validators pass.
#### Extract
Extractor takes the item and saves it to the disk. Usually to temporary location. Each extractor represents one file format and there can be multiple file formats exported for each item.
#### Integrate
Integrator takes the extracted files, categorizes and moves them to a correct location on the disk or on the server.
* * *
## Inventory
With Scene Inventory, you can browse, update and change subsets loaded with [Loader](#loader) into your scene or script.
:::note
You should first understand [Key concepts](artist_concepts) to understand how you can use this tool.
:::
### Details
<!-- This part may be in Maya description? -->
Once a subset is loaded, it turns into a container within a scene. This containerization allows us to have a good overview of everything in the scene, but also makes it possible to change versions, notify user if something is outdated, replace one asset for another, etc.
<!-- END HERE -->
The scene manager has a simple GUI focused on efficiency. You can see everything that has been previously loaded into the scene, how many time it's been loaded, what version and a lot of other information. Loaded assets are grouped by their asset name, subset name and representation. This grouping gives ability to apply changes for all instances of the loaded asset *(e.g. when __tree__ is loaded 20 times you can easily update version for all of them)*.
![tools_scene_inventory_10](assets/tools/tools_scene_inventory_10-small.png) <!-- picture needs to be changed -->
To interact with any container, you need to right click it and you'll see a drop down with possible actions. The key actions for production are already implemented, but more will be added over time.
![tools_scene_inventory_20](assets/tools/tools_scene_inventory_20.png)
### Usage
#### Change version
You can change versions of loaded subsets with scene inventory tool. Version of loaded assets is colored to red when newer version is available.
![tools_scene_inventory_40](assets/tools/tools_scene_inventory_40.png)
##### Update to the latest version
Select containers or subsets you want to update, right-click selection and press `Update to latest`.
##### Change to specific version
Select containers or subsets you want to change, right-click selection, press `Set version`, select from dropdown version you want change to and press `OK` button to confirm.
![tools_scene_inventory_30](assets/tools/tools_scene_inventory_30.png)
#### Switch Asset
It's tool in Scene inventory tool that gives ability to switch asset, subset and representation of loaded assets.
![tools_scene_inventory_50](assets/tools/tools_scene_inventory_50.png) <!-- picture needs to be changed -->
Because loaded asset is in fact representation of version published in asset's subset it is possible to switch each of this part *(representation, version, subset and asset)*, but with limitations. Limitations are obvious as you can imagine when you have loaded `.ma` representation of `modelMain` subset from `car` asset it is not possible to switch subset to `modelHD` and keep same representation if `modelHD` does not have published `.ma` representation. It is possible to switch multiple loaded assets at once that makes this tool very powerful helper if all published assets contain same subsets and representations.
Switch tool won't let you cross the border of limitations and inform you when you have to specify more if impossible combination occurs *(It is also possible that there will be no possible combination for selected assets)*. Border is colored to red and confirm button is not enabled when specification is required.
![tools_scene_inventory_55](assets/tools/tools_scene_inventory_55.png) <!-- picture needs to be changed -->
Possible switches:
- switch **representation** (`.ma` to `.abc`, `.exr` to `.dpx`, etc.)
- switch **subset** (`modelMain` to `modelHD`, etc.)
- `AND` keep same **representation** *(with limitations)*
- `AND` switch **representation** *(with limitations)*
- switch **asset** (`oak` to `elm`, etc.)
- `AND` keep same **subset** and **representation** *(with limitations)*
- `AND` keep same **subset** and switch **representation** *(with limitations)*
- `AND` switch **subset** and keep same **representation** *(with limitations)*
- `AND` switch **subset** and **representation** *(with limitations)*
We added one more switch layer above subset for LOD (Level Of Depth). That requires to have published subsets with name ending with **"_LOD{number}"** where number represents level (e.g. modelMain_LOD1). Has the same limitations as mentioned above. This is handy when you want to change only subset but keep same LOD or keep same subset but change LOD for multiple assets. This option is hidden if you didn't select subset that have published subset with LODs.
![tools_scene_inventory_54](assets/tools/tools_scene_inventory_54.png) <!-- picture needs to be changed -->
### Filtering
#### Filter by name
There is a search bar on the top for cases when you have a complex scene with many assets and need to find a specific one.
<div class="row markdown">
<div class="col col--6 markdown">
![tools_scene_inventory_60](assets/tools/tools_scene_inventory_60-small.png)
</div>
<div class="col col--6 markdown">
![tools_scene_inventory_61](assets/tools/tools_scene_inventory_61-small.png)
</div>
</div>
#### Filter with Cherry-pick selection
<div class="row markdown">
<div class="col col--6 markdown">
To keep only selected subsets right-click selection and press `Cherry-Pick (Hierarchy)` *(Border of subset list change to **orange** color when Cherry-pick filtering is set so you know filter is applied).*
</div>
<div class="col col--6 markdown">
![tools_scene_inventory_62-small](assets/tools/tools_scene_inventory_62-small.png)
</div>
</div>
<div class="row markdown">
<div class="col col--6 markdown">
To return to original state right-click anywhere in subsets list and press `Back to Full-View`.
</div>
<div class="col col--6 markdown">
![tools_scene_inventory_63-small](assets/tools/tools_scene_inventory_63-small.png)
</div>
</div>
:::tip
You can Cherry-pick from Cherry-picked subsets.
:::
* * *
## Workfiles
Save new working scenes or scripts, or open the ones you previously worked on.
### Details
Instead of digging through your software native file browser, you can simply open the workfiles app and see all the files for the asset or shot you're currently working with. The app takes care of all the naming and the location of your work files.
When saving a scene you can also add a comment. It is completely up to you how you use this, however we recommend using it for subversion within your current working version.
Let's say that the last version of the comp you published was v003 and now you're working on the file prj_sh010_compositing_v004.nk if you want to keep snapshots of your work, but not iterate on the main version because the supervisor is expecting next publish to be v004, you can use the comment to do this, so you can save the file under the name prj_sh010_compositing_v004_001 , prj_sh010_compositing_v004_002. the main version is automatically iterated every time you publish something.
### Usage
<div class="row markdown">
<div class="col col--6 markdown">
#### To open existing file:
1. Open Workfiles tool from OpenPype menu
2. Select file from list - the latest version is the highest *(descendent ordering)*
3. Press `Open` button
</div>
<div class="col col--6 markdown">
![workfiles_1](assets/workfiles_1.png)
</div>
</div>
#### To save new workfile
1. Open Workfiles tool from OpenPype menu
2. Press `Save As` button
3. You can add optional comment to the filename, that will be appended at the end
4. Press `OK`
:::note
You can manually override the workfile version by unticking next available version and using the version menu to choose your own.
:::
## Look Assigner
> The Look Manager takes care of assigning published looks to the correct model in the scene.
### Details
When a look is published it also stores the information about what shading networks need to be assigned to which models, but it also stores all the render attributes on the mesh necessary for a successful render.
### Usage
Look Assigner has GUI is made of two parts. On the left you will see the list of all the available models in the scene and on the right side, all the looks that can be associate with them. To assign a look to a model you just need to:
1. Click on "load all subsets"
2. Choose a subset from the menu on the left
3. Right click on a look from the list on the right
4. Choose "Assign"
At this point you should have a model with all it's shaders applied correctly. The tool automatically loads the latest look available.
## Subset Manager
> Subset Manager lists all items which are meant for publishig and will be published if Publish is triggered
### Details
One or more items (instances) could be published any time Publish process is started. Each this publishable
item must be created by Creator tool previously. Subset Manager provides easy way how to check which items,
and how many, will be published.
It also provides clean and preferable way how to remove unwanted item from publishing.
### Usage
Subset Manager has GUI is made of two parts. On the left you will see the list of all the available publishable items in the scene and on the right side, details about these items.
<div class="col col--6 markdown">
![subset_manager](assets/tools_subset_manager.png)
</div>
Any time new item is Created, it will show up here.
Currently there is only single action, 'Remove instance' which cleans workfile file from publishable item metadata.
This might not remove underlying host item, it depends on host and implementation!
It might also happen that user deletes underlying host item(for example layer in Photoshop) directly in the host, but metadata will stay.
This could result in phantom issues during publishing. Use Subset Manager to purge workfile from abandoned items.
Please check behaviour in host of your choice.
## Sync Queue
### Details
If **Site Sync** is configured for a project, each asset is marked to be synchronized to a remote site during publishing.
Each artist's OpenPype Tray application handles synchronization in background, it looks for all representation which
are marked with the site of the user (unique site name per artist) and remote site.
Artists then can see progress of synchronization via **Sync Queue** link in the Tray application.
Artists can see all synced representation in this dialog with helpful information such as when representation was created, when it was synched,
status of synchronization (OK or Fail) etc.
### Usage
With this app artists can modify synchronized representation, for example mark failed representation for re-sync etc.
![Sync Queue](assets/site_sync_sync_queue.png)
Actions accessible by context menu on single (or multiple representations):
- *Open in Explorer* - if site is locally accessible, open folder with it with OS based explorer
- *Re-sync Active Site* - mark artist own side for re-download (repre must be accessible on remote side)
- *Re-sync Remote Site* - mark representation for re-upload
- *Completely remove from local* - removes tag of synchronization to artist's local site, removes files from disk (available only for personal sites)
- *Change priority* - mark representations with higher priority for faster synchronization run
Double click on any of the representation open Detail dialog with information about all files for particular representation.
In this dialog error details could be accessed in the context menu.
#### Context menu on project name
Artists can also Pause whole server or specific project for synchronization. In that state no download/upload is being run.
This might be helpful if the artist is not interested in a particular project for a while or wants to save bandwidth data limit for a bit.
Another option is `Validate files on active site`. This option triggers process where all representation of the selected project are looped through, file paths are resolved for active site and
if paths point to local system, paths are physically checked if files are existing. If file exists and representation is not marked to be present on 'active_site' in DB, DB is updated
to follow that.
This might be useful if artist has representation files that Site Sync doesn't know about (newly attached external drive with representations from studio).
This project might take a while!

View file

@ -0,0 +1,17 @@
---
id: artist_tools_context_manager
title: Context Manager
sidebar_label: Context Manager
description: A tool to manage the context within a host app.
---
# Context Manager
Any time your host app is open in a defined context it can be changed to different hierarchy, asset or task within a project. This will allow you to change your opened session to any other asset, shot and tasks within the same project. This is useful particularly in cases where your host takes long time to start.
![workfiles_1](assets/tools_context_manager.png)
:::note
Notice that the window doesn't close after hitting `Accept` and confirming the change of context. This behaviour let's you keep the window open and change the context multiple times in a row.
:::

View file

@ -0,0 +1,25 @@
---
id: artist_tools_creator
title: Creator
sidebar_label: Creator
description: A tool to generate metadata for asset publishing.
---
# Creator
## Details
Despite the name, Creator isn't for making new content in your scene, but rather taking what's already in it and creating all the metadata your content needs to be published.
In Maya this means creating a set with everything you want to publish and assigning custom attributes to it so it gets picked up during publishing stage.
In Nuke it's either converting an existing write node to a publishable one, or simply creating a write node with all the correct settings and outputs already set.
## Usage
1. Select what you want to publish from your scenes.
2. Open *Creator* from OpenPype menu.
3. Choose what family (data type) you need to export.
4. Type the name for you export. This name is how others are going to be able to refer to this particular subset when loading it into their scenes. Every assets should have a Main subset, but can have any number of other variants.
5. Click on *Create*.

View file

@ -0,0 +1,129 @@
---
id: artist_tools_inventory
title: Inventory
sidebar_label: Inventory
description: Manage already loaded subsets.
---
# Inventory
With Scene Inventory, you can browse, update and change subsets loaded with [Loader](artist_tools_loader) into your scene or script.
:::note
You should first understand [Key concepts](artist_concepts) to understand how you can use this tool.
:::
## Details
<!-- This part may be in Maya description? -->
Once a subset is loaded, it turns into a container within a scene. This containerization allows us to have a good overview of everything in the scene, but also makes it possible to change versions, notify user if something is outdated, replace one asset for another, etc.
<!-- END HERE -->
The scene manager has a simple GUI focused on efficiency. You can see everything that has been previously loaded into the scene, how many time it's been loaded, what version and a lot of other information. Loaded assets are grouped by their asset name, subset name and representation. This grouping gives ability to apply changes for all instances of the loaded asset *(e.g. when __tree__ is loaded 20 times you can easily update version for all of them)*.
![tools_scene_inventory_10](assets/tools/tools_scene_inventory_10-small.png) <!-- picture needs to be changed -->
To interact with any container, you need to right click it and you'll see a drop down with possible actions. The key actions for production are already implemented, but more will be added over time.
![tools_scene_inventory_20](assets/tools/tools_scene_inventory_20.png)
## Usage
### Change version
You can change versions of loaded subsets with scene inventory tool. Version of loaded assets is colored to red when newer version is available.
![tools_scene_inventory_40](assets/tools/tools_scene_inventory_40.png)
#### Update to the latest version
Select containers or subsets you want to update, right-click selection and press `Update to latest`.
#### Change to specific version
Select containers or subsets you want to change, right-click selection, press `Set version`, select from dropdown version you want change to and press `OK` button to confirm.
![tools_scene_inventory_30](assets/tools/tools_scene_inventory_30.png)
### Switch Asset
It's tool in Scene inventory tool that gives ability to switch asset, subset and representation of loaded assets.
![tools_scene_inventory_50](assets/tools/tools_scene_inventory_50.png) <!-- picture needs to be changed -->
Because loaded asset is in fact representation of version published in asset's subset it is possible to switch each of this part *(representation, version, subset and asset)*, but with limitations. Limitations are obvious as you can imagine when you have loaded `.ma` representation of `modelMain` subset from `car` asset it is not possible to switch subset to `modelHD` and keep same representation if `modelHD` does not have published `.ma` representation. It is possible to switch multiple loaded assets at once that makes this tool very powerful helper if all published assets contain same subsets and representations.
Switch tool won't let you cross the border of limitations and inform you when you have to specify more if impossible combination occurs *(It is also possible that there will be no possible combination for selected assets)*. Border is colored to red and confirm button is not enabled when specification is required.
![tools_scene_inventory_55](assets/tools/tools_scene_inventory_55.png) <!-- picture needs to be changed -->
Possible switches:
- switch **representation** (`.ma` to `.abc`, `.exr` to `.dpx`, etc.)
- switch **subset** (`modelMain` to `modelHD`, etc.)
- `AND` keep same **representation** *(with limitations)*
- `AND` switch **representation** *(with limitations)*
- switch **asset** (`oak` to `elm`, etc.)
- `AND` keep same **subset** and **representation** *(with limitations)*
- `AND` keep same **subset** and switch **representation** *(with limitations)*
- `AND` switch **subset** and keep same **representation** *(with limitations)*
- `AND` switch **subset** and **representation** *(with limitations)*
We added one more switch layer above subset for LOD (Level Of Depth). That requires to have published subsets with name ending with **"_LOD{number}"** where number represents level (e.g. modelMain_LOD1). Has the same limitations as mentioned above. This is handy when you want to change only subset but keep same LOD or keep same subset but change LOD for multiple assets. This option is hidden if you didn't select subset that have published subset with LODs.
![tools_scene_inventory_54](assets/tools/tools_scene_inventory_54.png) <!-- picture needs to be changed -->
## Filtering
### Filter by name
There is a search bar on the top for cases when you have a complex scene with many assets and need to find a specific one.
<div class="row markdown">
<div class="col col--6 markdown">
![tools_scene_inventory_60](assets/tools/tools_scene_inventory_60-small.png)
</div>
<div class="col col--6 markdown">
![tools_scene_inventory_61](assets/tools/tools_scene_inventory_61-small.png)
</div>
</div>
### Filter with Cherry-pick selection
<div class="row markdown">
<div class="col col--6 markdown">
To keep only selected subsets right-click selection and press `Cherry-Pick (Hierarchy)` *(Border of subset list change to **orange** color when Cherry-pick filtering is set so you know filter is applied).*
</div>
<div class="col col--6 markdown">
![tools_scene_inventory_62-small](assets/tools/tools_scene_inventory_62-small.png)
</div>
</div>
<div class="row markdown">
<div class="col col--6 markdown">
To return to original state right-click anywhere in subsets list and press `Back to Full-View`.
</div>
<div class="col col--6 markdown">
![tools_scene_inventory_63-small](assets/tools/tools_scene_inventory_63-small.png)
</div>
</div>
:::tip
You can Cherry-pick from Cherry-picked subsets.
:::

View file

@ -0,0 +1,42 @@
---
id: artist_tools_library_loader
title: Library Loader
sidebar_label: Library Loader
description: Allows loading published subsets from projects of type "Library".
---
# Library Loader
Library loader is extended [loader](artist_tools_loader) which allows to load published subsets from Library projects. Controls are same but library loader has extra Combo Box which allows you to choose project you want to load from.
<div class="row markdown">
<div class="col col--6 markdown">
![tools_library_1](assets/tools/tools_library_1-small.png) <!-- picture needs to be changed -->
</div>
<div class="col col--6 markdown">
![tools_library_2](assets/tools/tools_library_2-small.png) <!-- picture needs to be changed -->
</div>
</div>
## Delivery Action
Library Loader contains functionality to export any selected asset, subsets and their version to configurable folder.
Delivery follows structure based on defined template, this template must be configured first by Admin in the Settings.
![delivery_action](assets/tools/tools_delivery_loader.png)
* Usage
- Select all required subsets for export (you can change theirs versions by double clicking on 'Version' value)
- Right click and select **Deliver Versions** from context menu
- Select predefined Delivery template (must be configured by Admin system or project wide)
- Fill value for root folder (folder will be created if it doesn't exist)
- Filter out type of representation you are not interested in
- Push **Deliver** button
- Dialog must be kept open until export is finished
- In a case of problems with any of the representation, that one will be skipped, description of error will be provided in the dialog

View file

@ -0,0 +1,121 @@
---
id: artist_tools_loader
title: Loader
sidebar_label: Loader
description: Allows loading published subsets from the same project.
---
# Loader
Loader loads published subsets into your current scene or script.
## Usage
1. Open *Loader* from OpenPype menu.
2. Select the asset where the subset you want to load is published.
3. From subset list select the subset you want.
4. Right-click the subset.
5. From action menu select what you want to do *(load, reference, ...)*.
![tools_loader_1](assets/tools/tools_loader_1.png) <!-- picture needs to be changed -->
<div class="row markdown">
<div class="col col--6 markdown">
## Refresh data
Data are not auto-refreshed to avoid database issues. To refresh assets or subsets press refresh button.
</div>
<div class="col col--6 markdown">
![tools_loader_50](assets/tools/tools_loader_50.png)
</div>
</div>
## Load another version
Loader by default load last version, but you can of course load another versions. Double-click on the subset in the version column to expose the drop down, choose version you want to load and continue from point 4 of the [Usage](#usage-1).
<div class="row markdown">
<div class="col col--6 markdown">
![tools_loader_21](assets/tools/tools_loader_21.png)
</div>
<div class="col col--6 markdown">
![tools_loader_22](assets/tools/tools_loader_22.png)
</div>
</div>
## Filtering
### Filter Assets and Subsets by name
To filter assets/subsets by name just type name or part of name to filter text input. Only assets/subsets containing the entered string remain.
- **Assets filtering example** *(it works the same for subsets)*:
<div class="row markdown">
<div class="col col--6 markdown">
![tools_loader_4](assets/tools/tools_loader_4-small.png)
</div>
<div class="col col--6 markdown">
![tools_loader_5](assets/tools/tools_loader_5-small.png)
</div>
</div>
### Filter Subsets by Family
<div class="row markdown">
<div class="col col--6 markdown">
To filter [subsets](artist_concepts.md#subset) by their [families](artist_publish.md#families) you can use families list where you can check families you want to see or uncheck families you are not interested in.
</div>
<div class="col col--6 markdown">
![tools_loader_30](assets/tools/tools_loader_30-small.png)
</div>
</div>
## Subset groups
Subsets may be grouped which can help to make the subset list more transparent. You can toggle visibility of groups with `Enable Grouping` checkbox.
![tools_loader_40](assets/tools/tools_loader_40-small.png)
### Add to group or change current group
You can set group of selected subsets with shortcut `Ctrl + G`.
![tools_loader_41](assets/tools/tools_loader_41-small.png)
:::warning
You'll set the group in Avalon database so your changes will take effect for all users.
:::
## Site Sync support
If **Site Sync** is enabled additional widget is shown in right bottom corner.
It contains list of all representations of selected version(s). It also shows availability of representation files
on particular site (*active* - mine, *remote* - theirs).
![site_sync_support](assets/site_sync_loader.png)
On this picture you see that representation files are available only on remote site (could be GDrive or other).
If artist wants to work with the file(s) they need to be downloaded first. That could be done by right mouse click on
particular representation (or multiselect all) and select *Download*.
This will mark representation to be download which will happen in the background if OpenPype Tray is running.
For more details of progress, state or possible error details artist should open **[Sync Queue](#Sync-Queue)** item in Tray app.
Work in progress...

View file

@ -0,0 +1,26 @@
---
id: artist_tools_look_assigner
title: Look Assigner
sidebar_label: Look Assigner
description: Manage published looks to their respective model(s).
---
# Look Assigner
The Look Manager takes care of assigning published looks to the correct model in the scene.
## Details
When a look is published it also stores the information about what shading networks need to be assigned to which models, but it also stores all the render attributes on the mesh necessary for a successful render.
## Usage
Look Assigner has GUI is made of two parts. On the left you will see the list of all the available models in the scene and on the right side, all the looks that can be associate with them. To assign a look to a model you just need to:
1. Click on "load all subsets".
2. Choose a subset from the menu on the left.
3. Right click on a look from the list on the right.
4. Choose "Assign".
At this point you should have a model with all it's shaders applied correctly. The tool automatically loads the latest look available.

View file

@ -0,0 +1,38 @@
---
id: artist_tools_publisher
title: Publisher
sidebar_label: Publisher
description: Publish versioned work progress into the project.
---
# Publisher
Use publish to share your work with others. It collects, validates and exports the data in standardized way.
## Details
When you run pyblish, the UI is made of 2 main parts. On the left, you see all the items pyblish will be working with (called instances), and on the right a list of actions that are going to process these items.
Even though every task type has some pre-defined settings of what should be collected from the scene and what items will be published by default. You can technically publish any output type from any task type.
Each item is passed through multiple plugins, each doing a small piece of work. These are organized into 4 areas and run in sequence.
## Using Pyblish
In the best case scenario, you open pyblish from the Avalon menu, press play, wait for it to finish, and youre done.
These are the steps in detail, for cases, where the default settings dont work for you or you know that the task youre working on, requires a different treatment.
### Collect
Finds all the important data in the scene and makes it ready for publishing
### Validate
Each validator makes sure your output complies to one particular condition. This could be anything from naming conventions, scene setting, to plugin usage. An item can only be published if all validators pass.
### Extract
Extractor takes the item and saves it to the disk. Usually to temporary location. Each extractor represents one file format and there can be multiple file formats exported for each item.
### Integrate
Integrator takes the extracted files, categorizes and moves them to a correct location on the disk or on the server.

View file

@ -0,0 +1,38 @@
---
id: artist_tools_subset_manager
title: Subset Manager
sidebar_label: Subset Manager
description: Manage all the publish-able elements.
---
# Subset Manager
Subset Manager lists all items which are meant for publishig and will be published if Publish is triggered
## Details
One or more items (instances) could be published any time Publish process is started. Each this publishable
item must be created by Creator tool previously. Subset Manager provides easy way how to check which items,
and how many, will be published.
It also provides clean and preferable way how to remove unwanted item from publishing.
## Usage
Subset Manager has GUI is made of two parts. On the left you will see the list of all the available publishable items in the scene and on the right side, details about these items.
<div class="col col--6 markdown">
![subset_manager](assets/tools_subset_manager.png)
</div>
Any time new item is Created, it will show up here.
Currently there is only single action, 'Remove instance' which cleans workfile file from publishable item metadata.
This might not remove underlying host item, it depends on host and implementation!
It might also happen that user deletes underlying host item(for example layer in Photoshop) directly in the host, but metadata will stay.
This could result in phantom issues during publishing. Use Subset Manager to purge workfile from abandoned items.
Please check behaviour in host of your choice.

View file

@ -0,0 +1,46 @@
---
id: artist_tools_sync_queue
title: Sync Queue
sidebar_label: Sync Queue
description: Track sites syncronization progress.
---
# Sync Queue
## Details
If **Site Sync** is configured for a project, each asset is marked to be synchronized to a remote site during publishing.
Each artist's OpenPype Tray application handles synchronization in background, it looks for all representation which
are marked with the site of the user (unique site name per artist) and remote site.
Artists then can see progress of synchronization via **Sync Queue** link in the Tray application.
Artists can see all synced representation in this dialog with helpful information such as when representation was created, when it was synched,
status of synchronization (OK or Fail) etc.
## Usage
With this app artists can modify synchronized representation, for example mark failed representation for re-sync etc.
![Sync Queue](assets/site_sync_sync_queue.png)
Actions accessible by context menu on single (or multiple representations):
- *Open in Explorer* - if site is locally accessible, open folder with it with OS based explorer
- *Re-sync Active Site* - mark artist own side for re-download (repre must be accessible on remote side)
- *Re-sync Remote Site* - mark representation for re-upload
- *Completely remove from local* - removes tag of synchronization to artist's local site, removes files from disk (available only for personal sites)
- *Change priority* - mark representations with higher priority for faster synchronization run
Double click on any of the representation open Detail dialog with information about all files for particular representation.
In this dialog error details could be accessed in the context menu.
#### Context menu on project name
Artists can also Pause whole server or specific project for synchronization. In that state no download/upload is being run.
This might be helpful if the artist is not interested in a particular project for a while or wants to save bandwidth data limit for a bit.
Another option is `Validate files on active site`. This option triggers process where all representation of the selected project are looped through, file paths are resolved for active site and
if paths point to local system, paths are physically checked if files are existing. If file exists and representation is not marked to be present on 'active_site' in DB, DB is updated
to follow that.
This might be useful if artist has representation files that Site Sync doesn't know about (newly attached external drive with representations from studio).
This project might take a while!

View file

@ -0,0 +1,49 @@
---
id: artist_tools_workfiles
title: Workfiles
sidebar_label: Workfiles
description: Save versioned progress files.
---
# Workfiles
Save new working scenes or scripts, or open the ones you previously worked on.
## Details
Instead of digging through your software native file browser, you can simply open the workfiles app and see all the files for the asset or shot you're currently working with. The app takes care of all the naming and the location of your work files.
When saving a scene you can also add a comment. It is completely up to you how you use this, however we recommend using it for subversion within your current working version.
Let's say that the last version of the comp you published was v003 and now you're working on the file prj_sh010_compositing_v004.nk if you want to keep snapshots of your work, but not iterate on the main version because the supervisor is expecting next publish to be v004, you can use the comment to do this, so you can save the file under the name prj_sh010_compositing_v004_001 , prj_sh010_compositing_v004_002. the main version is automatically iterated every time you publish something.
## Usage
<div class="row markdown">
<div class="col col--6 markdown">
### To open existing file:
1. Open Workfiles tool from OpenPype menu
2. Select file from list - the latest version is the highest *(descendent ordering)*
3. Press `Open` button
</div>
<div class="col col--6 markdown">
![workfiles_1](assets/workfiles_1.png)
</div>
</div>
### To save new workfile
1. Open Workfiles tool from OpenPype menu
2. Press `Save As` button
3. You can add optional comment to the filename, that will be appended at the end
4. Press `OK`
:::note
You can manually override the workfile version by unticking next available version and using the version menu to choose your own.
:::

View file

@ -195,7 +195,7 @@ Applicable context filters:
#### Subset grouping profiles
Published subsets might be grouped together for cleaner and easier selection in **[Loader](artist_tools.md#subset-groups)**
Published subsets might be grouped together for cleaner and easier selection in the **[Subset Manager](artist_tools_subset_manager)**
Group name is chosen with use of [profile filtering](#profile-filters)
@ -212,7 +212,7 @@ Applicable context filters:
Settings for OpenPype tools.
## Creator
Settings related to [Creator tool](artist_tools.md#details).
Settings related to [Creator tool](artist_tools_creator).
### Subset name profiles
![global_tools_creator_subset_template](assets/global_tools_creator_subset_template.png)
@ -250,4 +250,4 @@ All settings related to Workfile tool.
### Open last workfile at launch
This feature allows you to define a rule for each task/host or toggle the feature globally to all tasks as they are visible in the picture.
![global_tools_workfile_open_last_version](assets/global_tools_workfile_open_last_version.png)
![global_tools_workfile_open_last_version](assets/global_tools_workfile_open_last_version.png)

View file

@ -8,7 +8,24 @@ module.exports = {
"artist_getting_started",
"artist_concepts",
"artist_publish",
"artist_tools",
{
type: "category",
collapsed: true,
label: "Tools",
link: {type: 'doc', id: 'artist_tools'},
items: [
"artist_tools_context_manager",
"artist_tools_creator",
"artist_tools_loader",
"artist_tools_library_loader",
"artist_tools_publisher",
"artist_tools_inventory",
"artist_tools_workfiles",
"artist_tools_look_assigner",
"artist_tools_subset_manager",
"artist_tools_sync_queue"
],
},
"artist_install"
],
},

View file

@ -15,32 +15,32 @@ const key_features = [
label: "Workfiles",
description:
"Save and load workfiles in progress. Change the context inside of the application.",
docs: "/docs/artist_tools#workfiles",
docs: "/docs/artist_tools_workfiles",
},
{
label: "Creator",
description:
"Universal GUI for defining content for publishing from your DCC app.",
docs: "/docs/artist_tools#creator",
docs: "/docs/artist_tools_creator",
},
{
label: "Loader",
description:
"Universal GUI for loading published assets into your DCC app.",
docs: "/docs/artist_tools#loader",
docs: "/docs/artist_tools_loader",
},
{
label: "Publisher",
description:
"Universal GUI for validating and publishng content from your DCC app.",
image: "",
docs: "/docs/artist_tools#publisher",
docs: "/docs/artist_tools_publisher",
},
{
label: "Scene manager",
description:
"Universal GUI for managing versions of assets loaded into your working scene.",
docs: "docs/artist_tools#inventory",
docs: "docs/artist_tools_inventory",
},
{
label: "Project manager",
@ -52,7 +52,7 @@ const key_features = [
label: "Library Loader",
description:
"A loader GUI that allows yo to load content from dedicated cross project asset library",
docs: "docs/artist_tools#library-loader",
docs: "docs/artist_tool_library_loader",
image: "",
},
{