macroScript ScaleKeyTools category:"Grants" ( -- ghra@optushome.com.au try (destroyDialog ScaleTVKeysArbitrary ) catch() -- up here as seems to work more reliably struct ScaleTVKeysArbitraryStruct (tv, selTracks, SVkeysArr, SVval, STval, STkeysArr) global ScaleTVKeysData = ScaleTVKeysArbitraryStruct() global ScaleTVKeysArbitrary fn makeSelTracksSV = ( SVkeysArr = #() SVkeysArrTemp = #() tv = trackviews.currentTrackView selTracks = #() for i in 1 to tv.numSelTracks() do ( try ( -- all these ands to stop various tracks interfering if selected. Not all catered for. if ((tv.getselected i != undefined) AND (classof (tv.getselected i) != MAXRefTarg) AND (classof (tv.getselected i) as string != "RenderEffects") AND ((tv.getSelected i)[1] == undefined)) then ( append selTracks (tv.getSelected i) ) ) catch() ) for i in 1 to selTracks.count do ( SVkeysArrTemp = #() for j in 1 to seltracks[i].keys.count do (append SVkeysArrTemp seltracks[i].keys[j].value) append SVkeysArr SVkeysArrTemp ) ScaleTVKeysData.tv = tv ScaleTVKeysData.seltracks = seltracks ScaleTVKeysData.SVkeysArr = SVkeysArr ) fn makeSelTracksST = ( STkeysArr = #() STkeysArrTemp = #() tv = trackviews.currentTrackView selTracks = #() for i = 1 to tv.numSelTracks() do ( try ( -- all these ands to stop various tracks interfering if selected. Not all catered for. if ((tv.getselected i != undefined) AND (classof (tv.getselected i) != MAXRefTarg) AND (classof (tv.getselected i) as string != "RenderEffects") AND ((tv.getSelected i)[1] == undefined)) then ( append selTracks (tv.getSelected i) ) ) catch() ) for i in 1 to selTracks.count do ( STkeysArrTemp = #() for j in 1 to seltracks[i].keys.count do (append STkeysArrTemp seltracks[i].keys[j].time.frame) append STkeysArr STkeysArrTemp ) ScaleTVKeysData.tv = tv ScaleTVKeysData.seltracks = seltracks ScaleTVKeysData.STkeysArr = STkeysArr ) fn roundTime n = -- a modified john burnett round ( if n < 0 then n -= 0.5 else n += 0.5 return ((n as integer) / 1.) ) rollout ScaleTVKeysArbitrary "KeyScaler0.1" width:332 height:124 ( GroupBox grp2 "Time Scale" pos:[8,8] width:155 height:108 spinner st "Scale Value" pos:[48,27] width:106 height:16 range:[0,10000,1] fieldwidth:70 spinner sbt "Pivot Value" pos:[24,51] width:130 height:16 range:[-1000,10000,0] fieldwidth:70 scale:1 label lbl13 "Last Scale:" pos:[19,72] width:53 height:14 label lbl14 "1.0" pos:[85,72] width:30 height:14 --button undst "Undo" pos:[120,71] width:34 height:14 checkbox kof "Whole Frames Snap" pos:[22,92] width:120 height:15 checked:true GroupBox grp1 "Value Scale" pos:[168,8] width:155 height:80 spinner sv "Scale Value" pos:[208,27] width:106 height:16 range:[-1000,10000,1] fieldwidth:70 spinner sb "Pivot Value" pos:[181,51] width:133 height:16 range:[-1000,10000,0] fieldwidth:70 scale:1 label lb01 "Last Scale:" pos:[179,72] width:53 height:14 across:2 label lb02 "1.0" pos:[246,72] width:30 height:14 --button undsv "Undo" pos:[280,71] width:34 height:14 label lb1 "Note: Works on selected keys in selected tracks in the Trackview." pos:[168,91] width:160 height:30 -- time scaling on st changed val do ( if trackviews.currentTrackView != undefined then ( if ScaleTVKeysData.STkeysArr == undefined do makeSelTracksST() seltracks = ScaleTVKeysData.seltracks STkeysArr = ScaleTVKeysData.STkeysArr local scalePos= sbt.value for i in 1 to selTracks.count do ( for j in 1 to selTracks[i].keys.count do ( if selTracks[i].keys[j].selected do ( timeTemp = ( (STkeysArr[i][j] - Scalepos) * val + Scalepos ) if kof.checked do (timeTemp = roundtime timeTemp) selTracks[i].keys[j].time = timeTemp ) ) ) ) ScaleTVKeysData.STval = val ) on st entered do ( if trackviews.currentTrackView != undefined do ( makeSelTracksST() ) lbl14.text = ScaleTVKeysData.STval as string st.value = 1.0 ScaleTVKeysData.SVkeysArr = undefined -- so the value is not kept since this is called after changed ) on st buttondown do ( if trackviews.currentTrackView != undefined do ( makeSelTracksST() ) ) on st buttonup do ( lbl14.text = ScaleTVKeysData.STval as string st.value = 1.0 ) on sv changed val do ( if trackviews.currentTrackView != undefined then ( if ScaleTVKeysData.SVkeysArr == undefined do makeSelTracksSV() seltracks = ScaleTVKeysData.seltracks SVkeysArr = ScaleTVKeysData.SVkeysArr local scalePos= sb.value for i in 1 to selTracks.count do ( -- need to compensate for the values returned from tracks extraced via tv. if classof (tv.getparentofselected i) == Euler_XYZ do (scalepos /= (180/pi)) if classof (tv.getparentofselected i) == scaleXYZ do (scalepos /= 100) if classof (selTracks[i]) == bezier_scale do (scalepos /= 100) for j in 1 to selTracks[i].keys.count do ( if selTracks[i].keys[j].selected do ( print ( ( (SVkeysArr[i][j] - Scalepos) * val) + Scalepos ) selTracks[i].keys[j].value = ( ( (SVkeysArr[i][j] - Scalepos) * val) + Scalepos ) ) ) scalePos= sb.value -- reset the value ) ) ScaleTVKeysData.SVval = val ) on sv entered do ( if trackviews.currentTrackView != undefined do ( makeSelTracksSV() ) lb02.text = ScaleTVKeysData.SVval as string sv.value = 1.0 --ScaleTVKeysData.SVkeysArr = undefined -- so the value is not kept since this is called after changed ) on sv buttondown do ( if trackviews.currentTrackView != undefined do ( makeSelTracksSV() ) ) on sv buttonup do ( lb02.text = ScaleTVKeysData.SVval as string sv.value = 1.0 ) ) createDialog ScaleTVKeysArbitrary width:332 height:121 style:#(#style_titlebar, #style_sysmenu, #style_minimizebox) --pos:[900,400] )