[Python] undoInfo chunk write is not working


#1

Hi! I have a problem with my Python script - for some reasons I can’t make my script undoable. Any advice?

import maya.cmds as cmds
import random as random
import math as math

getSelectedCurves = []
getDuplicatedObjects = []
getSelectedShaders = []
seed_radius = 0
seed_mats = 0
seed_inst = 0

cmds.undoInfo( state=True, infinity=True )

def bake_curves(*args):
	objects = cmds.ls(sl=True)
	del getSelectedCurves[:]
	for item in objects:
		getSelectedCurves.append(item)
	print getSelectedCurves

def bake_duplicated_objs(*args):
	dups = cmds.ls(sl=True)
	del getDuplicatedObjects[:]
	for item in dups:
		getDuplicatedObjects.append(item)
	print getDuplicatedObjects
	
def bake_shaders(*args):
	shaders = cmds.ls(sl=True)
	del getSelectedShaders[:]
	for item in shaders:
		getSelectedShaders.append(item)
	print getSelectedShaders

def path_attach(scalemin, scalemax):
	dupsCount = len(getDuplicatedObjects)
	shaderCount = len(getSelectedShaders)
	cmds.undoInfo(openChunk=True, cn="Placement")  # Here undo chunk must start
	for item in getSelectedCurves:
		randScale = random.uniform( scalemin, scalemax )
		randShader = random.uniform( 0, shaderCount )
		mat_idx = int(randShader)
		randNumber = random.uniform(0,dupsCount)
		inst_idx = int(randNumber)
		
		instancedObj = cmds.instance(getDuplicatedObjects[inst_idx])
		cmds.scale(randScale, randScale, randScale, instancedObj)
		
		#set arnold parameters
		
		cmds.setAttr(item+".aiRenderCurve", 1)
		cmds.setAttr(item+".aiCurveWidth", randScale)
		cmds.setAttr(item+".aiMode", 1)
		#node_to_dicsonnect = cmds.connectionInfo(item+".aiCurveShader", sourceFromDestination = True)
		try:
			cmds.connectAttr(getSelectedShaders[mat_idx]+".outColor", item+".aiCurveShader", force=True)
		except:
			pass
		maxval = cmds.getAttr( item+".maxValue" )
		cmds.undoInfo(swf=False)
		pathanim = cmds.pathAnimation( instancedObj, curve=item, follow = 1, ua="z", fa="y",su=maxval )		
		cmds.disconnectAttr(pathanim+"_uValue.output", pathanim+".uValue")
		cmds.undoInfo(swf=True)
	cmds.undoInfo(closeChunk=True) # And here it must end.
			  
def UI():
	cmds.window('Rand That Shader!', mxb=False, sizeable=False)
	cmds.frameLayout('Controls', borderStyle = 'in', w=400)
	cmds.columnLayout(w=150)
	cmds.button("Bake Curves", w=150, h=35, align='center',c=bake_curves)
	cmds.button("Bake Shader", w=150, h=35, align='center', c=bake_shaders)
	cmds.button("Bake Duplicated Objs", w=150, h=35, align='center', c=bake_duplicated_objs)
	cmds.button('Path Attach', w=150, h=35, align='center',backgroundColor=[0.992, 0.776, 0.517], c='PathDuplicator.path_attach(scalemin,scalemax)') #
	cmds.setParent('..')
	cmds.showWindow()

#2

All MEL and Python commands are undoable by default as far as I know.
Commands between cmds.undoInfo(swf=False) and cmds.undoInfo(swf=True) will be non-undoable.
When you call only one process in a button call like you did, you dont need to use openChunk and closeChunk since they will be falled into single chunk anyway.
cmds.undoInfo( state=True, infinity=True ) seems to be also a not necessary.