foregroundRender_render

10 篇文章 1 订阅
# -*- coding: utf-8 -*-
# ***************************************
#
# Author: Xinghai Zhao
# Created on: 2016.2.4  16:55:58
#
# ***************************************

'''
1.0.0:
render: use foregroundRender
    can use vray,hareward and mental ray renderer

tryRender: try foregroundRender except close Maya
'''

__version__ = '1.0.0'


import os,socket,logging
import cPickle as pickle

import bglobal,bjobsys

import maya.cmds as cmds
import maya.mel

import mayaSubmitQube.renderSetting


def getFormatType(format):
    format_dir = {'JPEG':'jpg','Tiff':'tiff',
                  'Maya IFF':'iff','Targa':'tga',
                  'PNG':'png','Custom Image Format':'exr',
                 }
    return format_dir.get(format) if format_dir.get(format) != None else 'png'



def render(startFrame = None,endFrame = None,frameStep = 1,
           render_dir = None,filename = None,
           renderLayer = None,camera = None,
           height = None,width = None,pixelAspectRatio = None,
           renderer = None,**kwargs):

    startFrame           = startFrame       if startFrame not in ['None'] else None
    endFrame             = endFrame         if endFrame not in ['None'] else None
    render_dir           = render_dir       if render_dir not in ['None'] else None
    filename             = filename         if filename not in ['None'] else None
    renderLayer          = renderLayer      if renderLayer not in ['None'] else None
    camera               = camera           if camera not in ['None'] else None
    renderer             = renderer         if renderer not in ['None'] else None
    try:
        height           = height           if int(height) not in ['None'] else None
    except:
        height           = None
    try:
        width            = width            if int(width) not in ['None'] else None
    except:
        width            = None
    try:
        frameStep        = frameStep        if float(frameStep) not in ['None'] else 1
    except:
        frameStep        = 1
    try:
        pixelAspectRatio = pixelAspectRatio if float(pixelAspectRatio) not in ['None'] else None
    except:
        pixelAspectRatio = None


    # ----------------------------------- render settings -------------------------------------- #
    scenepath = bglobal.toCurrent(cmds.file(q=True,sn = True))
    workspace = bglobal.toCurrent(cmds.workspace(q=True,fullName = True))
    # set render_dir
    if not render_dir:
        render_dir = '/'.join([workspace,'images'])

    if not filename:
        filename = os.path.basename(scenepath).rsplit('.',1)[0]

    render_dir = bglobal.toCurrent(render_dir)
    if not os.path.isdir(render_dir):
        try:
            os.makedirs(render_dir)
        except:
            raise Exception('can not make Folder named: %s ' % render_dir)

    # get frame
    if not startFrame:
        startFrame = cmds.currentTime(q = True)
    if not endFrame:
        endFrame = startFrame
    if endFrame < startFrame:
        endFrame = startFrame

    # set renderLayer
    if not renderLayer:
        renderLayer = cmds.editRenderLayerGlobals(q = True,currentRenderLayer = True)
    elif not renderLayer in cmds.ls(type = 'renderLayer'):
        _log = 'can not find renderLayer: %s' % renderLayer
        renderLayer = cmds.editRenderLayerGlobals(q = True,currentRenderLayer = True)
        logging.warning('%s,use %s' %(_log,renderLayer))
    else:
        if cmds.editRenderLayerGlobals(q = True,currentRenderLayer = True) != renderLayer:
            cmds.editRenderLayerGlobals(currentRenderLayer = renderLayer)

    # get camera
    if not camera:
        _cameras = [i for i in cmds.listCameras(p = True) if cmds.getAttr('%s.renderable' % i)]
        if _cameras:
            camera = _cameras[0]
        else:
            camera = 'persp'

    # load renderer
    if renderer:
        if renderer != cmds.getAttr('defaultRenderGlobals.currentRenderer'):
            renderer_dict = {'vray':'vrayformaya',
                             'arnold':'mtoa',
                             'mentalRay':'Mayatomr'}
            for key in renderer_dict.keys():
                if renderer == key:
                    if not cmds.pluginInfo(renderer_dict[key], q=True, l=True):
                        try:
                            cmds.loadPlugin(renderer_dict[key])
                            break
                        except:
                            raise Exception('can not load vray renderer')

        try:
            cmds.setAttr('defaultRenderGlobals.currentRenderer',renderer,type = 'string')
        except:
            raise Exception('error: set currentRenderer %s fail' % renderer)

    else:

        renderer = cmds.getAttr('defaultRenderGlobals.currentRenderer')

    # foreclose arnold
    if renderer in ['arnold']:
        raise Exception('error: foreground model can not use %s renderer' % renderer)

    #set width,height,pixelAspectRatio
    if width:
        if renderer == 'vray':
            cmds.setAttr('vraySettings.width',width)
        else:
            cmds.setAttr("defaultResolution.w",width)
    if height:
        if renderer == 'vray':
            cmds.setAttr('vraySettings.height',height)
        else:
            cmds.setAttr("defaultResolution.h",height)
    if pixelAspectRatio:
        if renderer == 'vray':
            cmds.setAttr('vraySettings.pixelAspect',pixelAspectRatio)
        else:
            cmds.setAttr("defaultResolution.pixelAspect",pixelAspectRatio)

    # set filename
    _pad = 4
    _format = 'png'
    if renderer == 'vray':
        _pad = cmds.getAttr('vraySettings.fileNamePadding')
        if cmds.getAttr('vraySettings.imageFormatStr'):
            _format = cmds.getAttr('vraySettings.imageFormatStr').split('(')[0].strip()
    else:
        _pad = cmds.getAttr('defaultRenderGlobals.extensionPadding')
        _format = getFormatType(cmds.getAttr('defaultRenderGlobals.imageFormat',asString = True))

    hostname = socket.gethostname()
    scenename = scenepath.replace('/','-')
    if not scenename:
        scenename = 'untitled'

    # get frame tmp path
    tmp_frame_path = '/'.join([os.path.dirname(scenepath),'%s_%s_%s' % (socket.gethostname(),scenepath.replace('/','_').replace(':','_'),'frame_tmp')])

    frame = startFrame
    while frame <= endFrame:

        # set frame tmp
        if not os.path.isfile(tmp_frame_path):
            _info_file = open(tmp_frame_path,'wb')
            pickle.dump({},_info_file)
            _info_file.close()

        _info_file = open(tmp_frame_path,'rb')
        _info = pickle.load(_info_file)
        _info_file.close()

        if _info.get('frame') == 'frame':
            if _info.get('try') != None:
                _info['try'] += 1
            else:
                _info['try'] = 1
        else:
            _info['frame'] = frame
            _info['try'] = 1

        _info['completed'] = False
        _info['startFrame'] = startFrame
        _info['frameStep'] = frameStep
        _info['endFrame'] = endFrame

        _info_file = open(tmp_frame_path,'wb')
        pickle.dump(_info,_info_file)
        _info_file.close()

        #set frame
        if cmds.currentTime(q = True) != frame:
            cmds.currentTime(frame)

        #get filename.frame
        _filename = '.'.join([filename,str(frame).zfill(_pad)])

        #set temp name
        if renderer == 'vray':
            #_filename += '_'.join([hostname,scenename,renderLayer,camera,str(frame)])
            cmds.setAttr('vraySettings.fileNamePrefix',
                     bglobal.toCurrent(os.path.join(render_dir,_filename)),
                     type = 'string')
        else:
            cmds.setAttr('defaultRenderGlobals.imageFilePrefix',_filename,type = 'string')

        # ------------------------------------------------------------------------------------------ #
        # --------------------------------------- render ------------------------------------------- #
        # open renderView
        if renderer == 'vray':
            maya.mel.eval('vray showVFB')
        else:
            cmds.RenderViewWindow()

        # rendering
        logging.info('start rendering frame: %s' % frame)
        if renderer == 'vray':
            maya.mel.eval('vrend -camera %s' % camera)
            while maya.mel.eval('vrend -isRendering'):
                time.sleep(10)
        else:
            maya.mel.eval('renderWindowRenderCamera("render","renderView","%s")' % camera)
        logging.info('frame: %s is finished' % frame)

        # ------------------------------------------------------------------------------------------ #
        # --------------------------------------saveImage------------------------------------------- #
        _target = ''
        if renderer == 'vray':
            _target = bglobal.toCurrent(os.path.join(render_dir,'.'.join([_filename,_format])))
            _source = bglobal.toCurrent(os.path.join(render_dir,'.'.join([_filename+'_tmp',_format])))
            if not os.path.isfile(_source):
                raise Exception('can not find render Temp')

            if os.path.isfile(_target):
                try:
                    os.remove(_target)
                except:
                    raise Exception('path: %s is exist' % _target)
            try:
                os.rename(_source,_target)
            except:
                raise Exception('can not save %s' % _save)
            #if cmds.getAttr('vraySettings.imageFormatStr') == 'exr (multichannel)':
            #    _save = '%s/%s.exr' % (render_dir,filename)
            #    maya.mel.eval('vray vfbControl -savemultiimage "%s";' % _save)
            #else:
            #    _save = '%s/%s.%s' % (render_dir,filename,format)
            #    maya.mel.eval('vray vfbControl -saveimage "%s";' % _save)

            #tmp = workspace + '/images/tmp'
            #if os.path.isdir(tmp):
            #    format = 'png'
            #    if cmds.getAttr('vraySettings.imageFormatStr'):
            #        format = cmds.getAttr('vraySettings.imageFormatStr').split('(')[0].strip()
            #    _fullname = '.'.join([_filename,format])
            #    for _dir in os.walk(tmp):
            #        for i in _dir[2]:
            #            if i == _fullname:
            #                _source = os.path.join(_dir[0],i)
            #                _target = os.path.join(render_dir,'.'.join([filename,format]))
            #                os.rename(_source,_target)

            #else:
                #raise Exception('error: setting fail')
        else:
            _target = '.'.join(['/'.join([render_dir,filename]),_format])
            if os.path.isfile(_target):
                try:
                    os.remove(_target)
                except:
                    raise Exception('path: %s is exist' % _target)
            try:
                maya.mel.eval('renderWindowSaveImageCallback "renderView" "%s" "%s"' %('/'.join([render_dir,_filename]),getFormatType(format)))
            except:
                raise Exception('can not save %s' % _target)

        logging.info('save image:%s' % _target)

        # set frame tmp
        _info_file = open(tmp_frame_path,'wb')
        _info['completed'] = True
        pickle.dump(_info,_info_file)
        _info_file.close()

        frame += frameStep



def tryRender(**kwargs):
    try:
        render(**kwargs)
        return cmds.quit(force = True,exitCode = 0,abort = True)
    except:
        logging.error('render fail')
        return cmds.quit(force = True,exitCode = 666,abort = True)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值