macroScript Handle_Tools category:"Grants" ( -- version 1.2 -- added tangent controls, lock/unlock tangents, rearranged layout. -- tool to modify handles grant adam ghra@optushome.com.au -- works on the custom handles of selected keys in selected tracks -- interactive views simply enables update of objects in viewports during edits, which can be slow. ------------------------------------------------------------- try (destroyDialog handle_tools) catch() -- up here as seems to work more reliably selKeyArray_YN = #() selKeyArray_keys = #() KeyArray = #() modKeyArrayIn = #() modKeyArrayOut = #() keyTest_b = #() directi = 0 selKeysAr = #() selTracks = #() fn selectedKeysTracks = ( try ( tv = trackviews.currentTrackView selTracks = #() selKeyArray_keys = #() for i = 1 to tv.numSelTracks() do ( append selTracks (tv.getSelected i) ) for i in 1 to selTracks.count do ( for j in 1 to selTracks[i].keys.count do ( append KeyArray selTracks[i].keys[j] if selTracks[i].keys[j].selected then (append selKeyArray_keys selTracks[i].keys[j]) ) ) ) catch() ) fn resetHandlesin = ( undo "Reset Handles In" on ( try ( selectedKeysTracks() for i in 1 to selKeyArray_keys.count do ( if selKeyArray_keys[i].freeHandle == on then ( try ( selKeyArray_keys[i].freeHandle = off selKeyArray_keys[i].inTangentlength = (0.3333) --selKeyArray_keys[i].outTangentlength = (0.3333) selKeyArray_keys[i].freeHandle = on ) catch ( -- this for point3 controllers selKeyArray_keys[i].freeHandle = off selKeyArray_keys[i].inTangentlength = [0.3333, 0.3333, 0.3333] --selKeyArray_keys[i].outTangentlength = [0.3333, 0.3333, 0.3333] selKeyArray_keys[i].freeHandle = on ) ) else ( try ( selKeyArray_keys[i].inTangentlength = (0.3333) --selKeyArray_keys[i].outTangentlength = (0.3333) ) catch ( selKeyArray_keys[i].inTangentlength = [0.3333, 0.3333, 0.3333] --selKeyArray_keys[i].outTangentlength = [0.3333, 0.3333, 0.3333] ) ) ) ) catch() ) ) fn resetHandlesout = ( undo "Reset Handles Out" on ( try ( selectedKeysTracks() for i in 1 to selKeyArray_keys.count do ( if selKeyArray_keys[i].freeHandle == on then ( try ( selKeyArray_keys[i].freeHandle = off selKeyArray_keys[i].outTangentlength = (0.3333) selKeyArray_keys[i].freeHandle = on ) catch ( -- this for point3 controllers selKeyArray_keys[i].freeHandle = off selKeyArray_keys[i].outTangentlength = [0.3333, 0.3333, 0.3333] selKeyArray_keys[i].freeHandle = on ) ) else ( try ( selKeyArray_keys[i].outTangentlength = (0.3333) ) catch ( selKeyArray_keys[i].outTangentlength = [0.3333, 0.3333, 0.3333] ) ) ) ) catch() ) ) rollout handle_tools "Handle Tools" ( local keysarrin = #() local keysarrout = #() GroupBox grp1 "Reset handle lengths:" pos:[6,6] width:157 height:50 button rsthndin "In" width:35 offset:[-8,-35] across:3 button rsthndbth "Both" offset:[-4,-35] width:55 button rsthndout "Out" width:35 offset:[-0,-35] GroupBox grp2 "Handle Match: Modify " pos:[6,60] width:157 height:50 button mkbezin "In" width:35 offset:[-8,-35] across:3 button mkbezav "Average" offset:[-2,-35] button mkbezout "Out" width:35 offset:[2,-35] GroupBox grp3 "Handle Length, Multiplicative:" pos:[6,113] width:157 height:65 spinner adjhanin "In " range:[0, 100, 1.0] scale:0.01 fieldwidth:40 offset:[-12,-50] across:2 spinner adjhanOut "Out " range:[0, 100, 1.0] scale:0.01 fieldwidth:40 offset:[-2,-50] checkbox lckLgth "Link Length Spinners" ------------ GroupBox grp4 "Handle Tangent, Additive:" pos:[6,180] width:157 height:65 spinner adjAngIn "In " range:[-10, 10, 0.0] scale:0.005 fieldwidth:40 offset:[-12,-50] across:2 spinner adjAngOut "Out " range:[-10, 10, 0.0] scale:0.005 fieldwidth:40 offset:[-2,-50] checkbox lckAng "Link Tangent Spinners" GroupBox grp5 "Selected Key Tangents:" pos:[6,248] width:157 height:50 button lckr "Lock" width:70 offset:[-2,-35] across:2 button unlckr "Unlock" width:70 offset:[-2,-35] checkbox rdvw "Interactive Views" checked:false offset:[0,6] on rsthndin pressed do resetHandlesin() on rsthndout pressed do resetHandlesout() on rsthndbth pressed do (resetHandlesout(); resetHandlesin()) on mkbezin pressed do ( undo "Average Handles" on ( try ( selectedKeysTracks() for i in 1 to selKeyArray_keys.count do ( if selKeyArray_keys[i].selected then ( selKeyArray_keys[i].intangent = -selKeyArray_keys[i].outtangent try(selKeyArray_keys[i].x_locked = true) catch() try(selKeyArray_keys[i].y_locked = true) catch() try(selKeyArray_keys[i].z_locked = true) catch() ) ) ) catch() ) ) on mkbezout pressed do ( undo "Average Handles" on ( try ( selectedKeysTracks() for i in 1 to selKeyArray_keys.count do ( if selKeyArray_keys[i].selected then (selKeyArray_keys[i].outtangent = -selKeyArray_keys[i].intangent) try(selKeyArray_keys[i].x_locked = true) catch() try(selKeyArray_keys[i].y_locked = true) catch() try(selKeyArray_keys[i].z_locked = true) catch() ) ) catch() ) ) on mkbezav pressed do ( undo "Average Handles" on ( try ( selectedKeysTracks() for i in 1 to selKeyArray_keys.count do ( if selKeyArray_keys[i].selected then ( selKeyArray_keys[i].outtangent = (-selKeyArray_keys[i].intangent+selKeyArray_keys[i].outtangent)/2 selKeyArray_keys[i].intangent = -selKeyArray_keys[i].outtangent try(selKeyArray_keys[i].x_locked = true) catch() try(selKeyArray_keys[i].y_locked = true) catch() try(selKeyArray_keys[i].z_locked = true) catch() ) ) ) catch() ) ) ----------------- -- in length on adjHanIn changed val do ( try ( if keysarrin.count == 0 then (for i in 1 to selKeyArray_keys.count do (append keysarrin selKeyArray_keys[i].intangentLength)) if keysarrout.count == 0 then (for i in 1 to selKeyArray_keys.count do (append keysarrout selKeyArray_keys[i].outtangentLength)) for i in 1 to selKeyArray_keys.count do ( if lckLgth.checked then (selKeyArray_keys[i].outtangentLength= (keysarrout[i] * val); adjHanOut.value = adjHanIn.value) selKeyArray_keys[i].intangentLength= (keysarrin[i] * val) ) ) catch() ) on adjhanIn buttondown do ( if rdvw.checked == false then disableSceneRedraw() selectedKeysTracks() keysarrin = #() keysarrout = #() ) on adjhanIn buttonup do ( keysarrin = #() keysarrout = #() if rdvw.checked == false then ( enableSceneRedraw() redrawViews() ) ) on adjhanin entered do ( keysarrin = #() keysarrout = #() adjhanIn.value = 1.0 adjhanout.value = 1.0 ) ----------------- -- out length on adjHanOut changed val do ( try ( if keysarrin.count == 0 then (for i in 1 to selKeyArray_keys.count do (append keysarrin selKeyArray_keys[i].intangentLength)) if keysarrout.count == 0 then (for i in 1 to selKeyArray_keys.count do (append keysarrout selKeyArray_keys[i].outtangentLength)) for i in 1 to selKeyArray_keys.count do ( selKeyArray_keys[i].OuttangentLength= (keysarrOut[i] * val) if lckLgth.checked then (selKeyArray_keys[i].intangentLength= (keysarrin[i] * val); adjHanIn.value = adjHanOut.value) ) ) catch() ) on adjhanOut buttondown do ( if rdvw.checked == false then disableSceneRedraw() selectedKeysTracks() keysarrin = #() keysarrout = #() ) on adjhanOut buttonup do ( keysarrin = #() keysarrout = #() if rdvw.checked == false then ( enableSceneRedraw() redrawViews() ) ) on adjhanOut entered do ( keysarrin = #() keysarrout = #() adjhanIn.value = 1.0 adjhanout.value = 1.0 ) -------------------- -- in angle on adjAngIn changed val do ( try ( if keysarrin.count == 0 then (for i in 1 to selKeyArray_keys.count do (append keysarrin selKeyArray_keys[i].intangent)) if keysarrout.count == 0 then (for i in 1 to selKeyArray_keys.count do (append keysarrout selKeyArray_keys[i].outtangent)) for i in 1 to selKeyArray_keys.count do ( if lckAng.checked then (selKeyArray_keys[i].outtangent= (keysarrout[i] - val); adjAngOut.value = -adjAngIn.value) selKeyArray_keys[i].intangent= (keysarrin[i] + val) ) ) catch() ) on adjAngIn buttondown do ( if rdvw.checked == false then disableSceneRedraw() selectedKeysTracks() keysarrin = #() keysarrout = #() ) on adjAngIn buttonup do ( keysarrin = #() keysarrout = #() if rdvw.checked == false then ( enableSceneRedraw() redrawViews() ) ) on adjAngIn entered do ( keysarrin = #() keysarrout = #() adjAngIn.value = 0.0 adjAngout.value = 0.0 ) -------------------- -- out angle on adjAngOut changed val do ( try ( if keysarrin.count == 0 then (for i in 1 to selKeyArray_keys.count do (append keysarrin selKeyArray_keys[i].intangent)) if keysarrout.count == 0 then (for i in 1 to selKeyArray_keys.count do (append keysarrout selKeyArray_keys[i].outtangent)) for i in 1 to selKeyArray_keys.count do ( if lckAng.checked then (selKeyArray_keys[i].intangent= (keysarrin[i] - val); adjAngIn.value = -adjAngOut.value) selKeyArray_keys[i].outtangent= (keysarrout[i] + val) ) ) catch() ) on adjAngOut buttondown do ( if rdvw.checked == false then disableSceneRedraw() selectedKeysTracks() keysarrin = #() keysarrout = #() ) on adjAngOut buttonup do ( keysarrin = #() keysarrout = #() if rdvw.checked == false then ( enableSceneRedraw() redrawViews() ) ) on adjAngOut entered do ( keysarrin = #() keysarrout = #() adjAngIn.value = 0.0 adjAngout.value = 0.0 ) --- these to lock/unlock the tangents on lckr pressed do ( selectedKeysTracks() for i in 1 to selKeyArray_keys.count do ( try(selKeyArray_keys[i].x_locked = true) catch() try(selKeyArray_keys[i].y_locked = true) catch() try(selKeyArray_keys[i].z_locked = true) catch() ) ) on unlckr pressed do ( selectedKeysTracks() for i in 1 to selKeyArray_keys.count do ( try(selKeyArray_keys[i].x_locked = false) catch() try(selKeyArray_keys[i].y_locked = false) catch() try(selKeyArray_keys[i].z_locked = false) catch() ) ) ----------- ) -- end createDialog handle_tools width:170 height:314 style:#(#style_titlebar, #style_sysmenu, #style_minimizebox) --pos:[900,400] )