While in Maya user mode(with GUI interface), the following script would work
import maya.cmds as cmds
import maya.mel as mel
cmds.currentTime(1)
mel.eval('zCache -clear')
cmds.playbackOptions(ps=0,l="once", min=1, max=20, by=1)
cmds.play(state=True, forward=True)
cmds.evalDeferred("mel.eval('zCache -save \"D:/tmp/zCacheTest.ziva\";')")
However, this would not work in mayapy
batch. I am guessing play
command doesn't refresh normally in mayapy
batch. So I switch to currentTime
command, but zCache would not save, and return warning. The cache file was generated, but only 1KB.
#sFrame =1, eFrame =20
for i in range(sFrame, eFrame+1, 1):
cmds.currentTime(i)
cmds.evalDeferred("mel.eval('zCache -save \"D:/tmp/zCacheTest.ziva\"')")
#Warning: ziva 2018-01-22 15:38:49.014 WARN| Cannot advance more than one frame -zSolver1Shape
#Warning: ziva 2018-01-22 15:38:49.023 WARN| Cache saved to D:/tmp/zCacheTest.ziva, but nothing was written. No cached frames in range
To make this work, I ended up saving cache every frame. Is this intended? Is there a way to save cache just once at the end of caching to save some I/O time.
#sFrame =1, eFrame =20
for i in range(sFrame, eFrame+1, 1):
cmds.currentTime(i)
cmds.evalDeferred("mel.eval('zCache -save \"D:/tmp/zCacheTest.ziva\"')")