1
2
3
4
5
6
7
8 import types
9 import nuke
10
11
12 -def _addCallback(dict, call, args, kwargs, nodeClass, node=None):
13 if not callable(call):
14 raise ValueError("call must be a callable")
15 if type(args) != types.TupleType:
16 args = (args,)
17 if type(kwargs) != types.DictType:
18 raise ValueError("kwargs must be a dictionary")
19 if dict.has_key(nodeClass):
20 list = dict[nodeClass]
21
22 try:
23 list.remove((call,args,kwargs,node))
24 except:
25 pass
26 list.append((call,args,kwargs,node))
27 else:
28 dict[nodeClass] = [(call,args,kwargs,node)]
29
31 if type(args) != types.TupleType:
32 args = (args,)
33 if dict.has_key(nodeClass):
34 list = dict[nodeClass]
35 try:
36 list.remove((call,args,kwargs,node))
37 except:
38 pass
39
52
53 onUserCreates={}
63
64 onCreates={}
65 -def addOnCreate(call, args=(), kwargs={}, nodeClass='*'):
66 """Add code to execute when a node is created or undeleted"""
67 _addCallback(onCreates, call, args, kwargs, nodeClass)
69 """Remove a previously-added callback with the same arguments."""
70 _removeCallback(onCreates, call, args, kwargs, nodeClass)
73
74 onScriptLoads={}
83
84 onScriptSaves={}
93
94 onScriptCloses={}
103
104 onDestroys={}
106 """Add code to execute when a node is destroyed"""
107 _addCallback(onDestroys, call, args, kwargs, nodeClass)
109 """Remove a previously-added callback with the same arguments."""
110 _removeCallback(onDestroys, call, args, kwargs, nodeClass)
113
114 knobChangeds={}
115 -def addKnobChanged(call, args=(), kwargs={}, nodeClass='*', node=None):
116 """Add code to execute when the user changes a knob
117 The knob is availble in nuke.thisKnob() and the node in nuke.thisNode().
118 This is also called with dummy knobs when the control panel is opened
119 or when the inputs to the node changes. The purpose is to update other
120 knobs in the control panel. Use addUpdateUI() for changes that
121 should happen even when the panel is closed."""
122 _addCallback(knobChangeds, call, args, kwargs, nodeClass, node)
128
129 updateUIs={}
130 -def addUpdateUI(call, args=(), kwargs={}, nodeClass='*'):
131 """Add code to execute on every node when things change. This is done
132 during idle, you cannot rely on it being done before it starts updating
133 the viewer"""
134 _addCallback(updateUIs, call, args, kwargs, nodeClass)
136 """Remove a previously-added callback with the same arguments."""
137 _removeCallback(updateUIs, call, args, kwargs, nodeClass)
140
141
142 autolabels={}
144 """Add code to execute on every node to produce the text to draw on it
145 in the DAG. Any value other than None is converted to a string and used
146 as the text. None indicates that previously-added functions should
147 be tried"""
148 _addCallback(autolabels, call, args, kwargs, nodeClass)
150 """Remove a previously-added callback with the same arguments."""
151 _removeCallback(autolabels, call, args, kwargs, nodeClass)
153 list = autolabels.get(nuke.thisClass())
154 if list:
155 for f in list[::-1]:
156 s = f[0](*f[1],**f[2])
157 if s != None: return s
158 list = autolabels.get('*')
159 if list:
160 for f in list[::-1]:
161 s = f[0](*f[1],**f[2])
162 if s != None: return s
163
164
165 beforeRenders={}
174
175 beforeFrameRenders={}
184
185 afterFrameRenders={}
194
195 afterRenders={}
204
205
206
208 if not callable(call):
209 raise ValueError("call must be a callable")
210 if type(args) != types.TupleType:
211 args = (args,)
212 if type(kwargs) != types.DictType:
213 raise ValueError("kwargs must be a dictionary")
214
215 try:
216 list.remove((call,args,kwargs))
217 except:
218 pass
219 list.append((call,args,kwargs))
220
222 if type(args) != types.TupleType:
223 args = (args,)
224 try:
225 list.remove((call,args,kwargs))
226 except:
227 pass
228
230 for f in list:
231 f[0](context, *f[1],**f[2])
232
233
234 beforeBackgroundRenders=[]
236 """Add code to execute before starting any background renders.
237 The call must be in the form of:
238 def foo(context):
239 pass
240
241 The context object that will be passed in is a dictionary containing the following elements:
242 id => The identifier for the task that's about to begin
243
244 Please be aware that the current Nuke context will not make sense in the callback (e.g. nuke.thisNode will return a random node).
245 """
246 _addBackgroundCallback(beforeBackgroundRenders, call, args, kwargs)
252
253
254
255
256
257
258
259
260
261
262
263 afterBackgroundFrameRenders=[]
265 """Add code to execute after each frame of a background render.
266 The call must be in the form of:
267 def foo(context):
268 pass
269
270 The context object that will be passed in is a dictionary containing the following elements:
271 id => The identifier for the task that's making progress
272 frame => the current frame number being rendered
273 numFrames => the total number of frames that is being rendered
274 frameProgress => the number of frames rendered so far.
275
276 Please be aware that the current Nuke context will not make sense in the callback (e.g. nuke.thisNode will return a random node).
277 """
278 _addBackgroundCallback(afterBackgroundFrameRenders, call, args, kwargs)
284
285 afterBackgroundRenders=[]
287 """Add code to execute after any background renders.
288 The call must be in the form of:
289 def foo(context):
290 pass
291
292 The context object that will be passed in is a dictionary containing the following elements:
293 id => The identifier for the task that's ended
294
295 Please be aware that the current Nuke context will not make sense in the callback (e.g. nuke.thisNode will return a random node).
296 """
297 _addBackgroundCallback(afterBackgroundRenders, call, args, kwargs)
303
304
305 filenameFilters={}
307 """Add a function to modify filenames before Nuke passes them to
308 the operating system. The first argument to the function is the
309 filename, and it should return the new filename. None is the same as
310 returning the string unchanged. All added functions are called
311 in backwards order."""
312 _addCallback(filenameFilters, call, args, kwargs, nodeClass)
316
336
337 validateFilenames={}
339 """Add a function to validate a filename in Write nodes. The first argument
340 is the filename and it should return a Boolean as to whether the filename is valid
341 or not. If a callback is provided, it will control whether the Render button of Write nodes
342 and the Execute button of WriteGeo nodes is enabled or not."""
343 _addCallback(validateFilenames, call, args, kwargs, nodeClass)
362
363
365 import __main__
366 list = filters.get( 'Root' )
367 if list:
368 for f in list:
369 s = f[0](filename)
370 filename = s
371
372 return filename
373
374 autoSaveFilters={}
376 """addAutoSaveFilter(filter) -> None
377
378 Add a function to modify the autosave filename before Nuke saves the current script on an autosave timeout.
379
380 Look at rollingAutoSave.py in the nukescripts directory for an example of using the auto save filters.
381
382 @param filter: A filter function. The first argument to the filter is the current autosave filename.
383 The filter should return the filename to save the autosave to."""
384 _addCallback(autoSaveFilters, filter, (), {}, 'Root')
385
389
393
394
395 autoSaveRestoreFilters={}
397 """addAutoSaveRestoreFilter(filter) -> None
398
399 Add a function to modify the autosave restore file before Nuke attempts to restores the autosave file.
400
401 Look at rollingAutoSave.py in the nukescripts directory for an example of using the auto save filters.
402
403 @param filter: A filter function. The first argument to the filter is the current autosave filename.
404 This function should return the filename to load autosave from or it should return None if the autosave file should be ignored."""
405 _addCallback(autoSaveRestoreFilters, filter, (), {}, 'Root')
406
410
414
415 autoSaveDeleteFilters={}
417 """addAutoSaveDeleteFilter(filter) -> None
418
419 Add a function to modify the autosave filename before Nuke attempts delete the autosave file.
420
421 Look at rollingAutoSave.py in the nukescripts directory for an example of using the auto save filters.
422
423 @param filter: A filter function. The first argument to the filter is the current autosave filename.
424 This function should return the filename to delete or return None if no file should be deleted."""
425 _addCallback(autoSaveDeleteFilters, filter, (), {}, 'Root')
426
430
434