177 lines
5.6 KiB
Python
177 lines
5.6 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
MG-Picker Studio Module
|
|
Animation picker tool for Maya
|
|
"""
|
|
|
|
import os
|
|
import maya.cmds as cmds
|
|
import maya.mel as mel
|
|
|
|
|
|
def get_maya_version():
|
|
"""
|
|
获取当前 Maya 版本号
|
|
返回格式: '2023', '2024' 等
|
|
"""
|
|
try:
|
|
maya_version = cmds.about(version=True)
|
|
# Maya 版本格式可能是 "2023" 或 "2023.1" 等,取主版本号
|
|
return maya_version.split('.')[0]
|
|
except Exception as e:
|
|
print(f"Failed to get Maya version: {e}")
|
|
return None
|
|
|
|
|
|
def find_compatible_plugin(plugin_dir, maya_version):
|
|
"""
|
|
查找兼容的 MGPicker 插件
|
|
优先使用完全匹配的版本,如果没有则向下查找最接近的版本
|
|
|
|
Args:
|
|
plugin_dir: 插件目录路径
|
|
maya_version: Maya 版本号字符串,如 '2023'
|
|
|
|
Returns:
|
|
插件名称(不含扩展名),如果找不到则返回 None
|
|
"""
|
|
if not maya_version:
|
|
return None
|
|
|
|
try:
|
|
maya_ver_int = int(maya_version)
|
|
except ValueError:
|
|
print(f"Invalid Maya version format: {maya_version}")
|
|
return None
|
|
|
|
# 列出所有可用的插件版本
|
|
available_versions = []
|
|
if os.path.exists(plugin_dir):
|
|
for filename in os.listdir(plugin_dir):
|
|
if filename.startswith("MGPicker_") and filename.endswith(".mll"):
|
|
# 提取版本号,例如从 "MGPicker_2023x64.mll" 提取 "2023"
|
|
try:
|
|
version_str = filename.replace("MGPicker_", "").replace("x64.mll", "")
|
|
ver_int = int(version_str)
|
|
available_versions.append((ver_int, filename.replace(".mll", "")))
|
|
except ValueError:
|
|
continue
|
|
|
|
if not available_versions:
|
|
return None
|
|
|
|
# 按版本号排序
|
|
available_versions.sort(reverse=True)
|
|
|
|
# 首先尝试完全匹配
|
|
for ver, plugin_name in available_versions:
|
|
if ver == maya_ver_int:
|
|
print(f"Found exact match plugin for Maya {maya_version}: {plugin_name}")
|
|
return plugin_name
|
|
|
|
# 如果没有完全匹配,使用小于等于当前版本的最高版本
|
|
for ver, plugin_name in available_versions:
|
|
if ver <= maya_ver_int:
|
|
print(f"Using compatible plugin for Maya {maya_version}: {plugin_name} (version {ver})")
|
|
return plugin_name
|
|
|
|
# 如果当前版本比所有可用版本都旧,使用最旧的版本
|
|
oldest_ver, oldest_plugin = available_versions[-1]
|
|
print(f"Warning: Maya {maya_version} is older than available plugins. Using oldest: {oldest_plugin} (version {oldest_ver})")
|
|
return oldest_plugin
|
|
|
|
|
|
def get_mgpicker_path():
|
|
"""Get MG-Picker Studio installation path"""
|
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
return current_dir.replace("\\", "/")
|
|
|
|
|
|
def load_plugin():
|
|
"""
|
|
Load MGPicker plugin
|
|
自动检测 Maya 版本并加载对应的插件
|
|
"""
|
|
# 获取当前 Maya 版本
|
|
maya_version = get_maya_version()
|
|
if not maya_version:
|
|
print("Warning: Could not determine Maya version")
|
|
return False
|
|
|
|
print(f"Detected Maya version: {maya_version}")
|
|
|
|
# 查找兼容的插件
|
|
mgpicker_path = get_mgpicker_path()
|
|
plugin_dir = os.path.join(mgpicker_path, "MGPicker_Program", "Plug-ins")
|
|
plugin_name = find_compatible_plugin(plugin_dir, maya_version)
|
|
|
|
if not plugin_name:
|
|
print(f"Error: No compatible MGPicker plugin found for Maya {maya_version}")
|
|
return False
|
|
|
|
# Check if plugin is already loaded
|
|
try:
|
|
if cmds.pluginInfo(plugin_name, query=True, loaded=True):
|
|
print(f"MGPicker plugin already loaded: {plugin_name}")
|
|
return True
|
|
except RuntimeError:
|
|
# Plugin not registered yet, will try to load
|
|
pass
|
|
|
|
# Get the plugin path
|
|
plugin_path = os.path.join(plugin_dir, f"{plugin_name}.mll")
|
|
plugin_path = plugin_path.replace("\\", "/")
|
|
|
|
if not os.path.exists(plugin_path):
|
|
print(f"Error: Plugin file not found: {plugin_path}")
|
|
return False
|
|
|
|
try:
|
|
cmds.loadPlugin(plugin_path)
|
|
print(f"MGPicker plugin loaded successfully: {plugin_path}")
|
|
return True
|
|
except Exception as e:
|
|
print(f"Failed to load MGPicker plugin: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
|
|
def start(mode=1):
|
|
"""
|
|
Start MG-Picker Studio
|
|
|
|
Args:
|
|
mode (int): 0 for designer mode, 1 for animator mode (default)
|
|
"""
|
|
# Load plugin first
|
|
if not load_plugin():
|
|
cmds.warning("Failed to load MGPicker plugin")
|
|
return
|
|
|
|
# Get MGPicker path
|
|
mgpicker_path = get_mgpicker_path()
|
|
program_path = os.path.join(mgpicker_path, "MGPicker_Program")
|
|
|
|
# Set global variables
|
|
mel.eval(f'global string $MGPicker_ProgramPath = "{mgpicker_path}/"')
|
|
mel.eval('global string $MGPicker_ProgramFolder = "MGPicker_Program"')
|
|
mel.eval('global string $MGPicker_ScriptEntry = "MG_PickerStudio"')
|
|
|
|
# Source the main MEL script
|
|
main_mel = os.path.join(program_path, "MGPicker_WrittenByMiguel.mel").replace("\\", "/")
|
|
|
|
try:
|
|
mel.eval(f'source "{main_mel}"')
|
|
# Open MGPicker window with mode parameter
|
|
# mode 0: designer mode, mode 1: animator mode
|
|
mel.eval(f'MG_PickerStudio {mode}')
|
|
print(f"MG-Picker Studio started in {'designer' if mode == 0 else 'animator'} mode")
|
|
except Exception as e:
|
|
cmds.warning(f"Failed to start MG-Picker Studio: {e}")
|
|
|
|
|
|
__all__ = ['start', 'load_plugin']
|