initial support for template in output base path and slots
This commit is contained in:
		
							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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user