Save preferred units as user preference
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / RocketScience.java
1 package com.billkuker.rocketry.motorsim;\r
2 \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
7 \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
15 \r
16 import org.jscience.physics.amount.Amount;\r
17 \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
21         static{\r
22                 UnitFormat.getInstance().label(PSI, "psi");\r
23                 UnitFormat.getInstance().label(NEWTON_SECOND, "Ns");\r
24         }\r
25 \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
29         }\r
30         \r
31         public interface Impulse extends Quantity {\r
32                 public static Unit<Impulse> UNIT = NEWTON_SECOND;\r
33         }\r
34 \r
35         public static enum UnitPreference{\r
36                 SI(new Unit[]{\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
41                                 NEWTON_SECOND\r
42                 }),\r
43                 NONSI(new Unit[]{\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
47                                 PSI,\r
48                                 NEWTON_SECOND\r
49                 });\r
50                 \r
51                 private static UnitPreference preference = SI;\r
52 \r
53                 static {\r
54                         Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
55                         String p = prefs.get("PreferedUnits", "SI");\r
56                         preference = UnitPreference.valueOf(p);\r
57                 }\r
58                 \r
59                 public static UnitPreference getUnitPreference(){\r
60                         return preference;\r
61                 }\r
62                 \r
63                 public static void setUnitPreference( final UnitPreference up ){\r
64                         preference = up;\r
65                         Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
66                         prefs.put("PreferedUnits", up.toString());\r
67                 }\r
68                 \r
69                 protected Set<Unit<?>> units = new HashSet<Unit<?>>();\r
70                 \r
71                 UnitPreference( Unit<?> u[] ){\r
72                         for ( Unit<?> uu : u )\r
73                                 units.add(uu);\r
74                 }\r
75                 \r
76                 @SuppressWarnings("unchecked")\r
77                 public <T extends Quantity> Unit<T> getPreferredUnit(Unit<T> u){\r
78                         if ( units.contains(u) )\r
79                                 return u;\r
80                         for( Unit<?> ret : units ){\r
81                                 if ( ret.isCompatible(u) ){\r
82                                         return (Unit<T>) ret;\r
83                                 }\r
84                         }\r
85                         return u;\r
86                 }\r
87         }\r
88 \r
89         public static <T extends Quantity> String approx(Amount<T> a) {\r
90                 if (a == null)\r
91                         return "NULL";\r
92                 Unit<T> u = RocketScience.UnitPreference.preference.getPreferredUnit(a\r
93                                 .getUnit());\r
94                 double d = a.doubleValue(u);\r
95 \r
96                 DecimalFormat df;\r
97 \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
102                 } else {\r
103                         df = new DecimalFormat("#");\r
104                 }\r
105 \r
106                 return df.format(d) + " " + u.toString();\r
107         }\r
108 \r
109 }\r