import bpy
def node_score(node):
if node.bl_idname != "ShaderNodeTexImage":
return 0
src = input_node_for(node)
if src is None:
score1= 1
elif src.bl_idname == "ShaderNodeUVMap":
score1= 2
else:
score1=0
dst = output_node_for(node)
if dst is None:
score2=3
elif dst.bl_idname == "ShaderNodeEmission":
score2= 2
else:
score2= 0
return min(score1,score2)
def plausible_image(node):
return node_score(node)>0
def input_node_for(node):
links = node.inputs[0].links
if 0<len(links):
return links[0].from_node
return None
def output_node_for(node):
links = node.outputs[0].links
if 0 < len(links):
return links[0].to_node
return None
def select_image_nodes(obj):
mats = set()
for sl in obj.material_slots:
mats.add(sl.material)
per_mat = []
for mat in mats:
candidates=[]
for node in mat.node_tree.nodes:
#print(node.bl_idname)
score = node_score(node)
if score>0:
candidates.append(node)
print([score, node.image, uv_src_name(node), output_node_for(node)])
per_mat.append({
'candidates':candidates,
'mat':mat,
})
pm0 = per_mat[0]
trim= keys_for(pm0)
for i in range(1,len(per_mat)):
x = keys_for(per_mat[i])
trim = trim.intersection(x)
best = None
for x in trim:
if best is None or best[2] < x[2]:
best = x
if best is None:
raise BaseException("could not find a consistent bake image with UVmap to select in the various materials' node trees")
for pm in per_mat:
q = [ node for node in pm['candidates'] if node.image.name == best[0] ]
if len(q)<1:
raise BaseException("none of the candidates on material %r match %r"%(pm['mat'], best[0]))
mat = pm['mat']
print([mat, q])
for node in mat.node_tree.nodes:
node.select = (node==q[0])
mat.node_tree.nodes.active = q[0]
def keys_for(pm0):
return set([tuple([x.image.name, uv_src_name(x), node_score(x)]) for x in pm0['candidates']])
def uv_src_name(node):
src = input_node_for(node)
if src is None:
return None
else:
return src.uv_map
select_image_nodes(bpy.context.active_object)
|
Blender python API quick-start
Syntax highlighting by Pygments.