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
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
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
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
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
\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
}\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
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
\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
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
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
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
});\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