Moved some units into RocketScience, added unit preferences
authorBill Kuker <bkuker@billkuker.com>
Fri, 17 Apr 2009 19:08:34 +0000 (19:08 +0000)
committerBill Kuker <bkuker@billkuker.com>
Fri, 17 Apr 2009 19:08:34 +0000 (19:08 +0000)
MotorSim-0.1.jar [new file with mode: 0644]
src/com/billkuker/rocketry/motorsim/RocketScience.java
src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java
src/com/billkuker/rocketry/motorsim/visual/BurnPanel.java
src/com/billkuker/rocketry/motorsim/visual/Chart.java
src/com/billkuker/rocketry/motorsim/visual/CrappyEditor.java

diff --git a/MotorSim-0.1.jar b/MotorSim-0.1.jar
new file mode 100644 (file)
index 0000000..0dca678
Binary files /dev/null and b/MotorSim-0.1.jar differ
index e52c049572777ce0c7c2d7e041fa48e61d7c6ff2..aed135bfd3b056f9a5349bac5c6d31b597f8dc9e 100644 (file)
@@ -1,12 +1,23 @@
 package com.billkuker.rocketry.motorsim;\r
 \r
+import java.util.HashSet;\r
+import java.util.Set;\r
+\r
+import javax.measure.quantity.Pressure;\r
 import javax.measure.quantity.Quantity;\r
+import javax.measure.unit.NonSI;\r
 import javax.measure.unit.ProductUnit;\r
 import javax.measure.unit.SI;\r
 import javax.measure.unit.Unit;\r
+import javax.measure.unit.UnitFormat;\r
 \r
 public class RocketScience {\r
+       public static Unit<Pressure> PSI = new ProductUnit<Pressure>(NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)));\r
        public static Unit<Impulse> NEWTON_SECOND = new ProductUnit<Impulse>(SI.NEWTON.times(SI.SECOND));\r
+       static{\r
+               UnitFormat.getInstance().label(PSI, "psi");\r
+               UnitFormat.getInstance().label(NEWTON_SECOND, "Ns");\r
+       }\r
 \r
        public interface MolarWeight extends Quantity {\r
                public static final Unit<MolarWeight> UNIT = new ProductUnit<MolarWeight>(\r
@@ -17,5 +28,39 @@ public class RocketScience {
                public static Unit<Impulse> UNIT = NEWTON_SECOND;\r
        }\r
 \r
+       public static enum UnitPreference{\r
+               SI(new Unit[]{\r
+                               javax.measure.unit.SI.MILLIMETER,\r
+                               javax.measure.unit.SI.NEWTON,\r
+                               javax.measure.unit.SI.MEGA(javax.measure.unit.SI.PASCAL),\r
+                               NEWTON_SECOND\r
+               }),\r
+               NonSI(new Unit[]{\r
+                               javax.measure.unit.NonSI.INCH,\r
+                               javax.measure.unit.NonSI.POUND_FORCE,\r
+                               PSI,\r
+                               NEWTON_SECOND\r
+               });\r
+               \r
+               public static UnitPreference preference = NonSI;\r
+               \r
+               protected Set<Unit<?>> units = new HashSet<Unit<?>>();\r
+               \r
+               UnitPreference( Unit u[] ){\r
+                       for ( Unit uu : u )\r
+                               units.add(uu);\r
+               }\r
+               \r
+               public Unit getPreferredUnit(Unit u){\r
+                       if ( units.contains(u) )\r
+                               return u;\r
+                       for( Unit ret : units ){\r
+                               if ( ret.isCompatible(u) ){\r
+                                       return ret;\r
+                               }\r
+                       }\r
+                       return u;\r
+               }\r
+       }\r
 \r
 }\r
index be87e87811af62085a00ea99df84850efb942900..f8e1ab691143ca466ea26b6ca22d83c442ea190e 100644 (file)
@@ -10,6 +10,7 @@ import javax.measure.unit.Unit;
 import org.jscience.physics.amount.Amount;\r
 \r
 import com.billkuker.rocketry.motorsim.Fuel;\r
+import com.billkuker.rocketry.motorsim.RocketScience;\r
 \r
 public abstract class SaintRobertFuel implements Fuel {\r
        \r
@@ -19,7 +20,7 @@ public abstract class SaintRobertFuel implements Fuel {
                                SI.MEGA(SI.PASCAL).asType(Pressure.class)),\r
                English(\r
                                NonSI.INCH.divide(SI.SECOND).asType(Velocity.class),\r
-                               NonSI.POUND_FORCE.divide(NonSI.INCH.pow(2)).asType(Pressure.class))\r
+                               RocketScience.PSI)\r
                ;\r
                \r
                private final Unit<Velocity> v;\r
index 1bf938c9e5790405daa5b6d1b18ff8344cfe7498..75a3b78b6853289707d6d31d608920180f5c55c9 100644 (file)
@@ -11,6 +11,7 @@ import javax.measure.quantity.Pressure;
 import javax.measure.quantity.Velocity;\r
 import javax.measure.unit.NonSI;\r
 import javax.measure.unit.SI;\r
+import javax.measure.unit.Unit;\r
 import javax.swing.JFrame;\r
 import javax.swing.JLabel;\r
 import javax.swing.JPanel;\r
@@ -49,7 +50,7 @@ public class BurnPanel extends JPanel {
                        \r
                        thrust = new Chart<Duration, Force>(\r
                                        SI.SECOND,\r
-                                       NonSI.POUND_FORCE,//SI.NEWTON,\r
+                                       SI.NEWTON,\r
                                        b,\r
                                        "thrust");\r
                        thrust.setDomain(burn.getData().keySet());\r
@@ -138,9 +139,10 @@ public class BurnPanel extends JPanel {
        }\r
        \r
        private String approx(Amount a){\r
-               double d = a.doubleValue(a.getUnit());\r
+               Unit u = RocketScience.UnitPreference.preference.getPreferredUnit(a.getUnit());\r
+               double d = a.doubleValue(u);\r
                long i = Math.round(d);\r
-               return i + " " + a.getUnit().toString();\r
+               return i + " " + u.toString();\r
        }\r
        \r
        private class SL extends JSlider implements ChangeListener{\r
index a8cddd06b3a2259a99278206e73c349792c44fd2..f3450214f8966ea6e45327f36301cac2f18d54ec 100644 (file)
@@ -24,6 +24,7 @@ import org.jfree.data.xy.XYSeries;
 import org.jfree.data.xy.XYSeriesCollection;\r
 import org.jscience.physics.amount.Amount;\r
 \r
+import com.billkuker.rocketry.motorsim.RocketScience;\r
 import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
 \r
 public class Chart<X extends Quantity, Y extends Quantity> extends JPanel  {\r
@@ -92,12 +93,13 @@ public class Chart<X extends Quantity, Y extends Quantity> extends JPanel  {
 \r
                dataset.addSeries(series);\r
 \r
-               this.xUnit = xUnit;\r
-               this.yUnit = yUnit;\r
+               this.xUnit = RocketScience.UnitPreference.preference.getPreferredUnit(xUnit);\r
+               this.yUnit = RocketScience.UnitPreference.preference.getPreferredUnit(yUnit);\r
+               \r
                chart = ChartFactory.createXYLineChart(\r
                                method.substring(0,1).toUpperCase() + method.substring(1), // Title\r
-                               xUnit.toString(), // x-axis Label\r
-                               yUnit.toString(), // y-axis Label\r
+                               this.xUnit.toString(), // x-axis Label\r
+                               this.yUnit.toString(), // y-axis Label\r
                                dataset,\r
                                PlotOrientation.VERTICAL, // Plot Orientation\r
                                false, // Show Legend\r
index ba9b40545630dd80a8538b8062d8e620fe84cce2..c075172760302e68877fef6f7e29aaab2b097433 100644 (file)
@@ -8,9 +8,11 @@ import java.beans.PropertyVetoException;
 import java.io.IOException;\r
 \r
 import javax.measure.unit.SI;\r
+import javax.swing.ButtonGroup;\r
 import javax.swing.JButton;\r
 import javax.swing.JFrame;\r
 import javax.swing.JPanel;\r
+import javax.swing.JRadioButton;\r
 import javax.swing.JTabbedPane;\r
 import javax.swing.JTextArea;\r
 import javax.swing.UIManager;\r
@@ -25,6 +27,8 @@ import com.billkuker.rocketry.motorsim.Burn;
 import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;\r
 import com.billkuker.rocketry.motorsim.CylindricalChamber;\r
 import com.billkuker.rocketry.motorsim.Motor;\r
+import com.billkuker.rocketry.motorsim.RocketScience;\r
+import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;\r
 import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
 import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
 import com.billkuker.rocketry.motorsim.grain.MultiGrain;\r
@@ -64,6 +68,7 @@ public class CrappyEditor extends JFrame {
                editor.setLayout(new BorderLayout());\r
                editor.add(text, BorderLayout.CENTER);\r
                JPanel buttons = new JPanel(new FlowLayout());\r
+               \r
                buttons.add(new JButton("Burn!"){\r
                        {\r
                                addActionListener(new ActionListener(){\r
@@ -73,7 +78,27 @@ public class CrappyEditor extends JFrame {
                                });\r
                        }\r
                });\r
-                       \r
+               \r
+               {\r
+                       JRadioButton s, n;\r
+                       buttons.add(s = new JRadioButton("SI"));\r
+                       buttons.add(n = new JRadioButton("NonSI"));\r
+                       ButtonGroup g = new ButtonGroup();\r
+                       g.add(s);\r
+                       g.add(n);\r
+                       s.setSelected(true);\r
+                       s.addActionListener(new ActionListener(){\r
+                               public void actionPerformed(ActionEvent arg0) {\r
+                                       UnitPreference.preference = UnitPreference.SI;  \r
+                               }\r
+                       });\r
+                       n.addActionListener(new ActionListener(){\r
+                               public void actionPerformed(ActionEvent arg0) {\r
+                                       UnitPreference.preference = UnitPreference.NonSI;       \r
+                               }\r
+                       });\r
+               }\r
+               \r
                editor.add(buttons, BorderLayout.SOUTH);\r
                \r
                tabs.addTab("Edit", editor);\r