[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