Tiny Python Scripts
Here is an ever expanding collection of small yet useful Python scripts for Nuke:
Show all Plugin Paths
1 | nuke.pluginPath() |
Random Card X Pos
1 2 3 4 5 6 7 | import nuke import random for i in nuke.selectedNodes('Card2'): p = i['translate'].getValue() p = p[2] t = [random.randint(1,101),0,p] i['translate'].setValue(t) |
Disable all but selected Write Nodes
1 2 3 4 5 6 7 8 9 10 | import nuke def write_off(): nodeClasses = ['Write','WriteTank'] this_write = [i for i in nuke.selectedNodes() if i.Class() in nodeClasses] those_writes = [i for i in nuke.allNodes() if i.Class() in nodeClasses] for i in those_writes: i['disable'].setValue(1) for i in this_write: i['disable'].setValue(0) write_off() |
Label for the DeepWrite Node (callback – put in init.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 | def deepName(): sel = nuke.selectedNode() Ftype = sel['file'].getValue() if sel.Class() == 'DeepWrite': Fname = Ftype Fname = os.path.basename(Fname) Fname = Fname.split('.')[0] sel['label'].setValue(Fname) elif sel.Class() != 'DeepWrite': Fname = '' else: pass nuke.addKnobChanged(deepName, nodeClass="DeepWrite") |
Scale Transforms by 20%
1 2 3 4 5 6 | def TransX(scaler): for i in nuke.selectedNodes('Transform'): ScaleX = i['scale'].getValue() ScaleX = ScaleX * scaler i['scale'].setValue(ScaleX) TransX(1.2) |
Current frame on Frame Hold creation
Written by Frank Rueter from Nukepedia – add to menu.py
1 | nuke.addOnUserCreate(lambda:nuke.thisNode()['first_frame'].setValue(nuke.frame()), nodeClass='FrameHold') |
Auto Create Directory
Written by Julien Chandelle from Nukepedia – add to menu.py
1 2 3 4 5 6 7 8 9 10 | def CreatePath(): file = nuke.filename(nuke.thisNode()) dir = os.path.dirname(file) osdir = nuke.callbacks.filenameFilter(dir) try: os.makedirs (osdir) except OSError: pass nuke.addBeforeRender(CreatePath, nodeClass = 'Write') |
Get Node Tile Colour
1 2 3 | for i in nuke.selectedNodes(): color = i['tile_color'].getValue() print int(color) |
Convert Hex colours to Nuke script values
Sites like http://paletton.com/ have a great online picker tool
1 | int('00ff0000', 16) |
PostageStamp tool 3
Same as the other one but detects anything named deNoise and changes the colour.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import nuke import os def postNamer(): for i in nuke.selectedNodes('PostageStamp'): firstInput = i.input(0) if firstInput.Class() == 'Read': Fname = nuke.filename(firstInput) Fname = os.path.basename(Fname) Fname = Fname.split('.')[0] loName = Fname.lower() elif firstInput.Class() != 'Read': Fname = '' Ilabel = firstInput['label'].getValue() FiLabel = Fname + ' ' + Ilabel if firstInput is not None: i['label'].setValue(FiLabel) i['hide_input'].setValue(1) i['tile_color'].setValue(12345678910111213) elif firstInput is not None and 'denoise' in loName: i['tile_color'].setValue(888888) else: pass #postNamer() |
GPU and Render setting dual state
A is the number in GPU version of Nuke and B is for Render only Nuke.
1 | ($gui?A:B) |
Time Offset value in Label (okay, it’s TCL)
1 | [value this.time_offset] |
Disable ‘Bookmark’ in all Backdrop Nodes
1 2 3 4 5 | for i in nuke.allNodes('BackdropNode'): try: i['bookmark'].setValue(0) except: pass |
Relative to Absolute file path converter
1 2 3 4 5 6 7 8 | import nuke import os for i in nuke.selectedNodes(): Fname = nuke.filename(i) try: i['file'].setValue(Fname) except: pass |
Postage stamp renamer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import nuke import os def postNamer(): for i in nuke.selectedNodes('PostageStamp'): firstInput = i.input(0) if firstInput.Class() == 'Read': Fname = nuke.filename(firstInput) Fname = os.path.basename(Fname) Fname = Fname.split('.')[0] elif firstInput.Class() != 'Read': Fname = '' Ilabel = firstInput['label'].getValue() FiLabel = Fname + ' ' + Ilabel if firstInput is not None: i['label'].setValue(FiLabel) i['hide_input'].setValue(1) i['tile_color'].setValue(12345678910111213) else: pass postNamer() |
Set Label in Tracker to current Transform Type (add to init.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def Tlabel(): try: sel = nuke.selectedNode() Ttype = sel['transform'].getValue() if Ttype == 0: sel['label'].setValue('') elif Ttype == 1: sel['label'].setValue('STABILIZE') elif Ttype == 2: sel['label'].setValue('STABILIZE 1pt') elif Ttype == 3: sel['label'].setValue('MATCH-MOVE') elif Ttype == 4: sel['label'].setValue('MATCH-MOVE 1pt') elif Ttype == 5: sel['label'].setValue('REMOVE JITTER') elif Ttype == 6: sel['label'].setValue('ADD JITTER') else: pass except: pass nuke.addKnobChanged(Tlabel, nodeClass="Tracker4") |
Delete everything except Read Nodes
1 2 3 | for i in nuke.allNodes(): if i.Class() != 'Read': nuke.delete(i) |
Controls for enabling/disabling RSMB nodes in GUI and render
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import nuke def disableGui( nodetype ): for a in nodetype: a['disable'].setExpression('$gui') def enableGui( nodetype ): for a in nodetype: a['disable'].clearAnimated() a['disable'].setValue(0) def disableRender( nodetype ): for a in nodetype: a['disable'].clearAnimated() a['disable'].setValue(1) def menu(): nodeArray = [] p = nuke.Panel('RSMB GUI controls') p.addEnumerationPulldown('RSMB GUI', 'Enabled Disabled_GUI Disabled_Render') p.addBooleanCheckBox('selected Nodes Only', False) p.show() if p.value('selected Nodes Only') == True: nodeArray = nuke.selectedNodes('OFXcom.revisionfx.rsmb_v3') else: nodeArray = nuke.allNodes('OFXcom.revisionfx.rsmb_v3') if p.value('RSMB GUI') == 'Enabled': enableGui( nodeArray ) elif p.value('RSMB GUI') == 'Disabled_GUI': disableGui( nodeArray ) elif p.value('RSMB GUI') == 'Disabled_Render': disableRender( nodeArray ) menu() |
Random colour on selected nodes (okay maybe not super useful but you never know!)
1 2 3 4 5 6 7 8 9 10 11 12 | import random def totesRandom(): r = (float(random.randint( 20, 40)))/100 g = (float(random.randint( 10, 50)))/100 b = (float(random.randint( 15, 60)))/100 hexColour = int('%02x%02x%02x%02x' % (r*255,g*255,b*255,1),16) hexColour = hexColour +11010000 return hexColour for a in nuke.selectedNodes(): a['tile_color'].setValue(totesRandom()) |
Copy a ‘Read’ node path to clipboard from selection and convert it to work in Windows.
Now works with Nuke 11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import os import nuke try: nuke.NUKE_VERSION_MAJOR < 11 import PySide.QtGui as QtGuiWidgets except: nuke.NUKE_VERSION_MAJOR >= 11 import PySide2.QtWidgets as QtGuiWidgets def run(): if len(nuke.selectedNodes()) == 1: clipboard = QtGui.QApplication.clipboard() if nuke.selectedNode().Class() == 'Read': readFile = nuke.selectedNode()['file'].getValue() readFile = readFile.replace ( '/' , '\\' ) readpath = os.path.dirname(readFile) clipboard.setText(readpath) # set clipboard else: nuke.message('Please select a read node') |
Determine Node Class
1 | nuke.selectedNode().Class() |
Copy node label to other nodes(from first selected)
1 2 3 4 5 6 7 8 | def copyLabel(): sel = nuke.selectedNodes() first = sel.pop(-1) first = first['label'].getValue() for a in sel: a['label'].setValue(first) print first copyLabel() |
Reload all ‘Read’ nodes
1 2 | for a in nuke.allNodes('Read'): a['reload'].execute() |
Disable RotoPaint Nodes in GUI
1 2 3 | if nuke.ask('Disable all RotoPaint Nodes GUI?'): for a in nuke.allNodes('RotoPaint'): a['disable'].setExpression('$gui') |
Inherit tile colour from connected node
1 2 3 4 5 6 7 | for i in nuke.selectedNodes(): firstInput = i.input(0) color = firstInput['tile_color'].getValue() if firstInput is not None: i['tile_color'].setValue(int(color)) else: pass |
Set before and after to ‘Black’ on all selected read nodes
1 2 3 | for a in nuke.selectedNodes('Read'): a['before'].setValue('black') a['after'].setValue('black') |
Print a list of the details of all selected Read nodes
1 2 3 | for a in nuke.selectedNodes(): if 'Read' in a['name'].value(): print a['file'].value() |
Delete all disabled nodes
1 2 3 4 | for a in nuke.allNodes(): if 'disable' in a.knobs(): if a['disable'].value(): nuke.delete(a) |
Instance expressions to other nodes based on selection(select linked expression node first)
1 2 3 4 5 6 7 8 9 10 11 | def exprCopy(): selection = nuke.selectedNodes() master = selection.pop(-1) for name, knob in master.knobs().items(): if knob.hasExpression(): for select in selection: target = select.knobs().get(name) if target and (target.Class() == knob.Class()): target.fromScript(knob.toScript(False)) exprCopy() |
Set frame range to selected ‘Write’ nodes from 1-170 frames:
1 2 3 4 | for a in nuke.selectedNodes('Write'): a['use_limit'].setValue(1) a['first'].setValue(1) a['last'].setValue(170) |
Set blur size on all selected ‘Blur’ nodes to match first selected ‘Blur’ Node (and it’s node colour):
1 2 3 4 5 6 7 8 9 | def copyBlur(): selection = nuke.selectedNodes() master = selection[-1] for i in selection: if i.Class() =='Blur': i.knob('tile_color').setValue(master.knob('tile_color').value()) i.knob('size').setValue(master.knob('size').value()) copyBlur() |
Copy colour from ‘Backdrop Node’ to other selected
1 2 3 4 5 6 7 8 | def copyColor(): selection = nuke.selectedNodes() master = selection[-1] for i in selection: if i.Class() =='BackdropNode': i.knob('tile_color').setValue(master.knob('tile_color').value()) copyColor() |
Set ‘clip to’ to ‘bbox’ for selected ‘Roto’ nodes:
1 2 | for a in nuke.selectedNodes('Roto'): a['cliptype'].setValue(1) |