Skip to content
Snippets Groups Projects
Commit 7a6ee426 authored by Sebastian Nell's avatar Sebastian Nell
Browse files

Addon: New mesh border selection operator ("Border Deselect Outer"). Deselects...

Addon: New mesh border selection operator ("Border Deselect Outer"). Deselects editmesh geometry, that is outside of the border selection you make with this operator. Only previously selected geometry is considered, it won't border select geometry that wasn't selected before. This is useful to create a selection intersection from previous selection.
parent b437bd91
Branches
No related tags found
No related merge requests found
import bpy
import bmesh
bl_info = {
"name": "Border Deselect Outer",
"author": "CoDEmanX",
"version": (1, 2),
"blender": (2, 66, 0),
"location": "View3D > Spacebar > Border Deselect Outer",
"description": "Make a selection, then run this operator to border-select the desired selection intersection",
"warning": "",
"wiki_url": "",
"tracker_url": "",
"category": "3D View"}
def store_sel():
bm = MESH_OT_border_deselect_outer.bm
if 'select_old' in bm.loops.layers.int.keys():
sel = bm.loops.layers.int['select_old']
else:
sel = bm.loops.layers.int.new("select_old")
for v in bm.verts:
v.link_loops[0][sel] = v.select
def restore_sel(me):
bm = MESH_OT_border_deselect_outer.bm
sel = bm.loops.layers.int['select_old']
for v in bm.verts:
if not (v.select and v.link_loops[0][sel]):
v.select_set(False)
#bm.select_mode = {'VERT'}
#bm.select_flush_mode()
bm.select_flush(False)
me.update()
def changed_sel():
bm = MESH_OT_border_deselect_outer.bm
sel = bm.loops.layers.int['select_old']
for v in bm.verts:
if v.select != v.link_loops[0][sel]:
return True
return False
class MESH_OT_border_deselect_outer(bpy.types.Operator):
"""Border select an existing selection and make only the intersection selected"""
bl_idname = "mesh.border_deselect_outer"
bl_label = "Border Deselect Outer"
bl_options = {'REGISTER'}
init = True
bm = None
mode_change = False
def modal(self, context, event):
if changed_sel() or not self.init:
restore_sel(context.object.data)
return {'FINISHED'}
elif event.type in ('RIGHTMOUSE', 'ESC'):
return {'CANCELLED'}
if self.init:
bpy.ops.view3d.select_border('INVOKE_DEFAULT', extend=False)
self.init = False
return {'RUNNING_MODAL'}
#return {'PASS_THROUGH'} # Makes no difference
@staticmethod
def modecheck(context):
return (context.area.type == 'VIEW_3D' and
context.object and
context.object.type == 'MESH' and
context.object.mode == 'EDIT')
@classmethod
def poll(cls, context):
return cls.modecheck(context)
def invoke(self, context, event):
if self.__class__.modecheck(context):
MESH_OT_border_deselect_outer.bm = bmesh.from_edit_mesh(context.object.data)
store_sel()
context.window_manager.modal_handler_add(self)
return {'RUNNING_MODAL'}
else:
self.report({'WARNING'}, "No active editmesh!")
return {'CANCELLED'}
def register():
bpy.utils.register_class(MESH_OT_border_deselect_outer)
def unregister():
bpy.utils.unregister_class(MESH_OT_border_deselect_outer)
if __name__ == "__main__":
register()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment