Código:
Import Bpy.
Import Mathutils.
From Mathutils import *
###########################.
Class snap_fk_ik(Bpy, types. Panel):
Bl_label = Snap FK/IK
Bl_space_type = view_3d.
Bl_region_type = UI
# bl_context = object.
Def draw_header(self, context):
Layout = self, Layout Def draw(self, context):
Layout = self, Layout.
Col = Layout, column()
Row = col, row(align=true).
Row.operator(snap_fk, text=FK-->ik)
Row.operator(snap_ik, text=ik-->FK).
################################.
Def getmat(bone, active, context, ignoreparent):
Helper function for visual transform copy, gets the active transform in bone space.
Data_bone = context, active_object, data, Bones[bone, name]
#all matrices are in armature space unless commented otherwise.
Otherloc = active, Matrix #final 4x4 (*.mat) of target, location.
Bonemat_local = Matrix(data_bone, matrix_local) #self rest Matrix.
If data_bone, parent:
Parentposemat = Matrix(
Context, active_object, pose, Bones[data_bone, parent, name].Matrix)
Parentbonemat = Matrix(data_bone, parent, matrix_local)
Else:
Parentposemat = bonemat_local, copy(), identity()
Parentbonemat = bonemat_local, copy(), identity()
If parentbonemat == parentposemat or ignoreparent:
Newmat = bonemat_local, invert() * otherloc.
Else:
Bonemat = parentbonemat, invert() * bonemat_local.
Newmat = bonemat, invert() * parentposemat, invert() * otherloc.
Return newmat.
###############################.
Def rotcopy(item, mat):
Copy rotation todo item from Matrix (*.mat) depending on item, rotation_mode.
If item, rotation_mode == quaternion:
Item, rotation_cuaternión = mat, rotation_part(), to_quat()
Elif item, rotation_mode == axis_angle:
Quat = mat, rotation_part(), to_quat()
Item, rotation_axis_angle = Vector([quat, axis[0], quat, axis[1], quat, axis[2], quat, angle])
Else:
Item, rotation_euler = mat, rotation_part(), to_euler(item, rotation_mode).
###############################.
Def pvislocexec(bone, active, context):
Bone, location = getmat(bone, active, context, false), translation_part()
Def pvisrotexec(bone, active, context):
Rotcopy(bone, getmat(bone, active, context, not context, active_object, data, Bones[bone, name].use_inherit_rotation))
Def pvisscaexec(bone, active, context):
Bone, scale = getmat(bone, active, context, not context, active_object, data, Bones[bone, name].use_inherit_scale)\
.scale_part()
############################## Def snap_it(set1, set2, context):
##set org bone Snap IK/fk_set data = context, active_object, data.
Postura = context, active_object, pose con_in = pose, Bones[org, upper].constraints[ct-ik].
Con_in, influence = set1 con_in = pose, Bones[org, upper].constraints[ct-FK].
Con_in, influence = set2 con_in = pose, Bones[org, fore].constraints[ct-ik].
Con_in, influence = set1 con_in = pose, Bones[org, fore].constraints[ct-FK].
Con_in, influence = set2 con_in = pose, Bones[org, hand].constraints[ct-ik].
Con_in, influence = set1 con_in = pose, Bones[org, hand].constraints[ct-FK].
Con_in, influence = set2.
#####################################.
Def con_set_it(bname, cname, set1, context):
Data = context, active_object, data.
Postura = context, active_object, pose con_in = pose, Bones[bname].constraints[cname].
Con_in, influence = set1.
##################################### Def snap_it2(bname, cname, context):
##Snap rot_loc_sca IK/FK data = context, active_object, data.
Postura = context, active_object, pose pvisrotexec(pose, Bones[bname], pose, Bones[cname], context)
Pvislocexec(pose, Bones[bname], pose, Bones[cname], context)
Pvisscaexec(pose, Bones[bname], pose, Bones[cname], context).
###############################.
Def sel_layer1(a):
If a == 1:
Bpy, ops, pose, armature_layers(layers=(true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false)) Def sel_layer2(a):
If a == 1:
Bpy, ops, pose, armature_layers(layers=(true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false))
Def sel_layer_all(a):
If a == 1:
Bpy, ops, pose, armature_layers(layers=(true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false)).
#####################################.
Class snap_fk(Bpy, types. Operator):
Bl_label = fk_snap.
Bl_idname = snap_fk.
# bl_options = {register, undo}.
@classmethod.
Def Poll(cls, context):
Return context, mode == pose Def invoke (self, context, event):
Sel_layer_all(1) pose = context, active_object, pose snap_it2(FK, upper,ik, upper, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(FK, fore,ik, fore, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(FK, hand,ik, hand, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle () con_set_it(org, fore,stretch to,0, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle () con_set_it(org, upper,stretch to,0, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it(0,1, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle () sel_layer2(1) print(ok)
Return {finished}.
################################### class snap_ik(Bpy, types. Operator):
Bl_label = ik_snap.
Bl_idname = snap_ik.
# bl_options = {register, undo}.
@classmethod.
Def Poll(cls, context):
Return context, mode == pose Def invoke (self, context, event):
Sel_layer_all(1) pose = context, active_object, pose.
con_set_it(ik, fore,ik,0, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(ik, upper,FK, upper, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(ik, fore,FK, fore, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(ik, hand,FK, hand, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(ik, pole,ik, pole, handle, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
con_set_it(ik, fore,ik,1, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(dummie, pole, a,ik, pole, handle, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(dummie, pole, b,ik, pole, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(dummie, pole, a,ik, pole, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it2(ik, pole,dummie, pole, b, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle () con_set_it(org, fore,stretch to,0, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle () con_set_it(org, upper,stretch to,0, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle ()
snap_it(1,0, context)
Bpy, ops, object, posemode_toggle ()
Bpy, ops, object, posemode_toggle () sel_layer1(1) print(ok)
Return {finished}