splinecraft
1/4/2017 - 5:33 PM

snap keys

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')