#!/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()