[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4498] contrib/py/scripts/addons/ mesh_border_deselect_outer.py: Addon: New mesh border selection operator (" Border Deselect Outer").

Sebastian Nell codemanx at gmx.de
Wed May 1 00:37:43 CEST 2013


Revision: 4498
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4498
Author:   codemanx
Date:     2013-04-30 22:37:43 +0000 (Tue, 30 Apr 2013)
Log Message:
-----------
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.

Added Paths:
-----------
    contrib/py/scripts/addons/mesh_border_deselect_outer.py

Added: contrib/py/scripts/addons/mesh_border_deselect_outer.py
===================================================================
--- contrib/py/scripts/addons/mesh_border_deselect_outer.py	                        (rev 0)
+++ contrib/py/scripts/addons/mesh_border_deselect_outer.py	2013-04-30 22:37:43 UTC (rev 4498)
@@ -0,0 +1,110 @@
+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()



More information about the Bf-extensions-cvs mailing list