1 package com.billkuker.rocketry.motorsim.visual.workbench;
\r
3 import java.awt.Component;
\r
5 import javax.measure.quantity.Pressure;
\r
6 import javax.measure.quantity.Velocity;
\r
7 import javax.measure.quantity.VolumetricDensity;
\r
8 import javax.measure.unit.SI;
\r
9 import javax.swing.JSplitPane;
\r
10 import javax.swing.SwingUtilities;
\r
12 import org.jscience.physics.amount.Amount;
\r
14 import com.billkuker.rocketry.motorsim.Fuel;
\r
15 import com.billkuker.rocketry.motorsim.fuel.EditableCombustionProduct;
\r
16 import com.billkuker.rocketry.motorsim.fuel.PiecewiseSaintRobertFuel;
\r
17 import com.billkuker.rocketry.motorsim.visual.Chart;
\r
18 import com.billkuker.rocketry.motorsim.visual.Editor;
\r
20 public abstract class AbstractFuelEditor extends JSplitPane {
\r
21 private static final long serialVersionUID = 1L;
\r
23 protected static class EditablePSRFuel extends PiecewiseSaintRobertFuel {
\r
25 @SuppressWarnings("unchecked")
\r
26 private Amount<VolumetricDensity> idealDensity = (Amount<VolumetricDensity>) Amount
\r
27 .valueOf("1 g/mm^3");
\r
29 private double combustionEfficiency = 1;
\r
30 private double densityRatio = 1;
\r
31 private EditableCombustionProduct cp;
\r
32 private String name = "New Fuel";
\r
34 public EditablePSRFuel(Type t) {
\r
36 cp = new EditableCombustionProduct();
\r
39 public void clear(){
\r
43 public void setType(Type t){
\r
47 public void add(Amount<Pressure> p, final double _a, final double _n) {
\r
48 super.add(p, _a, _n);
\r
52 public Amount<VolumetricDensity> getIdealDensity() {
\r
53 return idealDensity;
\r
56 public void setIdealDensity(Amount<VolumetricDensity> idealDensity) {
\r
57 this.idealDensity = idealDensity;
\r
60 public double getCombustionEfficiency() {
\r
61 return combustionEfficiency;
\r
64 public void setCombustionEfficiency(double combustionEfficiency) {
\r
65 this.combustionEfficiency = combustionEfficiency;
\r
68 public double getDensityRatio() {
\r
69 return densityRatio;
\r
72 public void setDensityRatio(double densityRatio) {
\r
73 this.densityRatio = densityRatio;
\r
77 public CombustionProduct getCombustionProduct() {
\r
81 public String getName() {
\r
85 public void setName(String name) {
\r
91 private final JSplitPane editParent;
\r
92 private final JSplitPane editTop;
\r
93 private final Fuel f;
\r
94 private Chart<Pressure, Velocity> burnRate;
\r
96 public AbstractFuelEditor(Fuel f){
\r
97 super(HORIZONTAL_SPLIT);
\r
100 editTop = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
\r
101 editTop.setTopComponent(new Editor(f));
\r
102 editTop.setBottomComponent(new Editor(f.getCombustionProduct()));
\r
104 editParent = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
\r
105 setLeftComponent(editParent);
\r
106 editParent.setTopComponent(editTop);
\r
107 editParent.setBottomComponent(getBurnrateEditComponent());
\r
109 setResizeWeight(0);
\r
110 setDividerLocation(.3);
\r
111 editParent.setDividerLocation(.5);
\r
112 editTop.setDividerLocation(.5);
\r
113 editParent.resetToPreferredSizes();
\r
119 protected abstract Component getBurnrateEditComponent();
\r
121 public Fuel getFuel(){
\r
127 protected void update() {
\r
128 SwingUtilities.invokeLater(new Runnable() {
\r
131 public void run() {
\r
132 editTop.setTopComponent(new Editor(f));
\r
133 editTop.setBottomComponent(new Editor(f.getCombustionProduct()));
\r
134 if (burnRate != null)
\r
135 AbstractFuelEditor.this.remove(burnRate);
\r
137 burnRate = new Chart<Pressure, Velocity>(
\r
138 SI.MEGA(SI.PASCAL), SI.MILLIMETER.divide(SI.SECOND)
\r
139 .asType(Velocity.class), f, "burnRate");
\r
140 } catch (NoSuchMethodException e) {
\r
141 throw new Error(e);
\r
143 burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf(
\r
144 0, SI.MEGA(SI.PASCAL)), Amount.valueOf(11, SI
\r
145 .MEGA(SI.PASCAL)), 50));
\r
146 AbstractFuelEditor.this.setRightComponent(burnRate);
\r
147 AbstractFuelEditor.this.revalidate();
\r