[Durian-svn] [3795] smooth all vertex groups and create new ones

campbell institute at blender.org
Mon May 24 17:32:03 CEST 2010


Revision: 3795
          https://blenderinstitute.dyndns.org/durian-svn/?do=log&project=durian&path=/&rev=3795
Author:   campbell
Date:     2010-05-24 17:32:02 +0200 (Mon, 24 May 2010)
Log Message:
-----------
smooth all vertex groups and create new ones

Modified Paths:
--------------
    pro/scripts/op/mesh_weight_smooth.py

Modified: pro/scripts/op/mesh_weight_smooth.py
===================================================================
--- pro/scripts/op/mesh_weight_smooth.py	2010-05-24 15:16:16 UTC (rev 3794)
+++ pro/scripts/op/mesh_weight_smooth.py	2010-05-24 15:32:02 UTC (rev 3795)
@@ -1,18 +1,20 @@
 import bpy
 
 def main(context):
+    single_vgroup = False
+
     obj = context.object
     is_editmode = obj.mode == 'EDIT'
 
     if is_editmode:
-         bpy.ops.object.mode_set(mode='EDIT', toggle=True)
+        bpy.ops.object.mode_set(mode='EDIT', toggle=True)
 
-    vertex_group = context.object.active_vertex_group
+    vertex_group = obj.active_vertex_group
 
     if vertex_group is None:
         return
 
-    group_act = context.object.active_vertex_group.index
+    vertex_group_index_orig = context.object.active_vertex_group.index
 
     def weight_get(vert, act):
         for ge in vert.groups:
@@ -22,22 +24,58 @@
     me = context.object.data
     me_verts = me.verts
 
-    for loop in me.edge_loops_from_edges(edges=[ed for ed in me.edges if ed.selected]):
+    edge_loops = me.edge_loops_from_edges(edges=[ed for ed in me.edges if ed.selected])
+
+    # deselect all
+    bpy.ops.object.mode_set(mode='EDIT', toggle=True) # enter
+    bpy.ops.mesh.select_all(action='DESELECT')
+    bpy.ops.object.mode_set(mode='EDIT', toggle=True) # exit
+
+    for loop in edge_loops:
         tot = len(loop)
         if tot == 2:
             continue
 
-        weight_first = getattr(weight_get(me_verts[loop[0]], group_act), "weight", 0.0)
-        weight_last = getattr(weight_get(me_verts[loop[-1]], group_act), "weight", 0.0)
+        if single_vgroup:
+            active_groups = [vertex_group_orig]
+        else:
+            active_groups = list(set([dw.group for dw in me_verts[loop[0]].groups] + [dw.group for dw in me_verts[loop[-1]].groups]))
+    
+        print(active_groups)
 
-        tot_fac = tot - 1
-        for i in range(1, tot_fac):
-            vi = loop[i]
-            ge = weight_get(me_verts[loop[i]], group_act)
-            if ge:
-                fac = i / tot_fac
-                ge.weight = weight_first * (1.0 - fac) + weight_last * fac
+        # setup selected verts
+        for i in range(1, len(loop) - 1):
+            me_verts[loop[i]].selected = True
 
+        bpy.ops.object.mode_set(mode='EDIT', toggle=True) # enter
+
+        for vertex_group_index in active_groups:
+            obj.active_vertex_group_index = vertex_group_index
+            bpy.ops.object.vertex_group_assign() # weights wont matter
+
+        bpy.ops.mesh.select_all(action='DESELECT')
+        bpy.ops.object.mode_set(mode='EDIT', toggle=True) # exit
+
+
+        for vertex_group_index in active_groups:
+            obj.active_vertex_group_index = vertex_group_index
+            
+            weight_first = getattr(weight_get(me_verts[loop[0]], vertex_group_index), "weight", 0.0)
+            weight_last = getattr(weight_get(me_verts[loop[-1]], vertex_group_index), "weight", 0.0)
+
+            tot_fac = tot - 1
+            for i in range(1, tot_fac):
+                vi = loop[i]
+                dw = weight_get(me_verts[loop[i]], vertex_group_index)
+                if dw:
+                    fac = i / tot_fac
+                    dw.weight = weight_first * (1.0 - fac) + weight_last * fac
+    
+    # re-select all
+    for loop in edge_loops:
+        for i in loop:
+            me_verts[i].selected = True
+
     if is_editmode:
          bpy.ops.object.mode_set(mode='EDIT', toggle=True)
 



More information about the Durian-svn mailing list