// Speedometer // written by jeremy cantor // November 1, 2002 //do the math... global proc getSpeed() { float $numerator = 1; float $denominator = 1; float $back = `intField -q -v howFarBack`; float $ahead = `intField -q -v howFarAhead`; float $howManyFrames = $back + $ahead; float $unitzPerFrame = 0; string $distanceUnit = `optionMenu -q -v distanceMenu`; string $timeUnit = `optionMenu -q -v timeMenu`; string $picked[] = `ls -sl`; if (size($picked) == 0) {text -e -al "left" -l (" SELECTED") speedText; text -e -al "left" -l (" NOTHING") distanceText; return;} if (size($picked) > 1) {text -e -al "left" -l (" OBJECT ONLY") speedText; text -e -al "left" -l (" SELECT ONE") distanceText; return;} int $today = `currentTime -q`; polyCube; string $speedometer[] = `ls -sl -l`; pointConstraint $picked[0] $speedometer[0]; int $isAveraging = `checkBox -q -v frameAveraging`; float $sampleRate = 1; $samples = $howManyFrames/$sampleRate; $samples = $howManyFrames; string $pickedTX = $speedometer[0] + ".tx"; string $pickedTY = $speedometer[0] + ".ty"; string $pickedTZ = $speedometer[0] + ".tz"; if ($isAveraging == 0) { float $Xtrans= `getAttr -t ($today+$ahead) $pickedTX`; float $Xdelta = $Xtrans - `getAttr -t ($today-$back) $pickedTX`; float $Ytrans = `getAttr -t ($today+$ahead) $pickedTY`; float $Ydelta = $Ytrans - `getAttr -t ($today-$back) $pickedTY`; float $Ztrans = `getAttr -t ($today+$ahead) $pickedTZ`; float $Zdelta = $Ztrans - `getAttr -t ($today-$back) $pickedTZ`; float $cubez = (`pow $Xdelta 2`) + (`pow $Ydelta 2`) + (`pow $Zdelta 2`); $unitzPerFrame = `pow $cubez 0.5`; } else { text -e -al "left" -l (" CALCULATING...") distanceText; text -e -al "left" -l (" ...FRAME ") speedText; int $sampleRate = `intField -q -v sampleRate`; float $samples = $howManyFrames/$sampleRate; $samples = `trunc $samples`; float $runningTotal = 0; for ($x = 0; $x<$samples; $x++) { int $currFrame = ($today + $ahead - ($x * $sampleRate)); int $currFrame2 = ($currFrame -1); text -e -al "left" -l (" ...FRAME " + $currFrame) speedText; float $Xtrans= `getAttr -t ($currFrame) $pickedTX`; float $Xdelta = $Xtrans - `getAttr -t ($currFrame2) $pickedTX`; float $Ytrans = `getAttr -t ($currFrame) $pickedTY`; float $Ydelta = $Ytrans - `getAttr -t ($currFrame2) $pickedTY`; float $Ztrans = `getAttr -t ($currFrame) $pickedTZ`; float $Zdelta = $Ztrans - `getAttr -t ($currFrame2) $pickedTZ`; float $cubez = (`pow $Xdelta 2`) + (`pow $Ydelta 2`) + (`pow $Zdelta 2`); float $totalSoFar = `pow $cubez 0.5`; $runningTotal = $runningTotal + $totalSoFar; // if (($today+$ahead-($x*$sampleRate)-1) < ($today-$back)) break; } $unitzPerFrame = $runningTotal * $howManyFrames/$samples; } string $unitz = `currentUnit -q -l`; string $unitzMed = "CM"; string $unitzLong = "Centimeters"; switch ($unitz){ case "mm": $numerator = $numerator/10; $unitzLong = "Millimeters"; $unitzMed = "Mm"; break; case "cm": $numerator = $numerator; $unitzLong = "Centimeters"; $unitzMed = "Cm"; break; case "m": $numerator = $numerator*10; $unitzLong = "Meters"; $unitzMed = "Meters"; break; case "in": $numerator = $numerator*2.54; $unitzLong = "Inches"; $unitzMed = "Inches"; break; case "ft": $numerator = $numerator*2.54*12; $unitzLong = "Feet"; $unitzMed = "Feet"; break; case "yd": $numerator = $numerator*2.54*12*3; $unitzLong = "Yards"; $unitzMed = "Yards"; break;} text -e -l ("CURRENT MAYA UNITS ARE: " + $unitzLong) unitzText; switch ($distanceUnit){ case "Miles": $numerator=$numerator/2.54/12/5280; break; case "Yards": $numerator=$numerator/2.54/12/3; break; case "Feet": $numerator=$numerator/2.54/12; break; case "Inches": $numerator=$numerator/2.54; break; case "Kilometers": $numerator = $numerator/100000; break; case "Meters": $numerator = $numerator/100; break; case "Centimeters": $numerator = $numerator*1; break; case "Millimeters": $numerator = $numerator*10; break;} int $pbSpeed = `optionMenu -q -sl speedMenu`; float $fps; switch ($pbSpeed) { case 1 : $fps = 24; break; case 2 : $fps = 30; break; case 3 : $fps = 12; break; case 4 : $fps = 15;} switch ($timeUnit){ case "Hour": $denominator = $denominator/$fps/60/60; break; case "Minute": $denominator = $denominator/$fps/60; break; case "Second": $denominator = $denominator/$fps; break; case "Frame": $denominator = $denominator*1; break;} float $total = $unitzPerFrame/$howManyFrames*$numerator/$denominator; floatField -e -v $unitzPerFrame -pre 2 distanceField; if ($howManyFrames == 1) text -e -al "left" -l (" " + $unitzMed + " Traveled Over " + $howManyFrames + " Frame") distanceText; else text -e -al "left" -l (" " + $unitzMed + " traveled over " + $howManyFrames + " Frames") distanceText; floatField -e -v $total -pre 2 speedField; text -e -al "left" -l (" " + $distanceUnit + " per " + $timeUnit) speedText; delete $speedometer[0]; select -r $picked; } //the GUI global proc zpeedometer() { if ((`window -ex zpeedometer`) == true) deleteUI zpeedometer; if (`windowPref -q -ex zpeedometer`) {if ((`windowPref -q -w zpeedometer`) != 250) windowPref -e -w 250 zpeedometer; if ((`windowPref -q -h zpeedometer`) != 305) windowPref -e -h 305 zpeedometer;} window -title "Speedometer 11.01.02" -s true zpeedometer; string $unitz = `currentUnit -q -l`; string $unitzMed; string $unitzLong; switch ($unitz){ case "mm": $unitzLong = "Millimeters"; $unitzMed = "Mm"; break; case "cm": $unitzLong = "Centimeters"; $unitzMed = "Cm";break; case "m": $unitzLong = "Meters"; $unitzMed = "Meters";break; case "in": $unitzLong = "Inches"; $unitzMed = "Inches";break; case "ft": $unitzLong = "Feet"; $unitzMed = "Feet";break; case "yd": $unitzLong = "Yards"; $unitzMed = "Yards"; break;} rowColumnLayout -nr 16 -rh 1 5 -rh 2 22 -rh 3 5 -rh 4 44 -rh 5 5 -rh 6 22 -rh 7 5 -rh 8 22 -rh 9 10 -rh 10 30 -rh 11 30 -rh 12 22 -rh 13 5 -rh 14 22 -rh 15 5 -co 2 "left" 12 -co 4 "left" 10 -co 6 "left" 10 -co 8 "left" 10 -co 10 "left" 10 -co 12 "left" 10 -co 14 "left" 10 -co 16 "left" 10; //row 1 button -l "" -vis false; //row 2 text -al "left" -l ("CURRENT MAYA UNITS ARE: " + $unitzLong) unitzText; //row 3 button -l "" -vis false; //row 4 rowColumnLayout -nr 2; rowColumnLayout -nc 3 -cw 1 75 -cw 2 70 -cw 3 60; text -l "Calculate from"; intField -v 1 -min 1 howFarBack; float $back = `intField -q -v howFarBack`; text -l "frames ago" -al "right"; setParent ..; rowColumnLayout -nc 3 -cw 1 65 -cw 2 70 -cw 3 70; text -l "Calculate to"; intField -v 0 -min 0 howFarAhead; text -l "frames ahead" -al "right"; setParent ..; setParent ..; //row 5 button -l "" -vis false; //row 6 checkBox -v 0 -l " Calculate With Frame Averaging" -onc "intField -e -en true sampleRate" -ofc "intField -e -en false sampleRate" frameAveraging; //row 7 button -l "" -vis false; float $back = `intField -q -v howFarBack`; float $ahead = `intField -q -v howFarAhead`; float $howManyFrames = $back + $ahead; //row 8 rowColumnLayout -nc 2 -cw 1 145 -cw 2 40; text -l "Sample Rate (if averaging) -->"; intField -v 1 -min 1 -en false -cc "if (`intField -q -v sampleRate` > (`intField -q -v howFarBack` + `intField -q -v howFarAhead`)) intField -e -v (`intField -q -v howFarBack` + `intField -q -v howFarAhead`) sampleRate" sampleRate; setParent ..; //row 9 button -l "" -vis false; //row 10 rowColumnLayout -nc 3 -cw 1 100 -cw 2 30 -cw 3 120; optionMenu distanceMenu; menuItem -l "Miles"; menuItem -l "Yards"; menuItem -l "Feet"; menuItem -l "Inches"; menuItem -l "Kilometers"; menuItem -l "Meters"; menuItem -l "Centimeters"; menuItem -l "Millimeters"; text -l "per"; optionMenu timeMenu; menuItem -l "Hour"; menuItem -l "Minute"; menuItem -l "Second"; menuItem -l "Frame"; setParent ..; //row 11 rowColumnLayout -nc 2 -cw 1 140 -cw 2 100 -co 1 "left" 10; text "Maya Playback Speed -->"; optionMenu speedMenu; menuItem -l "24 fps"; menuItem -l "30 fps"; menuItem -l "12 fps"; menuItem -l "15 fps"; setParent ..; //row 12 rowColumnLayout -nc 1 -cw 1 205; button -l "Calculate Speed" -c "getSpeed"; setParent ..; //row 13 button -l "" -vis false; string $distanceUnit = `optionMenu -q -v distanceMenu`; string $timeUnit = `optionMenu -q -v timeMenu`; //row 14 rowColumnLayout -nc 2 -cw 1 50 -cw 2 180; floatField -ed false -v 0 -pre 2 distanceField; text -al "left" -l (" " + $unitzMed + " Traveled") distanceText; setParent ..; //row 15 button -l "" -vis false; //row 16 rowColumnLayout -nc 2 -cw 1 80 -cw 2 135; floatField -ed false -v 0 -pre 2 speedField; text -al "left" -l (" " + $distanceUnit + " per " + $timeUnit) speedText; setParent ..; showWindow zpeedometer; } zpeedometer;