For "function runs on selected nodes" type utils, I've tried to follow
the the idiom of:

def make_blurs(nodes = None):
    if nodes is None:
        nodes = nuke.selectedNodes()

    created_nodes = []
    for n in nodes:
        new = nuke.nodes.Blur(inputs = [n]) # or something more useful
        # ...
        created_nodes.append(n)

    return created_nodes

That allows functions to be chained together nicely, since you can do
something like:

starting = nuke.selectedNodes()
blurs = make_blurs(starting)
grades = make_grades(blurs)


The reason to do "nodes=None" is because..

def func(nodes = nuke.selectedNodes()):
    pass

..won't do what you expect - the selectedNodes function gets called a
function-definition time (so probably when Nuke starts up), it's the
same as doing:

default_value = nuke.selectedNodes()
def func(nodes = default_value):
    pass

There's a similar, but subtler issue with having mutable objects (like a
list or dict) as default argument:

http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument

Basically having anything other than simple numbers, or True/False as a
default argument value is usually.. "suspicious"

On 18/10/11 05:44, Diogo Girondi wrote:
> Ooops! Howard is right!
> 
> You need to feed nuke.selectedNode() or a node object to it. I did that
> to allow people to use that function from elsewhere while passing node
> objects from loops and whatnots and not just based on the node selection.
> 
> Sorry. 
> 
> Cheers,
> Diogo
> 
> On 17/10/2011, at 14:21, Howard Jones <[email protected]
> <mailto:[email protected]>> wrote:
> 
>> Hi
>> Yes works well - I modified it so it had nuke.selectedNode() fed into
>> it it.
>> See below though no doubt the formatting may have screwed.
>>
>>  
>> Howard
>>
>>
>> ###    Splits each and every layer on their own pipes using
>> ###    shuffle nodes.
>> ###    ------------------------------------------
>> ###    splitLayers.py
>> ###    v1.0 - Last modified: 07/08/2009
>> ###    Written by Diogo Girondi
>> ###    [email protected] <mailto:[email protected]>
>>
>> import nuke
>>
>> def splitLayers( node=nuke.selectedNode() ):
>>    
>>     '''
>>     Splits each and every layer from the selected node into their own
>> pipes
>>     '''
>>    
>>     ch = node.channels()
>>    
>>     layers = []
>>     valid_channels = ['red', 'green', 'blue', 'alpha', 'black', 'white']
>>    
>>     for each in ch:
>>         layer_name = each.split( '.' )[0]
>>         tmp = []
>>         for channel in ch:
>>             if channel.startswith( layer_name ) == True:
>>                 tmp.append( channel )
>>         if len( tmp ) < 4:
>>             for i in range( 4 - len( tmp ) ):
>>                 tmp.append( layer_name + ".white" )
>>         if tmp not in layers:
>>             layers.append( tmp )
>>            
>>     for each in layers:
>>         layer = each[0].split( '.' )[0]
>>         ch1 = each[0].split( '.' )[1]
>>         ch2 = each[1].split( '.' )[1]
>>         ch3 = each[2].split( '.' )[1]
>>         ch4 = each[3].split( '.' )[1]
>>        
>>         if ch1 not in valid_channels:
>>             ch1 = "red red"
>>         else:
>>             ch1 = '%s %s' % ( ch1, ch1 )
>>            
>>         if ch2 not in valid_channels:
>>             ch2 = "green green"
>>         else:
>>             ch2 = '%s %s' % ( ch2, ch2 )
>>            
>>         if ch3 not in valid_channels:
>>             ch3 = "blue blue"
>>         else:
>>             ch3 = '%s %s' % ( ch3, ch3 )
>>            
>>         if ch4 not in valid_channels:
>>             ch4 = "alpha alpha"
>>         else:
>>             ch4 = '%s %s' % ( ch4, ch4 )
>>            
>>         prefs = "in %s %s %s %s %s" % (layer, ch1, ch2, ch3, ch4)
>>         shuffle = nuke.createNode( 'Shuffle', prefs, inpanel=False )
>>         shuffle.knob( 'label' ).setValue( layer )
>>         shuffle.setInput( 0, node )
>>        
>>
>>     ------------------------------------------------------------------------
>>     *From:* JKehler <[email protected]
>>     <mailto:[email protected]>>
>>     *To:* Nuke user discussion <[email protected]
>>     <mailto:[email protected]>>
>>     *Sent:* Monday, 17 October 2011, 17:26
>>     *Subject:* [Nuke-users] Diogo's splitLayers.py script
>>
>>     Hey.
>>
>>     Just wondering if anyone has had any luck using the splitLayers.py
>>     script.?(Diogo maybe)
>>     I tried running it on an .exr file but nothing happened.
>>
>>     Thanks for the feedback.
>>
>>     JK
>>     _______________________________________________
>>     Nuke-users mailing list
>>     [email protected]
>>     <mailto:[email protected]>,
>>     http://forums.thefoundry.co.uk/
>>     http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>>
>>
>> _______________________________________________
>> Nuke-users mailing list
>> [email protected]
>> <mailto:[email protected]>,
>> http://forums.thefoundry.co.uk/
>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
> 
> 
> _______________________________________________
> Nuke-users mailing list
> [email protected], http://forums.thefoundry.co.uk/
> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users

-- 
ben dickson
2D TD | [email protected]
rising sun pictures | www.rsp.com.au
_______________________________________________
Nuke-users mailing list
[email protected], http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users

Reply via email to