From c75f170adb9ab2195aaa98122ed02d9332b1b72a Mon Sep 17 00:00:00 2001
From: Campbell Barton <ideasman42@gmail.com>
Date: Thu, 21 Mar 2013 14:55:28 +0000
Subject: [PATCH] use object.update_from_editmode() for scripts which read
 object data.

---
 io_mesh_ply/export_ply.py      | 1 +
 io_mesh_stl/blender_utils.py   | 3 +++
 io_mesh_uv_layout/__init__.py  | 7 +------
 io_scene_3ds/export_3ds.py     | 5 ++---
 io_scene_obj/export_obj.py     | 1 +
 io_scene_vrml2/export_vrml2.py | 8 +-------
 io_scene_x3d/export_x3d.py     | 6 ++++--
 7 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/io_mesh_ply/export_ply.py b/io_mesh_ply/export_ply.py
index aef2ed898..644b890fd 100644
--- a/io_mesh_ply/export_ply.py
+++ b/io_mesh_ply/export_ply.py
@@ -208,6 +208,7 @@ def save(operator,
         raise Exception("Error, could not get mesh data from active object")
 
     mesh.transform(obj.matrix_world)
+    mesh.calc_normals()
 
     ret = save_mesh(filepath, mesh,
                     use_normals=use_normals,
diff --git a/io_mesh_stl/blender_utils.py b/io_mesh_stl/blender_utils.py
index 5589da4e5..9c3488eb1 100644
--- a/io_mesh_stl/blender_utils.py
+++ b/io_mesh_stl/blender_utils.py
@@ -55,6 +55,9 @@ def faces_from_mesh(ob, use_mesh_modifiers=False, triangulate=True):
         Split the quad into two triangles
     """
 
+    # get the editmode data
+    ob.update_from_editmode()
+
     # get the modifiers
     try:
         mesh = ob.to_mesh(bpy.context.scene, use_mesh_modifiers, "PREVIEW")
diff --git a/io_mesh_uv_layout/__init__.py b/io_mesh_uv_layout/__init__.py
index dc6c05d53..07e9e5879 100644
--- a/io_mesh_uv_layout/__init__.py
+++ b/io_mesh_uv_layout/__init__.py
@@ -172,9 +172,7 @@ class ExportUVLayout(bpy.types.Operator):
     def execute(self, context):
 
         obj = context.active_object
-        is_editmode = (obj.mode == 'EDIT')
-        if is_editmode:
-            bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+        obj.update_from_editmode()
 
         mode = self.mode
 
@@ -204,9 +202,6 @@ class ExportUVLayout(bpy.types.Operator):
         if self.modified:
             bpy.data.meshes.remove(mesh)
 
-        if is_editmode:
-            bpy.ops.object.mode_set(mode='EDIT', toggle=False)
-
         file.close()
 
         return {'FINISHED'}
diff --git a/io_scene_3ds/export_3ds.py b/io_scene_3ds/export_3ds.py
index e7f624ac7..1bab73116 100644
--- a/io_scene_3ds/export_3ds.py
+++ b/io_scene_3ds/export_3ds.py
@@ -997,9 +997,6 @@ def save(operator,
     if global_matrix is None:
         global_matrix = mathutils.Matrix()
 
-    if bpy.ops.object.mode_set.poll():
-        bpy.ops.object.mode_set(mode='OBJECT')
-
     # Initialize the main chunk (primary):
     primary = _3ds_chunk(PRIMARY)
     # Add version chunk:
@@ -1028,6 +1025,8 @@ def save(operator,
         objects = (ob for ob in scene.objects if ob.is_visible(scene))
 
     for ob in objects:
+        ob.update_from_editmode()
+
         # get derived objects
         free, derived = create_derived_objects(scene, ob)
 
diff --git a/io_scene_obj/export_obj.py b/io_scene_obj/export_obj.py
index 90d693168..681e45343 100644
--- a/io_scene_obj/export_obj.py
+++ b/io_scene_obj/export_obj.py
@@ -678,6 +678,7 @@ def _write(context, filepath,
     scene = context.scene
 
     # Exit edit mode before exporting, so current object states are exported properly.
+    # use this over obj.update_from_editmode() because of animation export.
     if bpy.ops.object.mode_set.poll():
         bpy.ops.object.mode_set(mode='OBJECT')
 
diff --git a/io_scene_vrml2/export_vrml2.py b/io_scene_vrml2/export_vrml2.py
index 29b76ddb9..78d1e45b0 100644
--- a/io_scene_vrml2/export_vrml2.py
+++ b/io_scene_vrml2/export_vrml2.py
@@ -177,16 +177,10 @@ def save_object(fw, global_matrix,
     assert(obj.type == 'MESH')
 
     if use_mesh_modifiers:
-        is_editmode = (obj.mode == 'EDIT')
-        if is_editmode:
-            bpy.ops.object.editmode_toggle()
-
+        obj.update_from_editmode()
         me = obj.to_mesh(scene, True, 'PREVIEW', calc_tessface=False)
         bm = bmesh.new()
         bm.from_mesh(me)
-
-        if is_editmode:
-            bpy.ops.object.editmode_toggle()
     else:
         me = obj.data
         if obj.mode == 'EDIT':
diff --git a/io_scene_x3d/export_x3d.py b/io_scene_x3d/export_x3d.py
index 0b3250441..8e2c62db0 100644
--- a/io_scene_x3d/export_x3d.py
+++ b/io_scene_x3d/export_x3d.py
@@ -1582,8 +1582,10 @@ def save(operator, context, filepath="",
 
     bpy.path.ensure_ext(filepath, '.x3dz' if use_compress else '.x3d')
 
-    if bpy.ops.object.mode_set.poll():
-        bpy.ops.object.mode_set(mode='OBJECT')
+    edit_object = context.edit_object
+    if edit_object:
+        edit_object.update_from_editmode()
+    del edit_object
 
     if use_compress:
         file = gzip_open_utf8(filepath, 'w')
-- 
GitLab