Files
Nexus/2023/scripts/rigging_tools/ngskintools2/launcher.py
2025-11-24 21:05:22 +08:00

159 lines
5.6 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
ngSkinTools2 启动器
用于从工具架快速启动 ngSkinTools2
"""
import sys
import os
def get_maya_version():
"""
获取当前 Maya 版本号
返回格式: '2023', '2024'
"""
try:
from maya import cmds
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_dir(base_dir, maya_version):
"""
查找兼容的插件目录
优先使用完全匹配的版本,如果没有则向下查找最接近的版本
Args:
base_dir: 插件基础目录 (plug-ins/)
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(base_dir):
for item in os.listdir(base_dir):
item_path = os.path.join(base_dir, item)
if os.path.isdir(item_path):
try:
ver_int = int(item)
available_versions.append((ver_int, item_path))
except ValueError:
continue
if not available_versions:
return None
# 按版本号排序
available_versions.sort(reverse=True)
# 首先尝试完全匹配
for ver, path in available_versions:
if ver == maya_ver_int:
print(f"Found exact match plugin for Maya {maya_version}: {path}")
return path
# 如果没有完全匹配,使用小于等于当前版本的最高版本
for ver, path in available_versions:
if ver <= maya_ver_int:
print(f"Using compatible plugin for Maya {maya_version}: {path} (version {ver})")
return path
# 如果当前版本比所有可用版本都旧,使用最旧的版本
oldest_ver, oldest_path = available_versions[-1]
print(f"Warning: Maya {maya_version} is older than available plugins. Using oldest: {oldest_path} (version {oldest_ver})")
return oldest_path
def LaunchNgSkinTools():
"""
启动 ngSkinTools2 主界面
自动检测 Maya 版本并加载对应的插件
"""
try:
from maya import cmds, mel
# 获取当前 Maya 版本
maya_version = get_maya_version()
if not maya_version:
print("Warning: Could not determine Maya version, will try to continue anyway")
else:
print(f"Detected Maya version: {maya_version}")
# 将当前目录添加到 Python 路径,并使用别名
# 这样 ngSkinTools2 内部的 "from ngSkinTools2.ui" 就能找到模块
current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
# 添加父目录到路径
if parent_dir not in sys.path:
sys.path.insert(0, parent_dir)
# 添加当前目录到路径,作为 ngSkinTools2 模块
if current_dir not in sys.path:
sys.path.insert(0, current_dir)
# 在 sys.modules 中创建别名,让 ngSkinTools2 指向 ngskintools2
import rigging_tools.ngskintools2 as ngskintools2_module
sys.modules['ngSkinTools2'] = ngskintools2_module
# 查找并添加插件路径
# 根据 Maya 版本自动选择对应的插件目录
plugin_base_dir = os.path.join(current_dir, 'plug-ins')
plugin_dir = find_compatible_plugin_dir(plugin_base_dir, maya_version)
if plugin_dir and os.path.exists(plugin_dir):
# 添加插件路径
current_plugin_path = os.environ.get('MAYA_PLUG_IN_PATH', '')
if plugin_dir not in current_plugin_path:
os.environ['MAYA_PLUG_IN_PATH'] = plugin_dir + os.pathsep + current_plugin_path
# 加载插件
try:
# 检查插件是否已加载
if not cmds.pluginInfo('ngSkinTools2', query=True, loaded=True):
cmds.loadPlugin(os.path.join(plugin_dir, 'ngSkinTools2.mll'))
print(f"ngSkinTools2 plugin loaded successfully from {plugin_dir}")
else:
print(f"ngSkinTools2 plugin already loaded")
except RuntimeError:
# 插件不存在,尝试加载
try:
cmds.loadPlugin(os.path.join(plugin_dir, 'ngSkinTools2.mll'))
print(f"ngSkinTools2 plugin loaded successfully from {plugin_dir}")
except Exception as plugin_error:
print(f"Warning: Could not load ngSkinTools2 plugin: {plugin_error}")
except Exception as plugin_error:
print(f"Warning: Could not load ngSkinTools2 plugin: {plugin_error}")
else:
print(f"Warning: Plugin directory not found: {plugin_dir}")
# 现在可以导入并打开 UI
from rigging_tools.ngskintools2 import open_ui
open_ui()
print("ngSkinTools2 UI opened successfully")
except Exception as e:
print(f"Failed to open ngSkinTools2: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
LaunchNgSkinTools()