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