MetaFusion/scripts/ui/rigging.py

203 lines
6.8 KiB
Python
Raw Normal View History

2025-02-06 04:00:17 +08:00
import os
import sys
import maya.cmds as cmds
from scripts.ui.widgets import (
BaseWidget, DNABrowser, DescriptionWidget, IconButton, SearchLineEdit
)
try:
from PySide import QtCore, QtGui, QtWidgets
print(f"从PySide加载Qt")
except ImportError as e:
try:
from PySide2 import QtCore, QtGui, QtWidgets
print(f"从PySide2加载Qt")
except ImportError as e:
try:
from PySide6 import QtCore, QtGui, QtWidgets
print(f"从PySide6加载Qt")
except ImportError as e:
print(f"PySide6加载失败: {str(e)}")
try:
from shiboken import wrapInstance
print(f"从shiboken加载wrapInstance")
except ImportError as e:
cmds.warning(f"shiboken加载失败: {str(e)}")
try:
from shiboken2 import wrapInstance
print(f"从shiboken2加载wrapInstance")
except ImportError as e:
cmds.warning(f"shiboken2加载失败: {str(e)}")
try:
from shiboken6 import wrapInstance
print(f"从shiboken6加载wrapInstance")
except ImportError as e:
cmds.warning(f"shiboken6加载失败: {str(e)}")
class RigTab(BaseWidget):
"""绑定标签页"""
def __init__(self, parent=None):
super(RigTab, self).__init__(parent)
def setup_ui(self):
layout = QtWidgets.QVBoxLayout(self)
# 创建滚动区域
scroll = QtWidgets.QScrollArea()
scroll.setWidgetResizable(True)
scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
layout.addWidget(scroll)
# 创建内容控件
content = QtWidgets.QWidget()
content_layout = QtWidgets.QVBoxLayout(content)
scroll.setWidget(content)
# DNA部分
dna_group = self.create_dna_group()
content_layout.addWidget(dna_group)
# 资产部分
asset_group = self.create_asset_group()
content_layout.addWidget(asset_group)
# 描述部分
self.description_widget = DescriptionWidget()
content_layout.addWidget(self.description_widget)
# 骨架工具
skeleton_tools = self.create_skeleton_tools()
content_layout.addWidget(skeleton_tools)
content_layout.addStretch()
def create_dna_group(self):
"""创建DNA组"""
group = QtWidgets.QGroupBox("DNA")
layout = QtWidgets.QVBoxLayout(group)
# DNA浏览器
self.dna_browser = DNABrowser()
self.dna_browser.dnaSelected.connect(self.on_dna_selected)
layout.addWidget(self.dna_browser)
# 导入导出按钮
btn_layout = QtWidgets.QHBoxLayout()
export_btn = IconButton("export.png", "导出设置")
export_btn.clicked.connect(self.export_settings)
btn_layout.addWidget(export_btn)
import_btn = IconButton("import.png", "导入设置")
import_btn.clicked.connect(self.import_settings)
btn_layout.addWidget(import_btn)
btn_layout.addStretch()
layout.addLayout(btn_layout)
return group
def create_asset_group(self):
"""创建资产组"""
group = QtWidgets.QGroupBox("资产")
layout = QtWidgets.QFormLayout(group)
# 项目路径
project_layout = QtWidgets.QHBoxLayout()
self.project_edit = QtWidgets.QLineEdit()
project_btn = IconButton("target.png", "选择项目路径")
project_btn.clicked.connect(self.browse_project)
project_layout.addWidget(self.project_edit)
project_layout.addWidget(project_btn)
layout.addRow("项目路径:", project_layout)
# 预设文件
preset_layout = QtWidgets.QHBoxLayout()
self.preset_edit = QtWidgets.QLineEdit()
preset_btn = IconButton("target.png", "选择预设文件")
preset_btn.clicked.connect(self.browse_preset)
preset_layout.addWidget(self.preset_edit)
preset_layout.addWidget(preset_btn)
layout.addRow("预设文件:", preset_layout)
# 数据分层
layer_layout = QtWidgets.QHBoxLayout()
self.layer_combo = QtWidgets.QComboBox()
self.layer_combo.addItems(["行为"])
self.override_check = QtWidgets.QCheckBox("覆盖表情")
layer_layout.addWidget(self.layer_combo)
layer_layout.addWidget(self.override_check)
layout.addRow("数据分层:", layer_layout)
return group
def create_skeleton_tools(self):
"""创建骨架工具"""
group = QtWidgets.QGroupBox("骨架工具")
layout = QtWidgets.QHBoxLayout(group)
# 清空选项
clear_btn = IconButton("delete.png", "清空选项")
clear_btn.clicked.connect(self.clear_options)
layout.addWidget(clear_btn)
# 导入骨架
import_btn = IconButton("HIKCharacterToolSkeleton.png", "导入骨架")
import_btn.clicked.connect(self.import_skeleton)
layout.addWidget(import_btn)
# 创建骨架
create_btn = IconButton("HIKcreateControlRig.png", "创建骨架")
create_btn.clicked.connect(self.create_skeleton)
layout.addWidget(create_btn)
layout.addStretch()
return group
# DNA功能回调
def on_dna_selected(self, dna_path):
"""DNA文件选中"""
from scripts.utils import rigging_utils
rigging_utils.load_dna(dna_path)
def export_settings(self):
"""导出设置"""
from scripts.utils import rigging_utils
rigging_utils.export_settings()
def import_settings(self):
"""导入设置"""
from scripts.utils import rigging_utils
rigging_utils.import_settings()
# 资产功能回调
def browse_project(self):
"""浏览项目路径"""
path = QtWidgets.QFileDialog.getExistingDirectory(
self, "选择项目路径", os.path.expanduser("~"))
if path:
self.project_edit.setText(path)
def browse_preset(self):
"""浏览预设文件"""
file_path, _ = QtWidgets.QFileDialog.getOpenFileName(
self, "选择预设文件", os.path.expanduser("~"),
"预设文件 (*.json *.preset)")
if file_path:
self.preset_edit.setText(file_path)
# 骨架工具回调
def clear_options(self):
"""清空选项"""
from scripts.utils import rigging_utils
rigging_utils.clear_options()
def import_skeleton(self):
"""导入骨架"""
from scripts.utils import rigging_utils
rigging_utils.import_skeleton()
def create_skeleton(self):
"""创建骨架"""
from scripts.utils import rigging_utils
rigging_utils.create_skeleton()