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






