Source code for the_silo.scripts.multichannel

import os
import math


[docs]def shuffle(width=4096, height=4096): """ For either selected read nodes in the compositing script, shuffle out all channels contained and create a write node for each channel. :param width: Contact sheet width :type width: int :param height: Contact sheet height :type height: int """ exr_data = { 'channels': 'rgb', 'file_type': 'exr', 'datatype': '16 bit half', 'compression': 'Zip (1 scanline)', 'reading': True } import nuke for read in nuke.selectedNodes(): if read.Class() != 'Read': continue shuffle_nodes = [] for layer in nuke.layers(read): shuffle = nuke.nodes.Shuffle(name='shuffle_{0}'.format(layer), inputs=[read]) shuffle['in'].setValue(layer) shuffle['alpha'].setValue('black') shuffle_nodes.append(shuffle) write = nuke.nodes.Write(name='write_{0}'.format(layer), inputs=[shuffle]) write['file'].setValue('{0}.{1}.exr'.format( read['file'].value().replace('.exr', ''), layer)) write['file_type'].setValue(exr_data['file_type']) for attr, value in exr_data.iteritems(): write[attr].setValue(value) contact = nuke.nodes.ContactSheet(inputs=shuffle_nodes) contact['width'].setValue(width) contact['height'].setValue(height) sqrt = math.ceil(math.sqrt(len(shuffle_nodes))) contact['rows'].setValue(sqrt) contact['columns'].setValue(sqrt) contact_write = nuke.nodes.Write(name='write_{0}_contact_sheet'.format( layer), inputs=[contact]) contact_write['file'].setValue('{0}.ContactSheet.exr'.format( read['file'].value().replace('.exr', ''))) for attr, value in exr_data.iteritems(): contact_write[attr].setValue(value)
[docs]def create(): """ For a selected group of read nodes from the same rendering process (i.e. same naming pattern, using "." as a separator for Render Elements), create a multichannel EXR. """ def is_number(value): """ Check if a value is a number by trying to cast it as an integer :param value: Input value to check :type: any """ try: int(value) return True except ValueError: return False exr_data = { 'channels': 'all', 'file_type': 'exr', 'datatype': '16 bit half', 'compression': 'Zip (1 scanline)', 'reading': True } copy_data = { 'from0': 'red', 'to0': '{0}.red', 'from1': 'green', 'to1': '{0}.green', 'from2': 'blue', 'to2': '{0}.blue', 'from3': 'none', 'to3': 'none' } import nuke if not nuke.selectedNodes(): return passes = [] rgba = None for node in nuke.selectedNodes(): if node.Class() != 'Read': continue fp_base = os.path.basename(node['file'].value()) split_vals = fp_base.split('.') if len(split_vals) > 2 and not is_number(split_vals[-2]): passes.append(node) else: rgba = node last_copy = None for pass_read in sorted(passes, key=lambda x: os.path.basename(x['file'].value()).split('.')[-2].lower()): pass_name = os.path.basename(pass_read['file'].value()).split('.')[-2] nuke.Layer(pass_name, ['{0}.red'.format(pass_name), '{0}.green'.format(pass_name), '{0}.blue'.format(pass_name)]) if not last_copy: copy = nuke.nodes.Copy(name='copy_{0}'.format(pass_name), inputs=[rgba, pass_read]) last_copy = copy else: copy = nuke.nodes.Copy(name='copy_{0}'.format(pass_name), inputs=[last_copy, pass_read]) last_copy = copy for attr, value in copy_data.iteritems(): copy[attr].setValue(value.format(pass_name)) write = nuke.nodes.Write(name='multichannel_write', inputs=[last_copy]) write['file'].setValue(rgba['file'].value().replace('.exr', '_multichannel.exr')) for attr, value in exr_data.iteritems(): write[attr].setValue(value)