The best thing about posting my amateur, hacky Nuke scripts on this blog is that you, the handsome readers of this site, are often much smarter than I am, and frequently write in with enhancements or improvements to my scripts.
Such was the case, recently, with my Automated Viewer Frame Handles script. Reader and Visual Effects Supervisor Sean Danischevsky sent me this:
def set_viewer_handles(head_handles, tail_handles):
#from https://doingthatwrong.com/
# set in and out points of viewer to script range minus handle frames
# Get the node that is the current viewer
v = nuke.activeViewer().node()
# Get the first and last frames from the project settings
firstFrame = nuke.Root()['first_frame'].value()
lastFrame = nuke.Root()['last_frame'].value()
# get a string for the new range and set this on the viewer
newRange = str(int(firstFrame)+head_handles) + '-' + str(int(lastFrame) - tail_handles)
v['frame_range_lock'].setValue(True)
v['frame_range'].setValue(newRange)
# Add the commands to the Viewer Menu
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - 16f',
"set_viewer_handles(16, 16)")
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - 12f',
"set_viewer_handles(12, 12)")
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - 10f',
"set_viewer_handles(10, 10)")
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - 8f',
"set_viewer_handles(8, 8)")
In my original script, I had hard-coded the frame handle length into the function, and created duplicate functions for each of my different handle lengths. Sean, being much better at this than I am, created a single function that takes a handle length input from the function call. In his version, all that's required to add an alternative frame handle length to the menu options is to duplicate the line that adds the menu command, and change the handle length that's sent to the function. Sean also added the ability to set different head and tail handle lengths to the script.
In thanking Sean for sending me this improved version of the script, I mentioned that it seemed that he'd set up the function in a way that would make it easy to prompt users to input a handle length, should they require a custom handle that wasn't already in their menu options. To which he replied with this:
def set_viewer_range(head_handles= 10, tail_handles= 10, ask= False):
# set in and out points of viewer to script range minus handle frames
# from https://doingthatwrong.com/
# with some tweaks by Sean Danischevsky 2017
if ask:
p= nuke.Panel('Set Viewer Handles')
p.addSingleLineInput('Head', head_handles)
p.addSingleLineInput('Tail', tail_handles)
#show the panel
ret = p.show()
if ret:
head_handles= p.value('Head')
tail_handles= p.value('Tail')
else:
return
#only positive integers, please
head_handles= max(0, int(head_handles))
tail_handles= max(0, int(tail_handles))
# Get the node that is the current viewer
v = nuke.activeViewer().node()
# Get the first and last frames from the project settings
firstFrame = nuke.Root()['first_frame'].value()
lastFrame = nuke.Root()['last_frame'].value()
# get a string for the new range and set this on the viewer
newRange = str(int(firstFrame)+ head_handles) + '-' + str(int(lastFrame) - tail_handles)
v['frame_range_lock'].setValue(True)
v['frame_range'].setValue(newRange)
# Add the commands to the Viewer Menu
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - 16f',
"set_viewer_range(16, 16)")
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - 12f',
"set_viewer_range(12, 12)")
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - 10f',
"set_viewer_range(10, 10)")
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - 8f',
"set_viewer_range(8, 8)")
nuke.menu('Nuke').addCommand('Viewer/Viewer Handles - ask',
"set_viewer_range(ask= True)")
Now, in addition to the set, common handle lengths in the menu, there's now an option to prompt the user for input. The pop-up is pre-filled with a value of 10, something that can be customized, as well. It's a thing of beauty.
I'd like to thank Sean for sending me both of these scripts. He took my ugly, half-formed idea, simplified it and made it more flexible. I've already begun using his script in place of mine, and I suggest you do the same.