[Automated] Merged develop into main

This commit is contained in:
ynbot 2023-08-10 17:13:39 +02:00 committed by GitHub
commit b7bf7453e8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 595 additions and 234 deletions

View file

@ -35,6 +35,7 @@ body:
label: Version
description: What version are you running? Look to OpenPype Tray
options:
- 3.16.3-nightly.5
- 3.16.3-nightly.4
- 3.16.3-nightly.3
- 3.16.3-nightly.2
@ -134,7 +135,6 @@ body:
- 3.14.7-nightly.6
- 3.14.7-nightly.5
- 3.14.7-nightly.4
- 3.14.7-nightly.3
validations:
required: true
- type: dropdown

View file

@ -6,6 +6,9 @@ from .mongo import (
OpenPypeMongoConnection,
get_project_database,
get_project_connection,
load_json_file,
replace_project_documents,
store_project_documents,
)
@ -17,4 +20,7 @@ __all__ = (
"OpenPypeMongoConnection",
"get_project_database",
"get_project_connection",
"load_json_file",
"replace_project_documents",
"store_project_documents",
)

View file

@ -2076,9 +2076,16 @@ class WorkfileSettings(object):
str(workfile_settings["OCIO_config"]))
else:
# set values to root
# OCIO config path is defined from prelaunch hook
self._root_node["colorManagement"].setValue("OCIO")
# print previous settings in case some were found in workfile
residual_path = self._root_node["customOCIOConfigPath"].value()
if residual_path:
log.info("Residual OCIO config path found: `{}`".format(
residual_path
))
# we dont need the key anymore
workfile_settings.pop("customOCIOConfigPath", None)
workfile_settings.pop("colorManagement", None)
@ -2100,9 +2107,35 @@ class WorkfileSettings(object):
# set ocio config path
if config_data:
current_ocio_path = os.getenv("OCIO")
if current_ocio_path != config_data["path"]:
message = """
log.info("OCIO config path found: `{}`".format(
config_data["path"]))
# check if there's a mismatch between environment and settings
correct_settings = self._is_settings_matching_environment(
config_data)
# if there's no mismatch between environment and settings
if correct_settings:
self._set_ocio_config_path_to_workfile(config_data)
def _is_settings_matching_environment(self, config_data):
""" Check if OCIO config path is different from environment
Args:
config_data (dict): OCIO config data from settings
Returns:
bool: True if settings are matching environment, False otherwise
"""
current_ocio_path = os.environ["OCIO"]
settings_ocio_path = config_data["path"]
# normalize all paths to forward slashes
current_ocio_path = current_ocio_path.replace("\\", "/")
settings_ocio_path = settings_ocio_path.replace("\\", "/")
if current_ocio_path != settings_ocio_path:
message = """
It seems like there's a mismatch between the OCIO config path set in your Nuke
settings and the actual path set in your OCIO environment.
@ -2120,12 +2153,118 @@ Please note the paths for your reference:
Reopening Nuke should synchronize these paths and resolve any discrepancies.
"""
nuke.message(
message.format(
env_path=current_ocio_path,
settings_path=config_data["path"]
)
nuke.message(
message.format(
env_path=current_ocio_path,
settings_path=settings_ocio_path
)
)
return False
return True
def _set_ocio_config_path_to_workfile(self, config_data):
""" Set OCIO config path to workfile
Path set into nuke workfile. It is trying to replace path with
environment variable if possible. If not, it will set it as it is.
It also saves the script to apply the change, but only if it's not
empty Untitled script.
Args:
config_data (dict): OCIO config data from settings
"""
# replace path with env var if possible
ocio_path = self._replace_ocio_path_with_env_var(config_data)
log.info("Setting OCIO config path to: `{}`".format(
ocio_path))
self._root_node["customOCIOConfigPath"].setValue(
ocio_path
)
self._root_node["OCIO_config"].setValue("custom")
# only save script if it's not empty
if self._root_node["name"].value() != "":
log.info("Saving script to apply OCIO config path change.")
nuke.scriptSave()
def _get_included_vars(self, config_template):
""" Get all environment variables included in template
Args:
config_template (str): OCIO config template from settings
Returns:
list: list of environment variables included in template
"""
# resolve all environments for whitelist variables
included_vars = [
"BUILTIN_OCIO_ROOT",
]
# include all project root related env vars
for env_var in os.environ:
if env_var.startswith("OPENPYPE_PROJECT_ROOT_"):
included_vars.append(env_var)
# use regex to find env var in template with format {ENV_VAR}
# this way we make sure only template used env vars are included
env_var_regex = r"\{([A-Z0-9_]+)\}"
env_var = re.findall(env_var_regex, config_template)
if env_var:
included_vars.append(env_var[0])
return included_vars
def _replace_ocio_path_with_env_var(self, config_data):
""" Replace OCIO config path with environment variable
Environment variable is added as TCL expression to path. TCL expression
is also replacing backward slashes found in path for windows
formatted values.
Args:
config_data (str): OCIO config dict from settings
Returns:
str: OCIO config path with environment variable TCL expression
"""
config_path = config_data["path"]
config_template = config_data["template"]
included_vars = self._get_included_vars(config_template)
# make sure we return original path if no env var is included
new_path = config_path
for env_var in included_vars:
env_path = os.getenv(env_var)
if not env_path:
continue
# it has to be directory current process can see
if not os.path.isdir(env_path):
continue
# make sure paths are in same format
env_path = env_path.replace("\\", "/")
path = config_path.replace("\\", "/")
# check if env_path is in path and replace to first found positive
if env_path in path:
# with regsub we make sure path format of slashes is correct
resub_expr = (
"[regsub -all {{\\\\}} [getenv {}] \"/\"]").format(env_var)
new_path = path.replace(
env_path, resub_expr
)
break
return new_path
def set_writes_colorspace(self):
''' Adds correct colorspace to write node dict
@ -2239,7 +2378,7 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies.
knobs["to"]))
def set_colorspace(self):
''' Setting colorpace following presets
''' Setting colorspace following presets
'''
# get imageio
nuke_colorspace = get_nuke_imageio_settings()
@ -2247,17 +2386,16 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies.
log.info("Setting colorspace to workfile...")
try:
self.set_root_colorspace(nuke_colorspace)
except AttributeError:
msg = "set_colorspace(): missing `workfile` settings in template"
except AttributeError as _error:
msg = "Set Colorspace to workfile error: {}".format(_error)
nuke.message(msg)
log.info("Setting colorspace to viewers...")
try:
self.set_viewers_colorspace(nuke_colorspace["viewer"])
except AttributeError:
msg = "set_colorspace(): missing `viewer` settings in template"
except AttributeError as _error:
msg = "Set Colorspace to viewer error: {}".format(_error)
nuke.message(msg)
log.error(msg)
log.info("Setting colorspace to write nodes...")
try:

View file

@ -114,6 +114,11 @@ class NukePlaceholderPlugin(PlaceholderPlugin):
placeholder_data[key] = value
return placeholder_data
def delete_placeholder(self, placeholder):
"""Remove placeholder if building was successful"""
placeholder_node = nuke.toNode(placeholder.scene_identifier)
nuke.delete(placeholder_node)
class NukePlaceholderLoadPlugin(NukePlaceholderPlugin, PlaceholderLoadMixin):
identifier = "nuke.load"
@ -276,14 +281,6 @@ class NukePlaceholderLoadPlugin(NukePlaceholderPlugin, PlaceholderLoadMixin):
placeholder.data["nb_children"] += 1
reset_selection()
# remove placeholders marked as delete
if (
placeholder.data.get("delete")
and not placeholder.data.get("keep_placeholder")
):
self.log.debug("Deleting node: {}".format(placeholder_node.name()))
nuke.delete(placeholder_node)
# go back to root group
nuke.root().begin()
@ -690,14 +687,6 @@ class NukePlaceholderCreatePlugin(
placeholder.data["nb_children"] += 1
reset_selection()
# remove placeholders marked as delete
if (
placeholder.data.get("delete")
and not placeholder.data.get("keep_placeholder")
):
self.log.debug("Deleting node: {}".format(placeholder_node.name()))
nuke.delete(placeholder_node)
# go back to root group
nuke.root().begin()

View file

@ -18,6 +18,7 @@ Provides:
import pyblish.api
from openpype.client import get_last_version_by_subset_name
from openpype.pipeline.version_start import get_versioning_start
class CollectPublishedVersion(pyblish.api.ContextPlugin):
@ -47,9 +48,17 @@ class CollectPublishedVersion(pyblish.api.ContextPlugin):
version_doc = get_last_version_by_subset_name(project_name,
workfile_subset_name,
asset_id)
version_int = 1
if version_doc:
version_int += int(version_doc["name"])
version_int = int(version_doc["name"]) + 1
else:
version_int = get_versioning_start(
project_name,
"photoshop",
task_name=context.data["task"],
task_type=context.data["taskType"],
project_settings=context.data["project_settings"]
)
self.log.debug(f"Setting {version_int} to context.")
context.data["version"] = version_int

View file

@ -18,6 +18,7 @@ from openpype.hosts.tvpaint.api.lib import (
from openpype.hosts.tvpaint.api.pipeline import (
get_current_workfile_context,
)
from openpype.pipeline.version_start import get_versioning_start
class LoadWorkfile(plugin.Loader):
@ -95,7 +96,13 @@ class LoadWorkfile(plugin.Loader):
)[1]
if version is None:
version = 1
version = get_versioning_start(
project_name,
"tvpaint",
task_name=task_name,
task_type=data["task"]["type"],
family="workfile"
)
else:
version += 1

View file

@ -25,6 +25,7 @@ from openpype.lib import (
)
from openpype.pipeline.create import get_subset_name
from openpype_modules.webpublisher.lib import parse_json
from openpype.pipeline.version_start import get_versioning_start
class CollectPublishedFiles(pyblish.api.ContextPlugin):
@ -103,7 +104,13 @@ class CollectPublishedFiles(pyblish.api.ContextPlugin):
project_settings=context.data["project_settings"]
)
version = self._get_next_version(
project_name, asset_doc, subset_name
project_name,
asset_doc,
task_name,
task_type,
family,
subset_name,
context
)
next_versions.append(version)
@ -141,8 +148,9 @@ class CollectPublishedFiles(pyblish.api.ContextPlugin):
try:
no_of_frames = self._get_number_of_frames(file_url)
if no_of_frames:
frame_end = int(frame_start) + \
math.ceil(no_of_frames)
frame_end = (
int(frame_start) + math.ceil(no_of_frames)
)
frame_end = math.ceil(frame_end) - 1
instance.data["frameEnd"] = frame_end
self.log.debug("frameEnd:: {}".format(
@ -270,7 +278,16 @@ class CollectPublishedFiles(pyblish.api.ContextPlugin):
config["families"],
config["tags"])
def _get_next_version(self, project_name, asset_doc, subset_name):
def _get_next_version(
self,
project_name,
asset_doc,
task_name,
task_type,
family,
subset_name,
context
):
"""Returns version number or 1 for 'asset' and 'subset'"""
version_doc = get_last_version_by_subset_name(
@ -279,9 +296,19 @@ class CollectPublishedFiles(pyblish.api.ContextPlugin):
asset_doc["_id"],
fields=["name"]
)
version = 1
if version_doc:
version += int(version_doc["name"])
version = int(version_doc["name"]) + 1
else:
version = get_versioning_start(
project_name,
"webpublisher",
task_name=task_name,
task_type=task_type,
family=family,
subset=subset_name,
project_settings=context.data["project_settings"]
)
return version
def _get_number_of_frames(self, file_url):

View file

@ -106,7 +106,7 @@ class HoudiniSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline):
job_info.EnvironmentKeyValue[key] = value
# to recognize render jobs
job_info.add_render_job_env_var(job_info)
job_info.add_render_job_env_var()
for i, filepath in enumerate(instance.data["files"]):
dirname = os.path.dirname(filepath)

View file

@ -132,7 +132,7 @@ class MaxSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
job_info.EnvironmentKeyValue[key] = value
# to recognize render jobs
job_info.add_render_job_env_var(job_info)
job_info.add_render_job_env_var()
job_info.EnvironmentKeyValue["OPENPYPE_LOG_NO_COLORS"] = "1"
# Add list of expected files to job

View file

@ -3,7 +3,7 @@
import os
import json
import re
from copy import copy, deepcopy
from copy import deepcopy
import requests
import clique
@ -16,6 +16,7 @@ from openpype.client import (
from openpype.pipeline import publish, legacy_io
from openpype.lib import EnumDef, is_running_from_build
from openpype.tests.lib import is_in_tests
from openpype.pipeline.version_start import get_versioning_start
from openpype.pipeline.farm.pyblish_functions import (
create_skeleton_instance,
@ -566,7 +567,15 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin,
if version:
version = int(version["name"]) + 1
else:
version = 1
version = get_versioning_start(
project_name,
template_data["app"],
task_name=template_data["task"]["name"],
task_type=template_data["task"]["type"],
family="render",
subset=subset,
project_settings=context.data["project_settings"]
)
host_name = context.data["hostName"]
task_info = template_data.get("task") or {}

View file

@ -11,10 +11,8 @@ Provides:
"""
import os
import sys
import collections
import six
import pyblish.api
import clique

View file

@ -94,7 +94,7 @@ from .context_tools import (
get_current_host_name,
get_current_project_name,
get_current_asset_name,
get_current_task_name,
get_current_task_name
)
install = install_host
uninstall = uninstall_host

View file

@ -35,7 +35,7 @@ from . import (
register_inventory_action_path,
register_creator_plugin_path,
deregister_loader_plugin_path,
deregister_inventory_action_path,
deregister_inventory_action_path
)

View file

@ -0,0 +1,37 @@
from openpype.lib.profiles_filtering import filter_profiles
from openpype.settings import get_project_settings
def get_versioning_start(
project_name,
host_name,
task_name=None,
task_type=None,
family=None,
subset=None,
project_settings=None,
):
"""Get anatomy versioning start"""
if not project_settings:
project_settings = get_project_settings(project_name)
version_start = 1
settings = project_settings["global"]
profiles = settings.get("version_start_category", {}).get("profiles", [])
if not profiles:
return version_start
filtering_criteria = {
"host_names": host_name,
"families": family,
"task_names": task_name,
"task_types": task_type,
"subsets": subset
}
profile = filter_profiles(profiles, filtering_criteria)
if profile is None:
return version_start
return profile["version_start"]

View file

@ -10,7 +10,7 @@ from openpype.lib import (
Logger,
StringTemplate,
)
from openpype.pipeline import Anatomy
from openpype.pipeline import version_start, Anatomy
from openpype.pipeline.template_data import get_template_data
@ -316,7 +316,13 @@ def get_last_workfile(
)
if filename is None:
data = copy.deepcopy(fill_data)
data["version"] = 1
data["version"] = version_start.get_versioning_start(
data["project"]["name"],
data["app"],
task_name=data["task"]["name"],
task_type=data["task"]["type"],
family="workfile"
)
data.pop("comment", None)
if not data.get("ext"):
data["ext"] = extensions[0]

View file

@ -1612,7 +1612,7 @@ class PlaceholderLoadMixin(object):
pass
def delete_placeholder(self, placeholder, failed):
def delete_placeholder(self, placeholder):
"""Called when all item population is done."""
self.log.debug("Clean up of placeholder is not implemented.")
@ -1781,6 +1781,17 @@ class PlaceholderCreateMixin(object):
self.post_placeholder_process(placeholder, failed)
if failed:
self.log.debug(
"Placeholder cleanup skipped due to failed placeholder "
"population."
)
return
if not placeholder.data.get("keep_placeholder", True):
self.delete_placeholder(placeholder)
def create_failed(self, placeholder, creator_data):
if hasattr(placeholder, "create_failed"):
placeholder.create_failed(creator_data)
@ -1800,9 +1811,12 @@ class PlaceholderCreateMixin(object):
representation.
failed (bool): Loading of representation failed.
"""
pass
def delete_placeholder(self, placeholder):
"""Called when all item population is done."""
self.log.debug("Clean up of placeholder is not implemented.")
def _before_instance_create(self, placeholder):
"""Can be overriden. Is called before instance is created."""

View file

@ -32,6 +32,7 @@ from openpype.client import (
get_subsets,
get_last_versions
)
from openpype.pipeline.version_start import get_versioning_start
class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
@ -187,25 +188,13 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
project_task_types = project_doc["config"]["tasks"]
for instance in context:
if self.follow_workfile_version:
version_number = context.data('version')
else:
version_number = instance.data.get("version")
# If version is not specified for instance or context
if version_number is None:
# TODO we should be able to change default version by studio
# preferences (like start with version number `0`)
version_number = 1
# use latest version (+1) if already any exist
latest_version = instance.data["latestVersion"]
if latest_version is not None:
version_number += int(latest_version)
anatomy_updates = {
"asset": instance.data["asset"],
"folder": {
"name": instance.data["asset"],
},
"family": instance.data["family"],
"subset": instance.data["subset"],
"version": version_number
}
# Hierarchy
@ -225,6 +214,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
anatomy_updates["parent"] = parent_name
# Task
task_type = None
task_name = instance.data.get("task")
if task_name:
asset_tasks = asset_doc["data"]["tasks"]
@ -240,6 +230,30 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
"short": task_code
}
# Define version
if self.follow_workfile_version:
version_number = context.data('version')
else:
version_number = instance.data.get("version")
# use latest version (+1) if already any exist
if version_number is None:
latest_version = instance.data["latestVersion"]
if latest_version is not None:
version_number = int(latest_version) + 1
# If version is not specified for instance or context
if version_number is None:
version_number = get_versioning_start(
context.data["projectName"],
instance.context.data["hostName"],
task_name=task_name,
task_type=task_type,
family=instance.data["family"],
subset=instance.data["subset"]
)
anatomy_updates["version"] = version_number
# Additional data
resolution_width = instance.data.get("resolutionWidth")
if resolution_width:

View file

@ -142,6 +142,12 @@ class IntegrateHeroVersion(pyblish.api.InstancePlugin):
))
return
if AYON_SERVER_ENABLED and src_version_entity["name"] == 0:
self.log.debug(
"Version 0 cannot have hero version. Skipping."
)
return
all_copied_files = []
transfers = instance.data.get("transfers", list())
for _src, dst in transfers:

View file

@ -19,6 +19,7 @@ from openpype.pipeline import (
)
from openpype.pipeline.context_tools import get_workdir_from_session
from openpype.pipeline.version_start import get_versioning_start
log = logging.getLogger("Update Slap Comp")
@ -26,9 +27,6 @@ log = logging.getLogger("Update Slap Comp")
def _format_version_folder(folder):
"""Format a version folder based on the filepath
Assumption here is made that, if the path does not exists the folder
will be "v001"
Args:
folder: file path to a folder
@ -36,9 +34,13 @@ def _format_version_folder(folder):
str: new version folder name
"""
new_version = 1
new_version = get_versioning_start(
get_current_project_name(),
"fusion",
family="workfile"
)
if os.path.isdir(folder):
re_version = re.compile("v\d+$")
re_version = re.compile(r"v\d+$")
versions = [i for i in os.listdir(folder) if os.path.isdir(i)
and re_version.match(i)]
if versions:

View file

@ -1,4 +1,7 @@
{
"version_start_category": {
"profiles": []
},
"imageio": {
"activate_global_color_management": false,
"ocio_config": {

View file

@ -14,48 +14,70 @@
"create": {
"CreateArnoldAss": {
"enabled": true,
"default_variants": [],
"default_variants": [
"Main"
],
"ext": ".ass"
},
"CreateAlembicCamera": {
"enabled": true,
"defaults": []
"default_variants": [
"Main"
]
},
"CreateCompositeSequence": {
"enabled": true,
"defaults": []
"default_variants": [
"Main"
]
},
"CreatePointCache": {
"enabled": true,
"defaults": []
"default_variants": [
"Main"
]
},
"CreateRedshiftROP": {
"enabled": true,
"defaults": []
"default_variants": [
"Main"
]
},
"CreateRemotePublish": {
"enabled": true,
"defaults": []
"default_variants": [
"Main"
]
},
"CreateVDBCache": {
"enabled": true,
"defaults": []
"default_variants": [
"Main"
]
},
"CreateUSD": {
"enabled": false,
"defaults": []
"default_variants": [
"Main"
]
},
"CreateUSDModel": {
"enabled": false,
"defaults": []
"default_variants": [
"Main"
]
},
"USDCreateShadingWorkspace": {
"enabled": false,
"defaults": []
"default_variants": [
"Main"
]
},
"CreateUSDRender": {
"enabled": false,
"defaults": []
"default_variants": [
"Main"
]
}
},
"publish": {

View file

@ -527,7 +527,7 @@
},
"CreateRender": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
@ -627,55 +627,55 @@
},
"CreateMultiverseUsd": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateMultiverseUsdComp": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateMultiverseUsdOver": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateAssembly": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateCamera": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateLayout": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateMayaScene": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateRenderSetup": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateRig": {
"enabled": true,
"defaults": [
"default_variants": [
"Main",
"Sim",
"Cloth"
@ -683,20 +683,20 @@
},
"CreateSetDress": {
"enabled": true,
"defaults": [
"default_variants": [
"Main",
"Anim"
]
},
"CreateVRayScene": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateYetiRig": {
"enabled": true,
"defaults": [
"default_variants": [
"Main"
]
}

View file

@ -5,6 +5,61 @@
"label": "Global",
"is_file": true,
"children": [
{
"type": "dict",
"key": "version_start_category",
"label": "Version Start",
"collapsible": true,
"collapsible_key": true,
"children": [
{
"type": "list",
"collapsible": true,
"key": "profiles",
"label": "Profiles",
"object_type": {
"type": "dict",
"children": [
{
"key": "host_names",
"label": "Host names",
"type": "hosts-enum",
"multiselection": true
},
{
"key": "task_types",
"label": "Task types",
"type": "task-types-enum"
},
{
"key": "task_names",
"label": "Task names",
"type": "list",
"object_type": "text"
},
{
"key": "families",
"label": "Families",
"type": "list",
"object_type": "text"
},
{
"key": "subsets",
"label": "Subset names",
"type": "list",
"object_type": "text"
},
{
"key": "version_start",
"label": "Version Start",
"type": "number",
"minimum": 0
}
]
}
}
]
},
{
"key": "imageio",
"type": "dict",

View file

@ -19,7 +19,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
},
{
@ -39,51 +39,51 @@
]
},
{
"type": "schema_template",
"name": "template_create_plugin",
"template_data": [
{
"key": "CreateAlembicCamera",
"label": "Create Alembic Camera"
},
{
"key": "CreateCompositeSequence",
"label": "Create Composite (Image Sequence)"
},
{
"key": "CreatePointCache",
"label": "Create Point Cache"
},
{
"key": "CreateRedshiftROP",
"label": "Create Redshift ROP"
},
{
"key": "CreateRemotePublish",
"label": "Create Remote Publish"
},
{
"key": "CreateVDBCache",
"label": "Create VDB Cache"
},
{
"key": "CreateUSD",
"label": "Create USD"
},
{
"key": "CreateUSDModel",
"label": "Create USD Model"
},
{
"key": "USDCreateShadingWorkspace",
"label": "Create USD Shading Workspace"
},
{
"key": "CreateUSDRender",
"label": "Create USD Render"
}
]
}
{
"type": "schema_template",
"name": "template_create_plugin",
"template_data": [
{
"key": "CreateAlembicCamera",
"label": "Create Alembic Camera"
},
{
"key": "CreateCompositeSequence",
"label": "Create Composite (Image Sequence)"
},
{
"key": "CreatePointCache",
"label": "Create Point Cache"
},
{
"key": "CreateRedshiftROP",
"label": "Create Redshift ROP"
},
{
"key": "CreateRemotePublish",
"label": "Create Remote Publish"
},
{
"key": "CreateVDBCache",
"label": "Create VDB Cache"
},
{
"key": "CreateUSD",
"label": "Create USD"
},
{
"key": "CreateUSDModel",
"label": "Create USD Model"
},
{
"key": "USDCreateShadingWorkspace",
"label": "Create USD Shading Workspace"
},
{
"key": "CreateUSDRender",
"label": "Create USD Render"
}
]
}
]
}

View file

@ -29,14 +29,20 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
}
]
},
{
"type": "schema",
"name": "schema_maya_create_render"
{
"type": "schema_template",
"name": "template_create_plugin",
"template_data": [
{
"key": "CreateRender",
"label": "Create Render"
}
]
},
{
"type": "dict",
@ -53,7 +59,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
},
{
@ -85,7 +91,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
},
{
@ -148,7 +154,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
}
]
@ -178,7 +184,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
}
]
@ -213,7 +219,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
}
]
@ -243,7 +249,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
}
]
@ -263,7 +269,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
},
{
@ -288,7 +294,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
},
{
@ -390,7 +396,7 @@
{
"type": "list",
"key": "default_variants",
"label": "Default Subsets",
"label": "Default Variants",
"object_type": "text"
}
]

View file

@ -1,20 +0,0 @@
{
"type": "dict",
"collapsible": true,
"key": "CreateRender",
"label": "Create Render",
"checkbox_key": "enabled",
"children": [
{
"type": "boolean",
"key": "enabled",
"label": "Enabled"
},
{
"type": "list",
"key": "defaults",
"label": "Default Subsets",
"object_type": "text"
}
]
}

View file

@ -13,8 +13,8 @@
},
{
"type": "list",
"key": "defaults",
"label": "Default Subsets",
"key": "default_variants",
"label": "Default Variants",
"object_type": "text"
}
]

View file

@ -40,6 +40,7 @@ from openpype.lib import (
from openpype.lib.file_transaction import FileTransaction
from openpype.settings import get_project_settings
from openpype.pipeline import Anatomy
from openpype.pipeline.version_start import get_versioning_start
from openpype.pipeline.template_data import get_template_data
from openpype.pipeline.publish import get_publish_template_name
from openpype.pipeline.create import get_subset_name
@ -940,9 +941,17 @@ class ProjectPushItemProcess:
last_version_doc = get_last_version_by_subset_id(
project_name, subset_id
)
version = 1
if last_version_doc:
version += int(last_version_doc["name"])
version = int(last_version_doc["name"]) + 1
else:
version = get_versioning_start(
project_name,
self.host_name,
task_name=self.task_info["name"],
task_type=self.task_info["type"],
family=families[0],
subset=subset_doc["name"]
)
existing_version_doc = get_version_by_name(
project_name, version, subset_id
@ -966,14 +975,6 @@ class ProjectPushItemProcess:
return
if version is None:
last_version_doc = get_last_version_by_subset_id(
project_name, subset_id
)
version = 1
if last_version_doc:
version += int(last_version_doc["name"])
version_doc = new_version_doc(
version, subset_id, version_data
)

View file

@ -55,7 +55,7 @@ class SceneInventoryView(QtWidgets.QTreeView):
manager = ModulesManager()
sync_server = manager.modules_by_name.get("sync_server")
sync_enabled = sync_server is not None and self.sync_server.enabled
sync_enabled = sync_server is not None and sync_server.enabled
self.sync_server = sync_server
self.sync_enabled = sync_enabled

View file

@ -10,6 +10,7 @@ from openpype.client import (
)
from openpype.settings import get_project_settings
from openpype.pipeline import LegacyCreator
from openpype.pipeline.version_start import get_versioning_start
from openpype.pipeline.create import (
SUBSET_NAME_ALLOWED_SYMBOLS,
TaskNotSetError,
@ -299,7 +300,15 @@ class FamilyWidget(QtWidgets.QWidget):
project_name = self.dbcon.active_project()
asset_name = self.asset_name
subset_name = self.input_result.text()
version = 1
plugin = self.list_families.currentItem().data(PluginRole)
family = plugin.family.rsplit(".", 1)[-1]
version = get_versioning_start(
project_name,
"standalonepublisher",
task_name=self.dbcon.Session["AVALON_TASK"],
family=family,
subset=subset_name
)
asset_doc = None
subset_doc = None

View file

@ -12,6 +12,7 @@ from openpype.pipeline import (
from openpype.pipeline.workfile import get_last_workfile_with_version
from openpype.pipeline.template_data import get_template_data_with_names
from openpype.tools.utils import PlaceholderLineEdit
from openpype.pipeline import version_start, get_current_host_name
log = logging.getLogger(__name__)
@ -218,7 +219,15 @@ class SaveAsDialog(QtWidgets.QDialog):
# Version number input
version_input = QtWidgets.QSpinBox(version_widget)
version_input.setMinimum(1)
version_input.setMinimum(
version_start.get_versioning_start(
self.data["project"]["name"],
get_current_host_name(),
task_name=self.data["task"]["name"],
task_type=self.data["task"]["type"],
family="workfile"
)
)
version_input.setMaximum(9999)
# Last version checkbox
@ -420,7 +429,13 @@ class SaveAsDialog(QtWidgets.QDialog):
)[1]
if version is None:
version = 1
version = version_start.get_versioning_start(
data["project"]["name"],
get_current_host_name(),
task_name=self.data["task"]["name"],
task_type=self.data["task"]["type"],
family="workfile"
)
else:
version += 1

View file

@ -6,12 +6,18 @@ from ayon_server.settings import BaseSettingsModel
# Creator Plugins
class CreatorModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
defaults: list[str] = Field(title="Default Products")
default_variants: list[str] = Field(
title="Default Products",
default_factory=list,
)
class CreateArnoldAssModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
defaults: list[str] = Field(title="Default Products")
default_variants: list[str] = Field(
title="Default Products",
default_factory=list,
)
ext: str = Field(Title="Extension")
@ -54,49 +60,49 @@ class CreatePluginsModel(BaseSettingsModel):
DEFAULT_HOUDINI_CREATE_SETTINGS = {
"CreateArnoldAss": {
"enabled": True,
"default_variants": [],
"default_variants": ["Main"],
"ext": ".ass"
},
"CreateAlembicCamera": {
"enabled": True,
"defaults": []
"default_variants": ["Main"]
},
"CreateCompositeSequence": {
"enabled": True,
"defaults": []
"default_variants": ["Main"]
},
"CreatePointCache": {
"enabled": True,
"defaults": []
"default_variants": ["Main"]
},
"CreateRedshiftROP": {
"enabled": True,
"defaults": []
"default_variants": ["Main"]
},
"CreateRemotePublish": {
"enabled": True,
"defaults": []
"default_variants": ["Main"]
},
"CreateVDBCache": {
"enabled": True,
"defaults": []
"default_variants": ["Main"]
},
"CreateUSD": {
"enabled": False,
"defaults": []
"default_variants": ["Main"]
},
"CreateUSDModel": {
"enabled": False,
"defaults": []
"default_variants": ["Main"]
},
"USDCreateShadingWorkspace": {
"enabled": False,
"defaults": []
"default_variants": ["Main"]
},
"CreateUSDRender": {
"enabled": False,
"defaults": []
}
"default_variants": ["Main"]
},
}

View file

@ -7,14 +7,14 @@ class CreateLookModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
make_tx: bool = Field(title="Make tx files")
rs_tex: bool = Field(title="Make Redshift texture files")
defaults: list[str] = Field(
default_factory=["Main"], title="Default Products"
default_variants: list[str] = Field(
default_factory=list, title="Default Products"
)
class BasicCreatorModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
defaults: list[str] = Field(
default_variants: list[str] = Field(
default_factory=list,
title="Default Products"
)
@ -22,20 +22,21 @@ class BasicCreatorModel(BaseSettingsModel):
class CreateUnrealStaticMeshModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
defaults: list[str] = Field(
default_factory=["", "_Main"],
default_variants: list[str] = Field(
default_factory=list,
title="Default Products"
)
static_mesh_prefixes: str = Field("S", title="Static Mesh Prefix")
collision_prefixes: list[str] = Field(
default_factory=["UBX", "UCP", "USP", "UCX"],
default_factory=list,
title="Collision Prefixes"
)
class CreateUnrealSkeletalMeshModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
defaults: list[str] = Field(default_factory=[], title="Default Products")
default_variants: list[str] = Field(
default_factory=list, title="Default Products")
joint_hints: str = Field("jnt_org", title="Joint root hint")
@ -48,7 +49,7 @@ class BasicExportMeshModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
write_color_sets: bool = Field(title="Write Color Sets")
write_face_sets: bool = Field(title="Write Face Sets")
defaults: list[str] = Field(
default_variants: list[str] = Field(
default_factory=list,
title="Default Products"
)
@ -61,7 +62,7 @@ class CreateAnimationModel(BaseSettingsModel):
title="Include Parent Hierarchy")
include_user_defined_attributes: bool = Field(
title="Include User Defined Attributes")
defaults: list[str] = Field(
default_variants: list[str] = Field(
default_factory=list,
title="Default Products"
)
@ -74,8 +75,8 @@ class CreatePointCacheModel(BaseSettingsModel):
include_user_defined_attributes: bool = Field(
title="Include User Defined Attributes"
)
defaults: list[str] = Field(
default_factory=["Main"],
default_variants: list[str] = Field(
default_factory=list,
title="Default Products"
)
@ -84,8 +85,8 @@ class CreateProxyAlembicModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
write_color_sets: bool = Field(title="Write Color Sets")
write_face_sets: bool = Field(title="Write Face Sets")
defaults: list[str] = Field(
default_factory=["Main"],
default_variants: list[str] = Field(
default_factory=list,
title="Default Products"
)
@ -115,7 +116,8 @@ class CreateVrayProxyModel(BaseSettingsModel):
enabled: bool = Field(True)
vrmesh: bool = Field(title="VrMesh")
alembic: bool = Field(title="Alembic")
defaults: list[str] = Field(default_factory=list, title="Default Products")
default_variants: list[str] = Field(
default_factory=list, title="Default Products")
class CreatorsModel(BaseSettingsModel):
@ -230,7 +232,7 @@ DEFAULT_CREATORS_SETTINGS = {
},
"CreateRender": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
@ -295,19 +297,19 @@ DEFAULT_CREATORS_SETTINGS = {
},
"CreateMultiverseUsd": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateMultiverseUsdComp": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateMultiverseUsdOver": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
@ -333,31 +335,31 @@ DEFAULT_CREATORS_SETTINGS = {
},
"CreateAssembly": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateCamera": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateLayout": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateMayaScene": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateRenderSetup": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
@ -370,7 +372,7 @@ DEFAULT_CREATORS_SETTINGS = {
},
"CreateRig": {
"enabled": True,
"defaults": [
"default_variants": [
"Main",
"Sim",
"Cloth"
@ -378,7 +380,7 @@ DEFAULT_CREATORS_SETTINGS = {
},
"CreateSetDress": {
"enabled": True,
"defaults": [
"default_variants": [
"Main",
"Anim"
]
@ -393,13 +395,13 @@ DEFAULT_CREATORS_SETTINGS = {
},
"CreateVRayScene": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
},
"CreateYetiRig": {
"enabled": True,
"defaults": [
"default_variants": [
"Main"
]
}