#!/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 = cmds.about(version=True) SYSTEM_OS = "win64" if cmds.about(os=True) == "Windows" else "linux" PYTHON_VERSION = sys.version_info def load_dna_plugin(): """加载DNA插件""" try: # 加载DNA校准插件 dna_plugin = os.path.join(data.PLUGIN_PATH, "dnacalib.py") if not cmds.pluginInfo(dna_plugin, query=True, loaded=True): cmds.loadPlugin(dna_plugin) # 加载嵌入式插件 embedded_plugin = os.path.join(data.PLUGIN_PATH, "embeddedRL4.mll") if not cmds.pluginInfo(embedded_plugin, query=True, loaded=True): cmds.loadPlugin(embedded_plugin) # 加载RBF插件 rbf_plugin = os.path.join(data.PLUGIN_PATH, f"MayaUERBFPlugin.mll") if not cmds.pluginInfo(rbf_plugin, query=True, loaded=True): cmds.loadPlugin(rbf_plugin) return True except Exception as e: cmds.warning(f"加载DNA插件失败: {str(e)}") return False def setup_dna_path(): """设置DNA模块路径""" # 获取DNA插件路径 if data.PLUGIN_PATH not in sys.path: sys.path.append(data.PLUGIN_PATH) # 获取PyDNA路径 if data.PYDNA_PATH not in sys.path: sys.path.append(data.PYDNA_PATH) # 添加DLL搜索路径 if SYSTEM_OS == "win64": os.environ["PATH"] = f"{data.PYDNA_PATH};{os.environ['PATH']}" # 设置路径并加载插件 setup_dna_path() plugin_loaded = load_dna_plugin() # 全局变量 dna = None dnacalib = None try: # 确保 PYDNA_PATH 在 sys.path 中 if data.PYDNA_PATH not in sys.path: sys.path.append(data.PYDNA_PATH) # 导入 DNA 模块 from dna import * import dnacalib except ImportError as e: cmds.warning(f"无法导入DNA模块: {str(e)}") cmds.warning(f"Python路径: {sys.path}") cmds.warning(f"插件路径: {data.PLUGIN_PATH}") cmds.warning(f"PyDNA路径: {data.PYDNA_PATH}") 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