This commit is contained in:
2025-11-24 21:05:22 +08:00
parent e76152945e
commit e4c713035b
12 changed files with 585 additions and 414 deletions

View File

@@ -39,8 +39,50 @@ python("import animation_tools.mgpicker; animation_tools.mgpicker.start()");
## 插件说明
- 插件文件位于 `MGPicker_Program/Plug-ins/` 目录
- Maya 2023 使用 `MGPicker_2023x64.mll`
- 插件会在启动时自动加载
- 支持 Maya 2017-2026 版本
- 插件会在启动时自动检测 Maya 版本并加载对应的插件
## 🔧 版本兼容性
### 支持的 Maya 版本
- **Maya 2017** - MGPicker_2017x64.mll
- **Maya 2018** - MGPicker_2018x64.mll
- **Maya 2019** - MGPicker_2019x64.mll
- **Maya 2020** - MGPicker_2020x64.mll
- **Maya 2022** - MGPicker_2022x64.mll
- **Maya 2023** - MGPicker_2023x64.mll
- **Maya 2024** - MGPicker_2024x64.mll
- **Maya 2025** - MGPicker_2025x64.mll
- **Maya 2026** - MGPicker_2026x64.mll
### 自动版本匹配
启动器会自动检测当前 Maya 版本并加载对应的插件:
1. **完全匹配** - 优先使用与 Maya 版本完全匹配的插件
2. **向下兼容** - 如果没有完全匹配,使用小于等于当前版本的最高版本插件
3. **兜底策略** - 如果当前版本比所有可用插件都旧,使用最旧的可用插件
### 使用示例
```python
# 自动检测版本并启动(动画师模式)
import animation_tools.mgpicker
animation_tools.mgpicker.start()
# 启动设计师模式
animation_tools.mgpicker.start(mode=0)
# 仅加载插件
animation_tools.mgpicker.load_plugin()
```
## 💡 功能特性
- **动画选择器** - 快速选择和操作角色控制器
- **自定义界面** - 创建自定义的 Picker 界面
- **命令按钮** - 绑定 MEL/Python 命令到按钮
- **姿势管理** - 保存和加载角色姿势
- **镜像功能** - 镜像选择和姿势
- **多版本支持** - 自动适配不同 Maya 版本
## 原始信息

View File

@@ -11,6 +11,78 @@ 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__))
@@ -18,25 +90,52 @@ def get_mgpicker_path():
def load_plugin():
"""Load MGPicker plugin"""
plugin_name = "MGPicker_2023x64"
"""
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
if cmds.pluginInfo(plugin_name, query=True, loaded=True):
print(f"MGPicker plugin already loaded: {plugin_name}")
return True
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 from mgpicker module
mgpicker_path = get_mgpicker_path()
plugin_path = os.path.join(mgpicker_path, "MGPicker_Program", "Plug-ins", f"{plugin_name}.mll")
# 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: {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