macroscript SpeedoMeter category:"Bobo_s Tools" tooltip:"SpeedoMeter Floater"
(
---------------------------------------
-- SPEEDOMETER 
-- Version 0.2
-- by Borislav Petrov
-- http://gfxcentral.com/bobo/
-- Started: 8/16/99
-- Edited : 11/03/99
---------------------------------------

global speed_obj = undefined
global speed_floater 

rollout speed_roll "SpeedoMeter"
(
pickbutton pick_object "Pick Object to Monitor" width:140 align:#left across:2 offset:[-7,0] tooltip:"Lock a Single Object to Monitor Speed"
checkbutton use_selection "S" width:20 align:#right offset:[7,0] highlightcolor:(color 200 255 200) tooltip:"Monitor Selection Center Speed"



edittext speed_display_units text:"" fieldwidth:64 across:2 align:#left offset:[-10,0]
label speed_units_label01 "Units/Second" align:#left offset:[-12,0]
edittext speed_display_user text:"" fieldwidth:64 across:2 align:#left offset:[-10,0]
label speed_units_label02 "Units/Frame" align:#left offset:[-12,0]
edittext speed_display_knots text:"" fieldwidth:64 across:2 align:#left offset:[-10,0]
label speed_units_label03 "Knots" align:#left offset:[-12,0]
checkbutton calc_average "Calculate Average Speed" width:160 highlightcolor:(color 230 200 255) tooltip:"Toggle Average Speed for Active Animation Segment"
group "User Speed Units"
(
label speed_units_label04 "1 Generic Unit =" align:#left offset:[-6,0] across:2
dropdownlist units_mapping items:#("Meter","Kilometer","Centimeter","Millimeter","Mile","Foot","Inch") width:80 align:#left 

dropdownlist units_value "Distance Units" items:#("Units","Meters","Kilometers","Centimeters","Millimeters","Miles","Feet","Inches") width:80 across:2 align:#left offset:[-6,0]
dropdownlist time_value "Time Units" items:#("Frame","Second","Minute","Hour") width:80 align:#right offset:[8,0]
)

group "File Output"
(
button output_to_file "Output To .SPD File" width:150 enabled:false
spinner from_time "From:" range:[animationrange.start,animationrange.end,animationrange.start] fieldwidth:40 across:2 align:#left type:#integer
spinner to_time "To:" range:[animationrange.start,animationrange.end,animationrange.end] fieldwidth:40 align:#right type:#integer

)



fn save_ini =
(
out_file = createfile (scriptspath+"\\speedometer.ini")
format "%\n" "SpeedoMeter Preferences" to:out_file 
format "%\n" "Version 0.1" to:out_file 
format "%\n" (units_mapping.selection as string) to:out_file 
format "%\n" (units_value.selection as string) to:out_file 
format "%\n" (time_value.selection as string) to:out_file 
format "%\n" (speed_floater.pos as string) to:out_file 
close out_file 
)


fn calculate_speed =
(

try
(

if speed_roll.calc_average.checked then 
	(
	loop_start = animationrange.start
	loop_end = animationrange.end
	)
	else
	(
	loop_start = SliderTime
	loop_end = SliderTime
	)



user_speed_sum = 0
ups_speed_sum = 0
loops_counter = 0
knots_speed_sum = 0

for t = loop_start to loop_end do
(
loops_counter += 1
if speed_roll.use_selection.checked then 
(
pos_local_1 = at time t selection.center
pos_local_2 = at time (t-1f) selection.center
)
else
(
pos_local_1 = at time t speed_obj.pos
pos_local_2 = at time (t-1f) speed_obj.pos
)
local_dist = pos_local_2-pos_local_1
dist = sqrt ( (local_dist.x^2)+(local_dist.y^2)+(local_dist.z^2) )
speed_ups = dist * FrameRate as float
ups_speed_sum += speed_ups 

case speed_roll.units_value.selection of
(
1: (
	user_dist = dist
	case speed_roll.units_mapping.selection of
		(
		1: knot_km_part = user_dist / 1000.0 
		2: knot_km_part = user_dist 
		3: knot_km_part = user_dist / 100000.0 
		4: knot_km_part = user_dist / 1000000.0 
		5: knot_km_part = user_dist * 1.609
		6: knot_km_part = user_dist * 0.000305
		7: knot_km_part = user_dist * 0.0000254 	
		)
	)

2:	(--meters
	case speed_roll.units_mapping.selection of
		(
		1: user_dist = dist
		2: user_dist = dist * 1000.0
		3: user_dist = dist / 100.0
		4: user_dist = dist / 1000.0
		5: user_dist = dist * 1609.0
		6: user_dist = dist * 0.305
		7: user_dist = dist * 0.254
		)
		knot_km_part = user_dist / 1000.0 	
	)
	
3:	(--km
	case speed_roll.units_mapping.selection of
		(
		1: user_dist = dist / 1000.0
		2: user_dist = dist
		3: user_dist = dist / 100000.0
		4: user_dist = dist / 1000000.0
		5: user_dist = dist * 1.609
		6: user_dist = dist * 0.000305
		7: user_dist = dist * 0.000254
		)
	knot_km_part = user_dist	
	)
	
4:	(--cm
	case speed_roll.units_mapping.selection of
		(
		1: user_dist = dist * 100.0
		2: user_dist = dist * 100000.0
		3: user_dist = dist 
		4: user_dist = dist / 10.0
		5: user_dist = dist * 160900.0
		6: user_dist = dist * 30.5
		7: user_dist = dist * 2.54
		)
	knot_km_part = user_dist / 10000.0 	
	)
	
5:	(--mm
	case speed_roll.units_mapping.selection of
		(
		1: user_dist = dist * 1000.0
		2: user_dist = dist * 1000000.0
		3: user_dist = dist * 10.0
		4: user_dist = dist 
		5: user_dist = dist * 1609000.0
		6: user_dist = dist * 305.0
		7: user_dist = dist * 25.4
		)
	knot_km_part = user_dist / 100000.0 	
	)	
	
6:	(--miles
	case speed_roll.units_mapping.selection of
		(
		1: user_dist = dist / 1609.0
		2: user_dist = dist / 1.609
		3: user_dist = dist / 160900.0
		4: user_dist = dist / 1609000.0
		5: user_dist = dist 
		6: user_dist = dist / 5280.0
		7: user_dist = dist / 63360.0
		)
	knot_km_part = user_dist * 1.609 	
	)
	
7:	(--feet
	case speed_roll.units_mapping.selection of
		(
		1: user_dist = dist / 0.305
		2: user_dist = dist / 0.000305
		3: user_dist = dist / 0.00305
		4: user_dist = dist / 0.000305
		5: user_dist = dist * 5280.0 
		6: user_dist = dist 
		7: user_dist = dist / 12.0
		)
	knot_km_part = user_dist * 0.000305
	)	
	
8:	(--inches
	case speed_roll.units_mapping.selection of
		(
		1: user_dist = dist / 0.0254
		2: user_dist = dist / 0.0000254
		3: user_dist = dist / 2.54
		4: user_dist = dist / 0.254
		5: user_dist = dist * 63360.0 
		6: user_dist = dist * 12.0
		7: user_dist = dist 
		)
	knot_km_part = user_dist * 0.0000254 	
	)	
)

case speed_roll.time_value.selection of
( 
1: user_time = 1
2: user_time = FrameRate as float
3: user_time = FrameRate as float * 60
4: user_time = FrameRate as float * 3600
)

speed_user = user_dist * user_time
speed_in_knots = knot_km_part * user_time --(km/time)

case speed_roll.time_value.selection of
( 
1: speed_in_knots *=  (3600.0* FrameRate)
2: speed_in_knots *=  3600
3: speed_in_knots *=  60
4: () 
)

speed_in_knots /= 1.8532
knots_speed_sum += speed_in_knots 
user_speed_sum += speed_user 
)--end t loop

if loops_counter > 1 then loops_counter -= 1
speed_roll.speed_display_units.text = (ups_speed_sum / loops_counter) as string
speed_roll.speed_display_user.text = (user_speed_sum / loops_counter) as string
speed_roll.speed_display_knots.text = (knots_speed_sum / loops_counter) as string


)
catch ()

)


on use_selection changed state do 
(
pick_object.enabled = not state
unregisterTimeCallback calculate_speed 
registerTimeCallback calculate_speed 
SliderTime += 0f
if state then output_to_file.enabled = true
if not state and speed_obj == undefined then output_to_file.enabled = false
)

on calc_average changed state do
(
SliderTime += 0f
)

on pick_object picked obj do
(
speed_obj = obj
pick_object.text = obj.name
unregisterTimeCallback calculate_speed 
registerTimeCallback calculate_speed 
SliderTime += 0f
output_to_file.enabled = true
)

on units_value selected itm do
(
speed_units_label02.text = units_value.items[itm]+"/"+time_value.items[time_value.selection]
SliderTime += 0f
save_ini ()
)

on time_value selected itm do
(
speed_units_label02.text = units_value.items[units_value.selection]+"/"+time_value.items[itm]
SliderTime += 0f
save_ini ()
)

on speed_roll moved ps do save_ini()

on units_mapping selected itm do
(
SliderTime += 0f
save_ini()
)

on output_to_file pressed do
(
mfname = (getfilenamefile MaxFileName)
if mfname == "" then mfname = "Untitled"
f_name = mfname + ".SPD"
out_file = getSaveFileName caption:"Save .SPD File" types:"Speedometer (*.SPD)|*.spd|" filename:f_name
if out_file != undefined then
		(
		old_state = speed_roll.calc_average.checked 
		speed_roll.calc_average.checked = false
		
		if from_time.value > to_time.value then
		(
		ste = to_time.value
		stf = from_time.value
		sts = -1
		)
		else
		(
		stf = from_time.value
		ste = to_time.value
		sts = 1
		)

		output_file = createfile out_file 
		format "%\n" "===========================================================================" to:output_file
		format "%\n" "SPEEDOMETER OUTPUT FILE" to:output_file
		format "%\n" "===========================================================================" to:output_file
		
		format "%\n" "MAX File Name:" mfname to:output_file
		format "\t%\n" mfname to:output_file
		
		if use_selection.state then
		(
		format "%\n" "SELECTION:" to:output_file
		for o in (selection as array) do 
			(
			format "\t% \n" o.name to:output_file
			)
		)
		else
		(
		format "%\n" "OBJECT:" to:output_file
		format "\t%\n" (speed_obj.name) to:output_file
		)
		format "%\n" "UNITS MAPPING:" to:output_file
		format "\t1 Generic Unit = 1 %\n" (units_mapping.items[units_mapping.selection]) to:output_file
		
		format "%\n" "===========================================================================" to:output_file
		
		
		for t = stf to ste by sts do
		(
		sliderTime = t
		calculate_speed()
		format "%:\t\t% Units/Second \t % % \t% Knots\n" t speed_display_units.text speed_display_user.text speed_units_label02.text speed_display_knots.text to:output_file
		)--end t loop
		
		
		speed_roll.calc_average.checked = true
		calculate_speed()
		format "%\n" "===========================================================================" to:output_file
		format "%\n" "AVERAGE SPEED:" to:output_file
		format "\t\t% Units/Second \t % % \t% Knots\n" speed_display_units.text speed_display_user.text speed_units_label02.text speed_display_knots.text to:output_file
		
		speed_roll.calc_average.checked = old_state 
		
		close output_file 
		edit out_file
		)--end if

		
)

)--end rollout

fn load_ini =
(
try
(
in_file = openfile (scriptspath+"\\speedometer.ini")
str = readline in_file
str = readline in_file
speed_roll.units_mapping.selection = execute (readline in_file)
speed_roll.units_value.selection = execute (readline in_file)
speed_roll.time_value.selection = execute (readline in_file)
speed_floater.pos = execute (readline in_file)
close in_file 
)
catch
()
)




if speed_floater != undefined then closerolloutfloater speed_floater 
speed_floater = newrolloutfloater "SpeedoMeter v0.2" 200 350 100 100
addrollout speed_roll speed_floater 
load_ini ()
speed_roll.speed_units_label02.text = speed_roll.units_value.items[speed_roll.units_value.selection]+"/"+speed_roll.time_value.items[speed_roll.time_value.selection]

)--end script