MetaBox/Scripts/Modeling/Edit/XgenController.py
2025-01-14 02:17:16 +08:00

121 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : Jerry Tsai
# @Site : Zoroot
import xgenm as xg
import xgenm.xgGlobal as xgg
import xgenm.XgExternalAPI as xge
import maya.cmds as cmds
# 定义设置头发宽度默认值
hairwidth = 0.1000
hairwidthmax = 0.5000
hairwidthmin = 0.0050
hairwithstep = 0.0001
# 定义窗口的函数
def create_window():
global hairwidth
global hairwidthmax
global hairwidthmin
global hairwithstep
# 创建窗口
window = cmds.window(title="Hair Width", iconName='Hair Width', widthHeight=(600, 100))
# 创建窗口的布局
cmds.columnLayout(adjustableColumn=True)
# 创建最大值最小值输入框,可编辑,设置最大值最小值输入框的值
cmds.floatFieldGrp('SetMinMax', label='Set Min and Max', numberOfFields=2, value1=hairwidthmin, value2=hairwidthmax, changeCommand=update)
# 创建Hair Width滑块设置最大值最小值输入框的值步长设置滑块的值
cmds.floatSliderGrp('SetHairWidth', label='Set Hair Width', field=True, minValue=hairwidthmin, maxValue=hairwidthmax, fieldMinValue=hairwidthmin, fieldMaxValue=hairwidthmax, value=hairwidth, step=hairwithstep, changeCommand=update)
# 设置宽度表达式
set_width_expression(hairwidth)
# 显示窗口
cmds.showWindow(window)
# 定义更新函数
def update(*args):
# 获取参数
hairwidthmin = cmds.floatFieldGrp('SetMinMax', query=True, value1=True)
hairwidthmax = cmds.floatFieldGrp('SetMinMax', query=True, value2=True)
hairwidth = cmds.floatSliderGrp('SetHairWidth', query=True, value=True)
# 定义最大值与最小值的范围个规则
if hairwidthmin > hairwidthmax:
hairwidthmin = hairwidthmax
elif hairwidthmax < hairwidthmin:
hairwidthmax = hairwidthmin
elif hairwidthmin == hairwidthmax:
hairwidthmax = hairwidthmin + 0.0001
# 定义最大值最小值输入框均为0~1之间
if hairwidthmin < 0:
hairwidthmin = 0
if hairwidthmax < 0:
hairwidthmax = 0
if hairwidthmin > 1:
hairwidthmin = 1
if hairwidthmax > 1:
hairwidthmax = 1
# 定义滑块的值在最大值最小值之间
if hairwidth < hairwidthmin:
hairwidth = hairwidthmin
elif hairwidth > hairwidthmax:
hairwidth = hairwidthmax
# 定义滑块的值为正数
if hairwidth < 0:
hairwidth = 0
# 回调参数
cmds.floatFieldGrp('SetMinMax', edit=True, value1=hairwidthmin, value2=hairwidthmax)
cmds.floatSliderGrp('SetHairWidth', edit=True, minValue=hairwidthmin, maxValue=hairwidthmax, fieldMinValue=hairwidthmin, fieldMaxValue=hairwidthmax, value=hairwidth)
# 设置宽度表达式
set_width_expression(hairwidth)
print("Set the Description Primitive Attributes : ")
print(" Min : " + str(hairwidthmin) + " Max : " + str(hairwidthmax) + " Width: " + str(hairwidth))
# 定义设置宽度表达式的函数
def set_width_expression(hairwidth):
hairwidthmin = cmds.floatFieldGrp('SetMinMax', query=True, value1=True)
hairwidthmax = cmds.floatFieldGrp('SetMinMax', query=True, value2=True)
hairwidth = cmds.floatSliderGrp('SetHairWidth', query=True, value=True)
# 将hairwith转换为字符串
hairwidth_str = str(hairwidth)
# 将最大值最小值转换为字符串
hairwidthmax_str = str(hairwidthmax)
hairwidthmin_str = str(hairwidthmin)
# 获取被选中的物体
selectedobject = cmds.ls(selection=True)
print(hairwidth)
if not selectedobject:
ERROR_MESSAGE = "No object selected"
cmds.warning(ERROR_MESSAGE)
cmds.confirmDialog(title='Warning', message=ERROR_MESSAGE, button=['OK'], defaultButton='OK')
else:
if xgg.Maya:
# palette 是collection先用palettes 获取collections
palettes = xg.palettes()
# 筛选出被选中的palette
palettes = [palette for palette in palettes if palette in selectedobject]
# 筛选出被选中的Desciption
descriptions = xg.descriptions()
descriptions = [description for description in descriptions if description in selectedobject]
# 设置新的快读表达式
new_width_expression = "$a=", hairwidth_str + ";#" + hairwidthmax_str + "," + hairwidthmin_str
# 当palettes为空时将被选中的Desciption的父级collection筛选出来加入到palettes中
if palettes == []:
# 将被选中的Desciption筛选出来
for description in descriptions:
# 将被选中的Desciption的父级collection筛选出来
if description in selectedobject:
# 将被选中的Desciption的父级collection加入到palettes中
palettes.append(xg.palette(description))
# 将palettes转换为集合去除重复的collection
palettes = list(set(palettes))
if palettes != [] and descriptions == []:
# 选择的是collection
for palette in palettes:
# 获取collection下的所有Desciption
descriptions = xg.descriptions(palette)
if palettes == [] and descriptions == []:
print("No xGen collection or description selected")
print("Current selected hair collection : " + str(palettes))
print("Current selected hair description : " + str(descriptions))
# 设置宽度表达式
# if __name__ == "__main__":
# # 创建窗口
# create_window()