############################################################################# ## snapshot.py v1.1 by Andrew Osiow (c) 2009 ## ## To be used freely with the author's permission. Please contact the author ## if you wish upload or post this script to another site. ## ## usage: import snapshot.py ## snapshot.snapshot() ## ## ver 1.0 Converts a series of Maya Files into Demo Images. ## select a folder of Maya Scene files and snot wil automatically ## load each file and allow you to position the persp camera and ## take a shot. ## ver 1.1 Uses can now choose Playbast Image, Software render or Mental ## with Quick Occlusion Render ## ## todo: It would be nice to set the RenderGlobals ## ############################################################################# import maya.cmds as cmds import maya.mel as mel def browseForSnapDirectory(): fileResults = cmds.fileDialog() dirName = fileResults.rsplit( '/',1 )[0] cmds.textField('snapNameField', e=True, tx=dirName) cmds.textScrollList('mayaFileList', e=True, ra=True) fileList = cmds.getFileList( folder=dirName+'/', filespec='*.m*' ) cmds.textScrollList( 'mayaFileList', e=True, append=fileList, selectIndexedItem=1) # end browse for snap directory def loadScenefromList(): dirname = cmds.textField('snapNameField', q=True, tx=True) if dirname: mayaFile = cmds.textScrollList( 'mayaFileList', q=True, si=True)[0] if mayaFile: cmds.file( dirname + '/' + mayaFile ,f=True, ignoreVersion=True, o=True ) print "Loaded Maya file: " + mayaFile # select next item on list or go back to the top listTotal = cmds.textScrollList( 'mayaFileList', q=True, ni=True) currentIndex = cmds.textScrollList( 'mayaFileList', q=True, sii=True)[0] if currentIndex < listTotal: cmds.textScrollList( 'mayaFileList', e=True, sii=currentIndex+1) else: cmds.textScrollList( 'mayaFileList', e=True, sii=1) # end Load scene file from list def takeASnap(): mayaFile = '' if (cmds.textScrollList( 'mayaFileList', q=True, ni=True)>0): mayaFile = cmds.textScrollList( 'mayaFileList', q=True, si=True)[0] else: cmds.confirmDialog( title='Snapshot Dialog', message='Use the Browser to load a Scene Directory.', button='OK' ) if mayaFile: snapAction = cmds.radioCollection( 'snapActionType', q=True, sl=True ); if snapAction =='playBlastButton': print 'Taking a Playblast snap of', mayaFile currentFrame = int(cmds.currentTime( query=True )) #pbWidth = cmds.getAttr( 'defaultRenderGlobals.rght' ) + 1 not used yet #pbHeight = cmds.getAttr( 'defaultRenderGlobals.top' ) + 1 not used yet cmds.playblast( fr=currentFrame, format='image', widthHeight = [640, 480], clearCache=1, viewer=1, showOrnaments=0, fp=4, percent=100) elif snapAction =='softwareRenderButton': print 'Taking a Software snap of', mayaFile mel.eval( 'setCurrentRenderer mayaSoftware' ) #create a new Blinn - Maya will take care of the new shader group later snapshotBlinn = cmds.shadingNode('blinn', asShader=True) #create shader Group - Maya would do this automatically but it's nice to be complete cmds.sets( r=True, nss=True, em=True, name=snapshotBlinn+'SG' ) cmds.connectAttr( snapshotBlinn+'.outColor', snapshotBlinn+'SG.surfaceShader', force=True) # select all geometry and assign to new blinn geos = cmds.ls( g=True ) cmds.select( geos, r=True ) cmds.PickWalkUp() # assigning new blinn to all selected geometry - using mel version, Python seems not to work here mel.eval( 'hyperShade -assign ' + snapshotBlinn ) cmds.select ( clear=True ) # make new shader brighter cmds.setAttr ( snapshotBlinn+'.diffuse', 1 ) cmds.setAttr ( snapshotBlinn+'.color', .8, .8, .8, type='double3' ) # render into new window cmds.RenderIntoNewWindow() else: ## mentalRayRenderButton print 'Taking a Mental Ray snap of', mayaFile mel.eval( 'setCurrentRenderer mentalRay' ) #create a new Surface Shader - Maya will take care of the new shader group later snapshotSurfShader = cmds.shadingNode('surfaceShader', asShader=True) #create shader Group - Maya would do this automatically but it's nice to be complete cmds.sets( r=True, nss=True, em=True, name=snapshotSurfShader+'SG' ) cmds.connectAttr( snapshotSurfShader+'.outColor', snapshotSurfShader+'SG.surfaceShader', force=True) #create mib fast occlusion node and connect it snapshotMRfastOcc = mel.eval ( 'mrCreateCustomNode -asUtility "" mib_fast_occlusion' ) cmds.connectAttr( snapshotMRfastOcc+'.outValue', snapshotSurfShader+'.outColor', force=True) # select all geometry and assign to MR Occlusion Shader geos = cmds.ls( g=True ) cmds.select( geos, r=True ) cmds.PickWalkUp() # assigning new blinn to all selected geometry - using mel version, Python seems not to work here mel.eval( 'hyperShade -assign ' + snapshotSurfShader ) cmds.select ( clear=True ) cmds.RenderIntoNewWindow() # end of take a Snapshot def snapshot(): # delete any old array window preferences if cmds.windowPref( 'snapshotWindow', exists=True ): cmds.windowPref( 'snapshotWindow', remove=True ) # delete any old array window structures if cmds.window( 'snapshotWindow', exists=True ): cmds.deleteUI( 'snapshotWindow', window=True ) #trick to get python commands to work correctly with Maya GUI importCommand = 'python("import maya.cmds as cmds");' mel.eval( importCommand ) importCommand = 'python("import maya.mel as mel");' mel.eval( importCommand ) # create a window structure snapshotWin = cmds.window( 'snapshotWindow', title='snapshot 1.1', s=0) snaplayout = cmds.formLayout( 'snaplayout', numberOfDivisions=100, w=420, h=320) cmds.text('snapLabelName', label="Pick a Maya file from the scene directory:") cmds.textField('snapNameField', text='', width=310) cmds.button('snapbrowseButton', width=70, height=22, label='Browse', command='snapshot.browseForSnapDirectory()') cmds.textScrollList( 'mayaFileList', numberOfRows=12, allowMultiSelection=False, w=382, h=190) cmds.button('loadButton', width=136, height=26, label='Load', align='center', command='snapshot.loadScenefromList()') cmds.button('snapButton', width=136, height=26, label='Snap', align='center', command='snapshot.takeASnap()') cmds.button('cancelButton', width=136, height=26, label='Close', align='center', command="cmds.deleteUI( 'snapshotWindow')") cmds.text( 'snapActionText', label='Image Type:' ) cmds.radioCollection( 'snapActionType' ) cmds.radioButton( 'playBlastButton', label='Playblast' ) cmds.radioButton( 'softwareRenderButton', label='Maya SW.' ) cmds.radioButton( 'mentalRayRenderButton', label='MR. Occ.' ) cmds.button( 'optionButton', width=96, height=26, label='Settings', align='center', command='mel.eval("unifiedRenderGlobalsWindow")' ) cmds.radioCollection( 'snapActionType', e=True, sl='playBlastButton' ) cmds.formLayout( snaplayout, edit=True, attachForm=[ ('snapLabelName', 'left', 20), ('snapLabelName', 'top', 12), ('snapNameField', 'left', 17), ('snapNameField', 'top', 36), ('snapbrowseButton', 'right', 20), ('snapbrowseButton', 'top', 35), ('mayaFileList', 'left', 18), ('mayaFileList', 'top', 64), ('snapActionText', 'left', 18), ('snapActionText', 'top', 264), ('playBlastButton', 'left', 88), ('playBlastButton', 'top', 266), ('softwareRenderButton', 'left', 156), ('softwareRenderButton', 'top', 266), ('mentalRayRenderButton', 'left', 232), ('mentalRayRenderButton', 'top', 266), ('optionButton', 'left', 304), ('optionButton', 'top', 260), ('loadButton', 'left', 4), ('loadButton', 'bottom', 4), ('snapButton', 'left', 142), ('snapButton', 'bottom', 4), ('cancelButton', 'right', 4), ('cancelButton', 'bottom', 4)]) # display Window cmds.showWindow ( 'snapshotWindow' ) #end snapshot