MetaFusion/scripts/ui/adjust.py
2025-02-06 19:49:53 +08:00

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}")