252 lines
11 KiB
Python
252 lines
11 KiB
Python
# Scripts/Animation/AdvancedSkeleton/launch.py
|
|
|
|
import maya.cmds as cmds
|
|
import maya.mel as mel
|
|
import os
|
|
import logging
|
|
from .adv_install import is_installed, install
|
|
|
|
# 设置日志
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger('AdvancedSkeleton')
|
|
|
|
def asMayaVersionAsFloat():
|
|
return float(cmds.about(version=True))
|
|
|
|
def asGetScriptLocation():
|
|
return os.path.dirname(os.path.realpath(__file__))
|
|
|
|
def asFL(frame_layout):
|
|
try:
|
|
is_collapsed = cmds.frameLayout(frame_layout, query=True, collapse=True)
|
|
cmds.optionVar(intValue=(frame_layout, int(is_collapsed)))
|
|
|
|
if not is_collapsed:
|
|
if frame_layout == "asPreparationFrameLayout":
|
|
update_preparation_frame()
|
|
elif frame_layout == "asBodyFrameLayout":
|
|
update_body_frame()
|
|
elif frame_layout == "asFaceFrameLayout":
|
|
update_face_frame()
|
|
elif frame_layout == "asPoseFrameLayout":
|
|
update_pose_frame()
|
|
except Exception as e:
|
|
logger.error(f"Error in asFL: {str(e)}")
|
|
|
|
def update_preparation_frame():
|
|
pass
|
|
|
|
def update_body_frame():
|
|
pass
|
|
|
|
def update_face_frame():
|
|
pass
|
|
|
|
def update_pose_frame():
|
|
pass
|
|
|
|
def create_preparation_content(parent):
|
|
cmds.columnLayout(adjustableColumn=True, parent=parent)
|
|
|
|
model_frame = cmds.frameLayout(label="Model", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.button(label="Model Clean", command=lambda x: safe_mel_eval('asModelCleaner'))
|
|
cmds.button(label="Model Check", command=lambda x: safe_mel_eval('asModelCheckerUI'))
|
|
cmds.setParent('..')
|
|
|
|
rig_frame = cmds.frameLayout(label="Rig", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.button(label="New Scene", command=lambda x: cmds.file(new=True, force=True))
|
|
cmds.button(label="Reference", command=lambda x: mel.eval('asReferenceBrowser 1'))
|
|
cmds.setParent('..')
|
|
|
|
def create_body_content(parent):
|
|
cmds.columnLayout(adjustableColumn=True, parent=parent)
|
|
|
|
fit_frame = cmds.frameLayout(label="Fit", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.optionMenu(label="FitSkeletons:")
|
|
cmds.menuItem(label="biped")
|
|
cmds.menuItem(label="quadruped")
|
|
cmds.button(label="Import", command=lambda x: mel.eval('asFitSkeletonImport'))
|
|
cmds.button(label="AutoPlace", command=lambda x: mel.eval('asFitAutoPlace'))
|
|
cmds.setParent('..')
|
|
|
|
edit_frame = cmds.frameLayout(label="Edit", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.text(label="IK-Label:")
|
|
cmds.optionMenu(label="Label Type:")
|
|
cmds.menuItem(label="Root")
|
|
cmds.menuItem(label="Spine")
|
|
cmds.menuItem(label="Arm")
|
|
cmds.menuItem(label="Leg")
|
|
cmds.button(label="Add", command=lambda x: mel.eval('asAddFitJointLabel'))
|
|
cmds.button(label="Remove", command=lambda x: mel.eval('asRemoveFitJointLabel'))
|
|
cmds.setParent('..')
|
|
|
|
build_frame = cmds.frameLayout(label="Build", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.button(label="Build AdvancedSkeleton", command=lambda x: mel.eval('asReBuildAdvancedSkeleton'))
|
|
cmds.setParent('..')
|
|
|
|
def create_face_content(parent):
|
|
cmds.columnLayout(adjustableColumn=True, parent=parent)
|
|
|
|
pre_frame = cmds.frameLayout(label="Pre", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.button(label="Face Model Check", command=lambda x: mel.eval('asFaceModelCheck'))
|
|
cmds.optionMenu(label="Rig Type:")
|
|
cmds.menuItem(label="Joints")
|
|
cmds.menuItem(label="BlendShapes")
|
|
cmds.menuItem(label="Mixed")
|
|
cmds.checkBox(label="Game Engine")
|
|
cmds.setParent('..')
|
|
|
|
fit_frame = cmds.frameLayout(label="Fit", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.button(label="Create EyeBall", command=lambda x: mel.eval('asCreateFaceFit EyeBall "" 0 0 1 ""'))
|
|
cmds.button(label="Create EyeLid", command=lambda x: mel.eval('asCreateFaceFit EyeLid "Main" 1 1 0 ""'))
|
|
cmds.setParent('..')
|
|
|
|
build_frame = cmds.frameLayout(label="Build", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.button(label="Build AdvancedFace", command=lambda x: mel.eval('asBuildAdvancedFace'))
|
|
cmds.setParent('..')
|
|
|
|
def create_pose_content(parent):
|
|
cmds.columnLayout(adjustableColumn=True, parent=parent)
|
|
|
|
driving_systems_frame = cmds.frameLayout(label="Driving Systems", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.button(label="Create Driving System", command=lambda x: mel.eval('asDsCreate'))
|
|
cmds.button(label="Edit", command=lambda x: mel.eval('asDsAutoFindAndEdit'))
|
|
cmds.button(label="Delete", command=lambda x: mel.eval('asDsDelete'))
|
|
cmds.setParent('..')
|
|
|
|
corrective_shapes_frame = cmds.frameLayout(label="Corrective Shapes", collapsable=True, parent=parent)
|
|
cmds.columnLayout(adjustableColumn=True)
|
|
cmds.button(label="Create Corrective Shape", command=lambda x: mel.eval('asCreateCorrectiveShape'))
|
|
cmds.button(label="Edit", command=lambda x: mel.eval('asEditCorrectiveShape'))
|
|
cmds.button(label="Delete", command=lambda x: mel.eval('asDeleteCorrectiveShape'))
|
|
cmds.setParent('..')
|
|
|
|
def safe_mel_eval(command):
|
|
try:
|
|
return mel.eval(command)
|
|
except RuntimeError as e:
|
|
logger.error(f"Error executing MEL command '{command}': {str(e)}")
|
|
return None
|
|
|
|
def launch():
|
|
if not is_installed():
|
|
print("AdvancedSkeleton is not installed. Installing now...")
|
|
install()
|
|
|
|
try:
|
|
# 检查单位
|
|
current_unit = cmds.currentUnit(query=True, linear=True)
|
|
if current_unit != "cm":
|
|
result = cmds.confirmDialog(title='Unit Check',
|
|
message='AdvancedSkeleton requires "cm" units. Switch now?',
|
|
button=['Yes','No'],
|
|
defaultButton='Yes',
|
|
cancelButton='No',
|
|
dismissString='No')
|
|
if result == 'Yes':
|
|
cmds.currentUnit(linear='cm')
|
|
|
|
# 设置动画混合选项
|
|
anim_blending_opt = cmds.optionVar(query='animBlendingOpt')
|
|
if anim_blending_opt != 1:
|
|
cmds.optionVar(intValue=('animBlendingOpt', 1))
|
|
logger.info("\"Animation Blending Option\" now switched to On.")
|
|
|
|
# 检查Maya版本并设置关节方向
|
|
maya_version = asMayaVersionAsFloat()
|
|
if maya_version >= 2012:
|
|
if cmds.manipMoveContext('Move', exists=True):
|
|
try:
|
|
if cmds.manipMoveContext('Move', query=True, orientJointEnabled=True):
|
|
cmds.manipMoveContext('Move', edit=True, orientJointEnabled=False)
|
|
except:
|
|
pass
|
|
|
|
# 获取脚本位置
|
|
script_location = os.path.dirname(os.path.abspath(__file__))
|
|
mel_file = os.path.join(script_location, "AdvancedSkeleton5.mel")
|
|
|
|
logger.info(f"Script location: {script_location}")
|
|
logger.info(f"MEL file path: {mel_file}")
|
|
logger.info(f"MEL file exists: {os.path.exists(mel_file)}")
|
|
|
|
if os.path.exists(mel_file):
|
|
# 使用原始字符串和双引号来避免转义问题
|
|
mel_command = r'source "{}"'.format(mel_file.replace('\\', '/'))
|
|
logger.info(f"MEL command: {mel_command}")
|
|
mel.eval(mel_command)
|
|
logger.info("AdvancedSkeleton5.mel sourced successfully.")
|
|
else:
|
|
logger.error(f"Cannot find AdvancedSkeleton5.mel at {mel_file}")
|
|
return
|
|
|
|
# 创建UI
|
|
if cmds.window('AdvancedSkeletonWindow', exists=True):
|
|
cmds.deleteUI('AdvancedSkeletonWindow')
|
|
|
|
if cmds.dockControl('AdvancedSkeletonDockControl', exists=True):
|
|
cmds.deleteUI('AdvancedSkeletonDockControl')
|
|
|
|
window = cmds.window('AdvancedSkeletonWindow', title='AdvancedSkeleton 5')
|
|
main_layout = cmds.formLayout()
|
|
scroll_layout = cmds.scrollLayout(parent=main_layout)
|
|
column_layout = cmds.columnLayout(adjustableColumn=True, parent=scroll_layout)
|
|
|
|
# 添加框架布局
|
|
preparation_frame = cmds.frameLayout(label="Preparation", collapsable=True,
|
|
collapse=cmds.optionVar(query="asPreparationFrameLayout"),
|
|
parent=column_layout,
|
|
collapseCommand=lambda: asFL('asPreparationFrameLayout'),
|
|
expandCommand=lambda: asFL('asPreparationFrameLayout'))
|
|
create_preparation_content(preparation_frame)
|
|
|
|
body_frame = cmds.frameLayout(label="Body", collapsable=True,
|
|
collapse=cmds.optionVar(query="asBodyFrameLayout"),
|
|
parent=column_layout,
|
|
collapseCommand=lambda: asFL('asBodyFrameLayout'),
|
|
expandCommand=lambda: asFL('asBodyFrameLayout'))
|
|
create_body_content(body_frame)
|
|
|
|
face_frame = cmds.frameLayout(label="Face", collapsable=True,
|
|
collapse=cmds.optionVar(query="asFaceFrameLayout"),
|
|
parent=column_layout,
|
|
collapseCommand=lambda: asFL('asFaceFrameLayout'),
|
|
expandCommand=lambda: asFL('asFaceFrameLayout'))
|
|
create_face_content(face_frame)
|
|
|
|
pose_frame = cmds.frameLayout(label="Pose", collapsable=True,
|
|
collapse=cmds.optionVar(query="asPoseFrameLayout"),
|
|
parent=column_layout,
|
|
collapseCommand=lambda: asFL('asPoseFrameLayout'),
|
|
expandCommand=lambda: asFL('asPoseFrameLayout'))
|
|
create_pose_content(pose_frame)
|
|
|
|
# 设置主布局
|
|
cmds.formLayout(main_layout, edit=True,
|
|
attachForm=[(scroll_layout, 'top', 0),
|
|
(scroll_layout, 'left', 0),
|
|
(scroll_layout, 'right', 0),
|
|
(scroll_layout, 'bottom', 0)])
|
|
|
|
# 显示窗口
|
|
cmds.showWindow(window)
|
|
|
|
# 调用MEL中的AdvancedSkeleton5函数
|
|
mel.eval('AdvancedSkeleton5()')
|
|
|
|
logger.info("AdvancedSkeleton launched successfully.")
|
|
except Exception as e:
|
|
logger.error(f"Error launching AdvancedSkeleton: {str(e)}")
|
|
|
|
if __name__ == "__main__":
|
|
launch()
|