Skip to content

Commit 9da1d10

Browse files
committed
refactor: moved indent logic to write function, cleaned up functions
1 parent f0467dd commit 9da1d10

File tree

5 files changed

+489
-552
lines changed

5 files changed

+489
-552
lines changed

compositor/operator.py

Lines changed: 91 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import bpy
22

3-
from bpy.types import Node
3+
from bpy.types import Node, CompositorNodeColorBalance, CompositorNodeTree
44

55
from ..ntp_operator import NTP_Operator
66
from ..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}\ti = 1\n")
45-
self._write(f"{indent}\t{END_NAME_VAR} = {BASE_NAME_VAR} + f\".{{i:03d}}\"\n")
46-
self._write(f"{indent}\twhile 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\ti += 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("\tdef 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\treturn {'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

Comments
 (0)