| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 | 
							- ########################################################################
 - ###   PROXY TOOLS 1.0
 - ###   by Brian Willard
 - ###   mybikeislost@gmail.com
 - ###
 - ###   Generates reformat and write nodes for rendering proxies on a farm
 - ###   option to process all read nodes, selected read nodes, or all quicktime files in a script 
 - ###   reads metadata to determine filetype to handle quicktime files with and without and extension.
 - ###   process sequences proxy subfolders
 - ###   option to create a read node that reflects the new proxy/fullres path
 - ###   TODO: add support for r3d files
 - ###          
 - ###
 - ########################################################################
 - 
 - import re
 - import os
 - import sys
 - import nuke
 - import nukescripts
 - def proxyTools():
 - 
 -     def _buildPROXIES(selection, processPlates, createRead, formatFullVal, formatProxyVal, formatProxySizeVal):
 -         print '\n######## PROXYTOOLS Variables ########\n'
 -         print 'selection: ' +selection
 -         print 'processPlates: ' +processPlates
 -         print 'createRead: ' +str(createRead)
 -         print 'formatFullVal: ' +formatFullVal
 -         print 'formatProxyVal: ' +formatProxyVal
 -         print 'formatProxySizeVal: ' +formatProxySizeVal
 -         print '\n###############################\n'
 -         
 -         ### Figure out what we're rendering and build a list (all, selected, quicktime)
 -         readlist = []                  
 -         if selection ==('selected'):
 -             readlist= [i for i in nuke.selectedNodes() if i.Class() =='Read'] 
 -             if readlist ==[]:
 -                 nuke.message('no Read nodes selected!')
 -                 return
 -         if selection == ('all'):
 -             readlist= [i for i in nuke.allNodes() if i.Class() =='Read']
 -         if selection == ('quicktime'):
 -             readlist = [i for i in nuke.allNodes() if i.metadata('input/filereader') == 'QuickTime']
 - 
 -         ### Figure out if we're rendering fullres, proxies, or both    
 -         if processPlates == 'both':
 -             processProxy = True
 -             processFull = True
 -             print 'rendering Proxy and FullRes'
 -         if processPlates == 'proxy':
 -             processFull = False
 -             processProxy = True
 -             print 'rendering Proxy only'
 -         if processPlates == 'full':
 -             processFull = True
 -             processProxy = False
 -             print 'rendering FullRes only'
 -    
 -       
 -         if sys.platform.startswith('win'): 
 -             pathslash = ('\\')
 -         else:
 -             pathslash = ('/') 
 - 
 -         for i in readlist:
 - 
 -             curNode = i
 -             truncpath = i.knob('file').value().rfind(pathslash)
 -             truncfile = i.knob('file').value().rfind('.mov')
 -             dirpath = i.knob('file').value()[:truncpath]
 -             print '\n######## Begin ' +i.name() + ' ########\n'            
 - 
 -     
 -             ### Get filename and padding info from source knob
 -             if i.metadata('input/filereader') == 'QuickTime':
 -                filetype='quicktime'
 -                filepath = i.knob('file').getValue('fileName')
 - 
 -                filename = os.path.splitext(i.knob('file').getValue('fileName').split(pathslash)[-1])[-2]
 -                padding = 4
 -                print 'source file is a quicktime ' 
 -                fullFmt = str(int((i.format().width()))) +'x' +str(int((i.format().height())))
 -                print 'filepath: ' +filepath
 -                print 'filename: ' +filename
 -                print 'fullFmt: ' +fullFmt
 -                resFolder = False
 -     
 -             else:
 -                 filetype='imgSequence' 
 -                 filepath = i.knob('file').getValue('fileName')
 -                 filename =(i.knob('file').getValue('fileName')).split('.')[-3].split(pathslash)[-1]
 -                 parentfolder = (i.knob('file').getValue('fileName')).split('.')[-3].split(pathslash)[-2]
 -                 fullFmt = str(int((i.format().width()))) +'x' +str(int((i.format().height())))
 -                 print 'source file is an image sequence'
 -                 print 'filepath: ' +filepath
 -                 print 'filename: ' +filename
 -                 print 'parentfolder: ' +parentfolder
 -                 print 'fullFmt: ' +fullFmt
 -                 if parentfolder == fullFmt:
 -                     resFolder = True
 -                     print 'we are in a resolution folder, rendering 1 level up'
 -                     dirpath = os.sep.join(dirpath.split(pathslash)[:-1])
 -                     print 'adjusted output path is: ' +dirpath
 -                 else:
 -                     resFolder = False
 -                     print 'fullres not in a format folder, creating sub folders'
 -                     #print 'adjusted output path is: ' +dirpath
 -                 
 -                 number = re.search('(%+\d+d)|(#+)|(%d)' , filepath) 
 -                 if number:
 -                     padding = len(number.group(1)) 
 -                 path = i.knob('file').value()
 -                 if path.find('rnd'):
 -                     os.path.basename(path)
 -     
 -             foldername = filename + '_IMG'   
 - #            try:
 - #                os.mkdir(dirpath +pathslash +foldername)
 - #            except OSError:            pass
 -     
 -             ######################################################
 -             ###   BUILD PROXY
 -             ###   FILTER TYPES BY PROXY RASTER: Full (Impulse), half (Cubic), quarter (Cubic)
 -             ###
 -             ######################################################
 -             if processProxy == True:
 -     
 -                 ### CREATE FORMAT
 -                 m = nuke.createNode('Reformat', inpanel = False)
 -                 m.setInput(0,i)
 -                 m.setXYpos((int(i.knob('xpos').value())), (int(i.knob('ypos').value())+125))
 - 
 -                 m.knob('type').setValue('scale')
 -                 if formatProxySizeVal ==('full'):
 -                     sizeVal = 1.0
 -                     m.knob('filter').setValue('Impulse')
 -                 elif formatProxySizeVal ==('half'):
 -                     sizeVal = 0.5
 -                     m.knob('filter').setValue('Cubic')
 -                 elif formatProxySizeVal ==('quarter'):
 -                     sizeVal = 0.25
 -                     m.knob('filter').setValue('Cubic')   
 -                 m.knob('scale').setValue(sizeVal)             
 -                 m.knob('label').setValue('Filter: '+ m.knob('filter').value()+ '\nProxy Size: ' +formatProxySizeVal)
 -             
 -                 ### CREATE WRITE
 -                 
 -                 n = nuke.createNode('Write', inpanel=False)
 -                 n.setXYpos((int(m.knob('xpos').value())), (int(m.knob('ypos').value())+50))
 - 
 -                 proxyFmt = str(int((i.format().width())*sizeVal)) +'x' +str(int((i.format().height())*sizeVal)) 
 -                 print 'proxyFmt: ' +proxyFmt
 -                 if formatProxyVal ==('exr'):
 -                     if resFolder == True:
 -                         n.knob('file').setValue(dirpath +pathslash +proxyFmt +pathslash + filename +'.' + '%0'+str(padding)+'d.exr')
 -                     else:
 -                         n.knob('file').setValue(dirpath +pathslash + foldername +pathslash +proxyFmt +pathslash + filename +'.' + '%0'+str(padding)+'d.exr')
 -                     n.knob('file_type').setValue('exr')
 -                     n.knob('channels').setValue('all')
 -                     n.knob('colorspace').setValue(int(i.knob('colorspace').getValue()))
 -                     n.knob('premultiplied').setValue(i.knob('premultiplied').value())
 -                     n.knob('raw').setValue(i.knob('raw').value())
 -                     n.knob('stereo').setValue(False)
 -                 elif formatProxyVal ==('jpeg'):
 -                     n.knob('file_type').setValue('jpeg')
 -                     n.knob('channels').setValue('all')
 -                     n.knob('_jpeg_quality').setValue(0.97)
 -                     if resFolder == True:
 -                         n.knob('file').setValue(dirpath +pathslash +proxyFmt +pathslash + filename +'.' + '%0'+str(padding)+'d.jpg')
 -                     else:
 -                         n.knob('file').setValue(dirpath +pathslash + foldername +pathslash +proxyFmt +pathslash + filename +'.' + '%0'+str(padding)+'d.jpg')
 -                 n.knob('disable').setExpression('!inrange(frame, '+ str(i.knob('first').value()) + ', ' + str(i.knob('last').value()) + ')',0)
 -                 n.knob('label').setValue('PROXY \n Format: ' + proxyFmt)
 -                 print 'Proxy output: ' +n.knob('file').getValue()
 -    
 -              
 -             ######################################################
 -             ###   BUILD FULL RES
 -             ###
 -             ###
 -             ######################################################
 -     
 -             #move 'dot' up in DAG
 - 
 -             if processFull == True:
 -                 d = nuke.createNode('Dot', inpanel=False)
 -                 d.setInput(0,i)
 -                 d.setXYpos((int(i.knob('xpos').value())+160), (int(i.knob('ypos').value())+45))
 -                 o = nuke.createNode('Write', inpanel=False)
 -                 o.setInput(0,d)
 -                 o.setXYpos((int(d.knob('xpos').value()-33)), (int(d.knob('ypos').value())+120))
 -                 fullFmt = str(o.format().width()) +'x' +str(o.format().height()) 
 -                 if formatFullVal ==('exr'):
 -                     o.knob('file_type').setValue('exr')
 -                     o.knob('channels').setValue('all')
 -                     o.knob('colorspace').setValue(int(i.knob('colorspace').getValue()))
 -                     o.knob('premultiplied').setValue(i.knob('premultiplied').value())
 -                     if resFolder == True:
 -                         o.knob('file').setValue(dirpath+pathslash +fullFmt +pathslash + filename +'.' + '%0'+str(padding)+'d.exr')
 - 
 -                     else:
 -                         o.knob('file').setValue(dirpath+pathslash + foldername +pathslash +fullFmt +pathslash + filename +'.' + '%0'+str(padding)+'d.exr')
 -                     o.knob('raw').setValue(i.knob('raw').value())
 -                     o.knob('stereo').setValue(False)
 -                 elif formatFullVal ==('jpeg'):
 -                     o.knob('file_type').setValue('jpeg')
 -                     o.knob('channels').setValue('all')
 -                     o.knob('_jpeg_quality').setValue(0.97)
 -                     o.knob('file').setValue(dirpath+pathslash + foldername +pathslash +fullFmt  +pathslash + filename +'.' + '%0'+str(padding)+'d.jpg')
 -                 o.knob('label').setValue('FULL \n Format: [value format.w]x[value format.h]')
 -                 o.knob('disable').setExpression('!inrange(frame, '+ str(i.knob('first').value()) + ', ' + str(i.knob('last').value()) + ')',0)
 -                 print 'FullRes output: ' +o.knob('file').getValue()
 -     
 -     
 -             ######################################################
 -             ### CREATE READ FROM OUR PROXY/FULL RASTER RENDERS
 -             ###
 -             ###
 -             ######################################################
 -             if createRead == True:
 -                 p = nuke.createNode('Read', inpanel = False)
 -                 print '\n#### generating ' +p.name() +'####\n'
 - 
 -                 if processFull== True:
 -                     p.knob('file').setValue((o.knob('file').getValue('fileName')))
 -                 else:
 -                     p.knob('file').setValue((i.knob('file').getValue('fileName')))
 -                 print 'file path: ' +p.knob('file').getValue('fileName')
 - 
 -                 if processProxy == True:
 -                     p.knob('proxy').setValue((n.knob('file').getValue('fileName')))
 -                     print 'proxy path: '  +p.knob('proxy').getValue('fileName')
 -                 p.knob('first').setValue(int(i.knob('first').value()))
 -                 p.knob('last').setValue(int(i.knob('last').value()))
 -                 p.knob('first').setValue(int(i.knob('origfirst').value()))
 -                 p.knob('origlast').setValue(int(i.knob('origlast').value()))
 -                 p.setXYpos((int(i.knob('xpos').value())), (int(i.knob('ypos').value())+300))
 - 
 -             print '\n######## Finished ' +i.name() + ' ########\n'            
 - 
 -     class ProxyToolsPanel(nukescripts.PythonPanel):
 -         def __init__(self):
 -             nukescripts.PythonPanel.__init__(self, 'Proxy Tools v1.0', 'com.mybikeislost.ProxyTools')
 -     
 -             ### Create KNOBS
 -             self.processSelectionKnob = nuke.Enumeration_Knob('processSelection', 'Process Reads:', ['all', 'selected', 'quicktime'])
 -             self.processPlatesKnob = nuke.Enumeration_Knob('processPlates', 'Process Plates:', ['both', 'full', 'proxy'])
 -             self.createReadKnob = nuke.Boolean_Knob('create write node with our full/proxy paths from above', 'Create Read')
 -             self.dividerKnob = nuke.Text_Knob('div name','','')
 -             self.formatFullKnob = nuke.Enumeration_Knob('format', 'Full Res Format', ['exr', 'jpeg'])
 -             self.dividerKnob2 = nuke.Text_Knob('div name','','')
 -             self.formatProxyKnob = nuke.Enumeration_Knob('proxy_Format', 'Proxy Format:', ['jpeg', 'exr'])
 -             self.proxySizeKnob = nuke.Enumeration_Knob('proxy_Size', 'Proxy Size:', ['half', 'full', 'quarter'])
 -             self.dividerKnob3 = nuke.Text_Knob('div name','','')
 -     
 -             ### ADD KNOBS
 -             for k in ( self.processSelectionKnob, self.processPlatesKnob, self.createReadKnob, self.dividerKnob, self.formatFullKnob, self.dividerKnob2, self.formatProxyKnob, self.proxySizeKnob, self.dividerKnob3 ):
 -                 self.addKnob( k )
 -     
 -         def showModalDialog(self):
 -             result = nukescripts.PythonPanel.showModalDialog(self)
 -             if result:
 -                 selection = str(self.processSelectionKnob.value())
 - 
 -                 processPlates = str(self.processPlatesKnob.value())
 -                 createRead = self.createReadKnob.value()
 -                 formatFullVal =str(self.formatFullKnob.value())
 -                 formatProxyVal = self.formatProxyKnob.value()
 -                 formatProxySizeVal = str(self.proxySizeKnob.value())
 - 
 - 
 -                 _buildPROXIES(selection, processPlates, createRead, formatFullVal, formatProxyVal, formatProxySizeVal)
 -  
 -     def showProxyTools():
 -         ProxyToolsPanel().showModalDialog()
 -     showProxyTools()
 - 
 
 
  |