I'm trying to get and set the vertex colors of a mesh through a python script. However, the script seems unable to find the vertex color data, claiming the data set has length 0 despite that clearly not being the case.

import logging
logging.basicConfig(level=logging.DEBUG,format='(%(threadName)-10s) %(message)s',)

obj = bpy.context.edit_object

mesh = obj.data

if not mesh.vertex_colors:
    logging.debug("Mesh had no vertex colors, adding them")

color_layer = mesh.vertex_colors.active


if len(color_layer.data) > 0:
    i = 0
    for poly in mesh.polygons:
        for idx in poly.loop_indices:
            color_layer.data[i].color = (1.0, 0.0, 0.0)
            i += 1

This is the console output:

(MainThread) bpy_struct, Mesh("Cube")
(MainThread) bpy_collection1, LoopColors
(MainThread) 0

Here is my mesh, which very clearly has a non-zero list of vertex colors:
enter image description here
enter image description here

Anyone knows what's happening?


1 Answer 1


It seems that the way to go about it is, unintuitively, to exit edit mode into object mode in order to perform any vertex-level stuff, and then re-enter edit mode at the end of your script.

mode = bpy.context.active_object.mode
bpy.ops.object.mode_set(mode = 'OBJECT')

ob = bpy.context.active_object

for vcol in ob.data.vertex_colors:
#sample or do stuff to the vertex colors



You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .