[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4109] trunk/py/scripts/addons/ io_import_scene_mhx.py: Better FK/IK switching
Thomas Larsson
thomas_larsson_01 at hotmail.com
Fri Dec 28 05:27:06 CET 2012
Revision: 4109
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4109
Author: thomasl
Date: 2012-12-28 04:26:59 +0000 (Fri, 28 Dec 2012)
Log Message:
-----------
Better FK/IK switching
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 2012-12-27 21:18:24 UTC (rev 4108)
+++ trunk/py/scripts/addons/io_import_scene_mhx.py 2012-12-28 04:26:59 UTC (rev 4109)
@@ -40,7 +40,7 @@
'name': 'Import: MakeHuman (.mhx)',
'author': 'Thomas Larsson',
'version': (1, 14, 1),
- "blender": (2, 64, 0),
+ "blender": (2, 65, 0),
'location': "File > Import > MakeHuman (.mhx)",
'description': 'Import files in the MakeHuman eXchange format (.mhx)',
'warning': '',
@@ -4013,8 +4013,11 @@
rig = context.object
auto = context.scene.tool_settings.use_keyframe_insert_auto
print("Snap FK Arm%s" % suffix)
- (uparmIk, loarmIk, elbow, elbowPt, wrist) = getSnapBones(rig, "ArmIK", suffix)
- (uparmFk, loarmFk, elbowPtFk, handFk) = getSnapBones(rig, "ArmFK", suffix)
+ snapIk,cnsIk = getSnapBones(rig, "ArmIK", suffix)
+ (uparmIk, loarmIk, elbow, elbowPt, wrist) = snapIk
+ snapFk,cnsFk = getSnapBones(rig, "ArmFK", suffix)
+ (uparmFk, loarmFk, elbowPtFk, handFk) = snapFk
+ muteConstraints(cnsFk, True)
matchPoseRotation(uparmFk, uparmFk, auto)
matchPoseScale(uparmFk, uparmFk, auto)
@@ -4025,6 +4028,8 @@
if rig["MhaHandFollowsWrist" + suffix]:
matchPoseRotation(handFk, wrist, auto)
matchPoseScale(handFk, wrist, auto)
+
+ muteConstraints(cnsFk, False)
return
@@ -4033,8 +4038,11 @@
scn = context.scene
auto = scn.tool_settings.use_keyframe_insert_auto
print("Snap IK Arm%s" % suffix)
- (uparmIk, loarmIk, elbow, elbowPt, wrist) = getSnapBones(rig, "ArmIK", suffix)
- (uparmFk, loarmFk, elbowPtFk, handFk) = getSnapBones(rig, "ArmFK", suffix)
+ snapIk,cnsIk = getSnapBones(rig, "ArmIK", suffix)
+ (uparmIk, loarmIk, elbow, elbowPt, wrist) = snapIk
+ snapFk,cnsFk = getSnapBones(rig, "ArmFK", suffix)
+ (uparmFk, loarmFk, elbowPtFk, handFk) = snapFk
+ muteConstraints(cnsIk, True)
#rig["MhaElbowFollowsShoulder" + suffix] = False
#rig["MhaElbowFollowsWrist" + suffix] = False
@@ -4044,6 +4052,7 @@
matchPoseTranslation(elbow, elbowPtFk, auto)
matchPoseTranslation(elbowPt, elbowPtFk, auto)
setInverse(rig, elbowPt)
+ muteConstraints(cnsIk, False)
return
@@ -4051,14 +4060,23 @@
rig = context.object
auto = context.scene.tool_settings.use_keyframe_insert_auto
print("Snap FK Leg%s" % suffix)
- (uplegIk, lolegIk, kneePt, ankleIk, legIk, legFk, footIk, toeIk) = getSnapBones(rig, "LegIK", suffix)
- (uplegFk, lolegFk, kneePtFk, footFk, toeFk) = getSnapBones(rig, "LegFK", suffix)
-
+ snapIk,cnsIk = getSnapBones(rig, "LegIK", suffix)
+ (uplegIk, lolegIk, kneePt, ankleIk, legIk, legFk, footIk, toeIk) = snapIk
+ snapFk,cnsFk = getSnapBones(rig, "LegFK", suffix)
+ (uplegFk, lolegFk, kneePtFk, footFk, toeFk) = snapFk
+ muteConstraints(cnsFk, True)
+
+ if not rig["MhaLegIkToAnkle" + suffix]:
+ matchPoseRotation(footFk, footFk, auto)
+ matchPoseRotation(toeFk, toeFk, auto)
+
matchPoseRotation(uplegFk, uplegFk, auto)
matchPoseScale(uplegFk, uplegFk, auto)
matchPoseRotation(lolegFk, lolegFk, auto)
matchPoseScale(lolegFk, lolegFk, auto)
+
+ muteConstraints(cnsFk, False)
return
@@ -4067,8 +4085,11 @@
scn = context.scene
auto = scn.tool_settings.use_keyframe_insert_auto
print("Snap IK Leg%s" % suffix)
- (uplegIk, lolegIk, kneePt, ankleIk, legIk, legFk, footIk, toeIk) = getSnapBones(rig, "LegIK", suffix)
- (uplegFk, lolegFk, kneePtFk, footFk, toeFk) = getSnapBones(rig, "LegFK", suffix)
+ snapIk,cnsIk = getSnapBones(rig, "LegIK", suffix)
+ (uplegIk, lolegIk, kneePt, ankleIk, legIk, legFk, footIk, toeIk) = snapIk
+ snapFk,cnsFk = getSnapBones(rig, "LegFK", suffix)
+ (uplegFk, lolegFk, kneePtFk, footFk, toeFk) = snapFk
+ muteConstraints(cnsIk, True)
#rig["MhaKneeFollowsHip" + suffix] = False
#rig["MhaKneeFollowsFoot" + suffix] = False
@@ -4085,8 +4106,11 @@
setInverse(rig, kneePt)
if not legIkToAnkle:
matchPoseTranslation(ankleIk, footFk, auto)
+
+ muteConstraints(cnsIk, False)
return
-
+
+
#
# setInverse(rig, pb):
#
@@ -4103,66 +4127,6 @@
bpy.ops.object.mode_set(mode='POSE')
return
-
-"""
-def clearInverse(rig, pb):
- rig.data.bones.active = pb.bone
- pb.bone.select = True
- bpy.ops.object.mode_set(mode='OBJECT')
- bpy.ops.object.mode_set(mode='POSE')
- for cns in pb.constraints:
- if cns.type == 'CHILD_OF':
- bpy.ops.constraint.childof_clear_inverse(constraint=cns.name, owner='BONE')
- bpy.ops.object.mode_set(mode='OBJECT')
- bpy.ops.object.mode_set(mode='POSE')
- return
-
-
-def fixAnkle(rig, suffix, scn):
- layers = list(rig.data.layers)
- try:
- rig.data.layers = 32*[True]
- setInverse(rig, rig.pose.bones["Ankle" + suffix])
- scn.frame_current = scn.frame_current
- finally:
- rig.data.layers = layers
- return
-
-
-def clearAnkle(rig, suffix, scn):
- layers = list(rig.data.layers)
- try:
- rig.data.layers = 32*[True]
- clearInverse(rig, rig.pose.bones["Ankle" + suffix])
- scn.frame_current = scn.frame_current
- finally:
- rig.data.layers = layers
- return
-
-
-class VIEW3D_OT_FixAnkleButton(bpy.types.Operator):
- bl_idname = "mhx.fix_ankle"
- bl_label = "Fix ankle"
- bl_description = "Set inverse for ankle Child-of constraints"
- bl_options = {'UNDO'}
- suffix = StringProperty()
-
- def execute(self, context):
- fixAnkle(context.object, self.suffix, context.scene)
- return{'FINISHED'}
-
-
-class VIEW3D_OT_ClearAnkleButton(bpy.types.Operator):
- bl_idname = "mhx.clear_ankle"
- bl_label = "Clear ankle"
- bl_description = "Clear inverse for ankle Child-of constraints"
- bl_options = {'UNDO'}
- suffix = StringProperty()
-
- def execute(self, context):
- clearAnkle(context.object, self.suffix, context.scene)
- return{'FINISHED'}
-"""
#
#
#
@@ -4178,12 +4142,21 @@
def getSnapBones(rig, key, suffix):
names = SnapBones[key]
pbones = []
+ constraints = []
for name in names:
pb = rig.pose.bones[name+suffix]
pbones.append(pb)
- return tuple(pbones)
+ for cns in pb.constraints:
+ if cns.type == 'LIMIT_ROTATION' and not cns.mute:
+ constraints.append(cns)
+ return tuple(pbones),constraints
+def muteConstraints(constraints, value):
+ for cns in constraints:
+ cns.mute = value
+
+
class VIEW3D_OT_MhxSnapFk2IkButton(bpy.types.Operator):
bl_idname = "mhx.snap_fk_ik"
bl_label = "Snap FK"
@@ -4193,6 +4166,8 @@
def execute(self, context):
bpy.ops.object.mode_set(mode='POSE')
rig = context.object
+ if rig.MhxSnapExact:
+ rig["MhaRotationLimits"] = 0.0
(prop, old) = setSnapProp(rig, self.data, 1.0, context, False)
if prop[:6] == "MhaArm":
fk2ikArm(context, prop[-2:])
@@ -4211,6 +4186,8 @@
def execute(self, context):
bpy.ops.object.mode_set(mode='POSE')
rig = context.object
+ if rig.MhxSnapExact:
+ rig["MhaRotationLimits"] = 0.0
(prop, old) = setSnapProp(rig, self.data, 0.0, context, True)
if prop[:6] == "MhaArm":
ik2fkArm(context, prop[-2:])
@@ -4313,6 +4290,16 @@
self.toggleButton(row, rig, "MhaLegIk_L", " 5", " 4")
self.toggleButton(row, rig, "MhaLegIk_R", " 21", " 20")
+ layout.label("IK Influence")
+ row = layout.row()
+ row.label("Arm")
+ row.prop(rig, '["MhaArmIk_L"]', text="")
+ row.prop(rig, '["MhaArmIk_R"]', text="")
+ row = layout.row()
+ row.label("Leg")
+ row.prop(rig, '["MhaLegIk_L"]', text="")
+ row.prop(rig, '["MhaLegIk_R"]', text="")
+
try:
ok = (rig["MhxVersion"] >= 12)
except:
@@ -4321,6 +4308,13 @@
layout.label("Snapping only works with MHX version 1.12 and later.")
return
+ layout.separator()
+ layout.label("Snapping")
+ row = layout.row()
+ row.label("Rotation Limits")
+ row.prop(rig, '["MhaRotationLimits"]', text="")
+ row.prop(rig, "MhxSnapExact", text="Exact Snapping")
+
layout.label("Snap Arm bones")
row = layout.row()
row.label("FK Arm")
@@ -4340,17 +4334,8 @@
row.label("IK Leg")
row.operator("mhx.snap_ik_fk", text="Snap L IK Leg").data = "MhaLegIk_L 4 5 12"
row.operator("mhx.snap_ik_fk", text="Snap R IK Leg").data = "MhaLegIk_R 20 21 28"
- """
- row = layout.row()
- row.label("Ankle")
- row.operator("mhx.fix_ankle", text="Fix L Ankle").suffix = "_L"
- row.operator("mhx.fix_ankle", text="Fix R Ankle").suffix = "_R"
- row = layout.row()
- row.label("")
- row.operator("mhx.clear_ankle", text="Clear L Ankle").suffix = "_L"
- row.operator("mhx.clear_ankle", text="Clear R Ankle").suffix = "_R"
- """
+
def toggleButton(self, row, rig, prop, fk, ik):
if rig[prop] > 0.5:
row.operator("mhx.toggle_fk_ik", text="IK").toggle = prop + " 0" + fk + ik
@@ -4690,6 +4675,7 @@
bpy.types.Object.MhxMesh = BoolProperty(default=False)
bpy.types.Object.MhxRig = StringProperty(default="")
bpy.types.Object.MhxRigify = BoolProperty(default=False)
+ bpy.types.Object.MhxSnapExact = BoolProperty(default=False)
bpy.types.Object.MhxShapekeyDrivers = BoolProperty(default=True)
bpy.types.Object.MhxStrength = FloatProperty(
name = "Expression strength",
More information about the Bf-extensions-cvs
mailing list