def testUndo( self ) : # check our custom knob undoes in the same way as # standard knobs n = nuke.createNode( "ieObject" ) n2 = nuke.createNode( "Blur" ) self.assertEqual( n.knob( "object" ).getValue(), None ) self.assertEqual( n2.knob( "size" ).getValue(), 0 ) self.assertEqual( nuke.Undo.disabled(), True ) with IECoreNuke.UndoEnabled() : self.assertEqual( nuke.Undo.disabled(), False ) with IECoreNuke.UndoBlock() : n.knob( "object" ).setValue( IECore.IntData( 10 ) ) self.assertEqual( n.knob( "object" ).getValue(), IECore.IntData( 10 ) ) n2.knob( "size" ).setValue( 10 ) self.assertEqual( n2.knob( "size" ).getValue(), 10 ) self.assertEqual( nuke.Undo.disabled(), True ) self.assertEqual( n.knob( "object" ).getValue(), IECore.IntData( 10 ) ) self.assertEqual( n2.knob( "size" ).getValue(), 10 ) nuke.undo() self.assertEqual( n2.knob( "size" ).getValue(), 0 ) self.assertEqual( n.knob( "object" ).getValue(), None )
def testUndo( self ) : # check our custom knob undoes in the same way as # standard knobs n = nuke.createNode( "ieObject" ) n2 = nuke.createNode( "Blur" ) self.assertEqual( n.knob( "object" ).getValue(), None ) self.assertEqual( n2.knob( "size" ).getValue(), 0 ) self.assertEqual( nuke.Undo.disabled(), True ) with IECoreNuke.UndoEnabled() : self.assertEqual( nuke.Undo.disabled(), False ) with IECoreNuke.UndoBlock() : n.knob( "object" ).setValue( IECore.IntData( 10 ) ) self.assertEqual( n.knob( "object" ).getValue(), IECore.IntData( 10 ) ) n2.knob( "size" ).setValue( 10 ) self.assertEqual( n2.knob( "size" ).getValue(), 10 ) self.assertEqual( nuke.Undo.disabled(), True ) self.assertEqual( n.knob( "object" ).getValue(), IECore.IntData( 10 ) ) self.assertEqual( n2.knob( "size" ).getValue(), 10 ) nuke.undo() self.assertEqual( n2.knob( "size" ).getValue(), 0 ) self.assertEqual( n.knob( "object" ).getValue(), None )
def undoRedoTest(node): import nuke # ANT: I'm unsure why we need this Undo.enable() call # The documentation gives no obvious clues, "Undoes the previous disable()" !!! # PG: The undo system is only enable when Nuke start in GUI mode. # In terminal mode it's disabled. # It's very important to to call nuke.Undo.enable() only when is needed, # other wise undo/redo an operation could be not done properly if nuke.Undo.disabled() == True: nuke.Undo.enable() # Test Flow: Create a Node > nuke.undo() > Assert No Node > nuke.redo() > Assert Node comes back as expected nuke.tprint('Creating', node) nodeToCheck = "{}1_0".format(node) originalNode = nuke.createNode("{}1_0".format(node)) numNodesBeforeUndo = len(nuke.allNodes(nodeToCheck)) nuke.tprint("Number of %s's after creation, before Undo is %s" % (node , numNodesBeforeUndo)) nuke.tprint("Calling nuke.undo()") nuke.undo() numNodesAfterUndo = len(nuke.allNodes(nodeToCheck)) nuke.tprint("Number of %s's after nuke.undo() is %s" % (node ,numNodesAfterUndo)) # First assert that the Undo has removed the node we created if numNodesAfterUndo != 0: nuke.tprint("Undo failed to remove the %s node! There were %s %s nodes after calling nuke.undo()" %(node, numNodesAfterUndo, node)) sys.exit(1) else: nuke.tprint("Asserted that Undo removed the node as expected.") nuke.tprint("Calling nuke.redo()") nuke.redo() NodesAfterRedo = nuke.allNodes(nodeToCheck) numNodesAfterRedo = len(NodesAfterRedo) nuke.tprint("Number of %s's after nuke.redo() is %s" % (node, numNodesAfterRedo)) # Second assert that the Redo put the original node back if numNodesAfterRedo != 1: nuke.tprint("Failed to Restore the %s node! There were %s %s nodes after calling nuke.undo()" % (node ,numNodesAfterUndo, node)) sys.exit(1) else: restoredNode = NodesAfterRedo[0] nuke.tprint("Asserted that Redo restored a %s node.. now assert it's the same!..." % (node)) # Third assert - the Node after Redo is identical to the original node if restoredNode != originalNode: nuke.tprint("Redo failed to restore the original %s node! (original %s, restored %s)" % (node, (str(originalNode), str(restoredNode)))) sys.exit(1) else: nuke.tprint("Asserted the restored %s node is identical the original after Redo!..." % (node)) # If we're here, we've passed all the asserts. Exit with zero exit status nuke.tprint("All tests for UndoRedoSingleNode passed. Exiting with zero exit status")
def testModifyParametersAndUndo(self): fnOH = IECoreNuke.FnOpHolder.create("mult", "maths/multiply", 2) self.assertEqual(fnOH.node().knob("parm_a").getValue(), 1) self.assertEqual(fnOH.node().knob("parm_b").getValue(), 2) with IECoreNuke.UndoEnabled(): with fnOH.parameterModificationContext() as parameters: parameters["a"].setNumericValue(10) parameters["b"].setNumericValue(20) self.assertEqual(fnOH.node().knob("parm_a").getValue(), 10) self.assertEqual(fnOH.node().knob("parm_b").getValue(), 20) nuke.undo() self.assertEqual(fnOH.node().knob("parm_a").getValue(), 1) self.assertEqual(fnOH.node().knob("parm_b").getValue(), 2)
def testModifyParametersAndUndo( self ) : fnOH = IECoreNuke.FnOpHolder.create( "mult", "maths/multiply", 2 ) self.assertEqual( fnOH.node().knob( "parm_a" ).getValue(), 1 ) self.assertEqual( fnOH.node().knob( "parm_b" ).getValue(), 2 ) with IECoreNuke.UndoEnabled() : with fnOH.parameterModificationContext() as parameters : parameters["a"].setNumericValue( 10 ) parameters["b"].setNumericValue( 20 ) self.assertEqual( fnOH.node().knob( "parm_a" ).getValue(), 10 ) self.assertEqual( fnOH.node().knob( "parm_b" ).getValue(), 20 ) nuke.undo() self.assertEqual( fnOH.node().knob( "parm_a" ).getValue(), 1 ) self.assertEqual( fnOH.node().knob( "parm_b" ).getValue(), 2 )
def NetRender(): temp = nuke.scriptSave() n = nuke.allNodes('Read') for node in n: path = node['file'].getValue() new = path[3:] newpath = '//work/stripe (s)/' + new node = node['file'].setValue(newpath) n = nuke.allNodes('Write') for node in n: path = node['file'].getValue() new = path[3:] newpath = '//work/stripe (s)/' + new node = node['file'].setValue(newpath) h = nuke.scriptSave('//Farm/mfarm/FarmRender/Render.nk') h = nuke.scriptSave('//Farm2/D/Farm2Render/Render.nk') j = nuke.undo()
def Roto_to_WarpSpline_v2(): try: rotoNode = nuke.selectedNode() if rotoNode.Class() not in ('Roto', 'RotoPaint'): if nuke.GUI: nuke.message( 'Unsupported node type. Selected Node must be Roto or RotoPaint' ) return except: if nuke.GUI: nuke.message('Select a Roto or RotoPaint Node') return #=========================================================================== # panel setup #=========================================================================== p = nukescripts.panels.PythonPanel("RotoPaint to Splinewarp") k = nuke.String_Knob("framerange","FrameRange") k.setFlag(nuke.STARTLINE) k.setTooltip("Set the framerange to bake the shapes, by default its the project start-end. Example: 10-20") p.addKnob(k) k.setValue("%s-%s" % (nuke.root().firstFrame(), nuke.root().lastFrame())) k = nuke.Boolean_Knob("pin", "Break into Pin Points") k.setFlag(nuke.STARTLINE) k.setTooltip("This will break all the shapes into single points") p.addKnob(k) k = nuke.Boolean_Knob("mt", "MultiThread") k.setFlag(nuke.STARTLINE) k.setTooltip("This will speed up the script but without an accurate progress bar") p.addKnob(k) k.setValue(True) result = p.showModalDialog() if result == 0: return # Canceled try: fRange = nuke.FrameRange(p.knobs()["framerange"].getText()) except: if nuke.GUI: nuke.message( 'Framerange format is not correct, use startframe-endframe i.e.: 0-200' ) return breakintopin = p.knobs()["pin"].value() multi = p.knobs()["mt"].value() #=========================================================================== # end of panel #=========================================================================== start_time = time.time() # task = nuke.ProgressTask('Roto to SplineWarp') rptsw_shapeList = [] global cancel cancel = False if nuke.NUKE_VERSION_MAJOR > 6: # global cancel rptsw_shapeList = [] nukescripts.node_copypaste() rotoNode = nuke.selectedNode() warpNode = nuke.createNode('SplineWarp3') warpNode.setName(rotoNode.name()+ "_" + warpNode.name()) warpCurve = warpNode['curves'] warpRoot = warpCurve.rootLayer rotoCurve = rotoNode['curves'] rotoRoot = rotoCurve.rootLayer rptsw_shapeList = rptsw_walker(rotoRoot, rptsw_shapeList) if breakintopin: breakshapesintoPin(rotoNode,fRange) rptsw_shapeList = [] rptsw_shapeList = rptsw_walker(rotoRoot, rptsw_shapeList) if cancel: return threadlist =[] n=0 task = nuke.ProgressTask( 'Roto to SplineWarp' ) bar = len(rptsw_shapeList) + 1 for shape in rptsw_shapeList: if isinstance(shape[0], nuke.rotopaint.Shape): if multi and nuke.NUKE_VERSION_MAJOR != 11: task.setMessage( 'Processing' + shape[0].name ) task.setProgress((int(n/bar*100))) threading.Thread(None, bakeShapes, args=(shape, warpNode, fRange, rotoRoot, rptsw_shapeList, task)).start() else: bakeShapes(shape, warpNode,fRange, rotoRoot, rptsw_shapeList,task) n+=1 #=========================================================================== # join existing threads (to wait completion before continue) #=========================================================================== if multi and nuke.NUKE_VERSION_MAJOR != 11: main_thread = threading.currentThread() for t in threading.enumerate(): if t is main_thread: continue t.join() warpCurve.changed() warpNode.knob('toolbar_output_ab').setValue(1) warpNode.knob('boundary_bbox').setValue(0) #======================================================================= # theres a bug on Nuke 8 where the splinewarpnode UI do not update correctly with python created curves # this is a workaround #======================================================================= nukescripts.node_copypaste() nuke.show(nuke.selectedNode()) nuke.selectedNode().knob('selected').setValue(False) #======================================================================= # end of workaround - #======================================================================= rptsw_shapeList = [] nuke.delete(rotoNode) nuke.delete(warpNode) else: nuke.message( 'This version is for Nuke v7, use v1.1 with Nuke v6.3 from Nukepedia' ) rptsw_shapeList = [] if cancel: nuke.undo() print "Time elapsed:",time.time() - start_time, "seconds"