Force Refresh Expressions
Expressions can be a pain as they don’t always get evaluated. This is particularly problematic if you want to use an environment variable to control a switch node.
So, how do we force nuke to re-evaluate expressions? Looking at the properties of the switch-node, there’s nothing like “evaluate”, and even using getValue() doesn’t force the expression to re-evaluate even though we actually get the right value back from the python call.
The trick is to get the expression from the node, and re-apply it. This triggers the node to re-evaluate the switch value.
You can achieve this with the following python:
[a['which'].fromScript(nuke.allNodes('Switch')[0]['which'].toScript()) for a in nuke.allNodes('Switch')]
The builtin allNodes() method doesn’t handle groups very well, so you might want to replace it with this method instead (kindly shared by Sean Wallitsch : http://shidarin.github.io/2014/building-a-better-nukeallnodes/
def allNodes(filter=None, group=nuke.root(), recurseGroups=False):
""" Wraps nuke.allNodes to allow filtering and recursing
Args:
filter=None : (str)
A Nuke node name to filter for. Must be exact match.
group=nuke.root() : ()
A Nuke node of type `Group` to search within. If not provided, will
begin the search at the root level.
recurseGroups=False : (bool)
If we should continue our search into any encountered group nodes.
Returns:
[]
A list of any Nuke nodes found whose Class matches the given filter.
Raises:
N/A
"""
# First we'll check if we need to execute our custom allNodes function.
# If we don't have a filter AND recurseGroups=True, `nuke.allNodes` will
# do the job fine.
if filter and recurseGroups:
# Search for every node, then filter using a list comprehension.
# Faster than searching for all groups, then searching again
# for the filter.
all_nodes = nuke.allNodes(group=group, recurseGroups=True)
return [node for node in all_nodes if node.Class() == filter]
else:
# We just need to execute Nuke's `nuke.allNodes` function.
# But we need to modify our list of keyword arguments and remove
# the filter argument if it wasn't passed, otherwise Nuke chokes.
kwargs = {
'filter': filter,
'group': group,
'recurseGroups': recurseGroups
}
# Remove empty arguments
if not filter:
del kwargs['filter']
return nuke.allNodes(**kwargs)
and then use the updated snippet :
[a[‘which’].fromScript(allNodes(‘Switch’, recurseGroups=True)[0][‘which’].toScript()) for a in allNodes(‘Switch’, recurseGroups=True)]