--- /dev/null
+package com.billkuker.rocketry.motorsim.fuel;\r
+\r
+import java.awt.Component;\r
+\r
+import javax.measure.quantity.Pressure;\r
+import javax.measure.quantity.Velocity;\r
+import javax.measure.unit.SI;\r
+import javax.swing.JSplitPane;\r
+import javax.swing.SwingUtilities;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.Fuel;\r
+import com.billkuker.rocketry.motorsim.visual.Chart;\r
+import com.billkuker.rocketry.motorsim.visual.Editor;\r
+\r
+public abstract class AbstractFuelEditor extends JSplitPane {\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ private final JSplitPane editParent;\r
+ private final JSplitPane editTop;\r
+ private final Fuel f;\r
+ private Chart<Pressure, Velocity> burnRate;\r
+ \r
+ public AbstractFuelEditor(Fuel f){\r
+ super(HORIZONTAL_SPLIT);\r
+ this.f = f;\r
+ \r
+ editTop = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
+ editTop.setTopComponent(new Editor(f));\r
+ editTop.setBottomComponent(new Editor(f.getCombustionProduct()));\r
+ \r
+ editParent = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
+ setLeftComponent(editParent);\r
+ editParent.setTopComponent(editTop);\r
+ editParent.setBottomComponent(getBurnrateEditComponent());\r
+ \r
+ setResizeWeight(0);\r
+ setDividerLocation(.3);\r
+ editParent.setDividerLocation(.5);\r
+ editTop.setDividerLocation(.5);\r
+ editParent.resetToPreferredSizes();\r
+ revalidate();\r
+\r
+ update();\r
+ }\r
+ \r
+ protected abstract Component getBurnrateEditComponent();\r
+ \r
+ public Fuel getFuel(){\r
+ return f;\r
+ }\r
+ \r
+\r
+\r
+ protected void update() {\r
+ SwingUtilities.invokeLater(new Runnable() {\r
+\r
+ @Override\r
+ public void run() {\r
+ editTop.setTopComponent(new Editor(f));\r
+ editTop.setBottomComponent(new Editor(f.getCombustionProduct()));\r
+ if (burnRate != null)\r
+ AbstractFuelEditor.this.remove(burnRate);\r
+ try {\r
+ burnRate = new Chart<Pressure, Velocity>(\r
+ SI.MEGA(SI.PASCAL), SI.MILLIMETER.divide(SI.SECOND)\r
+ .asType(Velocity.class), f, "burnRate");\r
+ } catch (NoSuchMethodException e) {\r
+ throw new Error(e);\r
+ }\r
+ burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf(\r
+ 0, SI.MEGA(SI.PASCAL)), Amount.valueOf(11, SI\r
+ .MEGA(SI.PASCAL)), 50));\r
+ AbstractFuelEditor.this.setRightComponent(burnRate);\r
+ AbstractFuelEditor.this.revalidate();\r
+ }\r
+ });\r
+ }\r
+ \r
+}\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.fuel;\r
+\r
+import java.awt.Frame;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+\r
+import javax.swing.JFrame;\r
+import javax.swing.JMenuBar;\r
+\r
+import com.billkuker.rocketry.motorsim.Fuel;\r
+import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseLinearFuel;\r
+import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseSaintRobertFuel;\r
+import com.billkuker.rocketry.motorsim.io.MotorIO;\r
+import com.billkuker.rocketry.motorsim.visual.MultiObjectEditor;\r
+\r
+public class FuelsEditor extends MultiObjectEditor<Fuel, AbstractFuelEditor> {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public FuelsEditor(Frame frame) {\r
+ super(frame, "Fuel");\r
+ addCreator(new ObjectCreator() {\r
+ @Override\r
+ public Fuel newObject() {\r
+ return new EditablePiecewiseLinearFuel();\r
+ }\r
+\r
+ @Override\r
+ public String getName() {\r
+ return "Linear Fuel";\r
+ }\r
+ });\r
+ addCreator(new ObjectCreator() {\r
+ @Override\r
+ public Fuel newObject() {\r
+ return new EditablePiecewiseSaintRobertFuel();\r
+ }\r
+\r
+ @Override\r
+ public String getName() {\r
+ return "Saint Robert Fuel";\r
+ }\r
+ });\r
+ }\r
+\r
+ @Override\r
+ public AbstractFuelEditor createEditor(Fuel o) {\r
+ if ( o instanceof EditablePiecewiseLinearFuel ){\r
+ return new LinearFuelEditor((EditablePiecewiseLinearFuel)o);\r
+ } else if ( o instanceof EditablePiecewiseSaintRobertFuel ){\r
+ return new SRFuelEditor((EditablePiecewiseSaintRobertFuel)o);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public Fuel newObject() {\r
+ return new EditablePiecewiseLinearFuel();\r
+ }\r
+\r
+ @Override\r
+ protected Fuel loadFromFile(File f) throws IOException {\r
+ Fuel fuel = MotorIO.readFuel(new FileInputStream(f));\r
+ return fuel;\r
+ }\r
+\r
+ @Override\r
+ protected void saveToFile(Fuel o, File f) throws IOException {\r
+ MotorIO.writeFuel(o, new FileOutputStream(f));\r
+ }\r
+ \r
+ @SuppressWarnings("deprecation")\r
+ public static void main(String args[]){\r
+ JFrame f = new JFrame();\r
+ f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
+ FuelsEditor fe;\r
+ f.add(fe = new FuelsEditor(f));\r
+ JMenuBar b;\r
+ f.setJMenuBar(b = new JMenuBar());\r
+ b.add(fe.getMenu());\r
+ f.setSize(1024, 768);\r
+ f.show();\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.fuel;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.measure.quantity.Pressure;
+import javax.measure.quantity.Velocity;
+import javax.measure.unit.SI;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.table.AbstractTableModel;
+
+import org.jscience.physics.amount.Amount;
+
+import com.billkuker.rocketry.motorsim.RocketScience;
+import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseLinearFuel;
+
+public class LinearFuelEditor extends AbstractFuelEditor {
+ private static final long serialVersionUID = 1L;
+
+ private class Entry implements Comparable<Entry> {
+ Amount<Pressure> p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI));
+ Amount<Velocity> v = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(SI.METERS_PER_SECOND));
+
+ @Override
+ public int compareTo(Entry o) {
+ return p.compareTo(o.p);
+ }
+ }
+
+ private class TM extends AbstractTableModel {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public int getColumnCount() {
+ return 2;
+ }
+
+ @Override
+ public int getRowCount() {
+ return entries.size();
+ }
+
+ @Override
+ public String getColumnName(int col) {
+ switch (col) {
+ case 0:
+ return "Pressure";
+ case 1:
+ return "Burn Rate";
+ }
+ return null;
+ }
+
+ @Override
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ Entry e = entries.get(rowIndex);
+ switch (columnIndex) {
+ case 0:
+ return RocketScience.ammountToString(e.p);
+ case 1:
+ return RocketScience.ammountToString(e.v);
+ }
+ return null;
+ }
+
+ public boolean isCellEditable(int row, int col) {
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void setValueAt(Object value, int row, int col) {
+ Entry e = entries.get(row);
+ try {
+ switch (col) {
+ case 0:
+ try {
+ e.p = (Amount<Pressure>) Amount.valueOf((String) value);
+ } catch ( Exception ee ){
+ double d = Double.parseDouble((String)value);
+ e.p = (Amount<Pressure>)Amount.valueOf(d, e.p.getUnit());
+ }
+ break;
+ case 1:
+ try {
+ e.v = (Amount<Velocity>) Amount.valueOf((String) value);
+ } catch ( Exception ee ){
+ double d = Double.parseDouble((String)value);
+ e.v = (Amount<Velocity>)Amount.valueOf(d, e.v.getUnit());
+ }
+ break;
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ Collections.sort(entries);
+ fireTableDataChanged();
+ //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI);
+ f.clear();
+ for (Entry en : entries) {
+ f.add(en.p, en.v);
+ }
+ f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null));
+
+ update();
+
+ }
+
+ @Override
+ public void fireTableDataChanged() {
+ super.fireTableDataChanged();
+ }
+
+ };
+
+ private Vector<Entry> entries = new Vector<Entry>();
+ JPanel controls;
+ final EditablePiecewiseLinearFuel f;
+
+ public LinearFuelEditor(EditablePiecewiseLinearFuel f) {
+ super( f );
+ this.f = f;
+ for ( Map.Entry<Amount<Pressure>, Amount<Velocity>> e : f.getEntries().entrySet() ){
+ Entry n = new Entry();
+ n.p = e.getKey();
+ n.v = e.getValue();
+ entries.add(n);
+ }
+ Collections.sort(entries);
+ }
+
+ protected Component getBurnrateEditComponent(){
+ final TM tm = new TM();
+
+ JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
+
+
+ JTable table = new JTable(tm);
+ JScrollPane scrollpane = new JScrollPane(table);
+ scrollpane.setMinimumSize(new Dimension(200, 200));
+ editBottom.setTopComponent(scrollpane);
+
+
+ JButton add = new JButton("Add Data");
+ add.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ entries.add(new Entry());
+ tm.fireTableDataChanged();
+ }
+ });
+ controls = new JPanel();
+ controls.setPreferredSize(new Dimension(200, 50));
+ controls.setLayout(new FlowLayout());
+
+ controls.add(add);
+
+ editBottom.setBottomComponent(controls);
+
+
+
+ editBottom.setDividerLocation(.8);
+
+ return editBottom;
+ }
+
+ public static void main(String args[]) {
+ JFrame f = new JFrame();
+ f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ f.setContentPane(new LinearFuelEditor(new EditablePiecewiseLinearFuel()));
+ f.setSize(800, 600);
+ f.setVisible(true);
+
+ }
+
+}
--- /dev/null
+package com.billkuker.rocketry.motorsim.fuel;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.Collections;
+import java.util.Vector;
+
+import javax.measure.quantity.Pressure;
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.table.AbstractTableModel;
+
+import org.jscience.physics.amount.Amount;
+
+import com.billkuker.rocketry.motorsim.RocketScience;
+import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type;
+import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseSaintRobertFuel;
+
+public class SRFuelEditor extends AbstractFuelEditor {
+ private static final long serialVersionUID = 1L;
+
+ private static final NumberFormat nf = new DecimalFormat("##########.###");
+
+ private class Entry implements Comparable<Entry> {
+ Amount<Pressure> p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI));
+ double a;
+ double n;
+
+ @Override
+ public int compareTo(Entry o) {
+ return p.compareTo(o.p);
+ }
+ }
+
+ private class TM extends AbstractTableModel {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public int getColumnCount() {
+ return 3;
+ }
+
+ @Override
+ public int getRowCount() {
+ return entries.size();
+ }
+
+ @Override
+ public String getColumnName(int col) {
+ switch (col) {
+ case 0:
+ return "Pressure";
+ case 1:
+ return "Coefficient (a)";
+ case 2:
+ return "Exponent (n)";
+ }
+ return null;
+ }
+
+ @Override
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ Entry e = entries.get(rowIndex);
+ switch (columnIndex) {
+ case 0:
+ //Format like 100 psi or 4.8 Mpa
+ return nf.format(e.p.doubleValue(e.p.getUnit())) + " " + e.p.getUnit();
+ case 1:
+ return e.a;
+ case 2:
+ return e.n;
+ }
+ return null;
+ }
+
+ public boolean isCellEditable(int row, int col) {
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void setValueAt(Object value, int row, int col) {
+ Entry e = entries.get(row);
+ try {
+ switch (col) {
+ case 0:
+ try {
+ e.p = (Amount<Pressure>) Amount.valueOf((String) value);
+ } catch ( Exception ee ){
+ double d = Double.parseDouble((String)value);
+ e.p = (Amount<Pressure>)Amount.valueOf(d, e.p.getUnit());
+ }
+ break;
+ case 1:
+ e.a = Double.valueOf((String) value);
+ break;
+ case 2:
+ e.n = Double.valueOf((String) value);
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ Collections.sort(entries);
+ fireTableDataChanged();
+ //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI);
+ f.clear();
+ for (Entry en : entries) {
+ f.add(en.p, en.a, en.n);
+ }
+ f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null));
+
+ update();
+
+ }
+
+ @Override
+ public void fireTableDataChanged() {
+ super.fireTableDataChanged();
+ }
+
+ };
+
+ private Vector<Entry> entries = new Vector<Entry>();
+ JPanel controls;
+ final EditablePiecewiseSaintRobertFuel f;
+
+ public SRFuelEditor(EditablePiecewiseSaintRobertFuel f) {
+ super( f);
+ this.f = f;
+
+ for ( Amount<Pressure> p : f.getAMap().keySet() ){
+ Entry e = new Entry();
+ e.a = f.getAMap().get(p);
+ e.n = f.getNMap().get(p);
+ entries.add(e);
+ }
+ Collections.sort(entries);
+
+ }
+
+ protected Component getBurnrateEditComponent(){
+ final TM tm = new TM();
+
+ JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
+
+
+ JTable table = new JTable(tm);
+ JScrollPane scrollpane = new JScrollPane(table);
+ scrollpane.setMinimumSize(new Dimension(200, 200));
+ editBottom.setTopComponent(scrollpane);
+
+
+ JButton add = new JButton("Add Data");
+ add.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ entries.add(new Entry());
+ tm.fireTableDataChanged();
+ }
+ });
+ controls = new JPanel();
+ controls.setPreferredSize(new Dimension(200, 50));
+ controls.setLayout(new FlowLayout());
+
+ controls.add(add);
+
+
+ final JRadioButton si, nonsi;
+ ButtonGroup type = new ButtonGroup();
+ JPanel radio = new JPanel();
+ radio.add(si = new JRadioButton("SI"));
+ radio.add(nonsi = new JRadioButton("NonSI"));
+ controls.add(radio);
+ type.add(si);
+ type.add(nonsi);
+
+ si.setSelected(true);
+
+ si.addChangeListener(new ChangeListener(){
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ if ( si.isSelected() ){
+ System.err.println("SI");
+ f.setType(Type.SI);
+ } else {
+ System.err.println("NONSI");
+ f.setType(Type.NONSI);
+ }
+ update();
+ }});
+
+ editBottom.setBottomComponent(controls);
+
+
+
+ editBottom.setDividerLocation(.8);
+
+ return editBottom;
+ }
+
+ public static void main(String args[]) {
+ JFrame f = new JFrame();
+ f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ f.setContentPane(new SRFuelEditor(new EditablePiecewiseSaintRobertFuel()));
+ f.setSize(800, 600);
+ f.setVisible(true);
+
+ }
+
+}
import com.billkuker.rocketry.motorsim.Motor;\r
import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;\r
import com.billkuker.rocketry.motorsim.fuel.FuelResolver;\r
+import com.billkuker.rocketry.motorsim.fuel.FuelsEditor;\r
import com.billkuker.rocketry.motorsim.io.ENGExporter;\r
import com.billkuker.rocketry.motorsim.io.MotorIO;\r
\r
-import fuel.FuelsEditor;\r
\r
public class MotorWorkbench extends JFrame {\r
private static final long serialVersionUID = 1L;\r
+++ /dev/null
-package fuel;\r
-\r
-import java.awt.Component;\r
-\r
-import javax.measure.quantity.Pressure;\r
-import javax.measure.quantity.Velocity;\r
-import javax.measure.unit.SI;\r
-import javax.swing.JSplitPane;\r
-import javax.swing.SwingUtilities;\r
-\r
-import org.jscience.physics.amount.Amount;\r
-\r
-import com.billkuker.rocketry.motorsim.Fuel;\r
-import com.billkuker.rocketry.motorsim.visual.Chart;\r
-import com.billkuker.rocketry.motorsim.visual.Editor;\r
-\r
-public abstract class AbstractFuelEditor extends JSplitPane {\r
- private static final long serialVersionUID = 1L;\r
-\r
- private final JSplitPane editParent;\r
- private final JSplitPane editTop;\r
- private final Fuel f;\r
- private Chart<Pressure, Velocity> burnRate;\r
- \r
- public AbstractFuelEditor(Fuel f){\r
- super(HORIZONTAL_SPLIT);\r
- this.f = f;\r
- \r
- editTop = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
- editTop.setTopComponent(new Editor(f));\r
- editTop.setBottomComponent(new Editor(f.getCombustionProduct()));\r
- \r
- editParent = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
- setLeftComponent(editParent);\r
- editParent.setTopComponent(editTop);\r
- editParent.setBottomComponent(getBurnrateEditComponent());\r
- \r
- setResizeWeight(0);\r
- setDividerLocation(.3);\r
- editParent.setDividerLocation(.5);\r
- editTop.setDividerLocation(.5);\r
- editParent.resetToPreferredSizes();\r
- revalidate();\r
-\r
- update();\r
- }\r
- \r
- protected abstract Component getBurnrateEditComponent();\r
- \r
- public Fuel getFuel(){\r
- return f;\r
- }\r
- \r
-\r
-\r
- protected void update() {\r
- SwingUtilities.invokeLater(new Runnable() {\r
-\r
- @Override\r
- public void run() {\r
- editTop.setTopComponent(new Editor(f));\r
- editTop.setBottomComponent(new Editor(f.getCombustionProduct()));\r
- if (burnRate != null)\r
- AbstractFuelEditor.this.remove(burnRate);\r
- try {\r
- burnRate = new Chart<Pressure, Velocity>(\r
- SI.MEGA(SI.PASCAL), SI.MILLIMETER.divide(SI.SECOND)\r
- .asType(Velocity.class), f, "burnRate");\r
- } catch (NoSuchMethodException e) {\r
- throw new Error(e);\r
- }\r
- burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf(\r
- 0, SI.MEGA(SI.PASCAL)), Amount.valueOf(11, SI\r
- .MEGA(SI.PASCAL)), 50));\r
- AbstractFuelEditor.this.setRightComponent(burnRate);\r
- AbstractFuelEditor.this.revalidate();\r
- }\r
- });\r
- }\r
- \r
-}\r
+++ /dev/null
-package fuel;\r
-\r
-import java.awt.Frame;\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-\r
-import javax.swing.JFrame;\r
-import javax.swing.JMenuBar;\r
-\r
-import com.billkuker.rocketry.motorsim.Fuel;\r
-import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseLinearFuel;\r
-import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseSaintRobertFuel;\r
-import com.billkuker.rocketry.motorsim.io.MotorIO;\r
-import com.billkuker.rocketry.motorsim.visual.MultiObjectEditor;\r
-\r
-public class FuelsEditor extends MultiObjectEditor<Fuel, AbstractFuelEditor> {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- public FuelsEditor(Frame frame) {\r
- super(frame, "Fuel");\r
- addCreator(new ObjectCreator() {\r
- @Override\r
- public Fuel newObject() {\r
- return new EditablePiecewiseLinearFuel();\r
- }\r
-\r
- @Override\r
- public String getName() {\r
- return "Linear Fuel";\r
- }\r
- });\r
- addCreator(new ObjectCreator() {\r
- @Override\r
- public Fuel newObject() {\r
- return new EditablePiecewiseSaintRobertFuel();\r
- }\r
-\r
- @Override\r
- public String getName() {\r
- return "Saint Robert Fuel";\r
- }\r
- });\r
- }\r
-\r
- @Override\r
- public AbstractFuelEditor createEditor(Fuel o) {\r
- if ( o instanceof EditablePiecewiseLinearFuel ){\r
- return new LinearFuelEditor((EditablePiecewiseLinearFuel)o);\r
- } else if ( o instanceof EditablePiecewiseSaintRobertFuel ){\r
- return new SRFuelEditor((EditablePiecewiseSaintRobertFuel)o);\r
- }\r
- return null;\r
- }\r
-\r
- @Override\r
- public Fuel newObject() {\r
- return new EditablePiecewiseLinearFuel();\r
- }\r
-\r
- @Override\r
- protected Fuel loadFromFile(File f) throws IOException {\r
- Fuel fuel = MotorIO.readFuel(new FileInputStream(f));\r
- return fuel;\r
- }\r
-\r
- @Override\r
- protected void saveToFile(Fuel o, File f) throws IOException {\r
- MotorIO.writeFuel(o, new FileOutputStream(f));\r
- }\r
- \r
- @SuppressWarnings("deprecation")\r
- public static void main(String args[]){\r
- JFrame f = new JFrame();\r
- f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
- FuelsEditor fe;\r
- f.add(fe = new FuelsEditor(f));\r
- JMenuBar b;\r
- f.setJMenuBar(b = new JMenuBar());\r
- b.add(fe.getMenu());\r
- f.setSize(1024, 768);\r
- f.show();\r
- }\r
-\r
-}\r
+++ /dev/null
-package fuel;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.beans.PropertyChangeEvent;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Vector;
-
-import javax.measure.quantity.Pressure;
-import javax.measure.quantity.Velocity;
-import javax.measure.unit.SI;
-import javax.swing.JButton;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTable;
-import javax.swing.table.AbstractTableModel;
-
-import org.jscience.physics.amount.Amount;
-
-import com.billkuker.rocketry.motorsim.RocketScience;
-import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseLinearFuel;
-
-public class LinearFuelEditor extends AbstractFuelEditor {
- private static final long serialVersionUID = 1L;
-
- private class Entry implements Comparable<Entry> {
- Amount<Pressure> p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI));
- Amount<Velocity> v = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(SI.METERS_PER_SECOND));
-
- @Override
- public int compareTo(Entry o) {
- return p.compareTo(o.p);
- }
- }
-
- private class TM extends AbstractTableModel {
- private static final long serialVersionUID = 1L;
-
- @Override
- public int getColumnCount() {
- return 2;
- }
-
- @Override
- public int getRowCount() {
- return entries.size();
- }
-
- @Override
- public String getColumnName(int col) {
- switch (col) {
- case 0:
- return "Pressure";
- case 1:
- return "Burn Rate";
- }
- return null;
- }
-
- @Override
- public Object getValueAt(int rowIndex, int columnIndex) {
- Entry e = entries.get(rowIndex);
- switch (columnIndex) {
- case 0:
- return RocketScience.ammountToString(e.p);
- case 1:
- return RocketScience.ammountToString(e.v);
- }
- return null;
- }
-
- public boolean isCellEditable(int row, int col) {
- return true;
- }
-
- @SuppressWarnings("unchecked")
- public void setValueAt(Object value, int row, int col) {
- Entry e = entries.get(row);
- try {
- switch (col) {
- case 0:
- try {
- e.p = (Amount<Pressure>) Amount.valueOf((String) value);
- } catch ( Exception ee ){
- double d = Double.parseDouble((String)value);
- e.p = (Amount<Pressure>)Amount.valueOf(d, e.p.getUnit());
- }
- break;
- case 1:
- try {
- e.v = (Amount<Velocity>) Amount.valueOf((String) value);
- } catch ( Exception ee ){
- double d = Double.parseDouble((String)value);
- e.v = (Amount<Velocity>)Amount.valueOf(d, e.v.getUnit());
- }
- break;
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- Collections.sort(entries);
- fireTableDataChanged();
- //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI);
- f.clear();
- for (Entry en : entries) {
- f.add(en.p, en.v);
- }
- f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null));
-
- update();
-
- }
-
- @Override
- public void fireTableDataChanged() {
- super.fireTableDataChanged();
- }
-
- };
-
- private Vector<Entry> entries = new Vector<Entry>();
- JPanel controls;
- final EditablePiecewiseLinearFuel f;
-
- public LinearFuelEditor(EditablePiecewiseLinearFuel f) {
- super( f );
- this.f = f;
- for ( Map.Entry<Amount<Pressure>, Amount<Velocity>> e : f.getEntries().entrySet() ){
- Entry n = new Entry();
- n.p = e.getKey();
- n.v = e.getValue();
- entries.add(n);
- }
- Collections.sort(entries);
- }
-
- protected Component getBurnrateEditComponent(){
- final TM tm = new TM();
-
- JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
-
-
- JTable table = new JTable(tm);
- JScrollPane scrollpane = new JScrollPane(table);
- scrollpane.setMinimumSize(new Dimension(200, 200));
- editBottom.setTopComponent(scrollpane);
-
-
- JButton add = new JButton("Add Data");
- add.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- entries.add(new Entry());
- tm.fireTableDataChanged();
- }
- });
- controls = new JPanel();
- controls.setPreferredSize(new Dimension(200, 50));
- controls.setLayout(new FlowLayout());
-
- controls.add(add);
-
- editBottom.setBottomComponent(controls);
-
-
-
- editBottom.setDividerLocation(.8);
-
- return editBottom;
- }
-
- public static void main(String args[]) {
- JFrame f = new JFrame();
- f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- f.setContentPane(new LinearFuelEditor(new EditablePiecewiseLinearFuel()));
- f.setSize(800, 600);
- f.setVisible(true);
-
- }
-
-}
+++ /dev/null
-package fuel;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.beans.PropertyChangeEvent;
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-import java.util.Collections;
-import java.util.Vector;
-
-import javax.measure.quantity.Pressure;
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTable;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.table.AbstractTableModel;
-
-import org.jscience.physics.amount.Amount;
-
-import com.billkuker.rocketry.motorsim.RocketScience;
-import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type;
-import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseSaintRobertFuel;
-
-public class SRFuelEditor extends AbstractFuelEditor {
- private static final long serialVersionUID = 1L;
-
- private static final NumberFormat nf = new DecimalFormat("##########.###");
-
- private class Entry implements Comparable<Entry> {
- Amount<Pressure> p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI));
- double a;
- double n;
-
- @Override
- public int compareTo(Entry o) {
- return p.compareTo(o.p);
- }
- }
-
- private class TM extends AbstractTableModel {
- private static final long serialVersionUID = 1L;
-
- @Override
- public int getColumnCount() {
- return 3;
- }
-
- @Override
- public int getRowCount() {
- return entries.size();
- }
-
- @Override
- public String getColumnName(int col) {
- switch (col) {
- case 0:
- return "Pressure";
- case 1:
- return "Coefficient (a)";
- case 2:
- return "Exponent (n)";
- }
- return null;
- }
-
- @Override
- public Object getValueAt(int rowIndex, int columnIndex) {
- Entry e = entries.get(rowIndex);
- switch (columnIndex) {
- case 0:
- //Format like 100 psi or 4.8 Mpa
- return nf.format(e.p.doubleValue(e.p.getUnit())) + " " + e.p.getUnit();
- case 1:
- return e.a;
- case 2:
- return e.n;
- }
- return null;
- }
-
- public boolean isCellEditable(int row, int col) {
- return true;
- }
-
- @SuppressWarnings("unchecked")
- public void setValueAt(Object value, int row, int col) {
- Entry e = entries.get(row);
- try {
- switch (col) {
- case 0:
- try {
- e.p = (Amount<Pressure>) Amount.valueOf((String) value);
- } catch ( Exception ee ){
- double d = Double.parseDouble((String)value);
- e.p = (Amount<Pressure>)Amount.valueOf(d, e.p.getUnit());
- }
- break;
- case 1:
- e.a = Double.valueOf((String) value);
- break;
- case 2:
- e.n = Double.valueOf((String) value);
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- Collections.sort(entries);
- fireTableDataChanged();
- //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI);
- f.clear();
- for (Entry en : entries) {
- f.add(en.p, en.a, en.n);
- }
- f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null));
-
- update();
-
- }
-
- @Override
- public void fireTableDataChanged() {
- super.fireTableDataChanged();
- }
-
- };
-
- private Vector<Entry> entries = new Vector<Entry>();
- JPanel controls;
- final EditablePiecewiseSaintRobertFuel f;
-
- public SRFuelEditor(EditablePiecewiseSaintRobertFuel f) {
- super( f);
- this.f = f;
-
- for ( Amount<Pressure> p : f.getAMap().keySet() ){
- Entry e = new Entry();
- e.a = f.getAMap().get(p);
- e.n = f.getNMap().get(p);
- entries.add(e);
- }
- Collections.sort(entries);
-
- }
-
- protected Component getBurnrateEditComponent(){
- final TM tm = new TM();
-
- JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
-
-
- JTable table = new JTable(tm);
- JScrollPane scrollpane = new JScrollPane(table);
- scrollpane.setMinimumSize(new Dimension(200, 200));
- editBottom.setTopComponent(scrollpane);
-
-
- JButton add = new JButton("Add Data");
- add.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- entries.add(new Entry());
- tm.fireTableDataChanged();
- }
- });
- controls = new JPanel();
- controls.setPreferredSize(new Dimension(200, 50));
- controls.setLayout(new FlowLayout());
-
- controls.add(add);
-
-
- final JRadioButton si, nonsi;
- ButtonGroup type = new ButtonGroup();
- JPanel radio = new JPanel();
- radio.add(si = new JRadioButton("SI"));
- radio.add(nonsi = new JRadioButton("NonSI"));
- controls.add(radio);
- type.add(si);
- type.add(nonsi);
-
- si.setSelected(true);
-
- si.addChangeListener(new ChangeListener(){
- @Override
- public void stateChanged(ChangeEvent e) {
- if ( si.isSelected() ){
- System.err.println("SI");
- f.setType(Type.SI);
- } else {
- System.err.println("NONSI");
- f.setType(Type.NONSI);
- }
- update();
- }});
-
- editBottom.setBottomComponent(controls);
-
-
-
- editBottom.setDividerLocation(.8);
-
- return editBottom;
- }
-
- public static void main(String args[]) {
- JFrame f = new JFrame();
- f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- f.setContentPane(new SRFuelEditor(new EditablePiecewiseSaintRobertFuel()));
- f.setSize(800, 600);
- f.setVisible(true);
-
- }
-
-}