diff --git a/src/blenderbim/blenderbim/bim/module/drawing/annotation.py b/src/blenderbim/blenderbim/bim/module/drawing/annotation.py index 12a312026d..2eaf8d353b 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/annotation.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/annotation.py @@ -102,7 +102,7 @@ class Annotator: new_verts = [bm.verts.new(v) for v in verts_local] bm.faces.new([new_verts[i] for i in face_verts]) - tool.Blender.apply_bmesh(obj.data, bm) + tool.Blender.apply_bmesh(obj.data, bm, obj) return obj @staticmethod diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 4f88afe1fe..1b8d2b9d93 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -83,7 +83,7 @@ class Blender: def update_viewport(cls): pass def get_default_selection_keypmap(cls): pass def get_object_bounding_box(cls, obj): pass - def apply_bmesh(cls, mesh, bm): pass + def apply_bmesh(cls, mesh, bm, obj=None): pass def get_bmesh_for_mesh(cls, mesh, clean=False): pass def bmesh_join(cls, bm_a, bm_b, callback=None): pass diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 0d6de56515..b48e7d4e23 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -180,10 +180,12 @@ class Blender: ## BMESH UTILS ## @classmethod - def apply_bmesh(cls, mesh, bm): + def apply_bmesh(cls, mesh, bm, obj=None): + """`obj` argument is not optional if you plan to update mesh in EDIT mode + and it's possible that that mesh object won't be currenly active.""" import bmesh - if bpy.context.object and bpy.context.object.mode == "EDIT": + if mesh.is_editmode: # better to be safe because otherwise mesh won't be updated # and you won't get any errors if not bm.is_wrapped or hash(bmesh.from_edit_mesh(mesh)) != hash(bm): @@ -192,7 +194,13 @@ class Blender: "For applying bmesh in edit mode bmesh should be acquired with `bmesh.from_edit_mesh(me)`." ) bmesh.update_edit_mesh(mesh) - bpy.context.object.update_from_editmode() + if not obj: + if not bpy.context.object and bpy.context.object.data != mesh: + raise Exception( + "Error applying bmesh in EDIT object - object is " + "not provided and can't be acquired from the context. " + ) + obj.update_from_editmode() else: bm.to_mesh(mesh) # only freeing bmesh if object is in OBJECT mode