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