174 lines
6.3 KiB
Python
174 lines
6.3 KiB
Python
|
# Scripts/Animation/AdvancedSkeleton/install.py
|
|||
|
|
|||
|
import maya.cmds as cmds
|
|||
|
import maya.mel as mel
|
|||
|
import os
|
|||
|
import sys
|
|||
|
import logging
|
|||
|
|
|||
|
logging.basicConfig(level=logging.INFO)
|
|||
|
logger = logging.getLogger('AdvancedSkeleton')
|
|||
|
|
|||
|
# 定义全局变量
|
|||
|
asBuilding = 0
|
|||
|
asRebuilding = 0
|
|||
|
asFaceIsResetting = 0
|
|||
|
asFitModeScriptJobNr4 = 0
|
|||
|
asFitModeScriptJobNr5 = 0
|
|||
|
asSkipConfirm = 0
|
|||
|
|
|||
|
def asMayaVersionAsFloat():
|
|||
|
"""获取Maya版本号"""
|
|||
|
return float(cmds.about(version=True))
|
|||
|
|
|||
|
def load_wb_delta_mush_deformer():
|
|||
|
"""根据Maya版本加载wbDeltaMushDeformer模块"""
|
|||
|
maya_version = asMayaVersionAsFloat()
|
|||
|
script_dir = os.path.dirname(os.path.realpath(__file__))
|
|||
|
wb_delta_mush_dir = os.path.join(script_dir, "AdvancedSkeleton5Files", "modules", "wbDeltaMushDeformer").replace("\\", "/")
|
|||
|
|
|||
|
# 确定适用的Maya版本文件夹
|
|||
|
if maya_version >= 2016.5:
|
|||
|
version_folder = "2016.5"
|
|||
|
elif maya_version >= 2016:
|
|||
|
version_folder = "2016"
|
|||
|
elif maya_version >= 2015:
|
|||
|
version_folder = "2015"
|
|||
|
elif maya_version >= 2014:
|
|||
|
version_folder = "2014"
|
|||
|
elif maya_version >= 2013:
|
|||
|
version_folder = "2013"
|
|||
|
else:
|
|||
|
version_folder = "2012"
|
|||
|
|
|||
|
# 构建插件<E68F92><E4BBB6>径
|
|||
|
plugin_dir = os.path.join(wb_delta_mush_dir, version_folder, "plug-ins")
|
|||
|
|
|||
|
# 根据操作系统选择正确的插件文件
|
|||
|
if sys.platform == "win32":
|
|||
|
plugin_file = "wbDeltaMushDeformer.mll"
|
|||
|
elif sys.platform == "darwin":
|
|||
|
plugin_file = "wbDeltaMushDeformer.bundle"
|
|||
|
else: # 假设其他平台是Linux
|
|||
|
plugin_file = "wbDeltaMushDeformer.so"
|
|||
|
|
|||
|
plugin_path = os.path.join(plugin_dir, plugin_file)
|
|||
|
|
|||
|
if os.path.exists(plugin_path):
|
|||
|
try:
|
|||
|
cmds.loadPlugin(plugin_path)
|
|||
|
print(f"Successfully loaded wbDeltaMushDeformer for Maya {maya_version}")
|
|||
|
|
|||
|
# 加载MEL脚本
|
|||
|
mel_script = os.path.join(wb_delta_mush_dir, version_folder, "scripts", "AEwbDeltaMushTemplate.mel").replace("\\", "/")
|
|||
|
if os.path.exists(mel_script):
|
|||
|
mel.eval(f'source "{mel_script}"')
|
|||
|
print(f"Loaded AEwbDeltaMushTemplate.mel for Maya {maya_version}")
|
|||
|
else:
|
|||
|
print(f"AEwbDeltaMushTemplate.mel not found for Maya {maya_version}")
|
|||
|
except Exception as e:
|
|||
|
print(f"Failed to load wbDeltaMushDeformer for Maya {maya_version}: {str(e)}")
|
|||
|
else:
|
|||
|
print(f"wbDeltaMushDeformer plugin not found for Maya {maya_version}")
|
|||
|
|
|||
|
# 添加模块路径到Maya模块路径
|
|||
|
module_file = os.path.join(script_dir, "AdvancedSkeleton5Files", "modules", "wbDeltaMushDeformer.mod").replace("\\", "/")
|
|||
|
if os.path.exists(module_file):
|
|||
|
maya_module_path = mel.eval('getenv "MAYA_MODULE_PATH"')
|
|||
|
module_dir = os.path.dirname(module_file)
|
|||
|
if module_dir not in maya_module_path:
|
|||
|
mel.eval(f'putenv "MAYA_MODULE_PATH" "{module_dir};{maya_module_path}"')
|
|||
|
print(f"Added {module_dir} to MAYA_MODULE_PATH")
|
|||
|
|
|||
|
def is_installed():
|
|||
|
return cmds.menu('AdvancedSkeletonMenu', exists=True)
|
|||
|
|
|||
|
def install():
|
|||
|
global asBuilding, asRebuilding, asFaceIsResetting, asFitModeScriptJobNr4, asFitModeScriptJobNr5, asSkipConfirm
|
|||
|
|
|||
|
if is_installed():
|
|||
|
print("AdvancedSkeleton is already installed.")
|
|||
|
return
|
|||
|
|
|||
|
# 获取脚本所在目录
|
|||
|
script_dir = os.path.dirname(os.path.realpath(__file__))
|
|||
|
|
|||
|
# 添加脚本路径到Maya的脚本路径
|
|||
|
maya_script_path = mel.eval('getenv "MAYA_SCRIPT_PATH"')
|
|||
|
if script_dir not in maya_script_path:
|
|||
|
mel.eval(f'putenv "MAYA_SCRIPT_PATH" "{script_dir};{maya_script_path}"')
|
|||
|
|
|||
|
# 检查并设置单位为厘米
|
|||
|
current_unit = cmds.currentUnit(query=True, linear=True)
|
|||
|
if current_unit != "cm":
|
|||
|
result = cmds.confirmDialog(
|
|||
|
title='Confirm',
|
|||
|
message=f'Units currently set to: "{current_unit}"\nAdvancedSkeleton requires "cm".\nClick OK to switch',
|
|||
|
button=['Ok', 'Cancel'],
|
|||
|
defaultButton='Ok',
|
|||
|
cancelButton='Cancel',
|
|||
|
dismissString='Cancel'
|
|||
|
)
|
|||
|
if result == 'Ok':
|
|||
|
cmds.currentUnit(linear='cm')
|
|||
|
print("Units switched to cm.")
|
|||
|
else:
|
|||
|
print("Units already set to cm.")
|
|||
|
|
|||
|
# 设置动画混合选项
|
|||
|
if not cmds.optionVar(query='animBlendingOpt'):
|
|||
|
cmds.optionVar(intValue=('animBlendingOpt', 1))
|
|||
|
print("// \"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
|
|||
|
|
|||
|
# 设置显示层全局设置
|
|||
|
cmds.editDisplayLayerGlobals(useCurrent=False)
|
|||
|
|
|||
|
# 重置一些全局变量
|
|||
|
asBuilding = 0
|
|||
|
asRebuilding = 0
|
|||
|
asFitModeSkip = 0
|
|||
|
asSkipConfirm = 0
|
|||
|
|
|||
|
# 创建必要的脚本作业
|
|||
|
if asFitModeScriptJobNr4 == 0:
|
|||
|
asFitModeScriptJobNr4 = cmds.scriptJob(runOnce=True, event=("SceneOpened", "asSceneOpened()"))
|
|||
|
if asFitModeScriptJobNr5 == 0:
|
|||
|
asFitModeScriptJobNr5 = cmds.scriptJob(event=("Undo", "asUpdateButtonEnables();asFaceUpdateInfo(1);"))
|
|||
|
|
|||
|
# 创建菜单项
|
|||
|
if not cmds.menu('AdvancedSkeletonMenu', exists=True):
|
|||
|
main_window = mel.eval('$temp=$gMainWindow')
|
|||
|
cmds.menu('AdvancedSkeletonMenu', label='AdvancedSkeleton', parent=main_window)
|
|||
|
cmds.menuItem(label='Launch AdvancedSkeleton', command='import Scripts.Animation.AdvancedSkeleton.adv_launch as as_launch; as_launch.launch()')
|
|||
|
|
|||
|
# 设置版本信息
|
|||
|
try:
|
|||
|
if not cmds.objExists('Main'):
|
|||
|
cmds.createNode('transform', name='Main')
|
|||
|
|
|||
|
if not cmds.attributeQuery('version', node='Main', exists=True):
|
|||
|
cmds.addAttr('Main', longName='version', attributeType='double')
|
|||
|
|
|||
|
cmds.setAttr('Main.version', lock=True, keyable=False)
|
|||
|
cmds.setAttr('Main.version', asMayaVersionAsFloat())
|
|||
|
except Exception as e:
|
|||
|
print(f"Error setting version information: {str(e)}")
|
|||
|
|
|||
|
# 加载wbDeltaMushDeformer
|
|||
|
load_wb_delta_mush_deformer()
|
|||
|
|
|||
|
print("AdvancedSkeleton installed successfully.")
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
install()
|