autosave every render?

hello,

i wanted to ask, if there’s any plugin which would autosave render, so i wouldn’t have to bother with pressing F3 everytime, after every finished picture.

thank you

You could try something like


from os.path import exists  
  
from Blender import Registry, Scene  
 
def get_renderformat(ctx):  
    '''  
    returns renderformat in string format (ie. 'png')  
    '''      
    # need to map formats manually as the API doesn't offer them in nice form :(  
    # current map dict is incomplete! only needed/relevant formats for now. 
    formats = {20: 'bmp', 22: 'tiff', 4: 'jpg', 17: 'png'}  
    return formats[ctx.imageType]  
  
# check if this is triggered ~before~ render and set a flag 
rdict = Registry.GetKey('saverender') 
save_render = False # cannot use quit() as it seems to crash with registry 
 
if rdict: 
    before_render = rdict['before_render'] 
     
    if before_render: 
        rdict['before_render'] = False 
        save_render = True 
    else: 
        rdict['before_render'] = True 
else: 
    Registry.SetKey('saverender', {'before_render': True, }) 
 
if save_render: 
    scn = Scene.GetCurrent()  
    ctx = scn.getRenderingContext()  
    render_path = ctx.getRenderPath() # set path here. currently uses just default 
      
    # figure out where to render. avoid overwriting existing render  
    file_base = 'testrender' # set render name here 
    render_name = None  
      
    for i in range(1, 1000):  
        render_number = '%04d' % i  
        render_format = get_renderformat(ctx)  
        render_name = file_base + render_number  
        full_path = render_path + render_name + '.' + render_format  
          
        if not exists(full_path):  
            break # woohoo! found a suitable file name 
      
    if not render_name:  
        print 'could not find a path!!!'  
        quit()  
      
    try:  
        ctx.saveRenderedImage(render_name)  
        print 'render saved in path %s' % (full_path)  
    except ValueError, e:  
        print e

as a scene script link (render).

thank you :slight_smile:

but… err… how to actually use it? :smiley: :slight_smile:

You set it as a script link (render). You can do this by going to Buttons Window -> Script and then setting “Enable Script Links” on. After this you need to add a new script link to scene. Hit New button at the scene part in the bottom of the Scriptlinks panel.

Before this it may be a good idea to load the script to the text editor. Just copy/paste (if you are on Windows or Linux) the script to a new file created in Blender’s Text Editor window, give it a nice name and that should do it. Now if you hit "New’, the script name should appear there. Alternatively you can just type in the script name.

The final step is to set the script link to trigger on render. It’s “FrameChanged” by default. Change this to “Render”. Now the script gets executed each time “Render” is triggered. I just noticed that it seems to trigger that both before and after render. I made a tiny change to the script that fixes this issue.

ah :slight_smile:

thanks very much.

EDIT: i adjusted the script to fit my exact needs.

thanks a lot, BeBraw :slight_smile:

EDIT2: however, now it does not save files :smiley: only prints the “saved in…” message, but no real file appears.

why? :smiley:

from os.path import exists  
  
from Blender import Registry, Scene
import Blender
 
def get_renderformat(ctx):  
    '''  
    returns renderformat in string format (ie. 'png')  
    '''      
    # need to map formats manually as the API doesn't offer them in nice form :(  
    # current map dict is incomplete! only needed/relevant formats for now. 
    formats = {20: 'bmp', 22: 'tiff', 4: 'jpg', 17: 'png'}  
    return formats[ctx.imageType]  
  
# check if this is triggered ~before~ render and set a flag 
rdict = Registry.GetKey('saverender') 
save_render = False # cannot use quit() as it seems to crash with registry 
 
if rdict: 
    before_render = rdict['before_render'] 
     
    if before_render: 
        rdict['before_render'] = False 
        save_render = True 
    else: 
        rdict['before_render'] = True 
else: 
    Registry.SetKey('saverender', {'before_render': True, }) 
 
if save_render: 
    scn = Scene.GetCurrent()  
    ctx = scn.getRenderingContext()  
    path = Blender.Get('filename') #need to get rid of '.blend'
    render_path = path[0:path.rindex('.blend')] + '/'
    # figure out where to render. avoid overwriting existing render  
    file_base = 'render' # set render name here 
    render_name = None  
      
    for i in range(1, 1000):  
        render_number = '%04d' % i  
        render_format = get_renderformat(ctx)  
        render_name = file_base + render_number  
        full_path = render_path + render_name + '.' + render_format  
          
        if not exists(full_path):  
            break # woohoo! found a suitable file name 
      
    if not render_name:  
        print 'could not find a path!!!'  
        quit()  
      
    try:  
        ctx.saveRenderedImage(render_name)  
        print 'render saved in path %s' % (full_path)  
    except ValueError, e:  
        print e

anyone willing to help? or at least aid where to find the roots of this problem? thnx

it saves the image to /tmp/ path. is there any way to force it to save it elsewhere?

http://www.alienhelpdesk.com/python_scripts/autosave_render

That might be what you need.

from os.path import exists  
  
from Blender import Registry, Scene
import Blender
 
def get_renderformat(ctx):  
    '''  
    returns renderformat in string format (ie. 'png')  
    '''      
    # need to map formats manually as the API doesn't offer them in nice form :(  
    # current map dict is incomplete! only needed/relevant formats for now. 
    formats = {20: 'bmp', 22: 'tiff', 4: 'jpg', 17: 'png'}  
    return formats[ctx.imageType]  
  
# check if this is triggered ~before~ render and set a flag 
rdict = Registry.GetKey('saverender') 
save_render = False # cannot use quit() as it seems to crash with registry 
 
if rdict: 
    before_render = rdict['before_render'] 
     
    if before_render: 
        rdict['before_render'] = False 
        save_render = True 
    else: 
        rdict['before_render'] = True 
else: 
    Registry.SetKey('saverender', {'before_render': True, }) 
 
if save_render: 
    scn = Scene.GetCurrent()  
    ctx = scn.getRenderingContext()  
    path = Blender.Get('filename') #need to get rid of '.blend'   #ctx.getRenderPath() # set path here. currently uses just default 
    #print path.rfind('.blend')
    render_path = path[0:path.rindex('.blend')] + '/'
    # render path generated successfully. only condition is
    # that a directory with project's name exists.
    # figure out where to render. avoid overwriting existing render  
    file_base = 'render' # set render name here 
    render_name = None  
      
    for i in range(1, 1000):  
        render_number = '%04d' % i  
        render_format = get_renderformat(ctx)  
        render_name = file_base + render_number
        full_path = render_path + render_name + '.' + render_format  
          
        if not exists(full_path):  
            break # woohoo! found a suitable file name 
      
    if not render_name:  
        print 'could not find a path!!!'  
        quit()  
      
    try:  
        r = ctx.getRenderPath()
        ctx.setRenderPath(render_path)
        ctx.saveRenderedImage(render_name)  
        print 'render saved in path %s' % (full_path)
        ctx.setRenderPath(r)
    except ValueError, e:  
        print e

ha! this does exactly what i need :smiley:

all i had to do is to look in the API xD

thanks for everything, BeBraw and macouno.

Apparently there is a way to check if render is at “pre” or “post” stage. This technique is described at http://www.blender.org/documentation/247PythonDoc/API_related-module.html under “Important note about “Render” events”. Thanks to ianwill for pointing this out. :slight_smile: