initial support for template in output base path and slots
parent
ad083e45b6
commit
de66ed85ba
47
fn.py
47
fn.py
|
@ -1930,6 +1930,7 @@ def connect_to_file_output(node_list, file_out=None, base_path='', excludes=None
|
||||||
if not fo:
|
if not fo:
|
||||||
# color = (0.2,0.3,0.5)
|
# color = (0.2,0.3,0.5)
|
||||||
fo = create_node('CompositorNodeOutputFile', tree=scene.node_tree, location=(real_loc(node)[0]+500, real_loc(node)[1]+50), width=600)
|
fo = create_node('CompositorNodeOutputFile', tree=scene.node_tree, location=(real_loc(node)[0]+500, real_loc(node)[1]+50), width=600)
|
||||||
|
fo.inputs.remove(fo.inputs[0]) # Remove default image input
|
||||||
if file_format:
|
if file_format:
|
||||||
for k, v in file_format.items():
|
for k, v in file_format.items():
|
||||||
setattr(fo.format, k, v)
|
setattr(fo.format, k, v)
|
||||||
|
@ -1952,11 +1953,21 @@ def connect_to_file_output(node_list, file_out=None, base_path='', excludes=None
|
||||||
if next((l for l in o.links if recursive_node_connect_check(l, fo)), None):
|
if next((l for l in o.links if recursive_node_connect_check(l, fo)), None):
|
||||||
continue
|
continue
|
||||||
slot_name = bpy.path.clean_name(o.name)
|
slot_name = bpy.path.clean_name(o.name)
|
||||||
if fo.format.file_format == 'OPEN_EXR_MULTILAYER':
|
# if fo.format.file_format == 'OPEN_EXR_MULTILAYER':
|
||||||
slot_name = slot_name
|
# slot_name = slot_name
|
||||||
else:
|
# else:
|
||||||
slot_name = f'{slot_name}/{slot_name}_'
|
# slot_name = f'{slot_name}/{slot_name}_'
|
||||||
fo.file_slots.new(slot_name)
|
# fo.file_slots.new(slot_name)
|
||||||
|
fs = fo.file_slots.new('tmp') # slot_name)
|
||||||
|
ls = fo.layer_slots.new('tmp') # slot_name + 'layer')
|
||||||
|
|
||||||
|
ls = fo.layer_slots[-1]
|
||||||
|
ls.name = slot_name
|
||||||
|
|
||||||
|
fs = fo.file_slots[-1]
|
||||||
|
fs.path = f'{slot_name}/{slot_name}_' # Error 'NodeSocketColor' object has no attribute 'path'
|
||||||
|
|
||||||
|
|
||||||
out_input = fo.inputs[-1]
|
out_input = fo.inputs[-1]
|
||||||
links.new(o, out_input)
|
links.new(o, out_input)
|
||||||
|
|
||||||
|
@ -1972,6 +1983,7 @@ def connect_to_file_output(node_list, file_out=None, base_path='', excludes=None
|
||||||
if not fo:
|
if not fo:
|
||||||
# color = (0.2,0.3,0.5)
|
# color = (0.2,0.3,0.5)
|
||||||
fo = create_node('CompositorNodeOutputFile', tree=scene.node_tree, location=(real_loc(node)[0]+400, real_loc(node)[1]-200), width=220)
|
fo = create_node('CompositorNodeOutputFile', tree=scene.node_tree, location=(real_loc(node)[0]+400, real_loc(node)[1]-200), width=220)
|
||||||
|
fo.inputs.remove(fo.inputs[0]) # Remove default image input
|
||||||
if file_format:
|
if file_format:
|
||||||
for k, v in file_format.items():
|
for k, v in file_format.items():
|
||||||
setattr(fo.format, k, v)
|
setattr(fo.format, k, v)
|
||||||
|
@ -2001,17 +2013,22 @@ def connect_to_file_output(node_list, file_out=None, base_path='', excludes=None
|
||||||
|
|
||||||
slot_name = bpy.path.clean_name(o.name) # directly use name in multi layer exr
|
slot_name = bpy.path.clean_name(o.name) # directly use name in multi layer exr
|
||||||
|
|
||||||
if fo.format.file_format == 'OPEN_EXR_MULTILAYER':
|
# if fo.format.file_format == 'OPEN_EXR_MULTILAYER':
|
||||||
slot_name = slot_name
|
# slot_name = slot_name
|
||||||
else:
|
# else:
|
||||||
slot_name = f'{slot_name}/{slot_name}_'
|
# slot_name = f'{slot_name}/{slot_name}_'
|
||||||
fo.file_slots.new(slot_name)
|
# fo.file_slots.new(slot_name)
|
||||||
|
|
||||||
|
# Setting both file_slots and layer_slots...
|
||||||
|
fs = fo.file_slots.new('tmp')
|
||||||
|
ls = fo.layer_slots.new('tmp')
|
||||||
|
|
||||||
|
ls = fo.layer_slots[-1]
|
||||||
|
ls.name = slot_name
|
||||||
|
|
||||||
|
fs = fo.file_slots[-1]
|
||||||
|
fs.path = f'{slot_name}/{slot_name}_' # Error 'NodeSocketColor' object has no attribute 'path'
|
||||||
|
|
||||||
## Setting both file_slots and layer_slots...
|
|
||||||
# fs = fo.file_slots.new(slot_name)
|
|
||||||
# fs.path = f'{slot_name}/{slot_name}_' # Error 'NodeSocketColor' object has no attribute 'path'
|
|
||||||
# ls = fo.layer_slots.new(slot_name)
|
|
||||||
# ls.name = slot_name
|
|
||||||
|
|
||||||
out_input = fo.inputs[-1]
|
out_input = fo.inputs[-1]
|
||||||
links.new(o, out_input)
|
links.new(o, out_input)
|
||||||
|
|
|
@ -50,7 +50,30 @@ def add_rlayer(layer_name, scene=None, node_scene=None, location=None, color=Non
|
||||||
comp.show_preview = False
|
comp.show_preview = False
|
||||||
return comp
|
return comp
|
||||||
|
|
||||||
def connect_render_layer(rlayer, ng=None, out=None, frame=None):
|
# FIXME (Maybe just use "base_path")
|
||||||
|
|
||||||
|
def connect_render_layer(rlayer, ng=None, out=None, frame=None,
|
||||||
|
base_path='//render/{object}', file_slot='{gplayer}/{gplayer}_',
|
||||||
|
multi_base_path='//render/{object}/{object}_', layer_slot='{gplayer}'
|
||||||
|
):
|
||||||
|
'''Connect a render layer node to a fileoutput
|
||||||
|
Return existing or created nodegroup and file output nodes
|
||||||
|
|
||||||
|
Args:
|
||||||
|
rlayer (node): the renderlayuer node to connect
|
||||||
|
ng (node, optional): Nodegroup to connect to if given
|
||||||
|
out (node, optional): Fileoutput node to connect to if given
|
||||||
|
frame (node, optional): frame node to use as parent if given
|
||||||
|
|
||||||
|
base_path (str, optional): Template for base path when used with EXR
|
||||||
|
file_slot (str, optional): Template for slots when used with EXR
|
||||||
|
multi_base_path (str, optional): Template for base path when used with Multilayer EXR
|
||||||
|
layer_slot (str, optional): Template for slots when used with Multilayer EXR
|
||||||
|
Available keyword : {object} {gplayer}
|
||||||
|
|
||||||
|
Return:
|
||||||
|
tuple(node, node) Nodegroup node, file_output node
|
||||||
|
'''
|
||||||
|
|
||||||
node_tree = rlayer.id_data # get node_tree from rlayer
|
node_tree = rlayer.id_data # get node_tree from rlayer
|
||||||
|
|
||||||
|
@ -225,6 +248,8 @@ def connect_render_layer(rlayer, ng=None, out=None, frame=None):
|
||||||
return
|
return
|
||||||
|
|
||||||
out_name = f'OUT_{obname}' # or get output from frame
|
out_name = f'OUT_{obname}' # or get output from frame
|
||||||
|
out_base = bpy.path.clean_name(obname)
|
||||||
|
|
||||||
if not out:
|
if not out:
|
||||||
out = nodes.get(out_name)
|
out = nodes.get(out_name)
|
||||||
|
|
||||||
|
@ -232,29 +257,47 @@ def connect_render_layer(rlayer, ng=None, out=None, frame=None):
|
||||||
# color = (0.2,0.3,0.5)
|
# color = (0.2,0.3,0.5)
|
||||||
out = fn.create_node('CompositorNodeOutputFile', tree=node_tree, location=(fn.real_loc(ng)[0]+500, fn.real_loc(ng)[1]+50), width=600) # =(ng.location[0]+600, ng.location[1]+50)
|
out = fn.create_node('CompositorNodeOutputFile', tree=node_tree, location=(fn.real_loc(ng)[0]+500, fn.real_loc(ng)[1]+50), width=600) # =(ng.location[0]+600, ng.location[1]+50)
|
||||||
fn.set_file_output_format(out)
|
fn.set_file_output_format(out)
|
||||||
|
|
||||||
out.name = out_name
|
out.name = out_name
|
||||||
out.parent = frame
|
out.parent = frame
|
||||||
out_base = bpy.path.clean_name(obname)
|
|
||||||
if out.format.file_format == 'OPEN_EXR_MULTILAYER':
|
if out.format.file_format == 'OPEN_EXR_MULTILAYER':
|
||||||
out.base_path = f'//render/{out_base}/{out_base}_'
|
out.base_path = multi_base_path.format(object=out_base, gplayer=lname)
|
||||||
|
# out.base_path = f'//render/{out_base}/{out_base}_'
|
||||||
else:
|
else:
|
||||||
out.base_path = f'//render/{out_base}'
|
out.base_path = base_path.format(object=out_base, gplayer=lname)
|
||||||
|
# out.base_path = f'//render/{out_base}'
|
||||||
|
|
||||||
if out.format.file_format == 'OPEN_EXR_MULTILAYER':
|
if out.format.file_format == 'OPEN_EXR_MULTILAYER':
|
||||||
# Direct name in multilayer
|
# Direct name in multilayer
|
||||||
slot_name = lname
|
# slot_name = lname
|
||||||
|
slot_name = layer_slot.format(object=out_base, gplayer=lname)
|
||||||
else:
|
else:
|
||||||
# base_path/ named_folder/image_####
|
# base_path/ named_folder/image_####
|
||||||
slot_name = f'{lname}/{lname}_'
|
# slot_name = f'{lname}/{lname}_'
|
||||||
|
slot_name = file_slot.format(object=out_base, gplayer=lname)
|
||||||
|
|
||||||
## out_input = out.inputs.get(slot_name) # ok for non-numbered outputs
|
|
||||||
|
## out_input = out.inputs.get(slot_name) # Ok for non-numbered outputs
|
||||||
|
|
||||||
out_input = None
|
out_input = None
|
||||||
out_input = fn.get_numbered_output(out, slot_name)
|
out_input = fn.get_numbered_output(out, slot_name)
|
||||||
|
|
||||||
if not out_input:
|
if not out_input:
|
||||||
out.file_slots.new(slot_name)
|
## Assigning directly does not work
|
||||||
out_input = out.inputs[-1] # assigning directly above doesn't link afterwards
|
# out.file_slots.new(file_slot.format(object=out_base, gplayer=lname))
|
||||||
|
# out.layer_slots.new(layer_slot.format(object=out_base, gplayer=lname))
|
||||||
|
|
||||||
|
out.file_slots.new('file_slots_temp_name')
|
||||||
|
out.layer_slots.new('layer_slots_temp_name')
|
||||||
|
|
||||||
|
fs = out.file_slots[-1]
|
||||||
|
fs.path = file_slot.format(object=out_base, gplayer=lname)
|
||||||
|
|
||||||
|
ls = out.layer_slots[-1]
|
||||||
|
ls.name = layer_slot.format(object=out_base, gplayer=lname)
|
||||||
|
# out.file_slots.new(slot_name)
|
||||||
|
out_input = out.inputs[-1] # assigning directly as above doesn't link afterwards
|
||||||
# print(f'new filouput entry: {out_input}')
|
# print(f'new filouput entry: {out_input}')
|
||||||
|
|
||||||
# link to FileOut
|
# link to FileOut
|
||||||
|
|
Loading…
Reference in New Issue