diff options
Diffstat (limited to 'release/scripts/ui/buttons_object_constraint.py')
-rw-r--r-- | release/scripts/ui/buttons_object_constraint.py | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/release/scripts/ui/buttons_object_constraint.py b/release/scripts/ui/buttons_object_constraint.py index e089cff264f..6be166e8af0 100644 --- a/release/scripts/ui/buttons_object_constraint.py +++ b/release/scripts/ui/buttons_object_constraint.py @@ -536,6 +536,145 @@ class OBJECT_PT_constraints(ConstraintButtonsPanel): for con in ob.constraints: self.draw_constraint(context, con) +class BONE_PT_inverse_kinematics(ConstraintButtonsPanel): + __label__ = "Inverse Kinematics" + __default_closed__ = True + __context__ = "bone_constraint" + + def poll(self, context): + ob = context.object + bone = context.bone + + if ob and bone: + pchan = ob.pose.pose_channels[bone.name] + return pchan.has_ik + + return False + + def draw(self, context): + layout = self.layout + + ob = context.object + bone = context.bone + pchan = ob.pose.pose_channels[bone.name] + + row = layout.row() + row.itemR(ob.pose, "ik_solver") + + split = layout.split(percentage=0.25) + split.itemR(pchan, "ik_dof_x", text="X") + row = split.row() + row.itemR(pchan, "ik_stiffness_x", text="Stiffness", slider=True) + row.active = pchan.ik_dof_x + + split = layout.split(percentage=0.25) + row = split.row() + row.itemR(pchan, "ik_limit_x", text="Limit") + row.active = pchan.ik_dof_x + row = split.row(align=True) + row.itemR(pchan, "ik_min_x", text="") + row.itemR(pchan, "ik_max_x", text="") + row.active = pchan.ik_dof_x and pchan.ik_limit_x + + split = layout.split(percentage=0.25) + split.itemR(pchan, "ik_dof_y", text="Y") + row = split.row() + row.itemR(pchan, "ik_stiffness_y", text="Stiffness", slider=True) + row.active = pchan.ik_dof_y + + split = layout.split(percentage=0.25) + row = split.row() + row.itemR(pchan, "ik_limit_y", text="Limit") + row.active = pchan.ik_dof_y + row = split.row(align=True) + row.itemR(pchan, "ik_min_y", text="") + row.itemR(pchan, "ik_max_y", text="") + row.active = pchan.ik_dof_y and pchan.ik_limit_y + + split = layout.split(percentage=0.25) + split.itemR(pchan, "ik_dof_z", text="Z") + row = split.row() + row.itemR(pchan, "ik_stiffness_z", text="Stiffness", slider=True) + row.active = pchan.ik_dof_z + + split = layout.split(percentage=0.25) + row = split.row() + row.itemR(pchan, "ik_limit_z", text="Limit") + row.active = pchan.ik_dof_z + row = split.row(align=True) + row.itemR(pchan, "ik_min_z", text="") + row.itemR(pchan, "ik_max_z", text="") + row.active = pchan.ik_dof_z and pchan.ik_limit_z + split = layout.split() + split.itemR(pchan, "ik_stretch", text="Stretch", slider=True) + split.itemL() + + if ob.pose.ik_solver == "ITASC": + layout.itemL(text="Joint constraint:") + split = layout.split(percentage=0.3) + row = split.row() + row.itemR(pchan, "ik_rot_control", text="Rotation") + row = split.row() + row.itemR(pchan, "ik_rot_weight", text="Weight", slider=True) + row.active = pchan.ik_rot_control + # not supported yet + #split = layout.split(percentage=0.3) + #row = split.row() + #row.itemR(pchan, "ik_lin_control", text="Size") + #row = split.row() + #row.itemR(pchan, "ik_lin_weight", text="Weight", slider=True) + #row.active = pchan.ik_lin_control + +class BONE_PT_iksolver_itasc(ConstraintButtonsPanel): + __label__ = "iTaSC parameters" + __default_closed__ = True + __context__ = "bone_constraint" + + def poll(self, context): + ob = context.object + bone = context.bone + + if ob and bone: + pchan = ob.pose.pose_channels[bone.name] + return pchan.has_ik and ob.pose.ik_solver == "ITASC" and ob.pose.ik_param + + return False + + def draw(self, context): + layout = self.layout + + ob = context.object + itasc = ob.pose.ik_param + + layout.itemR(itasc, "mode", expand=True) + simulation = itasc.mode == "SIMULATION" + if simulation: + layout.itemL(text="Reiteration:") + layout.itemR(itasc, "reiteration", expand=True) + + flow = layout.column_flow() + flow.itemR(itasc, "precision", text="Prec") + flow.itemR(itasc, "num_iter", text="Iter") + flow.active = not simulation or itasc.reiteration != "NEVER" + + if simulation: + layout.itemR(itasc, "auto_step") + row = layout.row() + if itasc.auto_step: + row.itemR(itasc, "min_step", text="Min") + row.itemR(itasc, "max_step", text="Max") + else: + row.itemR(itasc, "num_step") + + layout.itemR(itasc, "solver") + if simulation: + layout.itemR(itasc, "feedback") + layout.itemR(itasc, "max_velocity") + if itasc.solver == "DLS": + row = layout.row() + row.itemR(itasc, "dampmax", text="Damp", slider=True) + row.itemR(itasc, "dampeps", text="Eps", slider=True) + class BONE_PT_constraints(ConstraintButtonsPanel): __label__ = "Constraints" __context__ = "bone_constraint" @@ -558,4 +697,6 @@ class BONE_PT_constraints(ConstraintButtonsPanel): self.draw_constraint(context, con) bpy.types.register(OBJECT_PT_constraints) +bpy.types.register(BONE_PT_iksolver_itasc) +bpy.types.register(BONE_PT_inverse_kinematics) bpy.types.register(BONE_PT_constraints) |