2025-02-06 04:46:41 +08:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
#===================================== 1. Module Imports =====================================
|
|
|
|
import maya.cmds as cmds
|
|
|
|
import maya.mel as mel
|
|
|
|
import sys
|
2025-02-06 04:00:17 +08:00
|
|
|
import os
|
|
|
|
|
2025-02-06 04:46:41 +08:00
|
|
|
from scripts.ui.widgets import ( BaseWidget, IconButton, SearchLineEdit)
|
|
|
|
|
|
|
|
try:
|
|
|
|
from PySide2 import QtCore, QtGui, QtWidgets
|
|
|
|
from shiboken2 import wrapInstance
|
|
|
|
print("从PySide2加载Qt和shiboken2")
|
|
|
|
except ImportError:
|
|
|
|
try:
|
|
|
|
from PySide6 import QtCore, QtGui, QtWidgets
|
|
|
|
from shiboken6 import wrapInstance
|
|
|
|
print("从PySide6加载Qt和shiboken6")
|
|
|
|
except ImportError:
|
|
|
|
try:
|
|
|
|
from PySide import QtCore, QtGui, QtWidgets
|
|
|
|
from shiboken import wrapInstance
|
|
|
|
print("从PySide加载Qt和shiboken")
|
|
|
|
except ImportError as e:
|
|
|
|
print(f"Qt加载失败: {str(e)}")
|
|
|
|
QtCore = QtGui = QtWidgets = None
|
|
|
|
wrapInstance = None
|
|
|
|
|
|
|
|
#===================================== 2. Define Tab Class =====================================
|
2025-02-06 04:00:17 +08:00
|
|
|
class DefineTab(BaseWidget):
|
|
|
|
"""定义标签页"""
|
|
|
|
def __init__(self, parent=None):
|
|
|
|
super(DefineTab, 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_definition()
|
|
|
|
content_layout.addWidget(dna_group)
|
|
|
|
|
|
|
|
# 骨骼定义部分
|
|
|
|
joint_group = self.create_joint_definition()
|
|
|
|
content_layout.addWidget(joint_group)
|
|
|
|
|
|
|
|
# BlendShape定义部分
|
|
|
|
bs_group = self.create_blendshape_definition()
|
|
|
|
content_layout.addWidget(bs_group)
|
|
|
|
|
|
|
|
content_layout.addStretch()
|
|
|
|
|
|
|
|
def create_dna_definition(self):
|
|
|
|
"""创建DNA定义组"""
|
|
|
|
group = QtWidgets.QGroupBox("DNA定义")
|
|
|
|
layout = QtWidgets.QVBoxLayout(group)
|
|
|
|
|
|
|
|
# DNA文件选择
|
|
|
|
file_layout = QtWidgets.QHBoxLayout()
|
|
|
|
file_layout.addWidget(QtWidgets.QLabel("DNA文件:"))
|
|
|
|
self.dna_file_input = QtWidgets.QLineEdit()
|
|
|
|
file_layout.addWidget(self.dna_file_input)
|
|
|
|
|
|
|
|
browse_btn = IconButton("target.png", "浏览DNA文件")
|
|
|
|
browse_btn.clicked.connect(self.browse_dna_file)
|
|
|
|
file_layout.addWidget(browse_btn)
|
|
|
|
|
|
|
|
layout.addLayout(file_layout)
|
|
|
|
|
|
|
|
# DNA预览
|
|
|
|
preview_group = QtWidgets.QGroupBox("DNA预览")
|
|
|
|
preview_layout = QtWidgets.QVBoxLayout(preview_group)
|
|
|
|
self.dna_preview = QtWidgets.QTextEdit()
|
|
|
|
self.dna_preview.setReadOnly(True)
|
|
|
|
preview_layout.addWidget(self.dna_preview)
|
|
|
|
|
|
|
|
layout.addWidget(preview_group)
|
|
|
|
|
|
|
|
return group
|
|
|
|
|
|
|
|
def create_joint_definition(self):
|
|
|
|
"""创建骨骼定义组"""
|
|
|
|
group = QtWidgets.QGroupBox("骨骼定义")
|
|
|
|
layout = QtWidgets.QVBoxLayout(group)
|
|
|
|
|
|
|
|
# 骨骼列表
|
|
|
|
self.joint_list = QtWidgets.QTreeWidget()
|
|
|
|
self.joint_list.setHeaderLabels(["骨骼名称", "位置", "旋转", "缩放"])
|
|
|
|
layout.addWidget(self.joint_list)
|
|
|
|
|
|
|
|
# 骨骼工具栏
|
|
|
|
tools_layout = QtWidgets.QHBoxLayout()
|
|
|
|
|
|
|
|
# 添加骨骼
|
|
|
|
add_btn = IconButton("joint.png", "添加骨骼")
|
|
|
|
add_btn.clicked.connect(self.add_joint)
|
|
|
|
tools_layout.addWidget(add_btn)
|
|
|
|
|
|
|
|
# 删除骨骼
|
|
|
|
del_btn = IconButton("delete.png", "删除骨骼")
|
|
|
|
del_btn.clicked.connect(self.delete_joint)
|
|
|
|
tools_layout.addWidget(del_btn)
|
|
|
|
|
|
|
|
# 修改骨骼
|
|
|
|
mod_btn = IconButton("modify.png", "修改骨骼")
|
|
|
|
mod_btn.clicked.connect(self.modify_joint)
|
|
|
|
tools_layout.addWidget(mod_btn)
|
|
|
|
|
|
|
|
tools_layout.addStretch()
|
|
|
|
layout.addLayout(tools_layout)
|
|
|
|
|
|
|
|
return group
|
|
|
|
|
|
|
|
def create_blendshape_definition(self):
|
|
|
|
"""创建BlendShape定义组"""
|
|
|
|
group = QtWidgets.QGroupBox("BlendShape定义")
|
|
|
|
layout = QtWidgets.QVBoxLayout(group)
|
|
|
|
|
|
|
|
# BlendShape列表
|
|
|
|
self.bs_list = QtWidgets.QTreeWidget()
|
|
|
|
self.bs_list.setHeaderLabels(["名称", "目标", "权重"])
|
|
|
|
layout.addWidget(self.bs_list)
|
|
|
|
|
|
|
|
# BlendShape工具栏
|
|
|
|
tools_layout = QtWidgets.QHBoxLayout()
|
|
|
|
|
|
|
|
# 添加BlendShape
|
|
|
|
add_btn = IconButton("blendShape.png", "添加BlendShape")
|
|
|
|
add_btn.clicked.connect(self.add_blendshape)
|
|
|
|
tools_layout.addWidget(add_btn)
|
|
|
|
|
|
|
|
# 删除BlendShape
|
|
|
|
del_btn = IconButton("delete.png", "删除BlendShape")
|
|
|
|
del_btn.clicked.connect(self.delete_blendshape)
|
|
|
|
tools_layout.addWidget(del_btn)
|
|
|
|
|
|
|
|
# 修改BlendShape
|
|
|
|
mod_btn = IconButton("modify.png", "修改BlendShape")
|
|
|
|
mod_btn.clicked.connect(self.modify_blendshape)
|
|
|
|
tools_layout.addWidget(mod_btn)
|
|
|
|
|
|
|
|
tools_layout.addStretch()
|
|
|
|
layout.addLayout(tools_layout)
|
|
|
|
|
|
|
|
return group
|
|
|
|
|
|
|
|
# DNA定义回调
|
|
|
|
def browse_dna_file(self):
|
|
|
|
"""浏览DNA文件"""
|
|
|
|
from scripts.utils import define_utils
|
|
|
|
define_utils.browse_dna_file()
|
|
|
|
|
|
|
|
# 骨骼定义回调
|
|
|
|
def add_joint(self):
|
|
|
|
"""添加骨骼"""
|
|
|
|
from scripts.utils import define_utils
|
|
|
|
define_utils.add_joint()
|
|
|
|
|
|
|
|
def delete_joint(self):
|
|
|
|
"""删除骨骼"""
|
|
|
|
from scripts.utils import define_utils
|
|
|
|
define_utils.delete_joint()
|
|
|
|
|
|
|
|
def modify_joint(self):
|
|
|
|
"""修改骨骼"""
|
|
|
|
from scripts.utils import define_utils
|
|
|
|
define_utils.modify_joint()
|
|
|
|
|
|
|
|
# BlendShape定义回调
|
|
|
|
def add_blendshape(self):
|
|
|
|
"""添加BlendShape"""
|
|
|
|
from scripts.utils import define_utils
|
|
|
|
define_utils.add_blendshape()
|
|
|
|
|
|
|
|
def delete_blendshape(self):
|
|
|
|
"""删除BlendShape"""
|
|
|
|
from scripts.utils import define_utils
|
|
|
|
define_utils.delete_blendshape()
|
|
|
|
|
|
|
|
def modify_blendshape(self):
|
|
|
|
"""修改BlendShape"""
|
|
|
|
from scripts.utils import define_utils
|
|
|
|
define_utils.modify_blendshape()
|