iszotic

Remove unused Vertex Groups, armature mirror friendly

Jan 27th, 2017
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.41 KB | None | 0 0
  1. bl_info = {
  2.     "name": "Remove unused Vertex Groups",
  3.     "author": "CoDEmanX",
  4.     "version": (1, 0),
  5.     "blender": (2, 70, 0),
  6.     "location": "Properties Editor > Object data > Vertex Groups > Specials menu",
  7.     "description": "Delete Vertex Groups with no assigned weight of active object",
  8.     "warning": "",
  9.     "wiki_url": "",
  10.     "category": "Mesh"}
  11.  
  12.  
  13. import bpy
  14. import re
  15. from bpy.types import Operator
  16.  
  17.  
  18. class OBJECT_OT_vertex_group_remove_unused(Operator):
  19.     bl_idname = "object.vertex_group_remove_unused"
  20.     bl_label = "Remove unused Vertex Groups"
  21.     bl_options = {'REGISTER', 'UNDO'}
  22.  
  23.     @classmethod
  24.     def poll(cls, context):
  25.         return (context.object is not None and
  26.                 context.object.type == 'MESH')
  27.  
  28.     def execute(self, context):
  29.  
  30.         ob = context.object
  31.         ob.update_from_editmode()
  32.        
  33.         vgroup_used = {i: False for i, k in enumerate(ob.vertex_groups)}
  34.         vgroup_names = {i: k.name for i, k in enumerate(ob.vertex_groups)}
  35.        
  36.         for v in ob.data.vertices:
  37.             for g in v.groups:
  38.                 if g.weight > 0.0:
  39.                     vgroup_used[g.group] = True
  40.                     vgroup_name = vgroup_names[g.group]
  41.                     armatch = re.search('((.R|.L)(.(\d){1,}){0,1})(?!.)', vgroup_name)
  42.                     if armatch != None:
  43.                         tag = armatch.group()
  44.                         mirror_tag =  tag.replace(".R", ".L") if armatch.group(2) == ".R" else tag.replace(".L", ".R")
  45.                         mirror_vgname = vgroup_name.replace(tag, mirror_tag)
  46.                         for i, name in sorted(vgroup_names.items(), reverse=True):
  47.                             if mirror_vgname == name:
  48.                                 vgroup_used[i] = True
  49.                                 break
  50.         for i, used in sorted(vgroup_used.items(), reverse=True):
  51.             if not used:
  52.                 ob.vertex_groups.remove(ob.vertex_groups[i])
  53.                
  54.         return {'FINISHED'}
  55.  
  56.  
  57. def draw_func(self, context):
  58.     self.layout.operator(
  59.         OBJECT_OT_vertex_group_remove_unused.bl_idname,
  60.         icon='X'
  61.     )
  62.  
  63.  
  64. def register():
  65.     bpy.utils.register_module(__name__)
  66.     bpy.types.MESH_MT_vertex_group_specials.prepend(draw_func)
  67.  
  68.  
  69. def unregister():
  70.     bpy.utils.unregister_module(__name__)
  71.     bpy.types.MESH_MT_vertex_group_specials.remove(draw_func)
  72.  
  73. if __name__ == "__main__":
  74.     register()
Advertisement
Add Comment
Please, Sign In to add comment