Useful Python Snippets for Lighting in Arnold and Maya

Some informations on Python for Arnold and Maya can be hard to find. In this list I have included useful code snippets for scripting in Arnold and Maya.

Let’s start by creating an Arnold light:

import maya.cmds as cmds
import mtoa.utils as mutils
light = mutils.createLocator("aiAreaLight", asLight=True)

create a light blocker:

blocker = mutils.createLocator("aiLightBlocker")
#connect blocker to light
cmds.connectAttr(blocker[0]+".message",str(light)+".aiFilters[0]")

Use cmds.linklink to automatically link or break lights to objects:

cmds.lightlink( b=True, light=light, object=("Character", "Environment")

create AOVs:

import mtoa
import mtoa.aovs
mtoa.aovs.AOVInterface().addAOV('N', aovType='vector')
mtoa.aovs.AOVInterface().addAOV('P', aovType='vector')
mtoa.aovs.AOVInterface().addAOV('emission', aovType='rgb')

create custom AOVs like a Deep Alpha Channel

#create custom Deep AOV driver
cmds.createNode( 'aiAOVDriver' , name= 'DeepDriver' )
cmds.setAttr('DeepDriver.ai_translator', "deepexr", type="string" )

#create DeepAlpha AOV
deepAlphaAOV = cmds.createNode( 'aiAOV' , name= 'DeepAlpha' )
cmds.setAttr( deepAlphaAOV + '.name' , 'DeepAlpha' , type='string')
cmds.setAttr( deepAlphaAOV + '.type' , 4 )
cmds.connectAttr( deepAlphaAOV + '.message' , 'defaultArnoldRenderOptions.aovList', nextAvailable=True )
cmds.connectAttr( 'DeepDriver.message' , deepAlphaAOV + '.outputs[0].driver' )
cmds.connectAttr( 'defaultArnoldFilter.message' , deepAlphaAOV + '.outputs[0].filter' )

To create Per-Light AOVs, the light AOV name has to be set in the light attributes and in the AOV itself:

cmds.setAttr(str(light)+ ".aiAov", str(light), type="string")
mtoa.aovs.AOVInterface().addAOV('RGBA_'+light, aovType='rgba')

When creating Maya Renderlayers, a dummy objects needs to be created in order to make use of render attributes

import maya.app.renderSetup.model.override as override
import maya.app.renderSetup.model.selector as selector
import maya.app.renderSetup.model.collection as collection
import maya.app.renderSetup.model.renderLayer as renderLayer
import maya.app.renderSetup.model.renderSetup as renderSetup

rs = renderSetup.instance()
ov = renderSetup.override
#create render layer
layer = rs.createRenderLayer(layerName+"_renderlayer")
#create collections
v = layer.createCollection("visibleObjects")
n = layer.createCollection("nonvisibleObjects")
#add objects to collection
v.getSelector().setPattern("Environment"+"*"+",Lights*")
n.getSelector().setPattern("Characters"+"*")

#create dummy object to access visibility
cmds.polyCube(n='dummyLAYERObj000001111')
ov = n.createAbsoluteOverride('dummyLAYERObj000001111Shape', 'primaryVisibility')
ov.setName(layerName + '_visibleOff')
ov.setAttrValue(False)
cmds.delete('dummyLAYERObj000001111')