from __future__ import print_function class playInRV(KellerNukePlugin): def configurePlugin(self): menubar = nuke.menu('Nuke') self.m = menubar.addMenu('Workgroup') self.m.addCommand('Play in RV', 'playInRV.playInRV()') self.m.addCommand('Play in RV (append)', 'playInRV.playInRV(append=true)') def unconfigurePlugin(self): self.m.removeItem('Play in RV') self.m.removeItem('Play in RV (append)') def playInRV(node, mode): """ loads the file specified in the write node to a new or existing RV session rvlink:// -l -play /path/to/my/movie.mov attaches a tag to the rv instance which is used to append sources to the session TODO: Linux / MacOS Support TODO: Better logging """ import os import subprocess import random import nuke file = node.knobs()['file'].getValue() useshotenv = node.knobs()['useshotenv'].getValue() my_env = os.environ.copy() if useshotenv == 0: try: del my_env['PREFIX'] del my_env['SEQ'] del my_env['SHOT'] except: pass try: rvpush = my_env['RV'] + 'rvpush' print(('playInRV: Info. Using RV: %s') % rvpush) except: print('playInRV: Error. No env variable RV found. Exiting.') return try: rv_gen_workgroup = my_env['RV_GEN_WORKGROUP'] except: print('playInRV: Error. No env variable RV_GEN_WORKGROUP found. Exiting.') return try: root3d = my_env['PROJECT_ROOT_3D'] print(('playInRV: Info. Using JOB: %s') % root3d) except: print('playInRV: Warning. No env variable job found.') my_env['JOB'] = 'GEN' try: dev = my_env['DEV'] print(('playInRV: Info. Using dev: %s') % dev) except: print('playInRV: Warning. No env variable dev found. Setting pub.') my_env['DEV'] = "0" # check with default project without dev/pub structure if my_env['JOB'] == 'GEN': pass if my_env['DEV'] == "0": my_env['RV_SUPPORT_PATH'] = rv_gen_workgroup.replace('"', '').replace('\\', '/') + ';' + root3d.replace('"', '').replace('\\', '/') + '/000_env/rv/' else: my_env['RV_SUPPORT_PATH'] = rv_gen_workgroup.replace('"', '').replace('\\', '/') + ';' + root3d.replace('"', '').replace('\\', '/') + '/000_dev/rv/' print(('playInRV: Info. Using RV Workgroup: %s') % my_env['RV_SUPPORT_PATH']) if nuke.root()['colorManagement'].value().lower() != 'ocio': pass else: if nuke.root()['OCIO_config'].value() == 'custom': if nuke.root()['customOCIOConfigPath'].value() != "": my_env['OCIO'] = nuke.root()['customOCIOConfigPath'].value() else: my_env['OCIO'] = 'c:/Program Files/Nuke' + nuke.NUKE_VERSION_STRING + '/plugins/OCIOConfigs/configs/' + \ nuke.root()['OCIO_config'].value() + '/config.ocio' print(('playInRV: Info. Using OCIO config %s') % my_env['OCIO']) # check modes if mode == 0: # new RV # get a random string for a random rv id rnd = random.choice('abcdefghijklmnopqrstuvwxyz') subprocess.call([rvpush, '-tag', rnd, 'set', file], env=my_env) pass elif mode == 1: # sets / replaces the source of the connected rv subprocess.call([rvpush, '-tag', 'nukeKeller', 'set', file], env=my_env) pass elif mode == 2: # appends to the connected rv subprocess.call([rvpush, '-tag', 'nukeKeller', 'merge', file], env=my_env) pass return # test in nuke #file = nuke.toNode('Write1').knob('file').getValue() #playInRV(file, 1)