12
$\begingroup$

This may be another simple question but I can't seem to find a straight answer.

I am procedurally generating figures and as part of the last step I want to color the figure red.

If I manually add a new material to the figure I can change the color with bpy.context.object.active_material.diffuse_color = (1, 0, 0)

But I need to automate this step such that the program automatically add a new material and then changes the color. I've tried the following but it doesn't seem to work:

bpy.ops.material.new()
bpy.context.object.active_material.diffuse_color = (1, 0, 0)

It seems the problematic step is adding a new material. Any help would be greatly appreciated.

$\endgroup$
2

1 Answer 1

17
$\begingroup$

Actually, I figured it out shortly after posting the question.

Instead of using:

bpy.ops.material.new()

I needed to use:

bpy.data.materials.new(name="MaterialName")

So the final solution was:

activeObject = bpy.context.active_object #Set active object to variable
mat = bpy.data.materials.new(name="MaterialName") #set new material to variable
activeObject.data.materials.append(mat) #add the material to the object
bpy.context.object.active_material.diffuse_color = (1, 0, 0) #change color
$\endgroup$
3
  • 4
    $\begingroup$ Won't always work as obj.active_material will not necessarily be mat $\endgroup$ Commented Jun 28, 2016 at 20:33
  • 4
    $\begingroup$ Just use mat.diffuse_color (or bpy.data.materials['Materialname'].diffuse_color) instead. $\endgroup$ Commented Nov 21, 2016 at 11:48
  • 1
    $\begingroup$ You're a real hero! $\endgroup$ Commented Oct 27, 2019 at 9:30

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.