From a19d7b707c76cba2ec8df48fa314cb3227706caf Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Sun, 24 Oct 2010 17:19:32 +0000 Subject: [PATCH] --- .../billkuker/rocketry/motorsim/Chamber.java | 3 + .../motorsim/ConvergentDivergentNozzle.java | 3 +- .../rocketry/motorsim/CylindricalChamber.java | 23 ++++ .../fuel/PiecewiseSaintRobertFuel.java | 4 + .../motorsim/fuel/SaintRobertFuel.java | 8 +- .../rocketry/motorsim/visual/FuelPanel.java | 43 +++++++ .../motorsim/visual/HardwarePanel.java | 103 +++++++++++++++++ .../rocketry/motorsim/visual/NozzlePanel.java | 76 ------------- .../visual/workbench/MotorEditor.java | 105 ++++++------------ .../visual/workbench/MotorWorkbench.java | 66 ++++++++--- .../visual/workbench/SRFuelEditor.java | 15 ++- .../workbench/WorkbenchTreeCellRenderer.java | 5 +- .../visual/workbench/WorkbenchTreeModel.java | 33 ++++-- 13 files changed, 308 insertions(+), 179 deletions(-) create mode 100644 src/com/billkuker/rocketry/motorsim/visual/FuelPanel.java create mode 100644 src/com/billkuker/rocketry/motorsim/visual/HardwarePanel.java delete mode 100644 src/com/billkuker/rocketry/motorsim/visual/NozzlePanel.java diff --git a/src/com/billkuker/rocketry/motorsim/Chamber.java b/src/com/billkuker/rocketry/motorsim/Chamber.java index 28c833e..2b84c2d 100644 --- a/src/com/billkuker/rocketry/motorsim/Chamber.java +++ b/src/com/billkuker/rocketry/motorsim/Chamber.java @@ -1,5 +1,7 @@ package com.billkuker.rocketry.motorsim; +import java.awt.Shape; + import javax.measure.quantity.Pressure; import javax.measure.quantity.Volume; @@ -10,4 +12,5 @@ public interface Chamber { public Amount burstPressure(); + public Shape chamberShape(); } diff --git a/src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java b/src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java index 2f10cb9..3d15550 100644 --- a/src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java +++ b/src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java @@ -99,11 +99,12 @@ public class ConvergentDivergentNozzle implements Nozzle, Validating { s.append(new Line2D.Double(0,0,cDiff,-cDiff), true); s.transform(AffineTransform.getScaleInstance(-1, 1)); - s.transform(AffineTransform.getTranslateInstance(-throatR, 0)); + s.transform(AffineTransform.getTranslateInstance(-throatR * 2, 0)); s.append(new Line2D.Double(0,0,diff,diff*3), false); s.append(new Line2D.Double(0,0,cDiff,-cDiff), true); + s.transform(AffineTransform.getTranslateInstance(throatR, cDiff)); //a.add(new java.awt.geom.Area( new Ellipse2D.Double(0,0,5,5))); return s; diff --git a/src/com/billkuker/rocketry/motorsim/CylindricalChamber.java b/src/com/billkuker/rocketry/motorsim/CylindricalChamber.java index 14e97ac..d810008 100644 --- a/src/com/billkuker/rocketry/motorsim/CylindricalChamber.java +++ b/src/com/billkuker/rocketry/motorsim/CylindricalChamber.java @@ -1,5 +1,11 @@ package com.billkuker.rocketry.motorsim; +import java.awt.Shape; +import java.awt.geom.Area; +import java.awt.geom.Rectangle2D; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + import javax.measure.quantity.Length; import javax.measure.quantity.Pressure; import javax.measure.quantity.Volume; @@ -45,4 +51,21 @@ public class CylindricalChamber implements Chamber { this.oD = oD; } + @Override + public Shape chamberShape() { + double ir = iD.doubleValue(SI.MILLIMETER) / 2; + double or = oD.doubleValue(SI.MILLIMETER) / 2; + double lenmm = length.doubleValue(SI.MILLIMETER); + double thick = or-ir; + + Rectangle2D.Double l,r,t; + l = new Rectangle2D.Double(-or,0,thick,lenmm); + r = new Rectangle2D.Double(ir, 0, thick, lenmm); + t = new Rectangle2D.Double(-or,0,or*2,thick); + Area a = new Area(l); + a.add(new Area(r)); + a.add(new Area(t)); + return a; + } + } diff --git a/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseSaintRobertFuel.java b/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseSaintRobertFuel.java index c2e968b..30109ba 100644 --- a/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseSaintRobertFuel.java +++ b/src/com/billkuker/rocketry/motorsim/fuel/PiecewiseSaintRobertFuel.java @@ -27,6 +27,10 @@ public abstract class PiecewiseSaintRobertFuel extends SaintRobertFuel { protected void add(Amount p, final double _a, final double _n){ entries.put(p, new Entry(){{a = _a; n = _n;}}); } + + protected void clear(){ + entries.clear(); + } @Override protected double burnrateCoefficient(Amount pressure) { diff --git a/src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java b/src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java index 1661227..93c440c 100644 --- a/src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java +++ b/src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java @@ -34,10 +34,12 @@ public abstract class SaintRobertFuel implements Fuel { private Type t = Type.SI; public SaintRobertFuel(Type t){ + if ( t == null ) + throw new IllegalArgumentException("Type must be non-null"); this.t = t; } - protected Type getType(){ + public Type getType(){ return t; } @@ -68,4 +70,8 @@ public abstract class SaintRobertFuel implements Fuel { public String getName(){ return this.getClass().getSimpleName(); } + + public String toString(){ + return getName(); + } } diff --git a/src/com/billkuker/rocketry/motorsim/visual/FuelPanel.java b/src/com/billkuker/rocketry/motorsim/visual/FuelPanel.java new file mode 100644 index 0000000..2a9ca06 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/visual/FuelPanel.java @@ -0,0 +1,43 @@ +package com.billkuker.rocketry.motorsim.visual; + +import javax.measure.quantity.Pressure; +import javax.measure.quantity.Velocity; +import javax.measure.unit.SI; +import javax.swing.BoxLayout; +import javax.swing.JPanel; +import javax.swing.JSplitPane; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Fuel; + +public class FuelPanel extends JSplitPane { + private static final long serialVersionUID = 1L; + + public FuelPanel(Fuel f) { + super(JSplitPane.HORIZONTAL_SPLIT); + setName("Fuel"); + Chart burnRate; + try { + burnRate = new Chart(SI.MEGA(SI.PASCAL), + SI.METERS_PER_SECOND, f, "burnRate"); + } catch (NoSuchMethodException e) { + throw new Error(e); + } + burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf(0, SI + .MEGA(SI.PASCAL)), Amount.valueOf(11, SI.MEGA(SI.PASCAL)), 20)); + + final JPanel p = new JPanel(); + p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); + + p.add(new Editor(f)); + try { + p.add(new Editor(f.getCombustionProduct())); + } catch (Exception e) { + + } + + setLeftComponent(p); + setRightComponent(burnRate); + } +} diff --git a/src/com/billkuker/rocketry/motorsim/visual/HardwarePanel.java b/src/com/billkuker/rocketry/motorsim/visual/HardwarePanel.java new file mode 100644 index 0000000..0c35222 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/visual/HardwarePanel.java @@ -0,0 +1,103 @@ +package com.billkuker.rocketry.motorsim.visual; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.Area; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.measure.unit.SI; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.WindowConstants; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Chamber; +import com.billkuker.rocketry.motorsim.ChangeListening; +import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle; +import com.billkuker.rocketry.motorsim.CylindricalChamber; +import com.billkuker.rocketry.motorsim.Nozzle; + +public class HardwarePanel extends JPanel { + private static final long serialVersionUID = 1L; + private Nozzle nozzle; + private Chamber chamber; + + public HardwarePanel(Nozzle n, Chamber c){ + nozzle = n; + chamber = c; + if ( n instanceof ChangeListening.Subject ){ + ((ChangeListening.Subject)n).addPropertyChangeListener(new PropertyChangeListener(){ + public void propertyChange(PropertyChangeEvent evt) { + repaint(); + } + }); + } + if ( c instanceof ChangeListening.Subject ){ + ((ChangeListening.Subject)c).addPropertyChangeListener(new PropertyChangeListener(){ + public void propertyChange(PropertyChangeEvent evt) { + repaint(); + } + }); + } + } + + public void paint(Graphics g){ + super.paint(g); + Graphics2D g2d = (Graphics2D)g; + g2d.translate(10, 10); + + g2d.setColor(Color.black); + + Shape c = chamber.chamberShape(); + + Shape n = nozzle.nozzleShape(((CylindricalChamber)chamber).getID()); + + Rectangle cb = c.getBounds(); + Rectangle nb = n.getBounds(); + double w, h; + w = Math.max(cb.getWidth(), nb.getWidth()); + h = cb.getHeight() + nb.getHeight(); + + double mw, mh; + mw = getWidth() - 10; + mh = getHeight() - 10; + + double sw, sh, s; + sw = mw / w; + sh = mh / h; + s = Math.min(sw, sh); + + g2d.translate(0, -cb.getY() - 5); + g2d.scale(s, s); + g2d.translate(-cb.getX(), 0); + + g2d.setStroke(new BasicStroke(1)); + g2d.draw( c ); + g2d.translate(0, cb.getHeight()); + + g2d.draw(n); + } + + public void showAsWindow(){ + JFrame f = new JFrame(); + f.setSize(220,250); + f.setContentPane(this); + f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + f.setVisible(true); + } + + public static void main(String args[]) throws Exception{ + ConvergentDivergentNozzle n = new ConvergentDivergentNozzle(); + CylindricalChamber c = new CylindricalChamber(); + n.setThroatDiameter(Amount.valueOf(10, SI.MILLIMETER)); + n.setExitDiameter(Amount.valueOf(20, SI.MILLIMETER)); + //new Editor(n).showAsWindow(); + new HardwarePanel(n,c).showAsWindow(); + } +} diff --git a/src/com/billkuker/rocketry/motorsim/visual/NozzlePanel.java b/src/com/billkuker/rocketry/motorsim/visual/NozzlePanel.java deleted file mode 100644 index ca88434..0000000 --- a/src/com/billkuker/rocketry/motorsim/visual/NozzlePanel.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.billkuker.rocketry.motorsim.visual; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.Shape; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; - -import javax.measure.unit.SI; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.WindowConstants; - -import org.jscience.physics.amount.Amount; - -import com.billkuker.rocketry.motorsim.ChangeListening; -import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle; -import com.billkuker.rocketry.motorsim.Nozzle; - -public class NozzlePanel extends JPanel { - private static final long serialVersionUID = 1L; - private Nozzle nozzle; - public NozzlePanel(Nozzle n){ - nozzle = n; - - if ( n instanceof ChangeListening.Subject ){ - ((ChangeListening.Subject)n).addPropertyChangeListener(new PropertyChangeListener(){ - public void propertyChange(PropertyChangeEvent evt) { - repaint(); - } - }); - } - } - - public void paint(Graphics g){ - super.paint(g); - Graphics2D g2d = (Graphics2D)g; - g2d.translate(10, 10); - - g2d.setColor(Color.black); - - - Shape a = nozzle.nozzleShape(Amount.valueOf(30, SI.MILLIMETER)); - - Rectangle bounds = a.getBounds(); - double max = bounds.getWidth(); - if ( bounds.getHeight() > max ) - max = bounds.getHeight(); - - g2d.scale(200 / max, 200 / max); - g2d.translate(-bounds.getX(), -bounds.getY()); - - g2d.setStroke(new BasicStroke(4*(float)max/200f)); - - g2d.draw( a ); - } - - public void showAsWindow(){ - JFrame f = new JFrame(); - f.setSize(220,250); - f.setContentPane(this); - f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - f.setVisible(true); - } - - public static void main(String args[]) throws Exception{ - ConvergentDivergentNozzle n = new ConvergentDivergentNozzle(); - n.setThroatDiameter(Amount.valueOf(5, SI.MILLIMETER)); - n.setExitDiameter(Amount.valueOf(9, SI.MILLIMETER)); - new Editor(n).showAsWindow(); - new NozzlePanel(n).showAsWindow(); - } -} diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java index 0e814e2..ab60e82 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java @@ -10,6 +10,8 @@ import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; import java.io.IOException; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Vector; @@ -17,8 +19,11 @@ import javax.measure.quantity.Pressure; import javax.measure.quantity.Velocity; import javax.measure.unit.SI; import javax.swing.BoxLayout; +import javax.swing.ComboBoxModel; import javax.swing.JButton; +import javax.swing.JComboBox; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JSplitPane; @@ -28,6 +33,7 @@ import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.WindowConstants; +import javax.swing.event.ListDataListener; import org.apache.log4j.Logger; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; @@ -60,7 +66,7 @@ import com.billkuker.rocketry.motorsim.visual.BurnPanel; import com.billkuker.rocketry.motorsim.visual.Chart; import com.billkuker.rocketry.motorsim.visual.Editor; import com.billkuker.rocketry.motorsim.visual.GrainPanel; -import com.billkuker.rocketry.motorsim.visual.NozzlePanel; +import com.billkuker.rocketry.motorsim.visual.HardwarePanel; public class MotorEditor extends JTabbedPane implements PropertyChangeListener { private static final long serialVersionUID = 1L; @@ -72,21 +78,17 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { Burn burn; private Vector burnWatchers = new Vector(); + private ComboBoxModel availableFuels; - private static final int XML_TAB = 0; - private static final int CASING_TAB = 1; - private static final int GRAIN_TAB = 2; - private static final int FUEL_TAB = 3; - private static final int BURN_TAB = 4; + //private static final int XML_TAB = 0; + private static final int CASING_TAB = 0; + private static final int GRAIN_TAB = 1; + private static final int BURN_TAB = 2; @SuppressWarnings("unchecked") private Class[] grainTypes = { CoredCylindricalGrain.class, Finocyl.class, Moonburner.class, RodAndTubeGrain.class, CSlot.class, EndBurner.class }; - @SuppressWarnings("unchecked") - private Class[] fuelTypes = { KNSB.class, KNSU.class, KNER.class, - KNDX.class, EditableFuel.class }; - private abstract class Chooser extends JPanel { private static final long serialVersionUID = 1L; private Class[] types; @@ -129,7 +131,7 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { public BurnTab() { setLayout(new BorderLayout()); - setName("Burn"); + setName("Simulation Results"); reBurn(); } @@ -188,7 +190,7 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { public GrainEditor(final Grain g) { super(JSplitPane.HORIZONTAL_SPLIT); - setName("Grain"); + setName("Grain Geometry"); setRightComponent(new GrainPanel(g)); if (g instanceof Grain.Composite) { final JPanel p = new JPanel(); @@ -229,67 +231,18 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { } } - private class FuelEditor extends JSplitPane { - private static final long serialVersionUID = 1L; - - public FuelEditor(Fuel f) { - super(JSplitPane.HORIZONTAL_SPLIT); - setName("Fuel"); - Chart burnRate; - try { - burnRate = new Chart(SI.MEGA(SI.PASCAL), - SI.METERS_PER_SECOND, f, "burnRate"); - } catch (NoSuchMethodException e) { - throw new Error(e); - } - burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf(0, SI - .MEGA(SI.PASCAL)), Amount.valueOf(11, SI.MEGA(SI.PASCAL)), - 20)); - - final JPanel p = new JPanel(); - p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); - - p.add(new Chooser(null, fuelTypes) { - private static final long serialVersionUID = 1L; - - @Override - protected void choiceMade(Fuel o) { - motor.setFuel(o); - removeTabAt(FUEL_TAB); - MotorEditor.this.add(new FuelEditor(motor.getFuel()), - FUEL_TAB); - setSelectedIndex(FUEL_TAB); - } - }); - p.add(new Editor(f)); - try { - p.add(new Editor(f.getCombustionProduct())); - } catch (Exception e) { - - } - - setLeftComponent(p); - setRightComponent(burnRate); - // setDividerLocation(.25); - // setResizeWeight(.25); - if (f instanceof ChangeListening.Subject) { - ((ChangeListening.Subject) f) - .addPropertyChangeListener(MotorEditor.this); - } - } - } - private class CaseEditor extends JSplitPane { private static final long serialVersionUID = 1L; public CaseEditor(Nozzle n, Chamber c) { super(JSplitPane.HORIZONTAL_SPLIT); - setName("Casing"); + setName("General Parameters"); JPanel parts = new JPanel(); parts.setLayout(new BoxLayout(parts, BoxLayout.Y_AXIS)); setLeftComponent(parts); - setRightComponent(new NozzlePanel(n)); + setRightComponent(new HardwarePanel(n, c)); + parts.add(new JLabel("Name:")); parts.add(new JTextField(motor.getName()) { private static final long serialVersionUID = 1L; { @@ -314,8 +267,18 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { } }); - + parts.add(new JLabel("Fuel:")); + parts.add( new JComboBox(availableFuels){{ + addActionListener(new ActionListener(){ + @Override + public void actionPerformed(ActionEvent e) { + motor.setFuel((Fuel)getSelectedItem()); + System.out.println("FUEL CHANGED"); + }}); + }}); + parts.add(new JLabel("Casing:")); parts.add(new Editor(c)); + parts.add(new JLabel("Nozzle:")); parts.add(new Editor(n)); if (n instanceof ChangeListening.Subject) { @@ -334,11 +297,12 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { } - public MotorEditor(Motor m) { + public MotorEditor(Motor m, ComboBoxModel fuels) { super(JTabbedPane.BOTTOM); + this.availableFuels = fuels; text.setName("XML"); text.setEditable(false); - add(text, XML_TAB); + //add(text, XML_TAB); setMotor(m, true); } @@ -367,7 +331,6 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { removeTabAt(1); add(new CaseEditor(motor.getNozzle(), motor.getChamber()), CASING_TAB); add(new GrainEditor(motor.getGrain()), GRAIN_TAB); - add(new FuelEditor(motor.getFuel()), FUEL_TAB); add(bt = new BurnTab(), BURN_TAB); } @@ -407,8 +370,6 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { setSelectedIndex(GRAIN_TAB); if (o instanceof Chamber || o instanceof Nozzle) setSelectedIndex(CASING_TAB); - if (o instanceof Fuel || o instanceof Fuel.CombustionProduct) - setSelectedIndex(FUEL_TAB); } public void addBurnWatcher(BurnWatcher bw) { @@ -430,7 +391,9 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { } catch (Exception e1) { e1.printStackTrace(); } - new MotorEditor(defaultMotor()).showAsWindow(); + Vector ff = new Vector(); + ff.add(new KNSU()); + //new MotorEditor(defaultMotor(), ff).showAsWindow(); } public void propertyChange(PropertyChangeEvent evt) { diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java index f256c51..4528b8a 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java @@ -10,9 +10,12 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Vector; import javax.swing.ButtonGroup; +import javax.swing.DefaultComboBoxModel; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; @@ -34,14 +37,27 @@ import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import com.billkuker.rocketry.motorsim.Burn; +import com.billkuker.rocketry.motorsim.Fuel; import com.billkuker.rocketry.motorsim.Motor; import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference; +import com.billkuker.rocketry.motorsim.fuel.EditableFuel; +import com.billkuker.rocketry.motorsim.fuel.KNDX; +import com.billkuker.rocketry.motorsim.fuel.KNER; +import com.billkuker.rocketry.motorsim.fuel.KNSB; +import com.billkuker.rocketry.motorsim.fuel.KNSU; import com.billkuker.rocketry.motorsim.io.ENGExporter; import com.billkuker.rocketry.motorsim.io.MotorIO; +import com.billkuker.rocketry.motorsim.visual.FuelPanel; import com.billkuker.rocketry.motorsim.visual.workbench.WorkbenchTreeModel.FuelEditNode; +import com.billkuker.rocketry.motorsim.visual.workbench.WorkbenchTreeModel.FuelNode; public class MotorWorkbench extends JFrame implements TreeSelectionListener { private static final long serialVersionUID = 1L; + + @SuppressWarnings("unchecked") + private Class[] fuelTypes = { KNSB.class, KNSU.class, KNER.class, + KNDX.class }; + private JPanel top; private JSplitPane split; private JTree tree; @@ -54,7 +70,9 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { private HashMap f2e = new HashMap(); private HashMap m2e = new HashMap(); - + + private DefaultComboBoxModel fuels = new DefaultComboBoxModel(); + public MotorWorkbench() { setTitle("MotorSim 1.0 RC1"); addMenu(); @@ -76,16 +94,31 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { tree.setCellRenderer(new WorkbenchTreeCellRenderer()); tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); - tree.setPreferredSize(new Dimension(200, 100)); + tree.setMinimumSize(new Dimension(200, 100)); // Listen for when the selection changes. tree.addTreeSelectionListener(this); split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane( tree), motors); - // split.setDividerLocation(.25); - // split.setResizeWeight(.25); + split.setDividerLocation(200); + split.setResizeWeight(0); + split.resetToPreferredSizes(); + split.revalidate(); + top.add(split, BorderLayout.CENTER); + + for ( Class f : fuelTypes){ + try { + addFuel(f.newInstance()); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); @@ -224,7 +257,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { - addFuel(); + newFuel(); } }); @@ -289,8 +322,18 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { }); } - private void addFuel(){ + private void addFuel(Fuel f){ + fuels.addElement(f); + FuelPanel fp = new FuelPanel(f); + FuelNode fn = tm.new FuelNode(fp, f); + tm.getFuels().add(fn); + tm.nodeStructureChanged(tm.getFuels()); + motors.addTab(f.getName(), fp); + } + + private void newFuel(){ final SRFuelEditor ed = new SRFuelEditor(); + fuels.addElement(ed.getFuel()); final FuelEditNode node = tm.new FuelEditNode(ed); tm.getFuels().add(node); tm.nodeStructureChanged(tm.getFuels()); @@ -319,7 +362,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { public void addMotor(Motor m, File f) { tm.addMotor(m); - MotorEditor e = new MotorEditor(m); + MotorEditor e = new MotorEditor(m, fuels); e.addBurnWatcher(mb); String title; if (f == null) { @@ -340,12 +383,9 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { allBurns.toFront(); } - if ( e.getPath().getLastPathComponent() instanceof FuelEditNode ){ - FuelEditNode fen = ((FuelEditNode)e.getPath().getLastPathComponent()); - SRFuelEditor ed = fen.getUserObject(); - for ( int i = 0 ; i < motors.getTabCount(); i++ ){ - motors.setSelectedComponent(ed); - } + if ( e.getPath().getLastPathComponent() instanceof FuelNode ){ + FuelNode fen = ((FuelNode)e.getPath().getLastPathComponent()); + motors.setSelectedComponent(fen.getUserObject()); } Motor m = getMotor(e.getPath()); diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java index 07b94a1..a3d31e5 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java @@ -8,6 +8,7 @@ import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.TextListener; +import java.beans.PropertyChangeEvent; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Collections; @@ -64,7 +65,7 @@ public class SRFuelEditor extends JSplitPane { } } - public class EditablePSRFuel extends PiecewiseSaintRobertFuel { + public static class EditablePSRFuel extends PiecewiseSaintRobertFuel { private Amount idealDensity = (Amount) Amount .valueOf("1 g/mm^3"); @@ -78,6 +79,10 @@ public class SRFuelEditor extends JSplitPane { cp = new EditableCombustionProduct(); } + public void clear(){ + super.clear(); + } + public void setType(Type t){ super.setType(t); } @@ -126,7 +131,7 @@ public class SRFuelEditor extends JSplitPane { } - EditablePSRFuel f = new EditablePSRFuel(SaintRobertFuel.Type.SI); + final EditablePSRFuel f = new EditablePSRFuel(SaintRobertFuel.Type.SI); private class TM extends AbstractTableModel { @@ -195,10 +200,12 @@ public class SRFuelEditor extends JSplitPane { } Collections.sort(entries); fireTableDataChanged(); - f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI); + //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(); @@ -302,11 +309,9 @@ public class SRFuelEditor extends JSplitPane { if ( si.isSelected() ){ System.err.println("SI"); f.setType(Type.SI); - RocketScience.UnitPreference.preference = UnitPreference.SI; } else { System.err.println("NONSI"); f.setType(Type.NONSI); - RocketScience.UnitPreference.preference = UnitPreference.NONSI; } update(); }}); diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java index e1b4355..ae3e3a6 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java @@ -10,6 +10,7 @@ import javax.swing.tree.DefaultTreeCellRenderer; import com.billkuker.rocketry.motorsim.Motor; import com.billkuker.rocketry.motorsim.Validating; import com.billkuker.rocketry.motorsim.Validating.ValidationException; +import com.billkuker.rocketry.motorsim.visual.workbench.WorkbenchTreeModel.FuelNode; public class WorkbenchTreeCellRenderer extends DefaultTreeCellRenderer { private static final long serialVersionUID = 1L; @@ -44,8 +45,8 @@ public class WorkbenchTreeCellRenderer extends DefaultTreeCellRenderer { if (part instanceof Motor) { setText(((Motor) part).getName()); - } else if ( part instanceof SRFuelEditor ){ - setText(((SRFuelEditor)part).getFuel().getName()); + } else if ( value instanceof FuelNode ){ + setText(((FuelNode)value).getFuel().getName()); } else if ( part instanceof String ) { setText((String)part); } else if ( part == null ) { diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java index 96999f7..8e6aaeb 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java @@ -1,5 +1,6 @@ package com.billkuker.rocketry.motorsim.visual.workbench; +import java.awt.Component; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Enumeration; @@ -10,6 +11,7 @@ import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; import com.billkuker.rocketry.motorsim.ChangeListening; +import com.billkuker.rocketry.motorsim.Fuel; import com.billkuker.rocketry.motorsim.Motor; import com.billkuker.rocketry.motorsim.grain.MultiGrain; @@ -39,11 +41,29 @@ public class WorkbenchTreeModel extends DefaultTreeModel { } } - public class FuelEditNode extends DefaultMutableTreeNode { + public class FuelNode extends DefaultMutableTreeNode{ + private static final long serialVersionUID = 1L; + Fuel f; + public FuelNode(Component c, Fuel f){ + super(c, false); + this.f = f; + } + + @Override + public Component getUserObject(){ + return (Component)super.getUserObject(); + } + + public Fuel getFuel(){ + return f; + } + } + + public class FuelEditNode extends FuelNode { private static final long serialVersionUID = 1L; public FuelEditNode(SRFuelEditor sr){ - super(sr, false); + super(sr, sr.getFuel()); sr.getFuel().addPropertyChangeListener(new PropertyChangeListener(){ @Override @@ -56,6 +76,7 @@ public class WorkbenchTreeModel extends DefaultTreeModel { public SRFuelEditor getUserObject(){ return (SRFuelEditor)super.getUserObject(); } + } public class PartNode extends DefaultMutableTreeNode implements PropertyChangeListener { @@ -92,7 +113,6 @@ public class WorkbenchTreeModel extends DefaultTreeModel { gn = new PartNode(m.getGrain()); } add(gn); - add( fn = new PartNode(m.getFuel())); if (m instanceof ChangeListening.Subject) { ((ChangeListening.Subject) m).addPropertyChangeListener(this); } @@ -105,14 +125,7 @@ public class WorkbenchTreeModel extends DefaultTreeModel { @Override public void propertyChange(PropertyChangeEvent e) { - if ( e.getPropertyName().equals("Fuel")){ - fn = new PartNode(motor.getFuel()); - remove(3); - add(fn); - nodesChanged(this, new int[]{3}); - } else { nodeChanged(this); - } super.propertyChange(e); } -- 2.30.2