how to use BMesh to add verts, faces, and edges to existing geometry I've puzzled about this for a while, but haven't found an answer I understood. This snippet below does add geometry (3 verts and a face) but it also generates an error, Does going to object mode make the data reference in bm be cleared? if so, how does data.vertices still get updated?

ReferenceError: BMesh data of type BMesh has been removed
Error: Python script fail, look in the console for now...


any ideas, this is the cut down script ( run it with a cube in edit mode)

import bpy, bmesh

obj = bpy.context.object
bm = bmesh.from_edit_mesh(obj.data)

bm.verts.new((2.0, 2.0, 2.0))
bm.verts.new((-2.0, 2.0, 2.0))
bm.verts.new((-2.0, -2.0, 2.0))

set_of_verts = set(bm.verts[i] for i in range(-3,0))
bm.faces.new(set_of_verts)

bpy.ops.object.mode_set(mode='OBJECT')
bm.to_mesh(obj.data)  


I have a few scripts that might benefit using the BMesh module for adding geometry, I know how to do it in the pre BMesh way.

Edit, using answer: here's how to add tris and quads while staying in edit mode https://gist.github.com/zeffii/5668669
The issue with this script is when you exit editmode, the editmesh you were editing becomes invalid (thats good, but not what you want).

So instead, just exit editmode and blender will handle converting the modified bmesh into the object mode mesh data.

import bpy, bmesh

obj = bpy.context.object
me = obj.data
bm = bmesh.from_edit_mesh(me)

v1 = bm.verts.new((2.0, 2.0, 2.0))
v2 = bm.verts.new((-2.0, 2.0, 2.0))
v3 = bm.verts.new((-2.0, -2.0, 2.0))

bm.faces.new((v1, v2, v3))

bmesh.update_edit_mesh(obj.data)

# This is optional, you could also stay in editmode.
bpy.ops.object.mode_set(mode='OBJECT')


Note, if you want to stay in editmode, call bmesh.update_edit_mesh(me) at the end of the script to ensure ngons are re-triangulated for display.