Source code for helga.maya.rendering.createUpdateRenderElements.createUpdateMmRenderElements

"""
createUpdateMmRenderElements
==========================================

Automatic setup of multimatte VRay Render Elements in Maya.
The script parses the scene for object ids on objects and creates
multi matte render elements from them. The object ids are sorted
numerically.
You can call this function as often as you want. It will not duplicate 
existing elements, only add missing ones.

-----------------------

Usage
-----

::
	
	from helga.maya.rendering.createUpdateRenderElements import createUpdateMmRenderElements
	reload(createUpdateMmRenderElements)

	#Create instance
	createUpdateMmRenderElementsInstance = createUpdateMmRenderElements.CreateUpdateMmRenderElements()
	#Create/Update shadow passes
	createUpdateMmRenderElementsInstance.createUpdateMmRenderElements()

-----------------------
"""




#Imports
#------------------------------------------------------------------
import pymel.core as pm
import maya.OpenMaya as openMaya


#reload?
doReload = True

#own
import vrayGlobals as vrayGlobals
if(doReload): reload(vrayGlobals)







#CreateUpdateMmRenderElements class
#------------------------------------------------------------------

class CreateUpdateMmRenderElements():
[docs] #Constructor / Main Procedure def __init__(self): #Instance Vars #------------------------------------------------------------------ self.verbose = True #Top Level Methods #------------------------------------------------------------------ #createUpdateMultiMatteElements def createUpdateMultiMatteElements(self):
[docs] """ Function to create/update multi matte render elements. """ #Check if Vray Loaded, else set Status and return if not(self.vrayLoaded()): openMaya.MGlobal.displayWarning('Vray for Maya Plugin not loaded') return None #deleteCurrentMultiMatteElements self.deleteCurrentMultiMatteElements() #getSceneObjectIDList objectIdList = self.getSceneObjectIdList() #createMultiMattes if objectIdList not empty if(objectIdList): try: #createMMs self.createMultiMattes(objectIdList) #msg openMaya.MGlobal.displayInfo('Multi Mattes created succesfully') except: #msg openMaya.MGlobal.displayWarning('Error creating Multi mattes') else: #msg openMaya.MGlobal.displayWarning('No object ids found. No MultiMatte render elements created.') #Methods #------------------------------------------------------------------ #createMultiMattes def createMultiMattes(self, objectIdList):
[docs] #create mMRE mMRE = self.createRenderElement('MultiMatteElement') self.renameMultiMatteRE(mMRE) #iterate through objectIdList indexId = 1 index = 0 for id in objectIdList: #check if %3 of indexId is not 0 if(indexId % 3 != 0): #set vray mm attr based on indexId if(indexId == 1): pm.setAttr(mMRE.vray_redid_multimatte, id) if(indexId == 2): pm.setAttr(mMRE.vray_greenid_multimatte, id) #increment indexId indexId = indexId + 1 #else (meaning indexId % 3 == 0), create new renderelement and set indexId back to 1 else: #set blue id attr for multimatte if(indexId == 3): pm.setAttr(mMRE.vray_blueid_multimatte, id) try: #try to access index+1 element from list to make sure current element has not been the last testId = objectIdList[index+1] #Create new renderelement mMRE = self.createRenderElement('MultiMatteElement') self.renameMultiMatteRE(mMRE) #set indexId back to one indexId = 1 except: pass #increment list index index = index + 1 #deleteCurrentMultiMatteElements def deleteCurrentMultiMatteElements(self):
[docs] #get all Mm REs multiMatteREList = self.getRenderElementsByPrefix('{0}Mm'.format(vrayGlobals.PREFIX)) #delete if list != empty if(multiMatteREList): pm.delete(multiMatteREList) #getSceneObjectIdList def getSceneObjectIdList(self):
[docs] #deselect all pm.select(cl = True) #list all scene objects sceneObjList = pm.ls(fl = True) #Iterate through scene objects list and if obj has vrayObjId attr then add to objIdList objIdList = [] for obj in sceneObjList: #attrs added on geometry if(pm.hasAttr(obj, 'vrayObjectID', checkShape = True)): objIdList.append(pm.getAttr(obj.vrayObjectID)) #cover vrops elif((pm.hasAttr(obj, 'objectIDEnabled')) and (pm.hasAttr(obj, 'objectID'))): if(obj.objectIDEnabled.get()): objIdList.append(pm.getAttr(obj.objectID)) #return duplicate free list return sorted(list(set(objIdList))) #renameMultiMatteRE def renameMultiMatteRE(self, mMRE):
[docs] #rename pm.rename(mMRE, '{0}MmRenderElement'.format(vrayGlobals.PREFIX)) #SetAttrs on mMRE pm.setAttr(mMRE.vray_name_multimatte, mMRE.name()) #Shared Methods #------------------------------------------------------------------ #REWithAttrAndValueExists def REWithAttrAndValueExists(self, attrName, attrValue):
[docs] #List all nodes of Type VRayRenderElement REList = pm.ls(fl = True, typ = 'VRayRenderElement') #if list < 1 return False (no RE in scene, ready to create) if not(REList): return False #if list larger check if REName in list of RElements for RE in REList: #check if RE has attr of attrName and if return True try: if(pm.getAttr(RE.name() +'.' +attrName) == attrValue): return True except: pass #Else False (ready to create) return False #getRenderElementsByPrefix def getRenderElementsByPrefix(self, prefix):
[docs] #clear selection pm.select(cl = True) #get list of all REs renderElementsList = pm.ls(fl = True, typ = 'VRayRenderElement') #if renderElementList < 1 return renderElementList if not(renderElementsList): return renderElementsList #iterate through renderElementList and append to lsList when name beginning matches prefix lsResList = [] prefixLength = len(prefix) for RE in renderElementsList: if(RE.name()[0:prefixLength] == prefix): lsResList.append(RE) return lsResList #createRenderElement def createRenderElement(self, renderElementName):
[docs] #clear Selection pm.select(cl = True) #build MEL Cmd createRElementMELCmd = 'vrayAddRenderElement ' +renderElementName +';' #Execute pm.mel.eval(createRElementMELCmd) #return created RenderElementNode renderElement = pm.ls(sl = True, fl = True)[0] pm.select(cl = True) return renderElement #vrayLoaded def vrayLoaded(self):
[docs] #Get list of all loaded plugIns plugInList = pm.pluginInfo( query=True, listPlugins=True ) #Return true if loaded else setStatus and return false if('vrayformaya' in plugInList): return True return False