200 lines
6.2 KiB
Python
200 lines
6.2 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
import maya.cmds as cmds
|
||
from scripts.utils.Core import Descriptor, RBFDeformer
|
||
|
||
def rbf_deformer_window():
|
||
"""
|
||
创建RBF变形器窗口
|
||
"""
|
||
# 检查主窗口是否存在
|
||
if not cmds.window('SuperRiggingEditor', exists=True):
|
||
return
|
||
|
||
# 如果RBF窗口已存在则删除
|
||
if cmds.window('RBFDeformerWin', exists=True):
|
||
cmds.deleteUI('RBFDeformerWin')
|
||
|
||
# 设置UI文本(支持中英文)
|
||
texts = {
|
||
'Load': 'Load...',
|
||
'Original': 'Original:',
|
||
'Deformed': 'Deformed:',
|
||
'Radius': 'Radius:',
|
||
'Points': 'Points:',
|
||
'Execute': 'Execute'
|
||
}
|
||
|
||
if Descriptor(l=True) == "ZH":
|
||
texts.update({
|
||
'Load': '加载...',
|
||
'Original': '原始模型:',
|
||
'Deformed': '变形模型:',
|
||
'Radius': '搜索半径:',
|
||
'Points': '采样点数:',
|
||
'Execute': '开始执行'
|
||
})
|
||
|
||
# 创建窗口
|
||
window = cmds.window('RBFDeformerWin',
|
||
title="RBF Deformer",
|
||
width=310,
|
||
height=100,
|
||
sizeable=True,
|
||
toolbox=True,
|
||
parent='SuperRiggingEditor')
|
||
|
||
# 主布局
|
||
cmds.columnLayout(adjustableColumn=True,
|
||
columnAttach=('both', 5),
|
||
rowSpacing=2,
|
||
columnWidth=150)
|
||
|
||
cmds.separator(height=10, style="in")
|
||
|
||
# 原始模型和变形模型选择
|
||
cmds.textFieldButtonGrp('RBFDeformer_Original',
|
||
label=texts['Original'],
|
||
buttonLabel=texts['Load'],
|
||
columnWidth3=[70, 1, 30],
|
||
adjustableColumn2=2,
|
||
buttonCommand=rbf_deformer_load_original)
|
||
|
||
cmds.textFieldButtonGrp('RBFDeformer_Deformed',
|
||
label=texts['Deformed'],
|
||
buttonLabel=texts['Load'],
|
||
columnWidth3=[70, 1, 30],
|
||
adjustableColumn2=2,
|
||
buttonCommand=rbf_deformer_load_deformed)
|
||
|
||
cmds.separator(height=10, style="in")
|
||
|
||
# 半径设置
|
||
cmds.rowLayout(numberOfColumns=3,
|
||
columnWidth3=[70, 70, 1],
|
||
columnAttach3=['right', 'left', 'left'],
|
||
adjustableColumn3=3)
|
||
|
||
cmds.text(label=texts['Radius'])
|
||
cmds.floatField('RBFDeformer_RadiusField',
|
||
width=70,
|
||
maxValue=2,
|
||
minValue=0.001,
|
||
value=0.1,
|
||
changeCommand=set_radius_field)
|
||
cmds.floatSlider('RBFDeformer_RadiusSlider',
|
||
maxValue=2,
|
||
minValue=0.001,
|
||
value=0.1,
|
||
dragCommand=set_radius_field)
|
||
cmds.setParent('..')
|
||
|
||
# 采样点设置
|
||
cmds.rowLayout(numberOfColumns=3,
|
||
columnWidth3=[70, 70, 1],
|
||
columnAttach3=['right', 'left', 'left'],
|
||
adjustableColumn3=3)
|
||
|
||
cmds.text(label=texts['Points'])
|
||
cmds.intField('RBFDeformer_PointsField',
|
||
width=70,
|
||
maxValue=10000,
|
||
minValue=100,
|
||
value=2000,
|
||
changeCommand=set_points_field)
|
||
cmds.intSlider('RBFDeformer_PointsSlider',
|
||
maxValue=10000,
|
||
minValue=100,
|
||
value=2000,
|
||
dragCommand=set_points_field)
|
||
cmds.setParent('..')
|
||
|
||
cmds.separator(height=10, style="in")
|
||
|
||
# 执行按钮
|
||
cmds.button(label=texts['Execute'],
|
||
align="center",
|
||
command=rbf_deformer_execute)
|
||
|
||
cmds.separator(height=10, style="in")
|
||
|
||
cmds.showWindow(window)
|
||
|
||
def rbf_deformer_execute(*args):
|
||
"""
|
||
执行RBF变形器操作
|
||
"""
|
||
# 获取UI值
|
||
original = cmds.textFieldButtonGrp('RBFDeformer_Original', query=True, text=True)
|
||
deformed = cmds.textFieldButtonGrp('RBFDeformer_Deformed', query=True, text=True)
|
||
radius = cmds.floatField('RBFDeformer_RadiusField', query=True, value=True)
|
||
points = cmds.intField('RBFDeformer_PointsField', query=True, value=True)
|
||
|
||
# 检查模型顶点数是否一致
|
||
org_vtx = cmds.polyEvaluate(original, vertex=True)
|
||
def_vtx = cmds.polyEvaluate(deformed, vertex=True)
|
||
|
||
if org_vtx != def_vtx:
|
||
cmds.error("The topology of the two models is inconsistent...")
|
||
return
|
||
|
||
# 获取选中的目标模型
|
||
selection = cmds.ls(selection=True)
|
||
|
||
# 执行RBF变形
|
||
RBFDeformer(
|
||
r=radius,
|
||
np=points,
|
||
rbf=1,
|
||
m=[original, deformed],
|
||
t=selection
|
||
)
|
||
|
||
def rbf_deformer_load_original(*args):
|
||
"""
|
||
加载原始模型
|
||
"""
|
||
selection = cmds.ls(selection=True)
|
||
if selection:
|
||
cmds.textFieldButtonGrp('RBFDeformer_Original', edit=True, text=selection[0])
|
||
|
||
def rbf_deformer_load_deformed(*args):
|
||
"""
|
||
加载变形模型
|
||
"""
|
||
selection = cmds.ls(selection=True)
|
||
if selection:
|
||
cmds.textFieldButtonGrp('RBFDeformer_Deformed', edit=True, text=selection[0])
|
||
|
||
def set_radius_field(*args):
|
||
"""
|
||
更新半径滑块值
|
||
"""
|
||
value = cmds.floatSlider('RBFDeformer_RadiusSlider', query=True, value=True)
|
||
cmds.floatField('RBFDeformer_RadiusField', edit=True, value=value)
|
||
|
||
def set_radius_field(*args):
|
||
"""
|
||
更新半径输入框值
|
||
"""
|
||
value = cmds.floatField('RBFDeformer_RadiusField', query=True, value=True)
|
||
cmds.floatSlider('RBFDeformer_RadiusSlider', edit=True, value=value)
|
||
|
||
def set_points_field(*args):
|
||
"""
|
||
更新采样点滑块值
|
||
"""
|
||
value = cmds.intSlider('RBFDeformer_PointsSlider', query=True, value=True)
|
||
cmds.intField('RBFDeformer_PointsField', edit=True, value=value)
|
||
|
||
def set_points_field(*args):
|
||
"""
|
||
更新采样点输入框值
|
||
"""
|
||
value = cmds.intField('RBFDeformer_PointsField', query=True, value=True)
|
||
cmds.intSlider('RBFDeformer_PointsSlider', edit=True, value=value)
|
||
|
||
# 如果直接运行此脚本
|
||
if __name__ == '__main__':
|
||
rbf_deformer_window() |