This is a simple addon for blender 2.79 i wrote to transfer vertex weights from one vertex to other vertices for selected vertex group.(modify use at your own risk).
Happy Sketching!
Nate
(original model and design used)
naTransferWeightToVertexAddOn for Blender from Nathan Anozie on Vimeo.
#naTransferWeightToVertexAddOn.py
#modify use at your own risk
bl_info = {
"name":"weighting tools for facial rigging",
"description":"tool to transfer vertex weight from one vertex to other vertices",
"category": "Object",
"author":"Nathaniel Anozie",
"blender":(2,79,0)
}
import bpy
import bmesh #for getting last selected vertex
from bpy.types import(
Operator,
Panel
)
class transferWeightToVertexOperator(Operator):
"""first select children vertices then last parent.transfers weight from parent to children.
(doesn't support lasso select because it needs selection history)
"""
bl_idname = "obj.transferweighttovertex" #needs to be all lowercase
bl_label = "transferWeightToVertex"
bl_options = {"REGISTER"}
def execute(self, context):
naTransferWeightToVertex(context)
return {'FINISHED'}
class transferWeightToVertexPanel(Panel):
bl_label = "transferWeightToVertex Panel"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
def draw(self, context):
layout = self.layout
layout.label(text = "first select children then last parent")
layout.operator( "obj.transferweighttovertex")
def register():
bpy.utils.register_class(transferWeightToVertexOperator)
bpy.utils.register_class(transferWeightToVertexPanel)
def unregister():
bpy.utils.unregister_class(transferWeightToVertexOperator)
bpy.utils.unregister_class(transferWeightToVertexPanel)
if __name__ == "__main__":
register()
#actual procs going here
def naTransferWeightToVertex(context):
"""transfer weights to all selected from last selected.
similar to how pick child then parent when binding to armature, or parenting
this supports single vertex group transfer.
need to select vertices one at a time cant use lasso select.
"""
currentMode = context.object.mode
#need to be in edit mode
bpy.ops.object.mode_set(mode="EDIT")
obj = context.object
#get selected vertex group
selectedGrpIndex = obj.vertex_groups.active_index
selectedGrp = obj.vertex_groups[selectedGrpIndex]
print("selectedGrpIndex %s" %selectedGrpIndex)
vtxGroup = (selectedGrp.name,selectedGrp.index)
#get 2 selected vertices, child then active index
#assuming you only selected vertices
bm = bmesh.from_edit_mesh(obj.data)
childVtxs=[]
parentVtx = None #last thing selected
#exit if select history is not 2 or more
#might need to check selection history is vert type
if not len(bm.select_history) >= 2:
print("please select 2 or more verts >> children then last parent")
return
for i in range(0,len(bm.select_history)-1):
childVtxs.append(bm.select_history[i].index)
parentVtx = bm.select_history[len(bm.select_history)-1].index
#get weight from parent vtx
bone = vtxGroup[0]
boneIndex = vtxGroup[1]
print('parent vtx %s bone index %s' %(parentVtx,boneIndex) )
print('childVtxs')
print(childVtxs)
##need to do this to find proper group to use for getting weight
groupIndexToUse = None
for j in range(0,len(obj.data.vertices[parentVtx].groups)):
grp = obj.data.vertices[parentVtx].groups[j]
if grp.group == boneIndex:
groupIndexToUse = j
break
weight = obj.data.vertices[parentVtx].groups[groupIndexToUse].weight
#assign weight to children vtxs
#assuming assign weight on same vertex group as first selected
print('weight %s , vert id %s' %(weight,childVtxs[0]))
#need to be in object mode
bpy.ops.object.mode_set(mode="OBJECT")
for vtx in childVtxs:
obj.vertex_groups[bone].add( [int(vtx)], float(weight) , 'REPLACE')
#flip to edit mode so we can see change
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.object.mode_set(mode="OBJECT")
#restore mode
bpy.ops.object.mode_set(mode=currentMode)
#inspired by:
#https://blender.stackexchange.com/questions/102562/can-someone-help-make-this-code-work-on-all-vertex-groups-instead-of-just-the-ac
#https://blender.stackexchange.com/questions/30582/get-active-vertex-through-python