Sorry for my English, I'm Brazilian and new to blender.
I've been looking for this script (first of all thank you very much Martynas Žiemys was very utiul for me) but it was out of date, so I'm putting it here with modifications to help someone who needs it like me, but the credit is all from the friend.
again, very grateful, helped me a lot ...
import bpy
# Separei a criação de nós em uma função para facilitar
# para editar mais tarde, se necessário
def create_nodes(mat):
mat.use_nodes = True
nodes = mat.node_tree.nodes
for every_node in nodes: # isso remove todos os nós existentes
nodes.remove(every_node)
# criando nó Principled e movendo-o:
node = nodes.new('ShaderNodeBsdfPrincipled')
node.location = (-190,100)
# criando nó de saída e movendo-o:
output_node = nodes.new('ShaderNodeOutputMaterial')
output_node.location = (40,100)
# criando o link entre os dois nós
links = mat.node_tree.links
link = links.new(node.outputs[0], output_node.inputs[0])
# Isso salva o objeto ativo no momento para que possa ser restaurado mais tarde
active = bpy.context.object
# vamos percorrer todos os objetos selecionados
for every_object in bpy.context.selected_objects:
# Eu só quero trabalhar com objetos capazes de ter um material
if every_object.type in {'MESH','CURVE', 'SURFACE','META', 'FONT'}:
if every_object.name not in bpy.data.materials:
# se ainda não houver material com o nome do objeto, vamos fazer um
mat = bpy.data.materials.new(every_object.name)
# e vamos criar os nós para ele
create_nodes(mat)
else:
# se o material já existir, vamos usá-lo
mat = bpy.data.materials.get(every_object.name)
if len(every_object.material_slots) == 0: # se não houver slots de material
# vamos ativar o objeto atual e criar um slot de material
bpy.context.view_layer.objects.active = every_object
bpy.ops.object.material_slot_add()
# vamos deixar o objeto ativo como estava
bpy.context.view_layer.objects.active = active
# A única coisa que resta agora é atribuir o material a
# todos os slots de material. Provavelmente não queremos perder a informação
# sobre como o objeto é dividido em materiais separados
for every_slot in every_object.material_slots:
every_slot.material = mat
Note: I didn't comment on his answer because I'm new to the community and I don't have enough reputation :P
bpy.data.objects["Cube"].material_slots[0].material = bpy.data.materials["Material.002"]
$\endgroup$