If you want to apply Arnold materials through scripting, there are a couple of undocumented commands you can use:
- SITOA_AddMaterial takes the shader family (for example, Material or Texture) and the name of a shader, and connects that shader to the surface port on the Material node.
# Add a standard material to the selected object
SITOA_AddMaterial( "Material", "standard" )
# Add ambient_occlusion to the selected object
SITOA_AddMaterial( "Texture", "ambient_occlusion" )
- SITOA_AddShader is similar, but it also takes a connection point as an argument, so you can connect to a specific port, such as the Environment or Displacement port.
# Add a vector displacement shader
SITOA_AddShader("Texture", "sta_vector_displacement", "displacement" )
However, neither of these commands return anything. So if you wanted to name the material, it’s not so easy. SITOA_AddMaterial does apply to the selection, so you could go through the selection to get the new material:
# Python
Application.SITOA_AddMaterial("Material", "standard")
sel = Application.Selection
mat = sel(0).Material
mat.Name = "MyStandardMaterial77"
You could write your own function with X3DObject.AddMaterial.
Here’s the simplest possible version. I don’t specify the path to a preset, just the name of the shader. That’s not terribly efficient, because Softimage now has to search for the preset (and that took about 0.2 seconds on my machine).
si = Application
def add_material( o, shader_name ):
return o.AddMaterial( shader_name )
mat = add_material( si.Selection(0), 'Material', 'Standard' )
mat.Name = 'My_Standard_Mat'
Here’s a version that builds the path to the preset (just like the SITOA commands do), but that doesn’t require the shader family, just the name of the shader.
# dictionary of shader families, keyed by shader name
shader_types = {
'ray_switch' : 'Material' ,
'sta_vector_displacement' : 'Texture' ,
'wireframe' : 'Material' ,
'sta_displacement' : 'Texture' ,
'ambient_occlusion' : 'Texture' ,
'skin_sss' : 'Material' ,
'sta_camera_projection' : 'Texture' ,
'utility' : 'Texture' ,
'bump3d' : 'Texture' ,
'standard' : 'Material' ,
'complex_fresnel' : 'Texture' ,
'bump2d' : 'Texture' ,
'motion_vector' : 'Material' ,
'hair' : 'Material' ,
'noise' : 'Texture' ,
}
si = Application
def add_material( o, shader_name ):
arnoldPlugin = si.plugins("Arnold Shaders");
dspresets = XSIUtils.BuildPath( arnoldPlugin.OriginPath, '..', '..', 'Data', 'DSPresets' )
mat = None
if shader_name in shader_types:
preset = XSIUtils.BuildPath( dspresets, 'Shaders', shader_types[shader_name], '%s.Preset' % shader_name )
mat = o.AddMaterial( preset )
return mat
mat = add_material( si.Selection(0), 'noise' )
mat.Name = 'My_Noise'