snap keys
import pymel.core as pm
def get_snap_value(values, last_sel):
differences = []
for value in values:
differences.append(abs(last_sel - value))
return min(differences)
def selection_ok(curve):
return len(pm.keyframe(curve, q=True, selected=True)) > 1
curve = pm.keyframe(q=True, selected=True, name=True)
if selection_ok(curve):
key_values = pm.keyframe(curve, q=True, selected=True, valueChange=True)
key_times = pm.keyframe(curve, q=True, selected=True, timeChange=True)
last_sel = pm.keyframe(curve, q=True, lastSelected=True, valueChange=True)[0]
for time, val in zip(key_times, key_values):
if val == last_sel:
key_values.remove(val)
key_times.remove(time)
snap_value = get_snap_value(key_values, last_sel)
if min(key_values) > last_sel:
snap_value = snap_value * -1
for time in key_times:
pm.keyframe(curve, edit=True, time=(time,), relative=True, vc=snap_value)
else:
pm.warning('Select one curve with at least 2 keys')