Y el código que no sé por qué no funciona es este, edito para que quede más mono.
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}