Maya: allow not creation of group for Import loaders (#5427)

* OP-6357 - removed unneeded import

* OP-6357 - extracted logic for getting custom group and namespace from Settings

Mimicing logic in ReferenceLoader, eg. group could be left empty >> no groupping of imported subset.

* OP-6357 - same logic for abc animation as Reference

* OP-6357 - same logic for yeti rig as ReferenceLoder

Allows to not create wrapping group.

* OP-6357 - added separate import_loader to settings

Could be used to not creating wrapping groups when Group kept empty.

* OP-6357 - added product subset conversion for ayon settings

* OP-6357 - fix using correct variable

Artist input comes from `data` not directly from self.options

* OP-6357 - add attach_to_root to options to allow control by same key

* OP-6357 - added docstring

* Added settings for Import loaders in maya

* OP-6357 - refactored formatting
This commit is contained in:
Petr Kalis 2023-08-11 16:12:05 +02:00 committed by GitHub
parent a2a35e8252
commit 8b128d91bc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 128 additions and 50 deletions

View file

@ -523,6 +523,55 @@ class RenderlayerCreator(NewCreator, MayaCreatorBase):
class Loader(LoaderPlugin):
hosts = ["maya"]
def get_custom_namespace_and_group(self, context, options, loader_key):
"""Queries Settings to get custom template for namespace and group.
Group template might be empty >> this forces to not wrap imported items
into separate group.
Args:
context (dict)
options (dict): artist modifiable options from dialog
loader_key (str): key to get separate configuration from Settings
('reference_loader'|'import_loader')
"""
options["attach_to_root"] = True
asset = context['asset']
subset = context['subset']
settings = get_project_settings(context['project']['name'])
custom_naming = settings['maya']['load'][loader_key]
if not custom_naming['namespace']:
raise LoadError("No namespace specified in "
"Maya ReferenceLoader settings")
elif not custom_naming['group_name']:
self.log.debug("No custom group_name, no group will be created.")
options["attach_to_root"] = False
formatting_data = {
"asset_name": asset['name'],
"asset_type": asset['type'],
"folder": {
"name": asset["name"],
},
"subset": subset['name'],
"family": (
subset['data'].get('family') or
subset['data']['families'][0]
)
}
custom_namespace = custom_naming['namespace'].format(
**formatting_data
)
custom_group_name = custom_naming['group_name'].format(
**formatting_data
)
return custom_group_name, custom_namespace, options
class ReferenceLoader(Loader):
"""A basic ReferenceLoader for Maya
@ -565,42 +614,13 @@ class ReferenceLoader(Loader):
path = self.filepath_from_context(context)
assert os.path.exists(path), "%s does not exist." % path
asset = context['asset']
subset = context['subset']
settings = get_project_settings(context['project']['name'])
custom_naming = settings['maya']['load']['reference_loader']
loaded_containers = []
if not custom_naming['namespace']:
raise LoadError("No namespace specified in "
"Maya ReferenceLoader settings")
elif not custom_naming['group_name']:
self.log.debug("No custom group_name, no group will be created.")
options["attach_to_root"] = False
formatting_data = {
"asset_name": asset['name'],
"asset_type": asset['type'],
"folder": {
"name": asset["name"],
},
"subset": subset['name'],
"family": (
subset['data'].get('family') or
subset['data']['families'][0]
)
}
custom_namespace = custom_naming['namespace'].format(
**formatting_data
)
custom_group_name = custom_naming['group_name'].format(
**formatting_data
)
custom_group_name, custom_namespace, options = \
self.get_custom_namespace_and_group(context, options,
"reference_loader")
count = options.get("count") or 1
loaded_containers = []
for c in range(0, count):
namespace = lib.get_custom_namespace(custom_namespace)
group_name = "{}:{}".format(

View file

@ -33,6 +33,13 @@ class AbcLoader(openpype.hosts.maya.api.plugin.ReferenceLoader):
suffix="_abc"
)
attach_to_root = options.get("attach_to_root", True)
group_name = options["group_name"]
# no group shall be created
if not attach_to_root:
group_name = namespace
# hero_001 (abc)
# asset_counter{optional}
path = self.filepath_from_context(context)
@ -41,8 +48,8 @@ class AbcLoader(openpype.hosts.maya.api.plugin.ReferenceLoader):
nodes = cmds.file(file_url,
namespace=namespace,
sharedReferenceFile=False,
groupReference=True,
groupName=options['group_name'],
groupReference=attach_to_root,
groupName=group_name,
reference=True,
returnNewNodes=True)

View file

@ -5,8 +5,9 @@ import qargparse
from openpype.pipeline import load
from openpype.hosts.maya.api.lib import (
maintained_selection,
unique_namespace
get_custom_namespace
)
import openpype.hosts.maya.api.plugin
class SetFrameRangeLoader(load.LoaderPlugin):
@ -83,7 +84,7 @@ class SetFrameRangeWithHandlesLoader(load.LoaderPlugin):
animationEndTime=end)
class ImportMayaLoader(load.LoaderPlugin):
class ImportMayaLoader(openpype.hosts.maya.api.plugin.Loader):
"""Import action for Maya (unmanaged)
Warning:
@ -130,13 +131,14 @@ class ImportMayaLoader(load.LoaderPlugin):
if choice is False:
return
asset = context['asset']
custom_group_name, custom_namespace, options = \
self.get_custom_namespace_and_group(context, data,
"import_loader")
namespace = namespace or unique_namespace(
asset["name"] + "_",
prefix="_" if asset["name"][0].isdigit() else "",
suffix="_",
)
namespace = get_custom_namespace(custom_namespace)
if not options.get("attach_to_root", True):
custom_group_name = namespace
path = self.filepath_from_context(context)
with maintained_selection():
@ -145,8 +147,9 @@ class ImportMayaLoader(load.LoaderPlugin):
preserveReferences=True,
namespace=namespace,
returnNewNodes=True,
groupReference=True,
groupName="{}:{}".format(namespace, name))
groupReference=options.get("attach_to_root",
True),
groupName=custom_group_name)
if data.get("clean_import", False):
remove_attributes = ["cbId"]

View file

@ -9,8 +9,7 @@ from openpype.hosts.maya.api.lib import (
maintained_selection,
get_container_members,
parent_nodes,
create_rig_animation_instance,
get_reference_node
create_rig_animation_instance
)

View file

@ -19,8 +19,15 @@ class YetiRigLoader(openpype.hosts.maya.api.plugin.ReferenceLoader):
def process_reference(
self, context, name=None, namespace=None, options=None
):
group_name = options['group_name']
path = self.filepath_from_context(context)
attach_to_root = options.get("attach_to_root", True)
group_name = options["group_name"]
# no group shall be created
if not attach_to_root:
group_name = namespace
with lib.maintained_selection():
file_url = self.prepare_root_value(
path, context["project"]["name"]
@ -30,7 +37,7 @@ class YetiRigLoader(openpype.hosts.maya.api.plugin.ReferenceLoader):
namespace=namespace,
reference=True,
returnNewNodes=True,
groupReference=True,
groupReference=attach_to_root,
groupName=group_name
)

View file

@ -602,6 +602,13 @@ def _convert_maya_project_settings(ayon_settings, output):
.replace("{product[name]}", "{subset}")
)
if ayon_maya_load.get("import_loader"):
import_loader = ayon_maya_load["import_loader"]
import_loader["namespace"] = (
import_loader["namespace"]
.replace("{product[name]}", "{subset}")
)
output["maya"] = ayon_maya

View file

@ -1463,6 +1463,10 @@
"namespace": "{asset_name}_{subset}_##_",
"group_name": "_GRP",
"display_handle": true
},
"import_loader": {
"namespace": "{asset_name}_{subset}_##_",
"group_name": "_GRP"
}
},
"workfile_build": {

View file

@ -121,6 +121,28 @@
"label": "Display Handle On Load References"
}
]
},
{
"type": "dict",
"collapsible": true,
"key": "import_loader",
"label": "Import Loader",
"children": [
{
"type": "text",
"label": "Namespace",
"key": "namespace"
},
{
"type": "text",
"label": "Group name",
"key": "group_name"
},
{
"type": "label",
"label": "Here's a link to the doc where you can find explanations about customing the naming of referenced assets: https://openpype.io/docs/admin_hosts_maya#load-plugins"
}
]
}
]
}

View file

@ -45,6 +45,11 @@ class ReferenceLoaderModel(BaseSettingsModel):
display_handle: bool = Field(title="Display Handle On Load References")
class ImportLoaderModel(BaseSettingsModel):
namespace: str = Field(title="Namespace")
group_name: str = Field(title="Group name")
class LoadersModel(BaseSettingsModel):
colors: ColorsSetting = Field(
default_factory=ColorsSetting,
@ -55,6 +60,10 @@ class LoadersModel(BaseSettingsModel):
title="Reference Loader"
)
import_loader: ImportLoaderModel = Field(
default_factory=ImportLoaderModel,
title="Import Loader"
)
DEFAULT_LOADERS_SETTING = {
"colors": {

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring addon version."""
__version__ = "0.1.2"
__version__ = "0.1.3"