Space view3d copy bone weights enhanced.py

De DigiWiki.

(Différences entre les versions)
Djphil (discuter | contributions)
(Page créée avec « <py> # AlingTools.py (c) 2009, 2010 Gabriel Beaudin (gabhead) # # ***** BEGIN GPL LICENSE BLOCK ***** # # # This program is free software; you can redistribute it and/or # mo… »)
Modification suivante →

Version du 30 décembre 2013 à 08:43

<py>

  1. AlingTools.py (c) 2009, 2010 Gabriel Beaudin (gabhead)
  2. ***** BEGIN GPL LICENSE BLOCK *****
  3. This program is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU General Public License
  5. as published by the Free Software Foundation; either version 2
  6. of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software Foundation,
  13. Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  14. ***** END GPL LICENCE BLOCK *****
  15. Modified by Gaia Clary, gaia.clary@machinimatrix.org :
  16. 31-aug-2011(GC): adapted to Blender-2.59 Python API
  17. 02-Sep-2011(GC): Added checkmarks for
  18. - copy only bone related weight groups
  19. - create weight groups on target even if they are empty
  20. 18-Jan-2012(GC): adapted to Blender-2.62 Python API


bl_info = {

   "name": "Copy Bone Weights",
   "author": "Luke Hares, Gaia Clary",
   "version": (0,1),
   "blender": (2, 5, 9),
   "api": 35853,
   "location": "View3D > Tool Shelf > Copy Bone Weights Panel",
   "description": "Copy Bone Weights from Active Object to Selected Objects",
   "warning": "",
   "category": "3D View"}

"""Copy Bone Weights to Selected Objects"""

import bpy from bpy.props import *

def initSceneProperties(scn):

   bpy.types.Scene.BWCInter = IntProperty(name="Interpolation",
       description="Base Mesh subdivides (Higher interpolation -> Better matching weights)",
       min=0,
       max=10,
       default=0)
   bpy.types.Scene.BWCNamedBones = BoolProperty(name="Only Named Bones",
       description="Copy only the bone related weight groups to Target (Skip all other weight groups)",
       default=False)
   bpy.types.Scene.BWCEmptyGroups = BoolProperty(name="Copy Empty Groups",
       description="Create bone related weight groups in Target, even if they contain no vertices",
       default=False)


initSceneProperties(bpy.context.scene)


class BWCUi(bpy.types.Panel):

   bl_space_type = 'VIEW_3D'
   bl_region_type = 'TOOLS'
   bl_label = "Bone Weight Copy"
   bl_context = "objectmode"


   @classmethod
   def poll(cls, context):
       try:
           type = context.active_object.type == "MESH"
           return type
       except:
           return False
   
   def draw(self, context):
       layout = self.layout
       scn = context.scene
       layout.prop(scn, 'BWCInter')
       layout.prop(scn, 'BWCNamedBones')
       layout.prop(scn, 'BWCEmptyGroups')
       col = layout.column(align=False)
       col.operator("object.bwc",text="Copy Bone Weights")
       


def boneWeightCopy(tempObj,targetObject, onlyNamedBones, keepEmptyGroups):

   print("Weight group Copy to ", targetObject.name)
   modifiers = tempObj.modifiers
   boneSet = []
   for modifier in modifiers:
       type = modifier.type
       if type == 'ARMATURE':
           armature = modifier.object.data
           bones = armature.bones
           for bone in bones:
               #print ("bone ", bone.name)
               boneSet.append(bone.name)
               if keepEmptyGroups == True:
                   if not(bone.name in targetObject.vertex_groups):
                       targetObject.vertex_groups.new(bone.name)
   #get active object vertices and transform to world space
   
   WSTargetVertsCo = [targetObject.matrix_world * v.co for v in targetObject.data.vertices]
   for targetVert,WSTargetVertCo in zip(targetObject.data.vertices,WSTargetVertsCo):
       dists = [(WSTargetVertCo-v.co).length for v in tempObj.data.vertices]
       activeIndex = dists.index(min(dists))
       nearestVertex = tempObj.data.vertices[activeIndex]
       for group in nearestVertex.groups:
           groupName = tempObj.vertex_groups[group.group].name
           #print ("Group name is", groupName)
           if ( onlyNamedBones == False or groupName in boneSet):
               if not(groupName in targetObject.vertex_groups):
                   targetObject.vertex_groups.new(groupName)
               targetObject.vertex_groups[groupName].add([targetVert.index],group.weight,'REPLACE')
               #print ("copied group", groupName)
           #else:
           #    print ("Skipping group", groupName)

def main(context):

   Copies the bone weights
   #print(context.scene.BWCInter, context.scene.BWCNamedBones, context.scene.BWCEmptyGroups )
   if context.active_object.type != 'MESH':
       return
   targetObjects = context.selected_objects
   baseObj = context.active_object
   bpy.ops.object.select_all(action='DESELECT')
   baseObj.select=True
   bpy.ops.object.duplicate()
   tempObj = context.active_object
   if context.scene.BWCInter > 0:
       bpy.ops.object.editmode_toggle()
       bpy.ops.mesh.select_all(action='SELECT')
       bpy.ops.mesh.subdivide(number_cuts=context.scene.BWCInter, smoothness=0)
       bpy.ops.object.editmode_toggle()
   for v in tempObj.data.vertices:
       v.co = baseObj.matrix_world * v.co
   for targetObject in targetObjects:
       if (targetObject.type == 'MESH') & (targetObject!=context.active_object):
            boneWeightCopy(tempObj,targetObject, context.scene.BWCNamedBones, context.scene.BWCEmptyGroups)
   bpy.ops.object.delete()
    1. Copy Bone Weights Operator

class BWCOperator(bpy.types.Operator):

   '
   bl_idname = "object.bwc"
   bl_label = "Copy Selected Object Bone Weights to Active"    


   def execute(self, context):
       main(context)
       return {'FINISHED'}


    1. registring

def register():

   bpy.utils.register_module(__name__)
   pass

def unregister():

   bpy.utils.unregister_module(__name__)
   pass

if __name__ == "__main__":

   register()

<py>

Outils personnels
donate
Google Ads