This commit is contained in:
Jeffreytsai1004 2025-02-05 02:10:47 +08:00
parent f9a39fc84a
commit 8d9898dfb7
3 changed files with 153 additions and 122 deletions

View File

@ -8,20 +8,20 @@ import maya.cmds as cmds
def Qt():
try:
from PySide2 import QtCore, QtGui, QtWidgets
print("成功加载PySide2")
print("加载PySide2")
return QtCore, QtGui, QtWidgets
except ImportError as e:
print(f"PySide2加载失败: {str(e)}")
try:
from PySide import QtCore, QtGui
QtWidgets = QtGui
print("成功加载PySide")
print("加载PySide")
return QtCore, QtGui, QtWidgets
except ImportError as e:
cmds.warning(f"PySide加载失败: {str(e)}")
try:
from PySide6 import QtCore, QtGui, QtWidgets
print("成功加载PySide6")
print("加载PySide6")
return QtCore, QtGui, QtWidgets
except ImportError as e:
cmds.warning(f"PySide加载失败: {str(e)}")

View File

@ -36,54 +36,124 @@ BUILDER_PATH = data.BUILDER_PATH
main_window = None
class MetaFusionWindow(QtWidgets.QMainWindow):
class ModelTab(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
layout = QtWidgets.QVBoxLayout(self)
# LOD导航栏
self.lod_tabs = QtWidgets.QTabWidget()
for i in range(1, 7):
tab = QtWidgets.QWidget()
self.lod_tabs.addTab(tab, f"LOD{i-1}")
layout.addWidget(self.lod_tabs)
# 模型操作工具栏
tool_bar = QtWidgets.QHBoxLayout()
self.add_button(tool_bar, "导入模型", "import.png", self.import_model)
self.add_button(tool_bar, "导出模型", "export.png", self.export_model)
layout.addLayout(tool_bar)
def add_button(self, layout, text, icon, callback):
btn = QtWidgets.QPushButton(QtGui.QIcon(os.path.join(data.ICONS_PATH, icon)), text)
btn.clicked.connect(callback)
layout.addWidget(btn)
def import_model(self): pass
def export_model(self): pass
class RigTab(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
# 左侧控制器列表
left_panel = QtWidgets.QWidget()
left_layout = QtWidgets.QVBoxLayout(left_panel)
self.controller_list = QtWidgets.QListWidget()
left_layout.addWidget(self.controller_list)
# 右侧视口区域
right_panel = QtWidgets.QWidget()
right_layout = QtWidgets.QVBoxLayout(right_panel)
self.viewport_label = QtWidgets.QLabel("3D视口区域")
right_layout.addWidget(self.viewport_label)
splitter.addWidget(left_panel)
splitter.addWidget(right_panel)
main_layout = QtWidgets.QHBoxLayout(self)
main_layout.addWidget(splitter)
class AdjustTab(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(QtWidgets.QLabel("调整功能开发中..."))
class DefineTab(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(QtWidgets.QLabel("定义功能开发中..."))
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
try:
super(MetaFusionWindow, self).__init__(parent)
self.setWindowTitle("MetaFusion")
self.resize(800, 600)
super(MainWindow, self).__init__(parent)
self.setup_core_components()
# 设置窗口标志
if parent is None:
# 独立窗口模式
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
else:
# 嵌入模式
self.setWindowFlags(QtCore.Qt.Widget)
def setup_core_components(self):
"""初始化核心组件"""
self.setup_paths()
self.init_ui()
self.setup_connections()
# 加载样式表
self.load_stylesheet()
def setup_paths(self):
"""配置系统路径"""
# 添加插件路径
if data.PLUGIN_PATH not in sys.path:
sys.path.insert(0, data.PLUGIN_PATH)
# 创建UI
self.setup_ui()
except Exception as e:
cmds.warning(f"窗口初始化失败: {str(e)}")
self.safe_shutdown()
# 添加PyDNA二进制路径到环境变量
pydna_bin = os.path.join(data.PYDNA_PATH, "bin")
os.environ["PATH"] = f"{pydna_bin}{os.pathsep}{os.environ['PATH']}"
def load_stylesheet(self):
"""加载QSS样式表"""
style_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resources", "styles", "style.qss")
if os.path.exists(style_file):
with open(style_file, 'r', encoding='utf-8') as f:
self.setStyleSheet(f.read())
def init_ui(self):
"""初始化UI框架"""
self.setWindowTitle(f"{data.TOOL_NAME} {data.TOOL_VERSION}")
self.setMinimumSize(1200, 800)
def setup_ui(self):
"""设置UI结构"""
# 创建中心部件
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
# 主窗口布局
main_widget = QtWidgets.QWidget()
self.setCentralWidget(main_widget)
main_layout = QtWidgets.QVBoxLayout(main_widget)
# 创建主布局
main_layout = QtWidgets.QVBoxLayout(central_widget)
# 创建菜单栏
# 创建核心组件
self.create_menu_bar()
self.create_toolbar()
self.create_tab_widget()
# 创建工具栏
self.create_tool_bar()
# 加载样式
self.load_styles()
# 创建标签页
self.create_tabs()
def load_styles(self):
"""加载样式表"""
style_path = os.path.join(data.STYLES_PATH, "style.qss")
if os.path.exists(style_path):
with open(style_path, "r", encoding="utf-8") as f:
self.setStyleSheet(f.read())
def create_menu_bar(self):
"""创建菜单栏"""
@ -91,8 +161,10 @@ class MetaFusionWindow(QtWidgets.QMainWindow):
# 文件菜单
file_menu = menubar.addMenu("文件")
self.add_menu_action(file_menu, "打开DNA", "open.png", self.on_open_dna)
self.add_menu_action(file_menu, "保存DNA", "save.png", self.on_save_dna)
self.add_menu_action(file_menu, "打开DNA",
lambda: self.load_dna(), "open.png")
self.add_menu_action(file_menu, "保存DNA",
lambda: self.save_dna(), "save.png")
self.add_menu_action(file_menu, "加载当前项目的DNA", "open.png", self.on_load_project_dna)
self.add_menu_action(file_menu, "修改混合目标名称", "rename.png", self.on_rename_blend_target)
self.add_menu_action(file_menu, "重置混合目标名称", "resetname.png", self.on_reset_blend_target)
@ -141,14 +213,15 @@ class MetaFusionWindow(QtWidgets.QMainWindow):
self.add_menu_action(help_menu, "帮助文档", "help.png", self.show_help_document)
self.add_menu_action(help_menu, "关于", "warning.png", self.show_about_dialog)
def add_menu_action(self, menu, text, icon, callback):
def add_menu_action(self, menu, text, callback, icon=None):
"""通用菜单项添加方法"""
action = QtWidgets.QAction(QtGui.QIcon(os.path.join(ICONS_PATH, icon)), text, self)
action = QtWidgets.QAction(text, self)
if icon:
action.setIcon(QtGui.QIcon(os.path.join(data.ICONS_PATH, icon)))
action.triggered.connect(callback)
menu.addAction(action)
return action
def create_tool_bar(self):
def create_toolbar(self):
"""创建工具栏"""
toolbar = self.addToolBar("主工具栏")
toolbar.setMovable(False)
@ -157,28 +230,32 @@ class MetaFusionWindow(QtWidgets.QMainWindow):
toolbar.addAction(QtGui.QIcon(os.path.join(ICONS_PATH, "save.png")), "保存DNA")
toolbar.addAction(QtGui.QIcon(os.path.join(ICONS_PATH, "open.png")), "加载当前项目DNA")
def create_tabs(self):
"""创建标签页"""
def create_tab_widget(self):
"""创建标签页"""
self.tab_widget = QtWidgets.QTabWidget()
self.centralWidget().layout().addWidget(self.tab_widget)
# 创建四个主要标签页
self.model_tab = QtWidgets.QWidget()
self.rig_tab = QtWidgets.QWidget()
self.adjust_tab = QtWidgets.QWidget()
self.define_tab = QtWidgets.QWidget()
# 初始化各标签页
self.model_tab = ModelTab()
self.rig_tab = RigTab()
self.adjust_tab = AdjustTab()
self.define_tab = DefineTab()
# 添加标签页到标签页控件
# 添加标签页
self.tab_widget.addTab(self.model_tab, "模型")
self.tab_widget.addTab(self.rig_tab, "绑定")
self.tab_widget.addTab(self.adjust_tab, "调整")
self.tab_widget.addTab(self.define_tab, "定义")
# 设置各个标签页的内容
self.setup_model_tab()
self.setup_rig_tab()
self.setup_adjust_tab()
self.setup_define_tab()
def setup_connections(self):
"""建立信号连接"""
# 示例:连接标签页切换信号
self.tab_widget.currentChanged.connect(self.on_tab_changed)
def on_tab_changed(self, index):
"""标签页切换回调"""
current_tab = self.tab_widget.widget(index)
print(f"切换到标签页: {current_tab.objectName()}")
def setup_model_tab(self):
"""设置模型标签页内容"""
@ -411,12 +488,12 @@ def dock_to_maya():
"""将窗口嵌入到 Maya 的 Dock 面板"""
try:
# 先清理可能存在的旧控件
if cmds.workspaceControl("MetaFusionDock", exists=True):
cmds.deleteUI("MetaFusionDock")
if cmds.workspaceControl(TOOL_WSCL_NAME, exists=True):
cmds.deleteUI(TOOL_WSCL_NAME)
# 创建新的Dock控件
dock_control = cmds.workspaceControl(
"MetaFusionDock",
TOOL_WSCL_NAME,
label=TOOL_NAME,
tabToControl=["AttributeEditor", -1],
initialWidth=1400,
@ -433,7 +510,7 @@ def dock_to_maya():
# 获取Maya主窗口并创建实例
maya_main_window = get_maya_window()
main_window = MetaFusionWindow(parent=maya_main_window)
main_window = MainWindow(parent=maya_main_window)
# 嵌入到Dock
maya_dock_widget = wrapInstance(int(maya_dock_ptr), QtWidgets.QWidget)
@ -454,7 +531,7 @@ def show():
# 清理旧实例
if main_window:
main_window.close()
cmds.deleteUI("MetaFusionDock")
cmds.deleteUI(TOOL_WSCL_NAME)
except:
pass
@ -464,7 +541,7 @@ def show():
# 备用方案:独立窗口模式
if not main_window:
cmds.warning("Dock 模式失败,使用独立窗口模式")
main_window = MetaFusionWindow()
main_window = MainWindow()
main_window.show()
return main_window

View File

@ -8,9 +8,9 @@ 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
MAYA_VERSION = data.MAYA_VERSION
PYDNA_PATH = data.PYDNA_PATH
PLUGIN_PATH = data.PLUGIN_PATH
def load_dna_plugin():
"""安全加载插件"""
@ -36,53 +36,7 @@ def load_dna_plugin():
except Exception as e:
cmds.warning(f"❌ 加载失败 {plugin_name}: {str(e)}")
# 不要退出,继续尝试加载其他插件
def setup_dna_path():
"""增强路径设置"""
try:
# 添加二进制路径到系统PATH
bin_path = os.path.join(data.PYDNA_PATH, "bin")
os.environ['PATH'] = f"{bin_path}{os.pathsep}{os.environ['PATH']}"
print(f"已添加二进制路径: {bin_path}")
# 确保Python能搜索到必要路径
required_paths = [
data.PLUGIN_PATH,
data.PYDNA_PATH,
os.path.join(data.PYDNA_PATH, "bin")
]
for path in required_paths:
if path not in sys.path:
sys.path.insert(0, path)
print(f"已添加路径: {path}")
except Exception as e:
cmds.warning(f"路径设置失败: {str(e)}")
# 设置路径并加载插件
setup_dna_path()
plugin_loaded = load_dna_plugin()
# 全局变量
dna = None
dnacalib = None
try:
# 在导入前添加二进制模块路径
PYBIN_PATH = os.path.join(data.PYDNA_PATH, "bin")
if PYBIN_PATH not in sys.path:
sys.path.insert(0, PYBIN_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):