diff options
author | Germano <germano.costa@ig.com.br> | 2017-10-25 08:27:16 +0300 |
---|---|---|
committer | Germano <germano.costa@ig.com.br> | 2017-10-25 08:27:16 +0300 |
commit | c4d4fa0f52c1740de85641fb373e645fd1d9e194 (patch) | |
tree | 4a7acebe93f92a5d3edf276eeb8b80ea2564b0f9 | |
parent | 5f8aaa2d4e93831e329d2203ea9cd42fa32dd2df (diff) |
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.
-rw-r--r-- | mesh_snap_utilities_line.py | 122 |
1 files changed, 63 insertions, 59 deletions
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 {'RUNNING_MODAL'} else: self.report({'WARNING'}, "Active space must be a View3d") |