Consolidating some to String methods in RocketScieence
[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.text.NumberFormat;\r
5 import java.util.HashSet;\r
6 import java.util.Set;\r
7 import java.util.prefs.Preferences;\r
8 \r
9 import javax.measure.quantity.Pressure;\r
10 import javax.measure.quantity.Quantity;\r
11 import javax.measure.unit.NonSI;\r
12 import javax.measure.unit.ProductUnit;\r
13 import javax.measure.unit.SI;\r
14 import javax.measure.unit.Unit;\r
15 import javax.measure.unit.UnitFormat;\r
16 \r
17 import org.jscience.physics.amount.Amount;\r
18 \r
19 public class RocketScience {\r
20         public static Unit<Pressure> PSI = new ProductUnit<Pressure>(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)));\r
21         public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));\r
22         static{\r
23                 UnitFormat.getInstance().label(PSI, "psi");\r
24                 UnitFormat.getInstance().label(NEWTON_SECOND, "Ns");\r
25         }\r
26 \r
27         public interface MolarWeight extends Quantity {\r
28                 public static final Unit<MolarWeight> UNIT = new ProductUnit<MolarWeight>(\r
29                                 SI.KILOGRAM.divide(SI.MOLE));\r
30         }\r
31         \r
32         public interface Impulse extends Quantity {\r
33                 public static Unit<Impulse> UNIT = NEWTON_SECOND;\r
34         }\r
35 \r
36         public static enum UnitPreference{\r
37                 SI(new Unit[]{\r
38                                 javax.measure.unit.SI.MILLIMETER,\r
39                                 javax.measure.unit.SI.MILLIMETER.divide(javax.measure.unit.SI.SECOND),\r
40                                 javax.measure.unit.SI.NEWTON,\r
41                                 javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL),\r
42                                 NEWTON_SECOND\r
43                 }),\r
44                 NONSI(new Unit[]{\r
45                                 javax.measure.unit.NonSI.INCH,\r
46                                 javax.measure.unit.NonSI.POUND_FORCE,\r
47                                 javax.measure.unit.NonSI.INCH.divide(javax.measure.unit.SI.SECOND),\r
48                                 PSI,\r
49                                 NEWTON_SECOND\r
50                 });\r
51                 \r
52                 private static UnitPreference preference = SI;\r
53 \r
54                 static {\r
55                         Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
56                         String p = prefs.get("PreferedUnits", "SI");\r
57                         preference = UnitPreference.valueOf(p);\r
58                 }\r
59                 \r
60                 public static UnitPreference getUnitPreference(){\r
61                         return preference;\r
62                 }\r
63                 \r
64                 public static void setUnitPreference( final UnitPreference up ){\r
65                         preference = up;\r
66                         Preferences prefs = Preferences.userNodeForPackage(RocketScience.class);\r
67                         prefs.put("PreferedUnits", up.toString());\r
68                 }\r
69                 \r
70                 protected Set<Unit<?>> units = new HashSet<Unit<?>>();\r
71                 \r
72                 UnitPreference( Unit<?> u[] ){\r
73                         for ( Unit<?> uu : u )\r
74                                 units.add(uu);\r
75                 }\r
76                 \r
77                 @SuppressWarnings("unchecked")\r
78                 public <T extends Quantity> Unit<T> getPreferredUnit(Unit<T> u){\r
79                         if ( units.contains(u) )\r
80                                 return u;\r
81                         for( Unit<?> ret : units ){\r
82                                 if ( ret.isCompatible(u) ){\r
83                                         return (Unit<T>) ret;\r
84                                 }\r
85                         }\r
86                         return u;\r
87                 }\r
88         }\r
89 \r
90         public static <T extends Quantity> String toString(Amount<T> a) {\r
91                 final NumberFormat nf = new DecimalFormat("##########.###");\r
92                 return nf.format(a.doubleValue(a.getUnit())) + " " + a.getUnit();\r
93         }\r
94         \r
95         public static <T extends Quantity> String ammountToRoundedString(Amount<T> a) {\r
96                 if (a == null)\r
97                         return "NULL";\r
98                 Unit<T> u = RocketScience.UnitPreference.preference.getPreferredUnit(a\r
99                                 .getUnit());\r
100                 double d = a.doubleValue(u);\r
101 \r
102                 DecimalFormat df;\r
103 \r
104                 if (Math.abs(d) < 10.0) {\r
105                         df = new DecimalFormat("#.##");\r
106                 } else if (Math.abs(d) < 100.0) {\r
107                         df = new DecimalFormat("#.#");\r
108                 } else {\r
109                         df = new DecimalFormat("#");\r
110                 }\r
111 \r
112                 return df.format(d) + " " + u.toString();\r
113         }\r
114 \r
115 }\r