Out of interest can you just use nuke.allNodes('Read') and see if they have an 
output and same for ReadGeo?

Howard

> On 14 Feb 2016, at 11:33 pm, Ben Dickson <[email protected]> wrote:
> 
> Your recursive tree walking is probably going over every possible combination 
> of connections, when you only need to visit each node once (since once you 
> have checked all upstream connections from one node, there's no need to check 
> them again)
> 
> This should be mostly equivalent to your "recursiveDependencies" method - 
> mainly it is just quicker, but it also handles when a node is disabled (by 
> only checking the primary pipe)
> 
> def _get_upstream(starter, _visited=None):
>    """Get upstream nodes, handling disabled nodes sensibly
>    """
> 
>    if _visited is None:
>        _visited = set()
> 
>    elif starter in _visited:
>        # If a node is already visisted, it's inputs have already been
>        # inspected, so, skip.
>        return
> 
>    yield starter
> 
>    if ('disable' in starter.knobs()
>        and starter['disable'].value()
>        and not starter['disable'].hasExpression()
>        ):
> 
>        # Disabled permenantly (non-expression),
>        # only look at first input
>        first_input = starter.input(0)
>        if first_input is None:
>            # Node has no inputs (e.g empty Group with zero inputs)
>            return # done
>        else:
>            for n in _get_upstream(first_input, _visited=_visited):
>                _visited.add(n)
>                yield n
> 
>    else:
>        # Regular node, look at all upstream nodes
>        inputs = starter.dependencies(
>            nuke.HIDDEN_INPUTS|nuke.INPUTS|nuke.EXPRESSIONS)
>        for curinp in inputs:
>            for n in _get_upstream(curinp, _visited=_visited):
>                _visited.add(n)
>                yield n
> 
> 
>> On 13/02/16 08:49, J Bills wrote:
>> This might not be the most efficient, but we have this in place as part
>> of a larger archive script, happy to share:
>> 
>> 
>> 
>> import nuke
>> import os
>> import sys
>> 
>> 
>> def recursiveDependencies(n):
>>   '''Given a node, find all upstream nodes. This works, but for moderately
>>   complex nuke graphs it can take a long long time, eg 516 nodes found in
>>   1418 seconds'''
>>   thisDependencies = set(n.dependencies())
>>   if not thisDependencies:
>>     return set()
>>   dependencyDependencies = set()
>>   for nn in thisDependencies:
>>     dependencyDependencies.update(recursiveDependencies(nn))
>>   return thisDependencies.union(dependencyDependencies)
>> 
>> def findOutputs():
>>   result = []
>>   for n in nuke.allNodes():
>>     if n.Class() in ["Write"]:
>>       result.append(n)
>>   return result
>> 
>> def findInputsFromOutputs():
>>   result = set()
>>   for n in findOutputs():
>>     dependencies = recursiveDependencies(n)
>>     for dependent in dependencies:
>>       if dependent.Class() in ['Read','ReadGeo']:
>>         result.add(os.path.dirname(nuke.filename(dependent)))
>>   return list(result)
>> 
>> def printInputsFromOutputs():
>>   print '\n'.join(findInputsFromOutputs())
>> 
>> def findInputs():
>>   result = set()
>>   for n in nuke.allNodes():
>>     if n.Class() in ["Read", "ReadGeo"]:
>>       result.add(os.path.dirname(nuke.filename(n)))
>>   result = list(result)
>>   result.sort()
>>   return result
>> 
>> def printInputs():
>>   print '\n'.join(findInputs())
>> 
>> 
>> 
>> 
>> On Thu, Feb 11, 2016 at 11:34 AM, Dan Stein
>> <[email protected] <mailto:[email protected]>>
>> wrote:
>> 
>>    For non-GUI you can load Nuke as a Python module.
>> 
>>    
>> http://docs.thefoundry.co.uk/nuke/80/pythondevguide/nuke_as_python_module.html
>> 
>>    Then just collect the Read and ReadGeo nodes however you would in
>>    the GUI, nuke.allNodes('Read')... etc
>> 
>>    On Feb 11, 2016, at 10:52 AM, Gabor Hovanyi <[email protected]
>>    <mailto:[email protected]>> wrote:
>> 
>>>    for reads, you could use nukescripts.get_script_data() or
>>>    nukescripts.get_reads()
>>> 
>>>    -g
>>> 
>>>    On Thu, Feb 11, 2016 at 10:26 AM, Gary Jaeger <[email protected]
>>>    <mailto:[email protected]>> wrote:
>>> 
>>>        Is there a way, preferably in non-gui mode, to quickly
>>>        generate a list of all read nodes, including geo, used in a
>>>        script?
>>> 
>>>        Gary Jaeger // Core Studio
>>>        249 Princeton Avenue
>>>        Half Moon Bay, CA 94019
>>>        650.728.7957 <tel:650.728.7957> (direct)
>>>        650.728.7060 <tel:650.728.7060> (main)
>>>        http://corestudio.com <http://corestudio.com/>
>>> 
>>> 
>>>        _______________________________________________
>>>        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]
>>    <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
_______________________________________________
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