[Durian-svn] [3784] operator to smooth vertex groups along selected edge loops

campbell institute at blender.org
Mon May 24 15:15:50 CEST 2010


Revision: 3784
          https://blenderinstitute.dyndns.org/durian-svn/?do=log&project=durian&path=/&rev=3784
Author:   campbell
Date:     2010-05-24 15:15:50 +0200 (Mon, 24 May 2010)
Log Message:
-----------
operator to smooth vertex groups along selected edge loops

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

Added: pro/scripts/op/mesh_weight_smooth.py
===================================================================
--- pro/scripts/op/mesh_weight_smooth.py	                        (rev 0)
+++ pro/scripts/op/mesh_weight_smooth.py	2010-05-24 13:15:50 UTC (rev 3784)
@@ -0,0 +1,72 @@
+import bpy
+
+def main(context):
+    obj = context.object
+    is_editmode = obj.mode == 'EDIT'
+
+    if is_editmode:
+         bpy.ops.object.mode_set(mode='EDIT', toggle=True)
+
+    vertex_group = context.object.active_vertex_group
+
+    if vertex_group is None:
+        return
+
+    group_act = context.object.active_vertex_group.index
+
+    def weight_get(vert, act):
+        for ge in vert.groups:
+            if ge.group == act:
+                return ge
+
+    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]):
+        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)
+
+        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
+
+    if is_editmode:
+         bpy.ops.object.mode_set(mode='EDIT', toggle=True)
+
+
+class VertexLoopBlend(bpy.types.Operator):
+    ''''''
+    bl_idname = "object.vertex_loop_blend"
+    bl_label = "Vertex Loop Blend"
+
+    def poll(self, context):
+        return context.active_object != None
+
+    def execute(self, context):
+        main(context)
+        return {'FINISHED'}
+
+menu_func = lambda self, context: self.layout.operator(VertexLoopBlend.bl_idname)
+
+def register():
+    bpy.types.register(VertexLoopBlend)
+    bpy.types.VIEW3D_PT_tools_weightpaint.append(menu_func)
+    bpy.types.VIEW3D_PT_tools_meshedit.append(menu_func)
+
+def unregister():
+    bpy.types.unregister(VertexLoopBlend)
+    bpy.types.VIEW3D_PT_tools_weightpaint.remove(menu_func)
+    bpy.types.VIEW3D_PT_tools_meshedit.remove(menu_func)
+
+if __name__ == "__main__":
+    register()
+
+    bpy.ops.object.vertex_loop_blend()



More information about the Durian-svn mailing list