11import bpy
22
3- from bpy .types import Node
3+ from bpy .types import Node , CompositorNodeColorBalance , CompositorNodeTree
44
55from ..ntp_operator import NTP_Operator
66from ..ntp_node_tree import NTP_NodeTree
@@ -37,82 +37,102 @@ def __init__(self):
3737
3838 def _create_scene (self , indent : str ):
3939 #TODO: wrap in more general unique name util function
40- self ._write (f"{ indent } # Generate unique scene name\n " )
41- self ._write (f"{ indent } { BASE_NAME_VAR } = { str_to_py_str (self .compositor_name )} \n " )
42- self ._write (f"{ indent } { END_NAME_VAR } = { BASE_NAME_VAR } \n " )
43- self ._write (f"{ indent } if bpy.data.scenes.get({ END_NAME_VAR } ) != None:\n " )
44- self ._write (f"{ indent } \t i = 1\n " )
45- self ._write (f"{ indent } \t { END_NAME_VAR } = { BASE_NAME_VAR } + f\" .{{i:03d}}\" \n " )
46- self ._write (f"{ indent } \t while bpy.data.scenes.get({ END_NAME_VAR } ) != None:\n " )
47- self ._write (f"{ indent } \t \t { END_NAME_VAR } = { BASE_NAME_VAR } + f\" .{{i:03d}}\" \n " )
48- self ._write (f"{ indent } \t \t i += 1\n \n " )
49-
50- self ._write (f"{ indent } { SCENE_VAR } = bpy.context.window.scene.copy()\n \n " )
51- self ._write (f"{ indent } { SCENE_VAR } .name = { END_NAME_VAR } \n " )
52- self ._write (f"{ indent } { SCENE_VAR } .use_fake_user = True\n " )
53- self ._write (f"{ indent } bpy.context.window.scene = { SCENE_VAR } \n " )
54-
55- def _initialize_compositor_node_tree (self , outer , ntp_nt , nt_name ):
40+ self ._write (f"# Generate unique scene name" , indent )
41+ self ._write (f"{ BASE_NAME_VAR } = { str_to_py_str (self .compositor_name )} " ,
42+ indent )
43+ self ._write (f"{ END_NAME_VAR } = { BASE_NAME_VAR } " , indent )
44+ self ._write (f"if bpy.data.scenes.get({ END_NAME_VAR } ) != None:" , indent )
45+
46+ indent2 = f"{ indent } \t "
47+ self ._write (f"i = 1" , indent2 )
48+ self ._write (f"{ END_NAME_VAR } = { BASE_NAME_VAR } + f\" .{{i:03d}}\" " ,
49+ indent2 )
50+ self ._write (f"while bpy.data.scenes.get({ END_NAME_VAR } ) != None:" ,
51+ indent2 )
52+
53+ indent3 = f"{ indent } \t \t "
54+ self ._write (f"{ END_NAME_VAR } = { BASE_NAME_VAR } + f\" .{{i:03d}}\" " , indent3 )
55+ self ._write (f"i += 1\n " , indent3 )
56+
57+ self ._write (f"{ SCENE_VAR } = bpy.context.window.scene.copy()\n " , indent )
58+ self ._write (f"{ SCENE_VAR } .name = { END_NAME_VAR } " , indent )
59+ self ._write (f"{ SCENE_VAR } .use_fake_user = True" , indent )
60+ self ._write (f"bpy.context.window.scene = { SCENE_VAR } " , indent )
61+
62+ def _initialize_compositor_node_tree (self , ntp_nt , nt_name ):
5663 #initialize node group
57- self ._write (f"{ outer } #initialize { nt_name } node group\n " )
58- self ._write (f"{ outer } def { ntp_nt .var } _node_group():\n " )
64+ self ._write (f"#initialize { nt_name } node group" , self . _outer )
65+ self ._write (f"def { ntp_nt .var } _node_group():" , self . _outer )
5966
60- inner = f"{ outer } \t "
6167 if ntp_nt .node_tree == self ._base_node_tree :
62- self ._write (f"{ inner } { ntp_nt .var } = { SCENE_VAR } .node_tree\n " )
63- self ._write (f"{ inner } #start with a clean node tree\n " )
64- self ._write (f"{ inner } for node in { ntp_nt .var } .nodes:\n " )
65- self ._write (f"{ inner } \t { ntp_nt .var } .nodes.remove(node)\n " )
68+ self ._write (f"{ ntp_nt .var } = { SCENE_VAR } .node_tree" )
69+ self ._write (f"#start with a clean node tree" )
70+ self ._write (f"for node in { ntp_nt .var } .nodes:" )
71+ self ._write (f"\t { ntp_nt .var } .nodes.remove(node)" )
6672 else :
67- self ._write ((f"{ inner } { ntp_nt .var } "
68- f"= bpy.data.node_groups.new("
73+ self ._write ((f"{ ntp_nt .var } = bpy.data.node_groups.new("
6974 f"type = \' CompositorNodeTree\' , "
70- f"name = { str_to_py_str (nt_name )} )\n " ))
71- self ._write ("\n " )
75+ f"name = { str_to_py_str (nt_name )} )" ))
76+ self ._write ("" )
77+
78+ def _set_color_balance_settings (self , node : CompositorNodeColorBalance
79+ ) -> None :
80+ """
81+ Sets the color balance settings so we only set the active variables,
82+ preventing conflict
83+
84+ node (CompositorNodeColorBalance): the color balance node
85+ """
86+ if node .correction_method == 'LIFT_GAMMA_GAIN' :
87+ lst = [("correction_method" , ST .ENUM ),
88+ ("gain" , ST .COLOR ),
89+ ("gamma" , ST .COLOR ),
90+ ("lift" , ST .COLOR )]
91+ else :
92+ lst = [("correction_method" , ST .ENUM ),
93+ ("offset" , ST .COLOR ),
94+ ("offset_basis" , ST .FLOAT ),
95+ ("power" , ST .COLOR ),
96+ ("slope" , ST .COLOR )]
97+
98+ self ._settings ['CompositorNodeColorBalance' ] = lst
7299
73- def _process_node (self , node : Node , ntp_nt : NTP_NodeTree , inner : str ):
74- node_var : str = self ._create_node (node , inner , ntp_nt .var )
100+ def _process_node (self , node : Node , ntp_nt : NTP_NodeTree ):
101+ """
102+ Create node and set settings, defaults, and cosmetics
103+
104+ Parameters:
105+ node (Node): node to process
106+ ntp_nt (NTP_NodeTree): the node tree that node belongs to
107+ """
108+ node_var : str = self ._create_node (node , ntp_nt .var )
75109
76110 if node .bl_idname == 'CompositorNodeColorBalance' :
77- if node .correction_method == 'LIFT_GAMMA_GAIN' :
78- lst = [("correction_method" , ST .ENUM ),
79- ("gain" , ST .COLOR ),
80- ("gamma" , ST .COLOR ),
81- ("lift" , ST .COLOR )]
82- else :
83- lst = [("correction_method" , ST .ENUM ),
84- ("offset" , ST .COLOR ),
85- ("offset_basis" , ST .FLOAT ),
86- ("power" , ST .COLOR ),
87- ("slope" , ST .COLOR )]
88-
89- self ._settings ['CompositorNodeColorBalance' ] = lst
90-
91- self ._set_settings_defaults (node , inner , node_var )
92- self ._hide_hidden_sockets (node , inner , node_var )
111+ self ._set_color_balance_settings (node )
112+
113+ self ._set_settings_defaults (node )
114+ self ._hide_hidden_sockets (node )
93115
94116 if node .bl_idname == 'CompositorNodeGroup' :
95- self ._process_group_node_tree (node , node_var , inner )
117+ self ._process_group_node_tree (node )
96118
97119 if bpy .app .version < (4 , 0 , 0 ):
98120 if node .bl_idname == 'NodeGroupInput' and not ntp_nt .inputs_set :
99- self ._group_io_settings (node , inner , "input" , ntp_nt )
121+ self ._group_io_settings (node , "input" , ntp_nt )
100122 ntp_nt .inputs_set = True
101123
102124 elif node .bl_idname == 'NodeGroupOutput' and not ntp_nt .outputs_set :
103- self ._group_io_settings (node , inner , "output" , ntp_nt )
125+ self ._group_io_settings (node , "output" , ntp_nt )
104126 ntp_nt .outputs_set = True
105127
106- self ._set_socket_defaults (node , node_var , inner )
128+ self ._set_socket_defaults (node )
107129
108- def _process_node_tree (self , node_tree , level ):
130+ def _process_node_tree (self , node_tree : CompositorNodeTree ):
109131 """
110132 Generates a Python function to recreate a compositor node tree
111133
112134 Parameters:
113- node_tree (NodeTree): node tree to be recreated
114- level (int): number of tabs to use for each line
115-
135+ node_tree (CompositorNodeTree): node tree to be recreated
116136 """
117137 if node_tree == self ._base_node_tree :
118138 nt_var = self ._create_var (self .compositor_name )
@@ -121,30 +141,29 @@ def _process_node_tree(self, node_tree, level):
121141 nt_var = self ._create_var (node_tree .name )
122142 nt_name = node_tree .name
123143
124- outer , inner = make_indents ( level )
144+ self . _node_tree_vars [ node_tree ] = nt_var
125145
126146 ntp_nt = NTP_NodeTree (node_tree , nt_var )
127- self ._initialize_compositor_node_tree (outer , ntp_nt , nt_name )
147+ self ._initialize_compositor_node_tree (ntp_nt , nt_name )
128148
129149 if bpy .app .version >= (4 , 0 , 0 ):
130- self ._tree_interface_settings (inner , ntp_nt )
150+ self ._tree_interface_settings (ntp_nt )
131151
132152 #initialize nodes
133- self ._write (f"{ inner } #initialize { nt_var } nodes\n " )
153+ self ._write (f"#initialize { nt_var } nodes" )
134154
135155 for node in node_tree .nodes :
136- self ._process_node (node , ntp_nt , inner )
156+ self ._process_node (node , ntp_nt )
137157
138- self ._set_parents (node_tree , inner )
139- self ._set_locations (node_tree , inner )
140- self ._set_dimensions (node_tree , inner )
158+ self ._set_parents (node_tree )
159+ self ._set_locations (node_tree )
160+ self ._set_dimensions (node_tree )
141161
142- self ._init_links (node_tree , inner , nt_var )
162+ self ._init_links (node_tree )
143163
144- self ._write (f"{ inner } return { nt_var } \n " )
164+ self ._write (f"return { nt_var } \n " )
145165
146- self ._write (f"\n { outer } { nt_var } = { nt_var } _node_group()\n \n " )
147- self ._node_trees [node_tree ] = nt_var
166+ self ._write (f"{ nt_var } = { nt_var } _node_group()\n " , self ._outer )
148167
149168 def execute (self , context ):
150169 #find node group to replicate
@@ -164,6 +183,9 @@ def execute(self, context):
164183 comp_var = clean_string (self .compositor_name )
165184
166185 if self .mode == 'ADDON' :
186+ self ._outer = "\t \t "
187+ self ._inner = "\t \t \t "
188+
167189 self ._setup_addon_directories (context , comp_var )
168190
169191 self ._file = open (f"{ self ._addon_dir } /__init__.py" , "w" )
@@ -172,7 +194,7 @@ def execute(self, context):
172194 self ._class_name = clean_string (self .compositor_name , lower = False )
173195 self ._init_operator (comp_var , self .compositor_name )
174196
175- self ._write ("\t def execute(self, context):\n " )
197+ self ._write ("def execute(self, context):" , " \t " )
176198 else :
177199 self ._file = StringIO ("" )
178200
@@ -181,19 +203,14 @@ def execute(self, context):
181203 self ._create_scene ("\t \t " )
182204 elif self .mode == 'SCRIPT' :
183205 self ._create_scene ("" )
184-
185- if self .mode == 'ADDON' :
186- level = 2
187- else :
188- level = 0
189206
190207 node_trees_to_process = self ._topological_sort (self ._base_node_tree )
191208
192209 for node_tree in node_trees_to_process :
193- self ._process_node_tree (node_tree , level )
210+ self ._process_node_tree (node_tree )
194211
195212 if self .mode == 'ADDON' :
196- self ._write ("\t \t return {'FINISHED'}\n \n " )
213+ self ._write ("return {'FINISHED'}\n " , self . _outer )
197214
198215 self ._create_menu_func ()
199216 self ._create_register_func ()
0 commit comments