mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-27 06:12:19 +01:00
Maya: Load Rendersetup - allow loading unmanaged + automatically 'accept' the import + pick import mode
This commit is contained in:
parent
312e0e7ad4
commit
8eab84e2da
1 changed files with 86 additions and 26 deletions
|
|
@ -9,7 +9,9 @@ instance.
|
|||
import json
|
||||
import sys
|
||||
import six
|
||||
import contextlib
|
||||
|
||||
from ayon_core.lib import BoolDef, EnumDef
|
||||
from ayon_core.pipeline import (
|
||||
load,
|
||||
get_representation_path
|
||||
|
|
@ -21,6 +23,31 @@ from maya import cmds
|
|||
import maya.app.renderSetup.model.renderSetup as renderSetup
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def mark_all_imported(enabled):
|
||||
"""Mark all imported nodes accepted by removing the `imported` attribute"""
|
||||
if not enabled:
|
||||
yield
|
||||
return
|
||||
|
||||
node_types = cmds.pluginInfo("renderSetup", query=True, dependNode=True)
|
||||
|
||||
# Get node before load, then we can disable `imported`
|
||||
# attribute on all new render setup layers after import
|
||||
before = cmds.ls(type=node_types, long=True)
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
after = cmds.ls(type=node_types, long=True)
|
||||
for node in (node for node in after if node not in before):
|
||||
if cmds.attributeQuery("imported",
|
||||
node=node,
|
||||
exists=True):
|
||||
plug = "{}.imported".format(node)
|
||||
if cmds.getAttr(plug):
|
||||
cmds.deleteAttr(plug)
|
||||
|
||||
|
||||
class RenderSetupLoader(load.LoaderPlugin):
|
||||
"""Load json preset for RenderSetup overwriting current one."""
|
||||
|
||||
|
|
@ -32,38 +59,71 @@ class RenderSetupLoader(load.LoaderPlugin):
|
|||
icon = "tablet"
|
||||
color = "orange"
|
||||
|
||||
options = [
|
||||
BoolDef("accept_import",
|
||||
label="Accept import on load",
|
||||
tooltip=(
|
||||
"By default importing or pasting Render Setup collections "
|
||||
"will display them italic in the Render Setup list.\nWith "
|
||||
"this enabled the load will directly mark the import "
|
||||
"'accepted' and remove the italic view."
|
||||
),
|
||||
default=True),
|
||||
BoolDef("load_managed",
|
||||
label="Load Managed",
|
||||
tooltip=(
|
||||
"Containerize the rendersetup on load so it can be "
|
||||
"'updated' later."
|
||||
),
|
||||
default=True),
|
||||
EnumDef("import_mode",
|
||||
label="Import mode",
|
||||
items={
|
||||
renderSetup.DECODE_AND_OVERWRITE: (
|
||||
"Flush existing render setup and "
|
||||
"add without any namespace"
|
||||
),
|
||||
renderSetup.DECODE_AND_MERGE: (
|
||||
"Merge with the existing render setup objects and "
|
||||
"rename the unexpected objects"
|
||||
),
|
||||
renderSetup.DECODE_AND_RENAME: (
|
||||
"Renaming all decoded render setup objects to not "
|
||||
"conflict with the existing render setup"
|
||||
),
|
||||
},
|
||||
default=renderSetup.DECODE_AND_OVERWRITE)
|
||||
]
|
||||
|
||||
def load(self, context, name, namespace, data):
|
||||
"""Load RenderSetup settings."""
|
||||
|
||||
# from ayon_core.hosts.maya.api.lib import namespaced
|
||||
|
||||
folder_name = context["folder"]["name"]
|
||||
namespace = namespace or lib.unique_namespace(
|
||||
folder_name + "_",
|
||||
prefix="_" if folder_name[0].isdigit() else "",
|
||||
suffix="_",
|
||||
)
|
||||
path = self.filepath_from_context(context)
|
||||
|
||||
accept_import = data.get("accept_import", True)
|
||||
import_mode = data.get("import_mode", renderSetup.DECODE_AND_OVERWRITE)
|
||||
|
||||
self.log.info(">>> loading json [ {} ]".format(path))
|
||||
with open(path, "r") as file:
|
||||
renderSetup.instance().decode(
|
||||
json.load(file), renderSetup.DECODE_AND_OVERWRITE, None)
|
||||
with mark_all_imported(accept_import):
|
||||
with open(path, "r") as file:
|
||||
renderSetup.instance().decode(
|
||||
json.load(file), import_mode, None)
|
||||
|
||||
nodes = []
|
||||
null = cmds.sets(name="null_SET", empty=True)
|
||||
nodes.append(null)
|
||||
if data.get("load_managed", True):
|
||||
self.log.info(">>> containerising [ {} ]".format(name))
|
||||
asset = context['asset']['name']
|
||||
namespace = namespace or lib.unique_namespace(
|
||||
asset + "_",
|
||||
prefix="_" if asset[0].isdigit() else "",
|
||||
suffix="_",
|
||||
)
|
||||
|
||||
self[:] = nodes
|
||||
if not nodes:
|
||||
return
|
||||
|
||||
self.log.info(">>> containerising [ {} ]".format(name))
|
||||
return containerise(
|
||||
name=name,
|
||||
namespace=namespace,
|
||||
nodes=nodes,
|
||||
context=context,
|
||||
loader=self.__class__.__name__)
|
||||
return containerise(
|
||||
name=name,
|
||||
namespace=namespace,
|
||||
nodes=[],
|
||||
context=context,
|
||||
loader=self.__class__.__name__)
|
||||
|
||||
def remove(self, container):
|
||||
"""Remove RenderSetup settings instance."""
|
||||
|
|
@ -73,7 +133,7 @@ class RenderSetupLoader(load.LoaderPlugin):
|
|||
|
||||
self.log.info("Removing '%s' from Maya.." % container["name"])
|
||||
|
||||
container_content = cmds.sets(container_name, query=True)
|
||||
container_content = cmds.sets(container_name, query=True) or []
|
||||
nodes = cmds.ls(container_content, long=True)
|
||||
|
||||
nodes.append(container_name)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue