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'
Hello, do you know how to add a shade to MtoA ? such as aaPhysicalSky,I want to use it in maya , how can I do? thanks!