[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2282] contrib/py/scripts/addons/ mesh_vertex_slide.py: Campbell suggestion: Removed a lot of Mode switching in Invoke.

Valter Battioli valter31 at interfree.it
Sat Aug 27 22:47:22 CEST 2011


Revision: 2282
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2282
Author:   valtervb
Date:     2011-08-27 20:47:21 +0000 (Sat, 27 Aug 2011)
Log Message:
-----------
Campbell suggestion: Removed a lot of Mode switching in Invoke. Now I switch only for select Linked vertices
Need more work to reduce switch also in Modal

Modified Paths:
--------------
    contrib/py/scripts/addons/mesh_vertex_slide.py

Modified: contrib/py/scripts/addons/mesh_vertex_slide.py
===================================================================
--- contrib/py/scripts/addons/mesh_vertex_slide.py	2011-08-27 18:23:02 UTC (rev 2281)
+++ contrib/py/scripts/addons/mesh_vertex_slide.py	2011-08-27 20:47:21 UTC (rev 2282)
@@ -19,9 +19,9 @@
 # <pep8 compliant>
 
 bl_info = {
-    "name": "Vertex Slide",
+    "name": "Vertex slide",
     "author": "Valter Battioli (ValterVB) and PKHG",
-    "version": (1, 1, 3),
+    "version": (1, 1, 4),
     "blender": (2, 5, 9),
     "api": 39523,
     "location": "View3D > Mesh > Vertices (CTRL V-key) or search for 'VB Vertex 2'",
@@ -56,6 +56,8 @@
 #            Add edge drawing (from chromoly vertex slide)
 #            Add help on screen (from chromooly vertex slide)
 #ver. 1.1.3: Now work also with Continuos Grab, some clean on code
+#ver. 1.1.4: Remove a lot of mode switching in Invoke. It was too slow 
+#            with big mesh.
 #***********************************************************************
 
 import bpy
@@ -90,7 +92,7 @@
 
 class VertexSlideOperator(bpy.types.Operator):
     bl_idname = "vertex.slide"
-    bl_label = "VB Vertex Slide 2"
+    bl_label = "Vertex Slide"
     bl_options = {'REGISTER', 'UNDO', 'GRAB_POINTER', 'BLOCKING', 'INTERNAL'}
 
     Vertex1 = Point()  # First selected vertex data
@@ -107,7 +109,7 @@
     LeftShiftPress = False  # Flag to know if SHIFT is hold on
 
     # Convert a 3D coord to screen 2D coord
-    def Conv3DtoScreen2D(self, context, index):
+    def Conv3DtoScreen2D(self, context, index):  # ^^^ could this function be replaced by bpy_extras.view3d_utils.location_3d_to_region_2d ?
         # Get screen information
         mid_x = context.region.width / 2.0
         mid_y = context.region.height / 2.0
@@ -161,6 +163,7 @@
             bgl.glVertex2f(p.x2D, p.y2D)
         bgl.glEnd()
 
+
     # Compute the screen distance of two vertices
     def ScreenDistance(self, vertex_zero_co, vertex_one_co):
         matw = bpy.context.active_object.matrix_world
@@ -173,8 +176,8 @@
 
     def modal(self, context, event):
         if event.type == 'MOUSEMOVE':
+            bpy.ops.object.mode_set(mode='OBJECT')
             Vertices = bpy.context.object.data.vertices
-            bpy.ops.object.mode_set(mode='OBJECT')
             # Calculate the temp t valuse. Stored in td
             tmpMouse = Vector((event.mouse_x, event.mouse_y))
             t_diff = (tmpMouse - self.tmpMouse).length
@@ -297,7 +300,6 @@
 
         elif event.type == 'LEFTMOUSE':  # Confirm and exit
             Vertices = bpy.context.object.data.vertices
-            bpy.ops.object.mode_set(mode='EDIT')
             bpy.ops.mesh.select_all(action='DESELECT')
             bpy.ops.object.mode_set(mode='OBJECT')
             Vertices[self.Vertex1.original.idx].select = True
@@ -330,11 +332,12 @@
             return {'CANCELLED'}
 
         obj = bpy.context.object
+        mesh = obj.data
         Selected = False
         Count = 0
         SelectedVertices = []  # Index of selected vertices
         bpy.ops.object.mode_set(mode='OBJECT')
-        for vert in obj.data.vertices:
+        for vert in mesh.vertices:
             if vert.select:
                 Selected = True
                 SelectedVertices.append(vert.index)
@@ -356,31 +359,30 @@
         self.LinkedVertices2 = []
 
         # Store selected vertices data
-        bpy.ops.object.mode_set(mode='OBJECT')
         self.Vertex1.original.idx = SelectedVertices[0]
-        self.Vertex1.original.co = obj.data.vertices[SelectedVertices[0]].co.copy()
+        self.Vertex1.original.co = mesh.vertices[SelectedVertices[0]].co.copy()
         self.Vertex1.new = self.Vertex1.original
         x, y = self.Conv3DtoScreen2D(context, SelectedVertices[0])  # For draw edge
         self.Vertex1.x2D = x
         self.Vertex1.y2D = y
         if len(SelectedVertices) == 2:
             self.Vertex2.original.idx = SelectedVertices[1]
-            self.Vertex2.original.co = obj.data.vertices[SelectedVertices[1]].co.copy()
+            self.Vertex2.original.co = mesh.vertices[SelectedVertices[1]].co.copy()
             self.Vertex2.new = self.Vertex2.original
             x, y = self.Conv3DtoScreen2D(context, SelectedVertices[1])  # For draw edge
             self.Vertex2.x2D = x
             self.Vertex2.y2D = y
-        bpy.ops.object.mode_set(mode='EDIT')
 
+        if len(SelectedVertices) == 2:
+            mesh.vertices[self.Vertex2.original.idx].select = False  # Unselect the second selected vertex
+        
         # Store linked vertices data, except the selected vertices
-        bpy.ops.mesh.select_all(action='DESELECT')
-        bpy.ops.object.mode_set(mode='OBJECT')
-        obj.data.vertices[self.Vertex1.original.idx].select = True  # Select the first selected vertex
         bpy.ops.object.mode_set(mode='EDIT')
         bpy.ops.mesh.select_more()  # Select the linked vertices
         bpy.ops.object.mode_set(mode='OBJECT')
-        for vert in obj.data.vertices:
-            if vert.select and vert.index != self.Vertex1.original.idx:
+        mesh.vertices[self.Vertex1.original.idx].select = False  #So are selected only the linked vertices
+        for vert in mesh.vertices:
+            if vert.select:
                 self.LinkedVertices1.append(Point())
                 self.LinkedVertices1[-1].original.idx = vert.index
                 self.LinkedVertices1[-1].original.co = vert.co.copy()
@@ -388,16 +390,15 @@
                 x, y = self.Conv3DtoScreen2D(context, vert.index)  # For draw edge
                 self.LinkedVertices1[-1].x2D = x
                 self.LinkedVertices1[-1].y2D = y
-        bpy.ops.object.mode_set(mode='EDIT')
-        bpy.ops.mesh.select_all(action='DESELECT')
+                vert.select = False
         if len(SelectedVertices) == 2:
-            bpy.ops.object.mode_set(mode='OBJECT')
-            obj.data.vertices[self.Vertex2.original.idx].select = True  # Select the Second selected vertex
+            mesh.vertices[self.Vertex2.original.idx].select = True  # Select the second selected vertex
             bpy.ops.object.mode_set(mode='EDIT')
             bpy.ops.mesh.select_more()  # Select the linked vertices
             bpy.ops.object.mode_set(mode='OBJECT')
-            for vert in obj.data.vertices:
-                if vert.select and vert.index != self.Vertex2.original.idx:
+            mesh.vertices[self.Vertex2.original.idx].select = False  #So are selected only the linked vertices
+            for vert in mesh.vertices:
+                if vert.select:
                     self.LinkedVertices2.append(Point())
                     self.LinkedVertices2[-1].original.idx = vert.index
                     self.LinkedVertices2[-1].original.co = vert.co.copy()
@@ -405,8 +406,7 @@
                     x, y = self.Conv3DtoScreen2D(context, vert.index)  # For draw edge
                     self.LinkedVertices2[-1].x2D = x
                     self.LinkedVertices2[-1].y2D = y
-            bpy.ops.object.mode_set(mode='EDIT')
-            bpy.ops.mesh.select_all(action='DESELECT')
+                    vert.select = False
 
         # Check for no linked vertex. Can be happen also with a mix of Select Mode
         # Need only with 1 vertex selected
@@ -415,15 +415,15 @@
             self.report({'WARNING'}, "Isolated vertex or mixed Select Mode!")
             return {'CANCELLED'}
 
-        bpy.ops.object.mode_set(mode='OBJECT')
-        obj.data.vertices[self.Vertex1.original.idx].select = True  # Select the firs selected vertex
+        mesh.vertices[self.Vertex1.original.idx].select = True  # Select the firs selected vertex
         if len(SelectedVertices) == 2:
-            obj.data.vertices[self.Vertex2.original.idx].select = True  # Select the second selected vertex
+            mesh.vertices[self.Vertex2.original.idx].select = True  # Select the second selected vertex
         else:
-            obj.data.vertices[self.LinkedVertices1[0].original.idx].select = True  # Select the first linked vertex
-        bpy.ops.object.mode_set(mode='EDIT')
+            mesh.vertices[self.LinkedVertices1[0].original.idx].select = True  # Select the first linked vertex
         self.ActiveVertex = self.Vertex1.original.idx
 
+        bpy.ops.object.mode_set(mode='EDIT')  #I must stay in Edit mode
+
         # Add the region OpenGL drawing callback
         # draw in view space with 'POST_VIEW' and 'PRE_VIEW'
         context.window_manager.modal_handler_add(self)



More information about the Bf-extensions-cvs mailing list