|
@@ -1,22 +1,56 @@
|
1
|
1
|
import fnmatch
|
2
|
2
|
import nuke
|
3
|
3
|
|
4
|
|
-# Idea from Stefan@BigHug
|
5
|
|
-# 2018-10-02: Martin S.
|
6
|
|
-#
|
7
|
|
-# Version 0.1
|
|
4
|
+
|
|
5
|
+# martin@keller.io
|
|
6
|
+__version__ = '1.0'
|
|
7
|
+
|
|
8
|
+MODES = ['MergeBackIntoStream','SelectOnly', 'ContactSheet']
|
|
9
|
+PATTERNDEFAULT = "*direct* !*indirect* !*default"
|
|
10
|
+INIT_DONE = False
|
8
|
11
|
|
9
|
12
|
class ChannelSelect(KellerNukePlugin):
|
10
|
13
|
|
11
|
14
|
def configurePlugin(self):
|
12
|
|
- self.menu = nuke.menu("Nodes")
|
13
|
|
- m = self.menu.addMenu("Workgroup","Toolbar_Workgroup.png")
|
14
|
|
- m.addCommand("ChannelSelect", "import ChannelSelect; ChannelSelect.createChannelSelect()", icon=":qrc/images/ToolbarChannel.png")
|
|
15
|
+ self.menu = nuke.menu('Nodes')
|
|
16
|
+ m = self.menu.addMenu('Workgroup','Toolbar_Workgroup.png')
|
|
17
|
+ m.addCommand('ChannelSelect', 'import ChannelSelect; ChannelSelect.createChannelSelect()', icon=':qrc/images/ToolbarChannel.png')
|
|
18
|
+ nuke.addKnobChanged(onKnobChanged)
|
15
|
19
|
|
16
|
20
|
def unconfigurePlugin(self):
|
17
|
|
- self.menu.removeItem("ChannelSelect")
|
|
21
|
+ self.menu.removeItem('ChannelSelect')
|
|
22
|
+ nuke.removeKnobChanged(onKnobChanged)
|
|
23
|
+ pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+# events
|
|
27
|
+def onKnobChanged():
|
|
28
|
+ global INIT_DONE
|
|
29
|
+ if not INIT_DONE:
|
|
30
|
+ # not ready
|
|
31
|
+ return
|
|
32
|
+
|
|
33
|
+ k = nuke.thisKnob()
|
|
34
|
+ # do a refresh on these knobs
|
|
35
|
+ refresh_resolved = ['pattern','update']
|
|
36
|
+
|
|
37
|
+ if k.name() in refresh_resolved:
|
|
38
|
+ print('ChannelSelect: Info. Event refresh triggered.')
|
|
39
|
+ # Config changed, loading new tasks
|
|
40
|
+ n = nuke.thisNode()
|
|
41
|
+
|
|
42
|
+ pattern = n['pattern'].value()
|
|
43
|
+ resolved = resolvePattern(n, pattern)
|
|
44
|
+ if resolved:
|
|
45
|
+ resString = '\n'.join(resolved)
|
|
46
|
+
|
|
47
|
+ if not resolved:
|
|
48
|
+ n['resolved'].setValue('NO MATCH')
|
|
49
|
+ else:
|
|
50
|
+ n['resolved'].setValue(resString)
|
18
|
51
|
pass
|
19
|
52
|
|
|
53
|
+
|
20
|
54
|
def createChannelSelect():
|
21
|
55
|
# get selected Node (for connecting our node below)
|
22
|
56
|
try:
|
|
@@ -25,11 +59,11 @@ def createChannelSelect():
|
25
|
59
|
s = None
|
26
|
60
|
# deselect all Nodes
|
27
|
61
|
for a in nuke.allNodes():
|
28
|
|
- a.knob("selected").setValue(False)
|
|
62
|
+ a.knob('selected').setValue(False)
|
29
|
63
|
|
30
|
64
|
# create Group
|
31
|
65
|
n = nuke.collapseToGroup(show = False)
|
32
|
|
- n.setName("ChannelSelect")
|
|
66
|
+ n.setName('ChannelSelect')
|
33
|
67
|
# % (r * 255, g * 255, b * 255, 1), 16): change r g and b to your liking
|
34
|
68
|
hexColour = int('%02x%02x%02x%02x' % (0 * 255, 0 * 255, 0 * 255, 1), 16)
|
35
|
69
|
n['tile_color'].setValue(hexColour)
|
|
@@ -39,34 +73,91 @@ def createChannelSelect():
|
39
|
73
|
n.setXYpos(s.xpos(), s.ypos() + 100)
|
40
|
74
|
|
41
|
75
|
# tab ChannelSelect
|
42
|
|
- k = nuke.Tab_Knob("select", "Select")
|
|
76
|
+ k = nuke.Tab_Knob('select', 'Select')
|
|
77
|
+ n.addKnob(k)
|
|
78
|
+
|
|
79
|
+ # Pattern
|
|
80
|
+ k = nuke.EvalString_Knob('pattern', 'Pattern')
|
|
81
|
+ n.addKnob(k)
|
|
82
|
+ n.knob('pattern').setTooltip('*diffuse* *SSS*\nwith exclude (! or ^):\n*direct* !*indirect*')
|
|
83
|
+ n.knob('pattern').setValue(PATTERNDEFAULT)
|
|
84
|
+
|
|
85
|
+ # Update
|
|
86
|
+ k = nuke.PyScript_Knob('update', 'Set', 'ChannelSelect.updatePattern(nuke.thisNode())')
|
|
87
|
+ n.addKnob(k)
|
|
88
|
+ n.knob('update').setTooltip('Creates Nodes in Group based on Search Pattern')
|
|
89
|
+
|
|
90
|
+ # Resolved Channels
|
|
91
|
+ k = nuke.Multiline_Eval_String_Knob('resolved', 'Resolved')
|
|
92
|
+ n.addKnob(k)
|
|
93
|
+ n.knob('resolved').setTooltip('These AOVs are found based on your search Pattern above')
|
|
94
|
+
|
|
95
|
+ # Divide and Conquer
|
|
96
|
+ k = nuke.Text_Knob('divider', '')
|
|
97
|
+ n.addKnob(k)
|
|
98
|
+
|
|
99
|
+ # Exposure
|
|
100
|
+ k = nuke.Double_Knob('exposure', 'Exposure')
|
|
101
|
+ n.addKnob(k)
|
|
102
|
+ n.knob('exposure').setRange(-2,2)
|
|
103
|
+
|
|
104
|
+ # Multiply
|
|
105
|
+ k = nuke.Color_Knob('multiply', 'Multiply')
|
|
106
|
+ n.addKnob(k)
|
|
107
|
+ n.knob('multiply').setValue([1, 1, 1])
|
|
108
|
+
|
|
109
|
+ # Gamma
|
|
110
|
+ k = nuke.Double_Knob('gamma', 'Gamma')
|
|
111
|
+ n.addKnob(k)
|
|
112
|
+ n.knob('gamma').setValue(1)
|
|
113
|
+ n.knob('gamma').setRange(0.2, 2)
|
|
114
|
+
|
|
115
|
+ # Compensate Mult
|
|
116
|
+ k = nuke.Boolean_Knob('compensate', 'Compensate Mult')
|
43
|
117
|
n.addKnob(k)
|
|
118
|
+ n.knob('compensate').setValue(True)
|
|
119
|
+ n.knob('compensate').setFlag(nuke.STARTLINE)
|
44
|
120
|
|
45
|
|
- k = nuke.EvalString_Knob("pattern", "Pattern")
|
|
121
|
+ # Reset Values
|
|
122
|
+ k = nuke.PyScript_Knob('reset', 'Reset', 'ChannelSelect.resetValues(nuke.thisNode())')
|
46
|
123
|
n.addKnob(k)
|
47
|
|
- n.knob("pattern").setTooltip("*diffuse* *SSS*\nwith exclude (! or ^):\n*direct* !*indirect*")
|
48
|
|
- n.knob("pattern").setValue("*key*")
|
|
124
|
+ n.knob('reset').setTooltip('Reset Color Correct values')
|
|
125
|
+ n.knob('reset').setFlag(nuke.STARTLINE)
|
49
|
126
|
|
50
|
|
- k = nuke.PyScript_Knob("update", "Update", "ChannelSelect.update(nuke.thisNode())")
|
|
127
|
+ # Divide and Conquer
|
|
128
|
+ k = nuke.Text_Knob('divider', '')
|
51
|
129
|
n.addKnob(k)
|
52
|
|
- n.knob("update").setTooltip("Creates Nodes in Group based on Search Pattern")
|
53
|
130
|
|
54
|
|
- k = nuke.Text_Knob("divider", "")
|
|
131
|
+ # Mode
|
|
132
|
+ k = nuke.Enumeration_Knob('mode', 'Mode', MODES)
|
55
|
133
|
n.addKnob(k)
|
|
134
|
+ k.setTooltip('MergeBackIntoStream: Shuffles the resolved aovs, applies the grading options and merges the result back to main comp stream\n\nSelectOnly: Just shuffles the resolved aovs and adds them together.\n\nLayerContactSheet: Displays the LayerContactSheet with layer names. Note. You need to Press Set in order for this to work. An empty Pattern is possible')
|
|
135
|
+ n.knob('mode').clearFlag(nuke.STARTLINE)
|
|
136
|
+
|
|
137
|
+ # refresh again
|
|
138
|
+ n.knob('pattern').setValue('*key*')
|
|
139
|
+ n.knob('pattern').setValue(PATTERNDEFAULT)
|
56
|
140
|
|
|
141
|
+ global INIT_DONE
|
|
142
|
+ INIT_DONE = True
|
57
|
143
|
return None
|
58
|
144
|
|
|
145
|
+
|
|
146
|
+def resetValues(n):
|
|
147
|
+ n['exposure'].setValue(0)
|
|
148
|
+ n['multiply'].setValue([1, 1, 1])
|
|
149
|
+ n['gamma'].setValue(1)
|
|
150
|
+ n['compensate'].setValue(True)
|
|
151
|
+
|
|
152
|
+
|
59
|
153
|
def resolvePattern(n, pattern):
|
|
154
|
+ if pattern == "":
|
|
155
|
+ return None
|
|
156
|
+
|
60
|
157
|
channels = n.channels()
|
61
|
|
- print ("channels")
|
62
|
|
- print (channels)
|
63
|
158
|
layers = list(set([c.split('.')[0] for c in channels]))
|
64
|
159
|
layers.sort()
|
65
|
|
- print ("layers:")
|
66
|
|
- print (layers)
|
67
|
|
- if layers is not None:
|
68
|
|
- print ("layers: %s " %layers)
|
69
|
|
- print ("pattern: " + pattern)
|
|
160
|
+
|
70
|
161
|
matchChannels = []
|
71
|
162
|
ignoreChannels = []
|
72
|
163
|
for p in pattern.split(' '):
|
|
@@ -77,82 +168,213 @@ def resolvePattern(n, pattern):
|
77
|
168
|
|
78
|
169
|
matchChannels = list(set(matchChannels) - set(ignoreChannels))
|
79
|
170
|
matchChannels.sort()
|
80
|
|
- print ("matchedChannels: %s" % matchChannels)
|
81
|
|
- print ("ignoredChannels: %s" % ignoreChannels)
|
82
|
171
|
return matchChannels
|
83
|
172
|
|
84
|
173
|
|
85
|
|
-def update(n):
|
86
|
|
- # n = node
|
87
|
|
- pattern = n['pattern'].value()
|
|
174
|
+def updatePattern(n):
|
88
|
175
|
|
89
|
|
- # empty pattern
|
90
|
|
- if pattern == "":
|
91
|
|
- n['label'].setValue("NO MATCH")
|
92
|
|
- return
|
|
176
|
+ V_OFFSET = 250
|
93
|
177
|
|
94
|
|
- # get the pattern
|
|
178
|
+ # n = node
|
|
179
|
+ pattern = n['pattern'].value()
|
95
|
180
|
resolved = resolvePattern(n, pattern)
|
96
|
|
- print ("Found %s matching channels" % len(resolved))
|
97
|
|
- if len(resolved) > 0:
|
98
|
|
- print ("resolved: %s" % resolved)
|
|
181
|
+
|
|
182
|
+ # create nodes
|
99
|
183
|
# input and output of Group
|
100
|
|
- input = nuke.toNode("Input1")
|
101
|
|
- output = nuke.toNode("Output1")
|
|
184
|
+ input = nuke.toNode('Input1')
|
|
185
|
+ output = nuke.toNode('Output1')
|
102
|
186
|
|
103
|
187
|
# delete old nodes
|
104
|
188
|
g = nuke.toNode(n.name())
|
105
|
|
- oldNodes = [i for i in g.nodes() if i.Class() == "Merge2" or i.Class() == "Shuffle"]
|
|
189
|
+ oldNodes = [i for i in g.nodes() if '__' in i['name'].value()]
|
106
|
190
|
|
107
|
191
|
for node in oldNodes:
|
108
|
192
|
nuke.delete(node)
|
109
|
193
|
|
|
194
|
+ # dot input
|
|
195
|
+ dot_input = nuke.nodes.Dot(xpos=input.xpos() , ypos=input.ypos()+100)
|
|
196
|
+ dot_input['name'].setValue('dot_input__')
|
|
197
|
+ dot_input['label'].setValue('[value name]')
|
|
198
|
+ #dot_input['note_font_size'].setValue(25)
|
|
199
|
+ # connect to the input1 node
|
|
200
|
+
|
|
201
|
+ # dot input 2
|
|
202
|
+ dot_input2 = nuke.nodes.Dot(xpos=dot_input.xpos()+1500 , ypos=dot_input.ypos())
|
|
203
|
+ dot_input2['name'].setValue('dot_input2__')
|
|
204
|
+ dot_input2['label'].setValue('[value name]')
|
|
205
|
+ #dot_input2['note_font_size'].setValue(25)
|
|
206
|
+ # connect to the input1 node
|
|
207
|
+
|
|
208
|
+ # dot resolved
|
|
209
|
+ dot_resolved = nuke.nodes.Dot(xpos=dot_input.xpos() , ypos=dot_input.ypos() + V_OFFSET)
|
|
210
|
+ dot_resolved['name'].setValue('dot_resolved__')
|
|
211
|
+ dot_resolved['label'].setValue('[value name]')
|
|
212
|
+ #dot_resolved['note_font_size'].setValue(25)
|
|
213
|
+
|
|
214
|
+ # dot resolved2
|
|
215
|
+ dot_resolved2 = nuke.nodes.Dot(xpos=dot_resolved.xpos() - 100, ypos=dot_resolved.ypos())
|
|
216
|
+ dot_resolved2['name'].setValue('dot_resolved2__')
|
|
217
|
+ dot_resolved2['label'].setValue('[value name]')
|
|
218
|
+ #dot_resolved2['note_font_size'].setValue(25)
|
|
219
|
+
|
|
220
|
+ # dot resolved3
|
|
221
|
+ dot_resolved3 = nuke.nodes.Dot(xpos=dot_resolved2.xpos(), ypos=dot_resolved.ypos() + V_OFFSET)
|
|
222
|
+ dot_resolved3['name'].setValue('dot_resolved3__')
|
|
223
|
+ dot_resolved3['label'].setValue('[value name]')
|
|
224
|
+ #dot_resolved3['note_font_size'].setValue(25)
|
|
225
|
+
|
|
226
|
+ # merge from
|
|
227
|
+ merge_from = nuke.nodes.Merge2(xpos=dot_input.xpos()+500 , ypos=dot_input.ypos() )
|
|
228
|
+ merge_from['name'].setValue('merge_from__')
|
|
229
|
+ merge_from['operation'].setValue("from")
|
|
230
|
+
|
|
231
|
+ # exposure
|
|
232
|
+ exposure = nuke.nodes.EXPTool(xpos=dot_resolved.xpos() , ypos=dot_resolved.ypos() + V_OFFSET)
|
|
233
|
+ exposure['name'].setValue('exposure__')
|
|
234
|
+
|
|
235
|
+ # grade
|
|
236
|
+ grade = nuke.nodes.Grade(xpos=exposure.xpos() , ypos=exposure.ypos() + V_OFFSET)
|
|
237
|
+ grade['name'].setValue('grade__')
|
|
238
|
+
|
|
239
|
+ # merge plus
|
|
240
|
+ merge_plus = nuke.nodes.Merge2(xpos=grade.xpos() , ypos=grade.ypos() + V_OFFSET)
|
|
241
|
+ merge_plus['operation'].setValue("plus")
|
|
242
|
+ merge_plus['name'].setValue('merge_plus__')
|
|
243
|
+
|
|
244
|
+ # dot input From
|
|
245
|
+ dot_input_from = nuke.nodes.Dot(xpos=merge_from.xpos() , ypos=merge_plus.ypos())
|
|
246
|
+ dot_input_from['name'].setValue('dot_input_from__')
|
|
247
|
+ dot_input_from['label'].setValue('[value name]')
|
|
248
|
+ #dot_input_from['note_font_size'].setValue(25)
|
|
249
|
+
|
|
250
|
+ # contact_sheet_all
|
|
251
|
+ contact_sheet_all = nuke.nodes.LayerContactSheet(xpos=merge_plus.xpos() +250 , ypos=merge_plus.ypos() + 200)
|
|
252
|
+ contact_sheet_all['name'].setValue('contact_sheet__')
|
|
253
|
+
|
|
254
|
+ # switch
|
|
255
|
+ switch = nuke.nodes.Switch(xpos=merge_plus.xpos() , ypos=merge_plus.ypos() + V_OFFSET)
|
|
256
|
+ switch['name'].setValue('switch__')
|
|
257
|
+
|
|
258
|
+ # dot output
|
|
259
|
+ dot_output = nuke.nodes.Dot(xpos=dot_input.xpos() , ypos=dot_input.ypos() + V_OFFSET)
|
|
260
|
+ dot_output['name'].setValue('dot_output__')
|
|
261
|
+ dot_output['label'].setValue('[value name]')
|
|
262
|
+ #dot_output['note_font_size'].setValue(25)
|
|
263
|
+
|
110
|
264
|
# create new nodes
|
111
|
265
|
i = 1
|
112
|
266
|
j = 0
|
113
|
267
|
offset = 100
|
114
|
268
|
|
115
|
|
- if len(resolved) > 0:
|
116
|
|
- for r in resolved:
|
117
|
|
- # shuffle
|
118
|
|
- shuffle = nuke.nodes.Shuffle(xpos=input.xpos() - (len(resolved)/2)*offset + (i * offset), ypos=input.ypos() + offset)
|
119
|
|
- shuffle['in'].setValue(resolved[i - 1])
|
120
|
|
- shuffle['in2'].setValue('rgba')
|
121
|
|
- shuffle['out'].setValue('rgb')
|
122
|
|
- shuffle.setInput(0, input)
|
123
|
|
-
|
124
|
|
- # create plus
|
125
|
|
- if i == 1:
|
126
|
|
- plus = nuke.nodes.Merge2(xpos=input.xpos(), ypos=output.ypos() - offset)
|
127
|
|
- plus['operation'].setValue("plus")
|
128
|
|
-
|
129
|
|
- # connect plus
|
130
|
|
- # skip Mask Input
|
131
|
|
- if j==2:
|
132
|
|
- j+=1
|
133
|
|
- plus.setInput(j, shuffle)
|
134
|
|
-
|
135
|
|
- # connect output
|
136
|
|
- output.setInput(i - 1, plus)
|
137
|
|
- # next please
|
138
|
|
- i += 1
|
139
|
|
- j += 1
|
140
|
|
- n['label'].setValue(pattern)
|
|
269
|
+ merge_resolved = None
|
|
270
|
+ if resolved:
|
|
271
|
+ if len(resolved) > 0:
|
|
272
|
+ for r in resolved:
|
|
273
|
+ # shuffle
|
|
274
|
+ shuffle = nuke.nodes.Shuffle(xpos=dot_input.xpos() - (len(resolved)/2)*offset + (i * offset), ypos=dot_input.ypos() + offset)
|
|
275
|
+ shuffle['in'].setValue(resolved[i - 1])
|
|
276
|
+ shuffle['in2'].setValue('rgba')
|
|
277
|
+ shuffle['out'].setValue('rgb')
|
|
278
|
+ shuffle['name'].setValue('shuffle__' + str(i))
|
|
279
|
+ # connect to the dot dot_input
|
|
280
|
+ shuffle.setInput(0, dot_input)
|
|
281
|
+
|
|
282
|
+ # create plus
|
|
283
|
+ if i == 1:
|
|
284
|
+ merge_resolved = nuke.nodes.Merge2(xpos=dot_input.xpos(), ypos=dot_output.ypos() + 50)
|
|
285
|
+ merge_resolved['operation'].setValue("plus")
|
|
286
|
+ merge_resolved['name'].setValue("merge_resolved__")
|
|
287
|
+
|
|
288
|
+ # connect plus
|
|
289
|
+ # skip Mask Input
|
|
290
|
+ if j==2:
|
|
291
|
+ j+=1
|
|
292
|
+ # connect input
|
|
293
|
+ merge_resolved.setInput(j, shuffle)
|
|
294
|
+
|
|
295
|
+ # next please
|
|
296
|
+ i += 1
|
|
297
|
+ j += 1
|
|
298
|
+
|
|
299
|
+ # connect to the input1 node
|
|
300
|
+ dot_resolved.setInput(0, merge_resolved)
|
|
301
|
+
|
141
|
302
|
else:
|
142
|
303
|
# shuffle
|
143
|
|
- shuffle = nuke.nodes.Shuffle(xpos=input.xpos() - (len(resolved)/2)*offset + (i * offset), ypos=input.ypos() + offset)
|
|
304
|
+ shuffle = nuke.nodes.Shuffle(xpos=dot_input.xpos() + (i * offset), ypos=dot_input.ypos() + offset)
|
144
|
305
|
# create black in rgb and a
|
145
|
306
|
shuffle['in'].setValue('none')
|
146
|
307
|
shuffle['in2'].setValue('none')
|
147
|
308
|
shuffle['out'].setValue('rgb')
|
|
309
|
+ shuffle['name'].setValue('shuffle_empty__')
|
148
|
310
|
|
149
|
|
- shuffle.setInput(0, input)
|
|
311
|
+ shuffle.setInput(0, dot_input)
|
150
|
312
|
|
151
|
313
|
# remove old input connections
|
152
|
|
- for r in range(output.inputs()):
|
153
|
|
- output.setInput(r, None)
|
|
314
|
+ #for r in range(output.inputs()):
|
|
315
|
+ # output.setInput(r, None)
|
|
316
|
+
|
|
317
|
+ # connect to the input1 node
|
|
318
|
+ dot_resolved.setInput(0, shuffle)
|
154
|
319
|
|
155
|
|
- output.setInput(0, shuffle)
|
156
|
|
- n['label'].setValue("NO MATCH.")
|
157
|
320
|
|
158
|
|
- return None
|
|
321
|
+ # connect the nodes
|
|
322
|
+ dot_input.setInput(0, input)
|
|
323
|
+ dot_input2.setInput(0, dot_input)
|
|
324
|
+ dot_input_from.setInput(0, merge_from)
|
|
325
|
+ dot_resolved2.setInput(0, dot_resolved)
|
|
326
|
+ dot_resolved3.setInput(0, dot_resolved2)
|
|
327
|
+ merge_plus.setInput(1, grade)
|
|
328
|
+ merge_plus.setInput(0, dot_input_from)
|
|
329
|
+ grade.setInput(0, exposure)
|
|
330
|
+ exposure.setInput(0, dot_resolved)
|
|
331
|
+ merge_from.setInput(0, dot_input2)
|
|
332
|
+ merge_from.setInput(1, dot_resolved)
|
|
333
|
+ contact_sheet_all.setInput(0, dot_input2)
|
|
334
|
+ switch.setInput(0, merge_plus)
|
|
335
|
+ switch.setInput(1, contact_sheet_all)
|
|
336
|
+ switch.setInput(2, dot_resolved3)
|
|
337
|
+ dot_output.setInput(0,switch)
|
|
338
|
+ output.setInput(0, dot_output)
|
|
339
|
+
|
|
340
|
+ # link the nodes
|
|
341
|
+ exposure['mode'].setValue('Stops')
|
|
342
|
+ exposure['gang'].setValue(0)
|
|
343
|
+ exposure['red'].setExpression('parent.exposure')
|
|
344
|
+ exposure['green'].setExpression('parent.exposure')
|
|
345
|
+ exposure['blue'].setExpression('parent.exposure')
|
|
346
|
+ # init
|
|
347
|
+ grade['multiply'].setValue([1,1,1,1])
|
|
348
|
+ grade['multiply'].setExpression('parent.multiply.r',0)
|
|
349
|
+ grade['multiply'].setExpression('parent.multiply.g',1)
|
|
350
|
+ grade['multiply'].setExpression('parent.multiply.b',2)
|
|
351
|
+ grade['multiply'].setValue(1, 3)
|
|
352
|
+ # enable Compensate Mult by default
|
|
353
|
+ grade['white'].setExpression('parent.compensate == 1 ? 1/((parent.multiply.r+parent.multiply.g+parent.multiply.b)/3) : 1')
|
|
354
|
+ grade['gamma'].setExpression('parent.gamma')
|
|
355
|
+ contact_sheet_all['width'].setExpression('parent.width')
|
|
356
|
+ contact_sheet_all['height'].setExpression('parent.height')
|
|
357
|
+ contact_sheet_all['showLayerNames'].setValue(1)
|
|
358
|
+ # again. Weird Update Issues
|
|
359
|
+ contact_sheet_all['showLayerNames'].setExpression('parent.mode == 0 ? 0 :1')
|
|
360
|
+ switch['which'].setExpression('parent.mode == 0 ? 0 :(parent.mode == 1 ? 2 : 1)')
|
|
361
|
+
|
|
362
|
+ # arrange the nodes
|
|
363
|
+ weird_dot_offset = 0
|
|
364
|
+ dot_input.setXYpos(input.xpos()+weird_dot_offset, input.ypos() + 100)
|
|
365
|
+ if merge_resolved:
|
|
366
|
+ merge_resolved.setXYpos(input.xpos(), input.ypos() + 350)
|
|
367
|
+ dot_resolved.setXYpos(input.xpos()+weird_dot_offset, input.ypos() + 500)
|
|
368
|
+ dot_resolved2.setXYpos(dot_resolved.xpos()-250+weird_dot_offset, dot_resolved.ypos())
|
|
369
|
+ dot_resolved3.setXYpos(dot_resolved2.xpos()+weird_dot_offset, dot_resolved2.ypos() + 500)
|
|
370
|
+ exposure.setXYpos(dot_resolved.xpos(), dot_resolved.ypos()+150)
|
|
371
|
+ grade.setXYpos(exposure.xpos(), exposure.ypos() + 150)
|
|
372
|
+ merge_plus.setXYpos(grade.xpos(), grade.ypos() + 150)
|
|
373
|
+ switch.setXYpos(merge_plus.xpos(), merge_plus.ypos() + 150)
|
|
374
|
+ dot_output.setXYpos(switch.xpos()+weird_dot_offset, switch.ypos() + 150)
|
|
375
|
+ output.setXYpos(dot_output.xpos(), dot_output.ypos() + 150)
|
|
376
|
+ merge_from.setXYpos(dot_input2.xpos(), dot_resolved.ypos())
|
|
377
|
+ dot_input_from.setXYpos(merge_from.xpos()+weird_dot_offset, merge_plus.ypos())
|
|
378
|
+
|
|
379
|
+ n['label'].setValue('[value pattern]')
|
|
380
|
+ return None
|