[Blender] Auto-Snap para IK FK

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}

Ver más sobre el tema y los comentarios en el foro