def generate_keyframes_range(keyframes):
#check if there are no keyframes in the selected object
if len(keyframes) < 1:
cmds.confirmDialog( message= 'no keyframes' )
return
#getting the range lenght, lowest and highest values of the range
highest_keyframe, lowest_keyframe = max(keyframes), min(keyframes)
generate_keyframes_range = highest_keyframe - lowest_keyframe
print "generate_keyframes_range: %f \nhighest_keyframe: %f \nlowest_keyframe: %f" %(generate_keyframes_range, highest_keyframe, lowest_keyframe)
return generate_keyframes_range, highest_keyframe, lowest_keyframe
def ranged_value(keyframe_values, keyframe_numbers, anim_curve_attribute, lowest_keyframe, keyframes_range, new_range, range_translation=0):
print "keyframe_values: ", keyframe_values, "keyframe_numbers: ", keyframe_numbers
if range_translation < 0:
new_range = (new_range - range_translation)
for frame, keyframe in zip(keyframe_numbers, keyframe_values):
cmds.currentTime(frame)
print "frame: ",frame, "value: ", keyframe
#getting the new keyframe value based on the lowest value of the new range
keyframe = keyframe - lowest_keyframe
#adding the normalized value to the normalized value list.
#the normalized value is the output of the keyframe * the normalized range / the range lenght
#the range translation value is used to shift the keyframe if the range goes from a negative value
normalized_value = (round(float(keyframe * new_range / keyframes_range),4)) + range_translation
print normalized_value
cmds.setAttr(anim_curve_attribute, normalized_value)
return normalized_value
objects = cmds.ls(sl=True)
for object in objects:
anim_curves = cmds.findKeyframe(object, curve=True)
if anim_curves:
for anim_curve in anim_curves:
anim_curve_attribute = cmds.listConnections(anim_curve,plugs=1)[0]
keyframe_numbers = cmds.keyframe(anim_curve, query=True, timeChange=True)
keyframe_values = cmds.keyframe(anim_curve, query=True, valueChange=True)
print generate_keyframes_range(keyframe_values)
keyframes_range = generate_keyframes_range(keyframe_values)[0]
lowest_keyframe = generate_keyframes_range(keyframe_values)[2]
ranged_value(keyframe_values, keyframe_numbers, anim_curve_attribute, lowest_keyframe, keyframes_range, 20, -2)