# How do I copy the vertices, edges, and faces of one mesh into another?

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?

• Answered the why does from_pydata give an error part of your question. Can you elaborate on the shader? – batFINGER Jun 4 '16 at 7:58

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.

• 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 – Justin Jun 6 '16 at 18:04
• 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. – batFINGER Jun 7 '16 at 3:38