Hi Mads,
thank you for sharing your code! this looks good :)
But still I'm wondering that this can't be as simple as it is with
standard nuke. I hoped to get away with something that works for all
nuke flavours. Something like telling the
"backgound-render-nuke-instance" to execute
'nuke.addBeforeRender(fustoms.createWriteDir)' when it starts the thread?
cheers,
Fabian
Am 06.05.2015 um 12:40 schrieb Mads Lund:
Im not sure if it is my thread from back in november you are refering
to, but I did find a good solution for us back then.
I create the Nuke scripts, then select the media in the timeline view
and hit a custom menu button connected to this funciton (note that our
scripts automatically create a tag called "script" on the media):
#Use this script to add a auto floder creation option.
#All you need is the \AutoWriteFolder.py file in your .nuke folder
def folderfix():
import hiero
HasExecuted = False
print "Fixing Path AutoCreation"
for item in
hiero.ui.TimelineEditor.selection(hiero.ui.getTimelineEditor(hiero.ui.activeSequence())):
for items in item.tags():
Tags = items.metadata()
if Tags.hasKey("script"):
print Tags.value("script")
subprocess.Popen([nuke.EXE_PATH,'-t',os.path.dirname(os.path.realpath(__file__))+'\AutoWriteFolder.py',
Tags.value("script")])
HasExecuted = True
if not HasExecuted:
nuke.message("ERROR - Did not patch any files! \nMake sure that you
select item(s) in the timline with a NukeScript tag.")
The key part here is "subprocess.Popen" that will make the script run
in its own nuke thread
The AutoWriteFolder.py looks like this:
import nuke
import os
import sys
def RecursiveFindNodes(nodeClass, startNode):
if startNode.Class() == nodeClass:
yield startNode
elif isinstance(startNode, nuke.Group):
for child in startNode.nodes():
for foundNode in RecursiveFindNodes(nodeClass, child):
yield foundNode
if len ( sys.argv ) != 2:
print 'Usage: NUKE autoWriteFolder.py <nuke_script>' + str(len (
sys.argv ))
sys.exit(-1)
inScript = sys.argv[1]
nuke.scriptOpen( inScript )
allWriteNodes = [w for w in RecursiveFindNodes('Write', nuke.root())]
for write in allWriteNodes:
write['beforeRender'].setValue( """if not
os.path.exists(os.path.dirname(nuke.thisNode().knob("file").value())):
os.makedirs(os.path.dirname(nuke.thisNode().knob("file").value()))""" )
nuke.scriptSave( inScript )
On Wed, May 6, 2015 at 12:23 PM, Fabian Fischer
<[email protected] <mailto:[email protected]>> wrote:
Hi,
has anyone come up with a solution for this yet? There is a thread
in the nuke-user list back from november, but no real solution was
found.
For nuke and nuke x, I'm calling this function (it is within my
own module):
def createWriteDir():
import os
file = nuke.filename(nuke.thisNode())
dir = os.path.dirname( file )
osdir = nuke.callbacks.filenameFilter( dir )
if os.path.exists(osdir) == False:
if nuke.ask(osdir+"\nOutput dir does not exist. Create?"):
os.makedirs( osdir )
I'm calling it from init.py:
nuke.addBeforeRender(fustoms.createWriteDir)
This seems not to work for Nuke Studio when rendering from the
timeline - which is really annoying...
Any help highly appreciated! Thank you,
Fabian
_______________________________________________
Nuke-python mailing list
[email protected]
<mailto:[email protected]>,
http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
_______________________________________________
Nuke-python mailing list
[email protected], http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
--
Fabian Fischer
Compositing & VFX | [email protected] | +49 170 15 20 750
_______________________________________________
Nuke-python mailing list
[email protected], http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python