MetaBox/Scripts/Animation/AdvancedSkeleton/adv_launch.py

252 lines
11 KiB
Python
Raw Normal View History

2025-01-14 03:11:03 +08:00
# 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()