[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4543] trunk/py/scripts/addons/ io_import_scene_mhx.py: MHX importer: edited rigify connection to work with the new rigifiable rig.
Thomas Larsson
thomas_larsson_01 at hotmail.com
Tue May 21 05:08:14 CEST 2013
Revision: 4543
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4543
Author: thomasl
Date: 2013-05-21 03:08:13 +0000 (Tue, 21 May 2013)
Log Message:
-----------
MHX importer: edited rigify connection to work with the new rigifiable rig.
Modified Paths:
--------------
trunk/py/scripts/addons/io_import_scene_mhx.py
Modified: trunk/py/scripts/addons/io_import_scene_mhx.py
===================================================================
--- trunk/py/scripts/addons/io_import_scene_mhx.py 2013-05-19 16:36:23 UTC (rev 4542)
+++ trunk/py/scripts/addons/io_import_scene_mhx.py 2013-05-21 03:08:13 UTC (rev 4543)
@@ -25,8 +25,7 @@
"""
Abstract
-MHX (MakeHuman eXchange format) importer for Blender 2.5x.
-Version 1.14.0
+MHX (MakeHuman eXchange format) importer for Blender 2.6x.
This script should be distributed with Blender.
If not, place it in the .blender/scripts/addons dir
@@ -39,8 +38,8 @@
bl_info = {
'name': 'Import: MakeHuman (.mhx)',
'author': 'Thomas Larsson',
- 'version': (1, 15, 3),
- "blender": (2, 65, 0),
+ 'version': (1, 15, 4),
+ "blender": (2, 67, 0),
'location': "File > Import > MakeHuman (.mhx)",
'description': 'Import files in the MakeHuman eXchange format (.mhx)',
'warning': '',
@@ -437,7 +436,7 @@
correctRig(val)
elif key == "Rigify":
if toggle & T_Rigify:
- rigifyMhx(bpy.context, val[0])
+ rigifyMhx(bpy.context)
elif key == 'AnimationData':
try:
ob = loadedData['Object'][val[0]]
@@ -2519,294 +2518,313 @@
#
# Postprocessing of rigify rig
#
-# rigifyMhx(context, name):
+# rigifyMhx(context):
#
###################################################################################
-def rigifyMhx(context, name):
+class RigifyBone:
+ def __init__(self, eb):
+ self.name = eb.name
+ self.realname = None
+ self.realname1 = None
+ self.realname2 = None
+ self.fkname = None
+ self.ikname = None
+
+ self.head = eb.head.copy()
+ self.tail = eb.tail.copy()
+ self.roll = eb.roll
+ self.deform = eb.use_deform
+ self.parent = None
+ self.child = None
+ self.connect = False
+ self.original = False
+ self.extra = (eb.name in ["spine-1"])
+
+ def __repr__(self):
+ return ("<RigifyBone %s %s %s>" % (self.name, self.realname, self.realname1))
+
+
+def rigifyMhx(context):
+ from collections import OrderedDict
+
print("Modifying MHX rig to Rigify")
scn = context.scene
- mhx = loadedData['Object'][name]
- mhx.MhxRigify = True
- bpy.context.scene.objects.active = mhx
-
- # Delete old widgets
- """
- for ob in scn.objects:
- if ob.type == 'MESH' and ob.name[0:3] == "WGT":
- scn.objects.unlink(ob)
- """
-
- # Save mhx bone locations
- heads = {}
- tails = {}
- rolls = {}
- parents = {}
- extras = {}
+ ob = context.object
+ if ob.type == 'ARMATURE':
+ rig = ob
+ elif ob.type == 'MESH':
+ rig = ob.parent
+ else:
+ rig = None
+ if not(rig and rig.type == 'ARMATURE'):
+ raise NameError("Rigify: %s is neither an armature nor has armature parent" % ob)
+ rig.MhxRigify = True
+ scn.objects.active = rig
+
+ group = None
+ for grp in bpy.data.groups:
+ if rig.name in grp.objects:
+ group = grp
+ break
+ print("Group: %s" % group)
+
+ # Setup info about MHX bones
+ bones = OrderedDict()
bpy.ops.object.mode_set(mode='EDIT')
-
- newParents = {
- 'head' : 'DEF-head',
- 'ribs' : 'DEF-ribs',
- 'upper_arm.L' : 'DEF-upper_arm.02.L',
- 'thigh.L' : 'DEF-thigh.02.L',
- 'upper_arm.R' : 'DEF-upper_arm.02.R',
- 'thigh.R' : 'DEF-thigh.02.R',
- }
-
- for eb in mhx.data.edit_bones:
- heads[eb.name] = eb.head.copy()
- tails[eb.name] = eb.tail.copy()
- rolls[eb.name] = eb.roll
- if eb.parent:
- par = eb.parent.name
- # print(eb.name, par)
- try:
- parents[eb.name] = newParents[par]
- except:
- parents[eb.name] = par
- else:
- parents[eb.name] = None
- extras[eb.name] = not eb.layers[16]
- bpy.ops.object.mode_set(mode='OBJECT')
-
- # Find corresponding meshes. Can be several (clothes etc.)
- meshes = []
- for ob in scn.objects:
- for mod in ob.modifiers:
- if (mod.type == 'ARMATURE' and mod.object == mhx):
- meshes.append((ob, mod))
- if meshes == []:
- MyError("Did not find matching mesh")
-
- # Rename Head vertex group
- for (mesh, mod) in meshes:
- try:
- vg = mesh.vertex_groups['DfmHead']
- vg.name = 'DEF-head'
- except:
- pass
-
- # Change meta bone locations
- scn.objects.active = None
- try:
- bpy.ops.object.armature_human_metarig_add()
- success = True
- except:
- success = False
- if not success:
- MyError("Unable to create advanced human. \n" \
- "Make sure that the Rigify addon is enabled. \n" \
- "It is found under Rigging.")
- return
-
+ for eb in rig.data.edit_bones:
+ bone = bones[eb.name] = RigifyBone(eb)
+ if eb.parent:
+ bone.parent = eb.parent.name
+ bones[bone.parent].child = eb.name
+ bpy.ops.object.mode_set(mode='OBJECT')
+
+ # Create metarig
+ bpy.ops.object.armature_human_metarig_add()
+ bpy.ops.object.location_clear()
+ bpy.ops.object.rotation_clear()
+ bpy.ops.object.scale_clear()
+ bpy.ops.transform.resize(value=(100, 100, 100))
+ bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
+
+ # Fit metarig to default MHX rig
meta = context.object
bpy.ops.object.mode_set(mode='EDIT')
- for eb in meta.data.edit_bones:
- eb.head = heads[eb.name]
- eb.tail = tails[eb.name]
- eb.roll = rolls[eb.name]
- extras[eb.name] = False
-
- fingerPlanes = [
- ('UP-thumb.L', 'thumb.01.L', 'thumb.03.L', ['thumb.02.L']),
- ('UP-index.L', 'finger_index.01.L', 'finger_index.03.L', ['finger_index.02.L']),
- ('UP-middle.L', 'finger_middle.01.L', 'finger_middle.03.L', ['finger_middle.02.L']),
- ('UP-ring.L', 'finger_ring.01.L', 'finger_ring.03.L', ['finger_ring.02.L']),
- ('UP-pinky.L', 'finger_pinky.01.L', 'finger_pinky.03.L', ['finger_pinky.02.L']),
- ('UP-thumb.R', 'thumb.01.R', 'thumb.03.R', ['thumb.02.R']),
- ('UP-index.R', 'finger_index.01.R', 'finger_index.03.R', ['finger_index.02.R']),
- ('UP-middle.R', 'finger_middle.01.R', 'finger_middle.03.R', ['finger_middle.02.R']),
- ('UP-ring.R', 'finger_ring.01.R', 'finger_ring.03.R', ['finger_ring.02.R']),
- ('UP-pinky.R', 'finger_pinky.01.R', 'finger_pinky.03.R', ['finger_pinky.02.R']),
- ]
-
- for (upbone, first, last, middles) in fingerPlanes:
- extras[upbone] = False
- #lineateChain(upbone, first, last, middles, 0.01, meta, heads, tails)
-
- ikPlanes = [
- ('UP-leg.L', 'thigh.L', 'shin.L'),
- ('UP-arm.L', 'upper_arm.L', 'forearm.L'),
- ('UP-leg.R', 'thigh.R', 'shin.R'),
- ('UP-arm.R', 'upper_arm.R', 'forearm.R'),
- ]
-
- for (upbone, first, last) in ikPlanes:
- extras[upbone] = False
- lineateChain(upbone, first, last, [], 0.1, meta, heads, tails)
-
+ extra = []
+ for bone in bones.values():
+ try:
+ eb = meta.data.edit_bones[bone.name]
+ except KeyError:
+ eb = None
+ if eb:
+ eb.head = bone.head
+ eb.tail = bone.tail
+ eb.roll = bone.roll
+ bone.original = True
+ elif bone.extra:
+ extra.append(bone.name)
+ bone.original = True
+ eb = meta.data.edit_bones.new(bone.name)
+ eb.use_connect = False
+ eb.head = bones[bone.parent].tail
+ eb.tail = bones[bone.child].head
+ eb.roll = bone.roll
+ parent = meta.data.edit_bones[bone.parent]
+ child = meta.data.edit_bones[bone.child]
+ child.parent = eb
+ child.head = bones[bone.child].head
+ parent.tail = bones[bone.parent].tail
+ eb.parent = parent
+ eb.use_connect = True
+
+ # Add rigify properties to extra bones
bpy.ops.object.mode_set(mode='OBJECT')
-
+ for bname in extra:
+ pb = meta.pose.bones[bname]
+ pb["rigify_type"] = ""
+
# Generate rigify rig
bpy.ops.pose.rigify_generate()
+ gen = context.object
+ print("Generated", gen)
scn.objects.unlink(meta)
- rigify = context.object
- rigify.name = name+"Rig"
- layers = 20*[False]
- layers[1] = True
- rigify.layers = layers
- rigify.show_x_ray = True
- for (mesh, mod) in meshes:
- mod.object = rigify
+ del meta
+
+ for bone in bones.values():
+ if bone.original:
+ setBoneName(bone, gen)
+
+ # Add extra bone to generated rig
+ bpy.ops.object.mode_set(mode='EDIT')
+ layers = 32*[False]
+ layers[1] = True
+ for bone in bones.values():
+ if not bone.original:
+ if bone.deform:
+ bone.realname = "DEF-" + bone.name
+ else:
+ bone.realname = "MCH-" + bone.name
+ eb = gen.data.edit_bones.new(bone.realname)
+ eb.head = bone.head
+ eb.tail = bone.tail
+ eb.roll = bone.roll
+ eb.use_deform = bone.deform
+ if bone.parent:
+ parent = bones[bone.parent]
+ if parent.realname:
+ eb.parent = gen.data.edit_bones[parent.realname]
+ elif parent.realname1:
+ eb.parent = gen.data.edit_bones[parent.realname1]
+ else:
+ print(bone)
+ eb.use_connect = (eb.parent != None and eb.parent.tail == eb.head)
+ eb.layers = layers
- grp = loadedData['Group'][name]
- grp.objects.link(rigify)
+ bpy.ops.object.mode_set(mode='OBJECT')
+ for bone in bones.values():
+ if not bone.original:
+ pb = gen.pose.bones[bone.realname]
+ db = rig.pose.bones[bone.name]
+ pb.rotation_mode = db.rotation_mode
+ for cns1 in db.constraints:
+ cns2 = pb.constraints.new(cns1.type)
+ fixConstraint(cns1, cns2, gen, bones)
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list