I have a handful of mesh objects and I'd like to display one of them per frame. Thus far, I've been switching out entire mesh objects like this:

myObject.data = meshes[frame_number]

Unfortunately, the object's shader is tied to each mesh, so when I change the mesh, the shader disappears.

I know that I can use myMesh.from_pydata() to edit the actual mesh, but I'm not quite sure how to get the vertices, edges, and faces out of a mesh and copy them into another. I tried this, but got an error:

#gives an error:
myMesh.from_pydata(otherMesh.vertices, otherMesh.edges, otherMesh.polygons)

Any ideas on how I can swap meshes but retain the object's shader?

  • $\begingroup$ Answered the why does from_pydata give an error part of your question. Can you elaborate on the shader? $\endgroup$
    – batFINGER
    Jun 4, 2016 at 7:58

1 Answer 1


One way is, as you are doing, Swapping the mesh

ob1.data = mesh # assign mesh to ob1
ob1.data = mesh.copy() # assign a copy of the mesh to ob1

how to use another meshes verts, edges and polygons to pass to the mesh.from_pydata method.

cone = context.object # some other object
mymesh = bpy.data.meshes.new("mymesh")
vertices = [v.co for v in cone.data.vertices]
faces = [[v for v in p.vertices] for p in cone.data.polygons]
# let faces take care of edges
mymesh.from_pydata(vertices=vertices, edges=[], faces=faces)
# could make edges
edges = [[v for v in e.vertices] for e in cone.data.edges]

Using from_pydata isn't going to fix the shader issue.

  • $\begingroup$ This worked for a brand-new mesh. Why doesn't this work for an existing mesh? I got the error: Traceback (most recent call last): File "<blender_console>", line 1, in <module> File "C:\Program Files\Blender Foundation\Blender\2.77\scripts\modules\bpy_types.py", line 417, in from_pydata self.vertices.foreach_set("co", vertices_flat) RuntimeError: internal error setting the array $\endgroup$
    – Justin
    Jun 6, 2016 at 18:04
  • $\begingroup$ It's designed to use on a new mesh, otherwise the indices won't match between verts and edges / faces, passed to method and those already existing in mesh. If you want to replace with a new mesh via from_pydata you will need to clear the old one first. $\endgroup$
    – batFINGER
    Jun 7, 2016 at 3:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.