MetaBox/Scripts/Animation/aTools/animTools/animBar/subUIs/specialTools_subUIs/animationCopier.py

120 lines
5.2 KiB
Python
Raw Permalink Normal View History

2025-01-14 03:08:55 +08:00
'''
========================================================================================================================
Author: Alan Camilo
www.alancamilo.com
Requirements: aTools Package
------------------------------------------------------------------------------------------------------------------------
To install aTools, please follow the instructions in the file how_to_install.txt
------------------------------------------------------------------------------------------------------------------------
To unistall aTools, go to menu (the last button on the right), Uninstall
========================================================================================================================
'''
from maya import cmds
from aTools.generalTools.aToolsGlobals import aToolsGlobals as G
from aTools.commonMods import uiMod
from aTools.commonMods import utilMod
from aTools.commonMods import animMod
from aTools.commonMods import aToolsMod
class AnimationCopier(object):
def popupMenu(self):
cmds.popupMenu()
cmds.menuItem( label="Copy All Animation", command=lambda *args: self.copyAnimation(range="all"))
cmds.menuItem( divider=True )
cmds.menuItem("onlySelectedNodesMenu", label="Paste To Selected", checkBox=False)
cmds.menuItem( label="Paste Animation in Place", command=lambda *args: self.pasteAnimation(pasteInPlace=True))
cmds.menuItem( label="Paste Original Animation", command=lambda *args: self.pasteAnimation(pasteInPlace=False))
cmds.menuItem( divider=True )
cmds.menuItem( label="Paste To Another Character", command=self.remapNamespaces)
def copyAnimation(self, range="selected", *args):
cmds.waitCursor(state=True)
if range == "all":
getCurves = animMod.getAnimCurves()
animCurves = getCurves[0]
animData = animMod.getAnimData(animCurves, showProgress=True)
else:
animData = animMod.getAnimData(showProgress=True)
aToolsMod.saveInfoWithUser("copyPasteAnim", "animData", animData)
if cmds.window("remapNamespacesWindow", query=True, exists=True): self.remapNamespaces()
cmds.waitCursor(state=False)
def pasteAnimation(self, animData=None, pasteInPlace=True, onlySelectedNodes=None, *args):
cmds.waitCursor(state=True)
if not onlySelectedNodes: onlySelectedNodes = cmds.menuItem("onlySelectedNodesMenu", query=True, checkBox=True)
if not animData: animData = aToolsMod.loadInfoWithUser("copyPasteAnim", "animData")
animMod.applyAnimData(animData, pasteInPlace, onlySelectedNodes, showProgress=True)
cmds.waitCursor(state=False)
def remapNamespaces(self, *args):
winName = "remapNamespacesWindow"
if cmds.window(winName, query=True, exists=True): cmds.deleteUI(winName)
window = cmds.window( winName, title = "Remap Namespaces")
cmds.columnLayout(adjustableColumn=True)
cmds.rowColumnLayout( numberOfColumns=3)
animData = aToolsMod.loadInfoWithUser("copyPasteAnim", "animData")
inputNameSpaces = list(set(utilMod.getNameSpace(animData["objects"])[0]))
outputNameSpaces = utilMod.listAllNamespaces()
for loopNameSpace in inputNameSpaces:
nameSpace = loopNameSpace[:-1]
eval("cmds.text('input%s', align='right', w=150, h=26, label='%s: ')"%(nameSpace, nameSpace))
eval("cmds.textField('output%s', w=150, h=26, text='%s')"%(nameSpace, nameSpace))
eval("cmds.button('output%s', w=26, h=26, label='...')"%(nameSpace))
if outputNameSpaces:
cmds.popupMenu(button=1)
for loopOutput in outputNameSpaces:
cmds.menuItem ("menu%s"%loopOutput, label=str(loopOutput), command=lambda x, loopOutput=loopOutput, nameSpace=nameSpace, *args: self.setOutputValue(loopOutput, nameSpace))
cmds.setParent( '..' )
cmds.button(label="Paste Animation in Place", command=lambda *args: self.remapAndPasteAnimation(animData, inputNameSpaces, pasteInPlace=True))
cmds.button(label="Paste Original Animation", command=lambda *args: self.remapAndPasteAnimation(animData, inputNameSpaces, pasteInPlace=False))
cmds.showWindow( window )
def setOutputValue(self, output, nameSpace):
cmds.textField('output%s'%nameSpace, edit=True, text=str(output))
def remapAndPasteAnimation(self, animData, nameSpaces, pasteInPlace):
separator = ":"
for loopNameSpace in nameSpaces:
nameSpace = loopNameSpace[:-1]
input = nameSpace
output = cmds.textField('output%s'%nameSpace, query=True, text=True)
animStr = str(animData)
animData = eval(animStr.replace("%s%s"%(input, separator), "%s%s"%(output, separator)))
self.pasteAnimation(animData, pasteInPlace)