Given a shader, it’s not too hard to find all materials that use (aka “own”) an instance of that shader. Here’s a Python snippet that does just that.
Note that I don’t check whether or not the shader is actually used. This snippet finds all instances, whether they are used or not (last week I posted another snippet for checking whether a shader instances was ultimately connected to the material).
from sipyutils import si # win32com.client.Dispatch('XSI.Application') from sipyutils import disp # win32com.client.Dispatch from sipyutils import C # win32com.client.constants si = si() def get_materials_that_use_shader( s ): mats = disp( "XSI.Collection" ) oShaderDef = si.GetShaderDef( s.ProgID ) for i in oShaderDef.ShaderInstances: try: mats.Add( i.Owners(0) ) except Exception: pass mats.Unique = True return mats # # Find all materials that use a specific shader # s = si.Selection(0) if s.IsClassOf( C.siShaderID ): mats = get_materials_that_use_shader( s ) for m in mats: print( "%s in %s" % (m.Name, m.Owners(0)) ) else: si.LogMessage( "Cannot find shader instances. Please select a shader." ) # Material in Sources.Materials.DefaultLib # Material1 in Sources.Materials.DefaultLib # Material2 in Sources.Materials.DefaultLib # Material3 in Sources.Materials.DefaultLib # Material7 in Sources.Materials.DefaultLib # Material6 in Sources.Materials.DefaultLib # Material5 in Sources.Materials.DefaultLib # Material4 in Sources.Materials.DefaultLib
I’m eager to try this script. I gave the ProgID of the shader I’m looking for I suppose in the first part of the script;
oShaderDef = si.GetShaderDef( “Softimage.BA_color_switcher.1.0” )
Second Part of the script I entered in the material I want to search for in all objects, in my case all the objects that are within a model object.
mats = get_materials_that_use_shader( “material.BA_color_switcher1” )
The end result an error;
# ERROR : Traceback (most recent call last):
# File “”, line 25, in
# for m in mats:
# NameError: name ‘mats’ is not defined
# – [line 25]
You need to select a shader and then run the script. I updated the script a bit to deal better with non-shader objects.
All the materials in my model are selected. I then open the render tree, select the shader node that I want the script to find within all the materials in the model, the script gives me an error “Cannot find shader instance”. What exactly is a shader instance, probably simple !
I assume the script won’t check if it’s actually plugged into the material or simple lying randomly in the render tree, unplugged.
Select a shader in the Explorer, then run the script.
This script doesn’t check whether or not the shader instance (shader instance = a node in a render tree) is connected.
I originally selected a shader node in explorer, ran the script, there was no result, I assumed I did something wrong.