The author of this code is Nathan Rusch. It is a fast and easy way to bake the expressions you have on your nodes. I use it on itself and also in other codes I have written.
Expand Bake Expressions
''' Bake Expressions Author: Nathan Rusch Updated: January 27, 2013 ''' import nuke def bakeExpressions(nodes=None, start=None, end=None, views=None): ''' Bakes all expression-driven Array_Knob-derived knob components to keyframes over a given input frame range and list of views. 'nodes': Optional iterable of nodes. If omitted, the current node selection will be used. 'start'/'end': Optional frame values defining the range to bake. If 'start' is omitted, the script's first frame will be used; likewise, if 'end' is omitted, the last frame of the script will be used. 'views': Optional list of views to bake. If omitted, all script views will be used. ''' if nodes is None: nodes = nuke.selectedNodes() if not nodes: nuke.message('No nodes to bake') return scriptRange = nuke.root().frameRange() if start is None: start = scriptRange.first() if end is None: end = scriptRange.last() if views is None: views = nuke.views() elif not views: nuke.message('No views to bake') return elif not set(views).issubset(nuke.views()): nuke.message('Not all views in %s exist in script' % views) return for node in nodes: for knob in node.knobs().itervalues(): if isinstance(knob, nuke.Array_Knob): for view in views: # There's currently no way to ask a knob if it has an # expression at a given view, so we have to check the # AnimationCurve objects for that. However, we can still # use knob.isAnimated() to partially optimize this. if knob.isAnimated(view=view): aSize = 1 if knob.singleValue(view) else knob.arraySize() for index in range(aSize): anim = knob.animation(index, view=view) if anim is None or anim.noExpression(): continue for f in range(start, end + 1): #knob.setValueAt(anim.evaluate(f), f, index) anim.setKey(f, anim.evaluate(f)) knob.setExpression('curve', channel=index, view=view) # Even if the expression would have evaluated to a # constant (flat) curve, we can't tell until after # it has been baked and the expression is gone. if anim.constant(): knob.clearAnimated(index, view=view) def promptAndBake(): ''' Simple GUI wrapper for the ``bakeExpressions`` function that prompts for an input frame range and view list, and always operates on the selected nodes. ''' nodes = nuke.selectedNodes() if not nodes: nuke.message('No nodes selected') return fr = nuke.getFramesAndViews("Range to Bake", str(nuke.root().frameRange())) if fr is None: return fr, v = fr try: fr = nuke.FrameRange(fr) except ValueError as e: nuke.message(str(e)) return bakeExpressions(nodes=nodes, start=fr.first(), end=fr.last(), views=v)