[Bf-extensions-cvs] [c4d4fa0f] master: mesh_snap_utilities: Remove redundant lines, organize and make it more stable

Germano noreply at git.blender.org
Wed Oct 25 07:27:24 CEST 2017


Commit: c4d4fa0f52c1740de85641fb373e645fd1d9e194
Author: Germano
Date:   Wed Oct 25 03:27:16 2017 -0200
Branches: master
https://developer.blender.org/rBAc4d4fa0f52c1740de85641fb373e645fd1d9e194

mesh_snap_utilities: Remove redundant lines, organize and make it more stable

Any reference to elements of a bmesh must be deleted before the operator finishes.
This prevents unpredictable crashes.

===================================================================

M	mesh_snap_utilities_line.py

===================================================================

diff --git a/mesh_snap_utilities_line.py b/mesh_snap_utilities_line.py
index dcdafdee..1bbfd4d8 100644
--- a/mesh_snap_utilities_line.py
+++ b/mesh_snap_utilities_line.py
@@ -351,12 +351,6 @@ def get_loose_linked_edges(bmvert):
 
 
 def draw_line(self, obj, bm, bm_geom, location):
-    if not hasattr(self, 'list_verts'):
-        self.list_verts = []
-
-    if not hasattr(self, 'list_edges'):
-        self.list_edges = []
-
     split_faces = set()
 
     drawing_is_dirt = False
@@ -683,7 +677,6 @@ class SnapUtilitiesLine(Operator):
             self.list_verts_co = []
             self.list_verts = []
             self.list_edges = []
-            self.list_faces = []
             self.obj = bpy.context.active_object
             self.obj_matrix = self.obj.matrix_world.copy()
             self.bm = bmesh.from_edit_mesh(self.obj.data)
@@ -802,20 +795,27 @@ class SnapUtilitiesLine(Operator):
 
             elif event.type in {'RIGHTMOUSE', 'ESC'}:
                 if self.list_verts_co == [] or event.type == 'ESC':
+                    del self.bm
+                    del self.list_edges
+                    del self.list_verts
+                    del self.list_verts_co
+
                     bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
-                    context.tool_settings.mesh_select_mode = self.select_mode
                     context.area.header_text_set()
-                    context.user_preferences.view.use_rotate_around_active = self.use_rotate_around_active
                     self.sctx.free()
-                    self.bm = None
+
+                    #restore initial state
+                    context.user_preferences.view.use_rotate_around_active = self.use_rotate_around_active
+                    context.tool_settings.mesh_select_mode = self.select_mode
                     if not self.is_editmode:
                         bpy.ops.object.editmode_toggle()
+
                     return {'FINISHED'}
                 else:
                     self.vector_constrain = None
+                    self.list_edges = []
                     self.list_verts = []
                     self.list_verts_co = []
-                    self.list_faces = []
 
         a = ""
         if self.list_verts_co:
@@ -838,79 +838,86 @@ class SnapUtilitiesLine(Operator):
         if context.space_data.type == 'VIEW_3D':
             # print('name', __name__, __package__)
             preferences = context.user_preferences.addons[__name__].preferences
-            create_new_obj = preferences.create_new_obj
+
+            #Store the preferences that will be used in modal
+            self.intersect = preferences.intersect
+            self.create_face = preferences.create_face
+            self.outer_verts = preferences.outer_verts
+            self.snap_to_grid = preferences.increments_grid
+
+            self.out_color = preferences.out_color
+            self.face_color = preferences.face_color
+            self.edge_color = preferences.edge_color
+            self.vert_color = preferences.vert_color
+            self.center_color = preferences.center_color
+            self.perpendicular_color = preferences.perpendicular_color
+            self.constrain_shift_color = preferences.constrain_shift_color
+
+            self.axis_x_color = tuple(context.user_preferences.themes[0].user_interface.axis_x)
+            self.axis_y_color = tuple(context.user_preferences.themes[0].user_interface.axis_y)
+            self.axis_z_color = tuple(context.user_preferences.themes[0].user_interface.axis_z)
+
             if context.mode == 'OBJECT' and \
-              (create_new_obj or context.object is None or context.object.type != 'MESH'):
+              (preferences.create_new_obj or context.object is None or context.object.type != 'MESH'):
 
                 mesh = bpy.data.meshes.new("")
                 obj = bpy.data.objects.new("", mesh)
                 context.scene.objects.link(obj)
                 context.scene.objects.active = obj
 
-            # bgl.glEnable(bgl.GL_POINT_SMOOTH)
-            self.is_editmode = bpy.context.object.data.is_editmode
+            #Store current state
+            self.is_editmode = context.object.data.is_editmode
+            self.use_rotate_around_active = context.user_preferences.view.use_rotate_around_active
+            self.select_mode = context.tool_settings.mesh_select_mode[:]
+
+            #Modify the current state
             bpy.ops.object.mode_set(mode='EDIT')
+            bpy.ops.mesh.select_all(action='DESELECT')
+            context.user_preferences.view.use_rotate_around_active = True
+            context.tool_settings.mesh_select_mode = (True, True, True)
             context.space_data.use_occlude_geometry = True
 
-            self.scale = context.scene.unit_settings.scale_length
+            #Configure the unit of measure
+            scale = context.scene.unit_settings.scale_length
             self.unit_system = context.scene.unit_settings.system
-            self.separate_units = context.scene.unit_settings.use_separate
-            self.uinfo = get_units_info(self.scale, self.unit_system, self.separate_units)
+            separate_units = context.scene.unit_settings.use_separate
+            self.uinfo = get_units_info(scale, self.unit_system, separate_units)
 
-            grid = context.scene.unit_settings.scale_length / context.space_data.grid_scale
-            relative_scale = preferences.relative_scale
-            self.scale = grid / relative_scale
-            self.rd = bpy.utils.units.to_value(self.unit_system, 'LENGTH', str(1 / self.scale))
+            scale /= context.space_data.grid_scale * preferences.relative_scale
+            self.rd = bpy.utils.units.to_value(self.unit_system, 'LENGTH', str(1 / scale))
 
-            incremental = preferences.incremental
-            self.incremental = bpy.utils.units.to_value(self.unit_system, 'LENGTH', str(incremental))
+            self.incremental = bpy.utils.units.to_value(self.unit_system, 'LENGTH', str(preferences.incremental))
 
-            self.use_rotate_around_active = context.user_preferences.view.use_rotate_around_active
-            context.user_preferences.view.use_rotate_around_active = True
-
-            self.select_mode = context.tool_settings.mesh_select_mode[:]
-            context.tool_settings.mesh_select_mode = (True, True, True)
-
-            self.region = context.region
+            #Store values from 3d view context
             self.rv3d = context.region_data
             self.rotMat = self.rv3d.view_matrix.copy()
             self.obj = bpy.context.active_object
             self.obj_matrix = self.obj.matrix_world.copy()
             self.obj_matinv = self.obj_matrix.inverted()
             # self.obj_glmatrix = bgl.Buffer(bgl.GL_FLOAT, [4, 4], self.obj_matrix.transposed())
-            self.bm = bmesh.from_edit_mesh(self.obj.data)
+            self.bm = bmesh.from_edit_mesh(self.obj.data) #remove at end
             self.cache = SnapCache()
 
+            #init these variables to avoid errors
+            self.prevloc = Vector()
             self.location = Vector()
             self.list_verts = []
+            self.list_edges = []
             self.list_verts_co = []
             self.bool_update = False
             self.vector_constrain = ()
             self.navigation_keys = NavigationKeys(context)
-            self.keytab = False
-            self.keyf8 = False
             self.type = 'OUT'
             self.len = 0
             self.length_entered = ""
             self.line_pos = 0
+            self.bm_geom_selected = None
 
-            self.out_color = preferences.out_color
-            self.face_color = preferences.face_color
-            self.edge_color = preferences.edge_color
-            self.vert_color = preferences.vert_color
-            self.center_color = preferences.center_color
-            self.perpendicular_color = preferences.perpendicular_color
-            self.constrain_shift_color = preferences.constrain_shift_color
-
-            self.axis_x_color = tuple(context.user_preferences.themes[0].user_interface.axis_x)
-            self.axis_y_color = tuple(context.user_preferences.themes[0].user_interface.axis_y)
-            self.axis_z_color = tuple(context.user_preferences.themes[0].user_interface.axis_z)
-
-            self.intersect = preferences.intersect
-            self.create_face = preferences.create_face
-            self.outer_verts = preferences.outer_verts
-            self.snap_to_grid = preferences.increments_grid
+            #Init event variables
+            self.keytab = False
+            self.keyf8 = False
 
+            #Init Snap Context
             from snap_context import SnapContext
 
             self.sctx = SnapContext(context.region, context.space_data)
@@ -918,24 +925,21 @@ class SnapUtilitiesLine(Operator):
             self.sctx.use_clip_planes(True)
 
             act_base = context.active_base
-            self.snap_obj = self.sctx.add_obj(act_base.object, act_base.object.matrix_world)
 
             if self.outer_verts:
                 for base in context.visible_bases:
                     if base != act_base:
                         self.sctx.add_obj(base.object, base.object.matrix_world)
 
-##            if DEBUG:
-##                self.screen = screenTexture()
+            self.snap_obj = self.sctx.add_obj(act_base.object, act_base.object.matrix_world)
 
-            bpy.ops.mesh.select_all(action='DESELECT')
+            self.snap_face = context.space_data.viewport_shade not in {'BOUNDBOX', 'WIREFRAME'}
+            self.sctx.set_snap_mode(True, True, self.snap_face)
 
-            self._handle = bpy.types.SpaceView3D.draw_handler_add(
-                                                    self.draw_callback_px,
-                                                    (context,),
-                                                    'WINDOW', 'POST_VIEW'
-                                                    )
+            #modals
+            self._handle = bpy.types.SpaceView3D.draw_handler_add(self.draw_callback_px, (context,), 'WINDOW', 'POST_VIEW')
             context.window_manager.modal_handler_add(self)
+
             return

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list