Files
Nexus/2023/scripts/animation_tools/dwpicker/namespace.py
2025-11-23 23:31:18 +08:00

72 lines
2.1 KiB
Python

from contextlib import contextmanager
from maya import cmds
def detect_picker_namespace(shapes):
targets = {target for shape in shapes for target in shape.targets()}
namespaces = {ns for ns in [node_namespace(t) for t in targets] if ns}
if len(namespaces) != 1:
return None
return list(namespaces)[0]
def pickers_namespaces(pickers):
targets = {
t for p in pickers for s in p.document.shapes for t in s.targets()}
namespaces = {ns for ns in [node_namespace(t) for t in targets] if ns}
return sorted(list(namespaces))
def node_namespace(node):
basename = node.split("|")[-1]
if ":" not in node:
return None
return basename.split(":")[0]
def node_full_namespace(node):
basename = node.split('|')[-1]
return (basename.rsplit(':', 1)[:-1] or [None])[-1]
@contextmanager
def maya_namespace(
namespace='', create_if_missing=True, restore_current_namespace=True):
"""Context manager to temporarily set a namespace"""
initial_namespace = ':' + cmds.namespaceInfo(currentNamespace=True)
if not namespace.startswith(':'):
namespace = ':' + namespace
try:
if not cmds.namespace(absoluteName=True, exists=namespace):
if create_if_missing:
cmds.namespace(setNamespace=':')
namespace = cmds.namespace(addNamespace=namespace)
else:
cmds.namespace(initial_namespace)
raise ValueError(namespace + " doesn't exist.")
cmds.namespace(setNamespace=namespace)
yield namespace
finally:
if restore_current_namespace:
cmds.namespace(setNamespace=initial_namespace)
def switch_namespace(name, namespace):
basename = name.split("|")[-1]
name = basename if ":" not in basename else basename.split(":")[-1]
if not namespace:
return name
return namespace + ":" + name
def selected_namespace():
selection = cmds.ls(selection=True)
if not selection:
return ":"
node = selection[0]
basename = node.split("|")[-1]
if ":" not in node:
return None
return basename.split(":")[0]