Hey here is a python function that returns all unused materials of a scene. After a while Houdini scenes tend to have more and more materials that are not needed. This function helps to find all stuff that has no dependency in the scene. I’ve added a searchContext List that defines all the types of materials we were working with. So if you are working with other renderes (like vray or renderman), it is needed to add this type of materials to the list. If you don’t know your type of material, you can use the function in the third line. Simply put this into the python source editor, select your material and hit apply. The console should give you informations over the type.
import hou
#debug Line if you want to add new searchContexts
#print hou.selectedItems()[0].type()
#findUnUsedMaterails function
#returns a tupple of materialpathes
def findUnUsedMaterials():
#define an empty list that will returned in the end
outList = []
#set the search Contexts
searchContext = [["mat", "principledshader::2.0"],\
["mat", "redshift_vopnet"],\
["mat", "redshift::Material"], \
["mat", "materialbuilder"],\
["mat", "arnold_materialbuilder"],\
["shop", "RS_Material"],\
["shop", "vopsurface"],\
["shop", "redshift_vopnet"],\
["shop", "arnold_vopnet"]]
#loop over the searchContext variable
for inContext in searchContext:
#define the node Context Type, mat or shop
if inContext[0] == "mat":
node_type = hou.nodeType(hou.vopNodeTypeCategory(), inContext[1])
if inContext[0] == "shop":
node_type = hou.nodeType(hou.shopNodeTypeCategory(), inContext[1])
#get all Instances of the Mat type
Mats = node_type.instances()
for Mat in Mats:
#set a checker variable for adding materials to the outList
checker = 0
#get all dependencies of the current material instance
allDepents = Mat.dependents()
#check if there are dependencies
if allDepents:
#loop over all dependencies of the material instance
for currDepents in allDepents:
#if there is an dependency set the checker to 1
if (currDepents.type().name() != inContext[1]):
checker = 1
#if the checker is still == 0, meaning that there is no dependency append the material path to the outList
if(checker == 0):
outList.append(str(Mat.path()))
else:
#if there is no dependency append the material paht the outList
outList.append(str(Mat.path()))
#return the list of unused materaials
return outList
print findUnUsedMaterials()
PS: If you are a tough guy, loop over the returned list and delete the nodes 😀
unusedMats = findUnUsedMaterials()
for unusedMat in unusedMats:
hou.node(unusedMat).destroy()