208 lines
8.0 KiB
Python
208 lines
8.0 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
#===================================== 1. Module Imports =====================================
|
|
import maya.cmds as cmds
|
|
import maya.mel as mel
|
|
import sys
|
|
import os
|
|
from scripts.config import data
|
|
from scripts.ui import adjust_utils as adjust_utils
|
|
from scripts.ui import widgets as widgets
|
|
|
|
try:
|
|
from PySide2 import QtCore, QtGui, QtWidgets
|
|
from shiboken2 import wrapInstance
|
|
except ImportError:
|
|
try:
|
|
from PySide6 import QtCore, QtGui, QtWidgets
|
|
from shiboken6 import wrapInstance
|
|
except ImportError:
|
|
try:
|
|
from PySide import QtCore, QtGui, QtWidgets
|
|
from shiboken import wrapInstance
|
|
except ImportError as e:
|
|
QtCore = QtGui = QtWidgets = None
|
|
wrapInstance = None
|
|
|
|
#===================================== 2. Adjust Tab Class =====================================
|
|
class AdjustTab(widgets.BaseWidget):
|
|
"""调整标签页"""
|
|
def __init__(self, parent=None):
|
|
self.raw_list = None
|
|
self.blend_list = None
|
|
self.raw_slider = None
|
|
self.blend_slider = None
|
|
self.raw_value_label = None
|
|
self.blend_value_label = None
|
|
super(AdjustTab, self).__init__(parent)
|
|
|
|
def setup_ui(self):
|
|
"""初始化UI"""
|
|
layout = QtWidgets.QVBoxLayout(self)
|
|
layout.setSpacing(self.SPACING)
|
|
layout.setContentsMargins(self.MARGINS, self.MARGINS,
|
|
self.MARGINS, self.MARGINS)
|
|
|
|
# 创建左右分栏布局
|
|
splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
|
|
layout.addWidget(splitter)
|
|
|
|
# 左侧 Raw Control 列表
|
|
left_widget = QtWidgets.QWidget()
|
|
left_layout = QtWidgets.QVBoxLayout(left_widget)
|
|
|
|
# 标题和计数
|
|
left_layout.addWidget(QtWidgets.QLabel("Raw Control [814/814]"))
|
|
|
|
# 搜索框
|
|
search_layout = QtWidgets.QHBoxLayout()
|
|
search_input = widgets.ModernLineEdit()
|
|
search_input.setPlaceholderText("搜索...")
|
|
search_layout.addWidget(search_input)
|
|
left_layout.addLayout(search_layout)
|
|
|
|
# Raw Control列表
|
|
self.raw_list = QtWidgets.QListWidget()
|
|
self.raw_list.setStyleSheet("QListWidget { background-color: #333333; }")
|
|
left_layout.addWidget(self.raw_list)
|
|
|
|
# 添加示例项
|
|
for i, name in enumerate(['browDownL', 'browDownR', 'browLateralL', 'browLateralR',
|
|
'browRaiseInL', 'browRaiseInR', 'browRaiseOuterL', 'browRaiseOuterR',
|
|
'earUpL', 'earUpR', 'eyeBlinkL']):
|
|
item = QtWidgets.QListWidgetItem()
|
|
item.setText(f"{name}")
|
|
item.setData(QtCore.Qt.UserRole, f"{i:03d}") # 存储编号
|
|
self.raw_list.addItem(item)
|
|
|
|
# 数值控制
|
|
value_layout = QtWidgets.QHBoxLayout()
|
|
self.raw_value_label = QtWidgets.QLabel("0.010")
|
|
value_layout.addWidget(self.raw_value_label)
|
|
self.raw_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
|
|
self.raw_slider.setRange(0, 100)
|
|
self.raw_slider.valueChanged.connect(self._on_raw_value_changed)
|
|
value_layout.addWidget(self.raw_slider)
|
|
value_layout.addWidget(QtWidgets.QLabel("全部"))
|
|
left_layout.addLayout(value_layout)
|
|
|
|
# 页码控制
|
|
page_layout = QtWidgets.QHBoxLayout()
|
|
page_layout.addWidget(QtWidgets.QLabel("全部"))
|
|
for i in range(2, 7):
|
|
btn = QtWidgets.QPushButton(str(i))
|
|
page_layout.addWidget(btn)
|
|
left_layout.addLayout(page_layout)
|
|
|
|
# 源目标选择
|
|
source_layout = QtWidgets.QHBoxLayout()
|
|
source_layout.addWidget(QtWidgets.QLabel("源目标"))
|
|
source_layout.addWidget(QtWidgets.QComboBox())
|
|
left_layout.addLayout(source_layout)
|
|
|
|
splitter.addWidget(left_widget)
|
|
|
|
# 右侧 Related Blend Shapes 列表
|
|
right_widget = QtWidgets.QWidget()
|
|
right_layout = QtWidgets.QVBoxLayout(right_widget)
|
|
|
|
# 标题和列表
|
|
right_layout.addWidget(QtWidgets.QLabel("Related Blend Shapes [858/858]"))
|
|
self.blend_list = QtWidgets.QListWidget()
|
|
self.blend_list.setStyleSheet("QListWidget { background-color: #333333; }")
|
|
|
|
# 添加示例项
|
|
for i in range(10):
|
|
item = QtWidgets.QListWidgetItem()
|
|
item.setText(f"head_lod0_mesh | brow_down_L {i:03d}")
|
|
self.blend_list.addItem(item)
|
|
|
|
right_layout.addWidget(self.blend_list)
|
|
|
|
# 数值控制
|
|
blend_value_layout = QtWidgets.QHBoxLayout()
|
|
self.blend_value_label = QtWidgets.QLabel("0.000")
|
|
blend_value_layout.addWidget(self.blend_value_label)
|
|
self.blend_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
|
|
self.blend_slider.setRange(0, 100)
|
|
self.blend_slider.valueChanged.connect(self._on_blend_value_changed)
|
|
blend_value_layout.addWidget(self.blend_slider)
|
|
blend_value_layout.addWidget(QtWidgets.QLabel("全部"))
|
|
right_layout.addLayout(blend_value_layout)
|
|
|
|
# 工具按钮组
|
|
tools_layout = QtWidgets.QGridLayout()
|
|
tools = [
|
|
("整理目标", adjust_utils.organize_targets),
|
|
("高级混合变形", adjust_utils.advanced_blend),
|
|
("重建混合目标", adjust_utils.rebuild_targets),
|
|
("添加混合变形", adjust_utils.add_blend),
|
|
("删除混合变形", adjust_utils.delete_blend),
|
|
("批量混合变形", adjust_utils.batch_blend)
|
|
]
|
|
|
|
for i, (text, callback) in enumerate(tools):
|
|
btn = QtWidgets.QPushButton(text)
|
|
btn.clicked.connect(lambda checked=False, cb=callback: cb())
|
|
row = i // 2
|
|
col = i % 2
|
|
tools_layout.addWidget(btn, row, col)
|
|
right_layout.addLayout(tools_layout)
|
|
|
|
# 底部工具栏
|
|
bottom_layout = QtWidgets.QVBoxLayout()
|
|
|
|
# 功能开关和数值
|
|
toggle_layout = QtWidgets.QHBoxLayout()
|
|
|
|
# 左侧开关
|
|
left_toggles = QtWidgets.QHBoxLayout()
|
|
for text in ["KEY", "MIR", "ARK", "CTR"]:
|
|
btn = QtWidgets.QPushButton(text)
|
|
btn.setCheckable(True)
|
|
left_toggles.addWidget(btn)
|
|
toggle_layout.addLayout(left_toggles)
|
|
|
|
# 右侧数值
|
|
toggle_layout.addStretch()
|
|
value_spin = QtWidgets.QDoubleSpinBox()
|
|
value_spin.setValue(0.000)
|
|
toggle_layout.addWidget(value_spin)
|
|
toggle_layout.addWidget(QtWidgets.QPushButton("全部"))
|
|
|
|
bottom_layout.addLayout(toggle_layout)
|
|
|
|
# 操作按钮
|
|
action_layout = QtWidgets.QGridLayout()
|
|
actions = [
|
|
("在线帮助", adjust_utils.show_help),
|
|
("控制面板编辑", adjust_utils.edit_control_panel),
|
|
("控制面板预览", adjust_utils.preview_control_panel),
|
|
("导入编辑器", adjust_utils.import_editor),
|
|
("导入编辑器预览", adjust_utils.import_editor_preview),
|
|
("导入编辑器预览", adjust_utils.import_editor_preview)
|
|
]
|
|
|
|
for i, (text, callback) in enumerate(actions):
|
|
btn = QtWidgets.QPushButton(text)
|
|
btn.clicked.connect(lambda checked=False, cb=callback: cb())
|
|
row = i // 2
|
|
col = i % 2
|
|
action_layout.addWidget(btn, row, col)
|
|
bottom_layout.addLayout(action_layout)
|
|
|
|
right_layout.addLayout(bottom_layout)
|
|
splitter.addWidget(right_widget)
|
|
|
|
# 设置分割器比例
|
|
splitter.setSizes([400, 400])
|
|
|
|
def _on_raw_value_changed(self, value):
|
|
"""Raw Control数值改变"""
|
|
self.raw_value_label.setText(f"{value/1000:.3f}")
|
|
|
|
def _on_blend_value_changed(self, value):
|
|
"""Blend Shape数值改变"""
|
|
self.blend_value_label.setText(f"{value/1000:.3f}")
|
|
|