#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import maya.cmds as cmds import maya.mel as mel from config import data # 根据Maya和Python版本获取正确的DNA模块路径 MAYA_VERSION = data.MAYA_VERSION PYDNA_PATH = data.PYDNA_PATH PLUGIN_PATH = data.PLUGIN_PATH def load_dna_plugin(): """安全加载插件""" plugins = [ ("dnacalib.py", "dnacalib"), ("embeddedRL4.mll", "embeddedRL4"), ("MayaUERBFPlugin.mll", "MayaUERBFPlugin") ] for file_name, plugin_name in plugins: try: plugin_path = os.path.join(data.PLUGIN_PATH, file_name) if not os.path.exists(plugin_path): cmds.warning(f"⚠️ 插件文件缺失: {file_name}") continue if cmds.pluginInfo(plugin_name, q=True, loaded=True): print(f"✅ 已加载: {plugin_name}") continue cmds.loadPlugin(plugin_path) print(f"✔️ 成功加载: {plugin_name}") except Exception as e: cmds.warning(f"❌ 加载失败 {plugin_name}: {str(e)}") class DNAManager: def __init__(self): self.current_dna = None self.reader = None self.writer = None def is_ready(self): """检查DNA模块是否可用""" return dna is not None and dnacalib is not None def load_dna(self, file_path): """载入DNA文件""" if not self.is_ready(): cmds.warning("DNA模块未正确加载") return False try: # 创建DNA读取器 self.reader = dna.DNAReader() self.reader.read(file_path) self.current_dna = self.reader.get_dna() return True except Exception as e: cmds.warning(f"DNA文件加载失败: {str(e)}") return False def save_dna(self, file_path): """保存DNA文件""" try: if not self.current_dna: raise ValueError("没有DNA数据可保存") # 创建DNA写入器 self.writer = DNAWriter() self.writer.set_dna(self.current_dna) self.writer.write(file_path) return True except Exception as e: cmds.warning(f"DNA文件保存失败: {str(e)}") return False def calibrate_joints(self): """校准骨骼位置""" try: if not self.current_dna: raise ValueError("请先加载DNA文件") # 获取骨骼定义 joints = self.current_dna.get_joints() # 校准每个骨骼 for joint in joints: # 获取骨骼名称和位置 joint_name = joint.get_name() neutral_position = joint.get_neutral_position() # 如果Maya场景中存在该骨骼 if cmds.objExists(joint_name): # 设置骨骼位置 cmds.xform(joint_name, worldSpace=True, translation=neutral_position) return True except Exception as e: cmds.warning(f"骨骼校准失败: {str(e)}") return False def export_fbx(self, file_path): """导出FBX文件""" try: # 选择所有需要导出的对象 all_objects = self.get_export_objects() cmds.select(all_objects) # 设置FBX导出选项 mel.eval('FBXExportInputConnections -v true') mel.eval('FBXExportIncludeChildren -v true') # 导出FBX cmds.file(file_path, force=True, options="v=0", type="FBX export", preserveReferences=True, exportSelected=True) return True except Exception as e: cmds.warning(f"FBX导出失败: {str(e)}") return False def get_export_objects(self): """获取需要导出的对象列表""" # 获取模型、骨骼等对象 objects = [] if self.current_dna: # 添加骨骼 joints = self.current_dna.get_joints() for joint in joints: joint_name = joint.get_name() if cmds.objExists(joint_name): objects.append(joint_name) # 添加蒙皮模型 meshes = self.current_dna.get_meshes() for mesh in meshes: mesh_name = mesh.get_name() if cmds.objExists(mesh_name): objects.append(mesh_name) return objects def import_settings(self, file_path): """导入 DNA 设置""" try: if not self.is_ready(): raise ImportError("DNA模块未正确加载") # TODO: 实现导入设置逻辑 return True except Exception as e: cmds.warning(f"导入设置失败: {str(e)}") return False def export_settings(self, file_path): """导出 DNA 设置""" try: if not self.is_ready(): raise ImportError("DNA模块未正确加载") # TODO: 实现导出设置逻辑 return True except Exception as e: cmds.warning(f"导出设置失败: {str(e)}") return False