1 package com.billkuker.rocketry.motorsim;
\r
3 import java.text.DecimalFormat;
\r
4 import java.util.HashSet;
\r
5 import java.util.Set;
\r
6 import java.util.prefs.Preferences;
\r
8 import javax.measure.quantity.Pressure;
\r
9 import javax.measure.quantity.Quantity;
\r
10 import javax.measure.unit.NonSI;
\r
11 import javax.measure.unit.ProductUnit;
\r
12 import javax.measure.unit.SI;
\r
13 import javax.measure.unit.Unit;
\r
14 import javax.measure.unit.UnitFormat;
\r
16 import org.jscience.physics.amount.Amount;
\r
18 public class RocketScience {
\r
19 public static Unit<Pressure> PSI = new ProductUnit<Pressure>(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)));
\r
20 public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));
\r
22 UnitFormat.getInstance().label(PSI, "psi");
\r
23 UnitFormat.getInstance().label(NEWTON_SECOND, "Ns");
\r
26 public interface MolarWeight extends Quantity {
\r
27 public static final Unit<MolarWeight> UNIT = new ProductUnit<MolarWeight>(
\r
28 SI.KILOGRAM.divide(SI.MOLE));
\r
31 public interface Impulse extends Quantity {
\r
32 public static Unit<Impulse> UNIT = NEWTON_SECOND;
\r
35 public static enum UnitPreference{
\r
37 javax.measure.unit.SI.MILLIMETER,
\r
38 javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND),
\r
39 javax.measure.unit.SI.NEWTON,
\r
40 javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL),
\r
44 javax.measure.unit.NonSI.INCH,
\r
45 javax.measure.unit.NonSI.POUND_FORCE,
\r
46 javax.measure.unit.NonSI.INCH.divide(javax.measure.unit.SI.SECOND),
\r
51 private static UnitPreference preference = SI;
\r
54 Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);
\r
55 String p = prefs.get("PreferedUnits", "SI");
\r
56 preference = UnitPreference.valueOf(p);
\r
59 public static UnitPreference getUnitPreference(){
\r
63 public static void setUnitPreference( final UnitPreference up ){
\r
65 Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);
\r
66 prefs.put("PreferedUnits", up.toString());
\r
69 protected Set<Unit<?>> units = new HashSet<Unit<?>>();
\r
71 UnitPreference( Unit<?> u[] ){
\r
72 for ( Unit<?> uu : u )
\r
76 @SuppressWarnings("unchecked")
\r
77 public <T extends Quantity> Unit<T> getPreferredUnit(Unit<T> u){
\r
78 if ( units.contains(u) )
\r
80 for( Unit<?> ret : units ){
\r
81 if ( ret.isCompatible(u) ){
\r
82 return (Unit<T>) ret;
\r
89 public static <T extends Quantity> String approx(Amount<T> a) {
\r
92 Unit<T> u = RocketScience.UnitPreference.preference.getPreferredUnit(a
\r
94 double d = a.doubleValue(u);
\r
98 if (Math.abs(d) < 10.0) {
\r
99 df = new DecimalFormat("#.##");
\r
100 } else if (Math.abs(d) < 100.0) {
\r
101 df = new DecimalFormat("#.#");
\r
103 df = new DecimalFormat("#");
\r
106 return df.format(d) + " " + u.toString();
\r