(no commit message)
authorBill Kuker <bkuker@billkuker.com>
Sun, 24 Oct 2010 17:19:32 +0000 (17:19 +0000)
committerBill Kuker <bkuker@billkuker.com>
Sun, 24 Oct 2010 17:19:32 +0000 (17:19 +0000)
13 files changed:
src/com/billkuker/rocketry/motorsim/Chamber.java
src/com/billkuker/rocketry/motorsim/ConvergentDivergentNozzle.java
src/com/billkuker/rocketry/motorsim/CylindricalChamber.java
src/com/billkuker/rocketry/motorsim/fuel/PiecewiseSaintRobertFuel.java
src/com/billkuker/rocketry/motorsim/fuel/SaintRobertFuel.java
src/com/billkuker/rocketry/motorsim/visual/FuelPanel.java [new file with mode: 0644]
src/com/billkuker/rocketry/motorsim/visual/HardwarePanel.java [new file with mode: 0644]
src/com/billkuker/rocketry/motorsim/visual/NozzlePanel.java [deleted file]
src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java
src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java
src/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java
src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java
src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java

index 28c833e619e47ca681f8bd45a2fc31c486fd0a15..2b84c2d2e3d2dd0965ca9deb66ed009af32ffd7b 100644 (file)
@@ -1,5 +1,7 @@
 package com.billkuker.rocketry.motorsim;\r
 \r
+import java.awt.Shape;\r
+\r
 import javax.measure.quantity.Pressure;\r
 import javax.measure.quantity.Volume;\r
 \r
@@ -10,4 +12,5 @@ public interface Chamber {
        \r
        public Amount<Pressure> burstPressure();\r
        \r
+       public Shape chamberShape();\r
 }\r
index 2f10cb99d93a2a88f5c2379c93da251ae0b8c0f9..3d15550bb8b743f5da8d853bcd2e3795625ab512 100644 (file)
@@ -99,11 +99,12 @@ public class ConvergentDivergentNozzle implements Nozzle, Validating {
                s.append(new Line2D.Double(0,0,cDiff,-cDiff), true);\r
                \r
                s.transform(AffineTransform.getScaleInstance(-1, 1));\r
-               s.transform(AffineTransform.getTranslateInstance(-throatR, 0));\r
+               s.transform(AffineTransform.getTranslateInstance(-throatR * 2, 0));\r
                \r
                s.append(new Line2D.Double(0,0,diff,diff*3), false);\r
                s.append(new Line2D.Double(0,0,cDiff,-cDiff), true);\r
                \r
+               s.transform(AffineTransform.getTranslateInstance(throatR, cDiff));\r
                //a.add(new java.awt.geom.Area( new Ellipse2D.Double(0,0,5,5)));\r
                \r
                return s;\r
index 14e97aca2487893cdfb2927070e31f966056d5f3..d810008fa6ad2a49987b484ca527bc2d3be828f0 100644 (file)
@@ -1,5 +1,11 @@
 package com.billkuker.rocketry.motorsim;\r
 \r
+import java.awt.Shape;\r
+import java.awt.geom.Area;\r
+import java.awt.geom.Rectangle2D;\r
+import java.beans.PropertyChangeEvent;\r
+import java.beans.PropertyChangeListener;\r
+\r
 import javax.measure.quantity.Length;\r
 import javax.measure.quantity.Pressure;\r
 import javax.measure.quantity.Volume;\r
@@ -45,4 +51,21 @@ public class CylindricalChamber implements Chamber {
                this.oD = oD;\r
        }\r
 \r
+       @Override\r
+       public Shape chamberShape() {\r
+               double ir = iD.doubleValue(SI.MILLIMETER) / 2;\r
+               double or = oD.doubleValue(SI.MILLIMETER) / 2;\r
+               double lenmm = length.doubleValue(SI.MILLIMETER);\r
+               double thick = or-ir;\r
+\r
+               Rectangle2D.Double l,r,t;\r
+               l = new Rectangle2D.Double(-or,0,thick,lenmm);\r
+               r = new Rectangle2D.Double(ir, 0, thick, lenmm);\r
+               t = new Rectangle2D.Double(-or,0,or*2,thick);\r
+               Area a = new Area(l);\r
+               a.add(new Area(r));\r
+               a.add(new Area(t));\r
+               return a;\r
+       }\r
+\r
 }\r
index c2e968b046af4bf913fb421afb05125d3cfaa16d..30109bae00fdf74ef578c50e31e1048e83927168 100644 (file)
@@ -27,6 +27,10 @@ public abstract class PiecewiseSaintRobertFuel extends SaintRobertFuel {
        protected void add(Amount<Pressure> p, final double _a, final double _n){\r
                entries.put(p, new Entry(){{a = _a; n = _n;}});\r
        }\r
+       \r
+       protected void clear(){\r
+               entries.clear();\r
+       }\r
 \r
        @Override\r
        protected double burnrateCoefficient(Amount<Pressure> pressure) {\r
index 16612275387695724c640155f88c19a7e7afc2f9..93c440c178ccd4b64b398f3fec4a831616338460 100644 (file)
@@ -34,10 +34,12 @@ public abstract class SaintRobertFuel implements Fuel {
        private Type t = Type.SI;\r
        \r
        public SaintRobertFuel(Type t){\r
+               if ( t == null )\r
+                       throw new IllegalArgumentException("Type must be non-null");\r
                this.t = t;\r
        }\r
        \r
-       protected Type getType(){\r
+       public Type getType(){\r
                return t;\r
        }\r
        \r
@@ -68,4 +70,8 @@ public abstract class SaintRobertFuel implements Fuel {
        public String getName(){\r
                return this.getClass().getSimpleName();\r
        }\r
+       \r
+       public String toString(){\r
+               return getName();\r
+       }\r
 }\r
diff --git a/src/com/billkuker/rocketry/motorsim/visual/FuelPanel.java b/src/com/billkuker/rocketry/motorsim/visual/FuelPanel.java
new file mode 100644 (file)
index 0000000..2a9ca06
--- /dev/null
@@ -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<Pressure, Velocity> burnRate;
+               try {
+                       burnRate = new Chart<Pressure, Velocity>(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 (file)
index 0000000..0c35222
--- /dev/null
@@ -0,0 +1,103 @@
+package com.billkuker.rocketry.motorsim.visual;\r
+\r
+import java.awt.BasicStroke;\r
+import java.awt.Color;\r
+import java.awt.Graphics;\r
+import java.awt.Graphics2D;\r
+import java.awt.Rectangle;\r
+import java.awt.Shape;\r
+import java.awt.geom.Area;\r
+import java.beans.PropertyChangeEvent;\r
+import java.beans.PropertyChangeListener;\r
+\r
+import javax.measure.unit.SI;\r
+import javax.swing.JFrame;\r
+import javax.swing.JPanel;\r
+import javax.swing.WindowConstants;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.Chamber;\r
+import com.billkuker.rocketry.motorsim.ChangeListening;\r
+import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;\r
+import com.billkuker.rocketry.motorsim.CylindricalChamber;\r
+import com.billkuker.rocketry.motorsim.Nozzle;\r
+\r
+public class HardwarePanel extends JPanel {\r
+       private static final long serialVersionUID = 1L;\r
+       private Nozzle nozzle;\r
+       private Chamber chamber;\r
+       \r
+       public HardwarePanel(Nozzle n, Chamber c){\r
+               nozzle = n;\r
+               chamber = c;\r
+               if ( n instanceof ChangeListening.Subject ){\r
+                       ((ChangeListening.Subject)n).addPropertyChangeListener(new PropertyChangeListener(){\r
+                               public void propertyChange(PropertyChangeEvent evt) {\r
+                                       repaint();\r
+                               }\r
+                       });\r
+               }\r
+               if ( c instanceof ChangeListening.Subject ){\r
+                       ((ChangeListening.Subject)c).addPropertyChangeListener(new PropertyChangeListener(){\r
+                               public void propertyChange(PropertyChangeEvent evt) {\r
+                                       repaint();\r
+                               }\r
+                       });\r
+               }\r
+       }\r
+       \r
+       public void paint(Graphics g){\r
+               super.paint(g);\r
+               Graphics2D g2d = (Graphics2D)g;\r
+               g2d.translate(10, 10);\r
+\r
+               g2d.setColor(Color.black);\r
+               \r
+               Shape c = chamber.chamberShape();\r
+               \r
+               Shape n = nozzle.nozzleShape(((CylindricalChamber)chamber).getID());\r
+               \r
+               Rectangle cb = c.getBounds();\r
+               Rectangle nb = n.getBounds();\r
+               double w, h;\r
+               w = Math.max(cb.getWidth(), nb.getWidth());\r
+               h = cb.getHeight() + nb.getHeight();\r
+               \r
+               double mw, mh;\r
+               mw = getWidth() - 10;\r
+               mh = getHeight() - 10;\r
+               \r
+               double sw, sh, s;\r
+               sw = mw / w;\r
+               sh = mh / h;\r
+               s = Math.min(sw, sh);\r
+               \r
+               g2d.translate(0, -cb.getY() - 5);\r
+               g2d.scale(s, s);\r
+               g2d.translate(-cb.getX(), 0);\r
+               \r
+               g2d.setStroke(new BasicStroke(1));\r
+               g2d.draw( c );\r
+               g2d.translate(0, cb.getHeight());\r
+               \r
+               g2d.draw(n);\r
+       }\r
+       \r
+       public void showAsWindow(){\r
+               JFrame f = new JFrame();\r
+               f.setSize(220,250);\r
+               f.setContentPane(this);\r
+               f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
+               f.setVisible(true);\r
+       }\r
+       \r
+       public static void main(String args[]) throws Exception{\r
+               ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
+               CylindricalChamber c = new CylindricalChamber();\r
+               n.setThroatDiameter(Amount.valueOf(10, SI.MILLIMETER));\r
+               n.setExitDiameter(Amount.valueOf(20, SI.MILLIMETER));\r
+               //new Editor(n).showAsWindow();\r
+               new HardwarePanel(n,c).showAsWindow();\r
+       }\r
+}\r
diff --git a/src/com/billkuker/rocketry/motorsim/visual/NozzlePanel.java b/src/com/billkuker/rocketry/motorsim/visual/NozzlePanel.java
deleted file mode 100644 (file)
index ca88434..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.billkuker.rocketry.motorsim.visual;\r
-\r
-import java.awt.BasicStroke;\r
-import java.awt.Color;\r
-import java.awt.Graphics;\r
-import java.awt.Graphics2D;\r
-import java.awt.Rectangle;\r
-import java.awt.Shape;\r
-import java.beans.PropertyChangeEvent;\r
-import java.beans.PropertyChangeListener;\r
-\r
-import javax.measure.unit.SI;\r
-import javax.swing.JFrame;\r
-import javax.swing.JPanel;\r
-import javax.swing.WindowConstants;\r
-\r
-import org.jscience.physics.amount.Amount;\r
-\r
-import com.billkuker.rocketry.motorsim.ChangeListening;\r
-import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;\r
-import com.billkuker.rocketry.motorsim.Nozzle;\r
-\r
-public class NozzlePanel extends JPanel {\r
-       private static final long serialVersionUID = 1L;\r
-       private Nozzle nozzle;\r
-       public NozzlePanel(Nozzle n){\r
-               nozzle = n;\r
-               \r
-               if ( n instanceof ChangeListening.Subject ){\r
-                       ((ChangeListening.Subject)n).addPropertyChangeListener(new PropertyChangeListener(){\r
-                               public void propertyChange(PropertyChangeEvent evt) {\r
-                                       repaint();\r
-                               }\r
-                       });\r
-               }\r
-       }\r
-       \r
-       public void paint(Graphics g){\r
-               super.paint(g);\r
-               Graphics2D g2d = (Graphics2D)g;\r
-               g2d.translate(10, 10);\r
-\r
-               g2d.setColor(Color.black);\r
-               \r
-               \r
-               Shape a = nozzle.nozzleShape(Amount.valueOf(30, SI.MILLIMETER));\r
-               \r
-               Rectangle bounds = a.getBounds();\r
-               double max = bounds.getWidth();\r
-               if ( bounds.getHeight() > max )\r
-                       max = bounds.getHeight();\r
-               \r
-               g2d.scale(200 / max, 200 / max);\r
-               g2d.translate(-bounds.getX(), -bounds.getY());\r
-               \r
-               g2d.setStroke(new BasicStroke(4*(float)max/200f));\r
-               \r
-               g2d.draw( a );\r
-       }\r
-       \r
-       public void showAsWindow(){\r
-               JFrame f = new JFrame();\r
-               f.setSize(220,250);\r
-               f.setContentPane(this);\r
-               f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
-               f.setVisible(true);\r
-       }\r
-       \r
-       public static void main(String args[]) throws Exception{\r
-               ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
-               n.setThroatDiameter(Amount.valueOf(5, SI.MILLIMETER));\r
-               n.setExitDiameter(Amount.valueOf(9, SI.MILLIMETER));\r
-               new Editor(n).showAsWindow();\r
-               new NozzlePanel(n).showAsWindow();\r
-       }\r
-}\r
index 0e814e200f6ca69feaed45a15aede805abb0012b..ab60e82aba5b5e40a8e9f7f72cceea1815576d6c 100644 (file)
@@ -10,6 +10,8 @@ import java.beans.PropertyChangeListener;
 import java.beans.PropertyVetoException;\r
 import java.io.IOException;\r
 import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
 import java.util.Map;\r
 import java.util.Vector;\r
 \r
@@ -17,8 +19,11 @@ import javax.measure.quantity.Pressure;
 import javax.measure.quantity.Velocity;\r
 import javax.measure.unit.SI;\r
 import javax.swing.BoxLayout;\r
+import javax.swing.ComboBoxModel;\r
 import javax.swing.JButton;\r
+import javax.swing.JComboBox;\r
 import javax.swing.JFrame;\r
+import javax.swing.JLabel;\r
 import javax.swing.JPanel;\r
 import javax.swing.JProgressBar;\r
 import javax.swing.JSplitPane;\r
@@ -28,6 +33,7 @@ import javax.swing.JTextField;
 import javax.swing.SwingUtilities;\r
 import javax.swing.UIManager;\r
 import javax.swing.WindowConstants;\r
+import javax.swing.event.ListDataListener;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;\r
@@ -60,7 +66,7 @@ import com.billkuker.rocketry.motorsim.visual.BurnPanel;
 import com.billkuker.rocketry.motorsim.visual.Chart;\r
 import com.billkuker.rocketry.motorsim.visual.Editor;\r
 import com.billkuker.rocketry.motorsim.visual.GrainPanel;\r
-import com.billkuker.rocketry.motorsim.visual.NozzlePanel;\r
+import com.billkuker.rocketry.motorsim.visual.HardwarePanel;\r
 \r
 public class MotorEditor extends JTabbedPane implements PropertyChangeListener {\r
        private static final long serialVersionUID = 1L;\r
@@ -72,21 +78,17 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
        Burn burn;\r
 \r
        private Vector<BurnWatcher> burnWatchers = new Vector<BurnWatcher>();\r
+       private ComboBoxModel availableFuels;\r
 \r
-       private static final int XML_TAB = 0;\r
-       private static final int CASING_TAB = 1;\r
-       private static final int GRAIN_TAB = 2;\r
-       private static final int FUEL_TAB = 3;\r
-       private static final int BURN_TAB = 4;\r
+       //private static final int XML_TAB = 0;\r
+       private static final int CASING_TAB = 0;\r
+       private static final int GRAIN_TAB = 1;\r
+       private static final int BURN_TAB = 2;\r
 \r
        @SuppressWarnings("unchecked")\r
        private Class[] grainTypes = { CoredCylindricalGrain.class, Finocyl.class,\r
                        Moonburner.class, RodAndTubeGrain.class, CSlot.class, EndBurner.class };\r
 \r
-       @SuppressWarnings("unchecked")\r
-       private Class[] fuelTypes = { KNSB.class, KNSU.class, KNER.class,\r
-                       KNDX.class, EditableFuel.class };\r
-\r
        private abstract class Chooser<T> extends JPanel {\r
                private static final long serialVersionUID = 1L;\r
                private Class<? extends T>[] types;\r
@@ -129,7 +131,7 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
                \r
                public BurnTab() {\r
                        setLayout(new BorderLayout());\r
-                       setName("Burn");\r
+                       setName("Simulation Results");\r
                        reBurn();\r
                }\r
                \r
@@ -188,7 +190,7 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
 \r
                public GrainEditor(final Grain g) {\r
                        super(JSplitPane.HORIZONTAL_SPLIT);\r
-                       setName("Grain");\r
+                       setName("Grain Geometry");\r
                        setRightComponent(new GrainPanel(g));\r
                        if (g instanceof Grain.Composite) {\r
                                final JPanel p = new JPanel();\r
@@ -229,67 +231,18 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
                }\r
        }\r
 \r
-       private class FuelEditor extends JSplitPane {\r
-               private static final long serialVersionUID = 1L;\r
-\r
-               public FuelEditor(Fuel f) {\r
-                       super(JSplitPane.HORIZONTAL_SPLIT);\r
-                       setName("Fuel");\r
-                       Chart<Pressure, Velocity> burnRate;\r
-                       try {\r
-                               burnRate = new Chart<Pressure, Velocity>(SI.MEGA(SI.PASCAL),\r
-                                               SI.METERS_PER_SECOND, f, "burnRate");\r
-                       } catch (NoSuchMethodException e) {\r
-                               throw new Error(e);\r
-                       }\r
-                       burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf(0, SI\r
-                                       .MEGA(SI.PASCAL)), Amount.valueOf(11, SI.MEGA(SI.PASCAL)),\r
-                                       20));\r
-\r
-                       final JPanel p = new JPanel();\r
-                       p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));\r
-\r
-                       p.add(new Chooser<Fuel>(null, fuelTypes) {\r
-                               private static final long serialVersionUID = 1L;\r
-\r
-                               @Override\r
-                               protected void choiceMade(Fuel o) {\r
-                                       motor.setFuel(o);\r
-                                       removeTabAt(FUEL_TAB);\r
-                                       MotorEditor.this.add(new FuelEditor(motor.getFuel()),\r
-                                                       FUEL_TAB);\r
-                                       setSelectedIndex(FUEL_TAB);\r
-                               }\r
-                       });\r
-                       p.add(new Editor(f));\r
-                       try {\r
-                               p.add(new Editor(f.getCombustionProduct()));\r
-                       } catch (Exception e) {\r
-\r
-                       }\r
-\r
-                       setLeftComponent(p);\r
-                       setRightComponent(burnRate);\r
-                       // setDividerLocation(.25);\r
-                       // setResizeWeight(.25);\r
-                       if (f instanceof ChangeListening.Subject) {\r
-                               ((ChangeListening.Subject) f)\r
-                                               .addPropertyChangeListener(MotorEditor.this);\r
-                       }\r
-               }\r
-       }\r
-\r
        private class CaseEditor extends JSplitPane {\r
                private static final long serialVersionUID = 1L;\r
 \r
                public CaseEditor(Nozzle n, Chamber c) {\r
                        super(JSplitPane.HORIZONTAL_SPLIT);\r
-                       setName("Casing");\r
+                       setName("General Parameters");\r
                        JPanel parts = new JPanel();\r
                        parts.setLayout(new BoxLayout(parts, BoxLayout.Y_AXIS));\r
                        setLeftComponent(parts);\r
-                       setRightComponent(new NozzlePanel(n));\r
+                       setRightComponent(new HardwarePanel(n, c));\r
 \r
+                       parts.add(new JLabel("Name:"));\r
                        parts.add(new JTextField(motor.getName()) {\r
                                private static final long serialVersionUID = 1L;\r
                                {\r
@@ -314,8 +267,18 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
 \r
                                }\r
                        });\r
-\r
+                       parts.add(new JLabel("Fuel:"));\r
+                       parts.add( new JComboBox(availableFuels){{\r
+                               addActionListener(new ActionListener(){\r
+                                       @Override\r
+                                       public void actionPerformed(ActionEvent e) {\r
+                                               motor.setFuel((Fuel)getSelectedItem());\r
+                                               System.out.println("FUEL CHANGED");\r
+                                       }});\r
+                       }});\r
+                       parts.add(new JLabel("Casing:"));\r
                        parts.add(new Editor(c));\r
+                       parts.add(new JLabel("Nozzle:"));\r
                        parts.add(new Editor(n));\r
 \r
                        if (n instanceof ChangeListening.Subject) {\r
@@ -334,11 +297,12 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
 \r
        }\r
 \r
-       public MotorEditor(Motor m) {\r
+       public MotorEditor(Motor m, ComboBoxModel fuels) {\r
                super(JTabbedPane.BOTTOM);\r
+               this.availableFuels = fuels;\r
                text.setName("XML");\r
                text.setEditable(false);\r
-               add(text, XML_TAB);\r
+               //add(text, XML_TAB);\r
                setMotor(m, true);\r
        }\r
 \r
@@ -367,7 +331,6 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
                        removeTabAt(1);\r
                add(new CaseEditor(motor.getNozzle(), motor.getChamber()), CASING_TAB);\r
                add(new GrainEditor(motor.getGrain()), GRAIN_TAB);\r
-               add(new FuelEditor(motor.getFuel()), FUEL_TAB);\r
                add(bt = new BurnTab(), BURN_TAB);\r
        }\r
 \r
@@ -407,8 +370,6 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
                        setSelectedIndex(GRAIN_TAB);\r
                if (o instanceof Chamber || o instanceof Nozzle)\r
                        setSelectedIndex(CASING_TAB);\r
-               if (o instanceof Fuel || o instanceof Fuel.CombustionProduct)\r
-                       setSelectedIndex(FUEL_TAB);\r
        }\r
 \r
        public void addBurnWatcher(BurnWatcher bw) {\r
@@ -430,7 +391,9 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
                } catch (Exception e1) {\r
                        e1.printStackTrace();\r
                }\r
-               new MotorEditor(defaultMotor()).showAsWindow();\r
+               Vector<Fuel> ff = new Vector<Fuel>();\r
+               ff.add(new KNSU());\r
+               //new MotorEditor(defaultMotor(), ff).showAsWindow();\r
        }\r
 \r
        public void propertyChange(PropertyChangeEvent evt) {\r
index f256c51879ca451b8add1442fa41c72fde1e246e..4528b8ae0b4b6e3da9412e08b126a4a1a6b10d07 100644 (file)
@@ -10,9 +10,12 @@ import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;\r
 import java.io.File;\r
 import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
 import java.util.Vector;\r
 \r
 import javax.swing.ButtonGroup;\r
+import javax.swing.DefaultComboBoxModel;\r
 import javax.swing.JFileChooser;\r
 import javax.swing.JFrame;\r
 import javax.swing.JMenu;\r
@@ -34,14 +37,27 @@ import javax.swing.tree.TreePath;
 import javax.swing.tree.TreeSelectionModel;\r
 \r
 import com.billkuker.rocketry.motorsim.Burn;\r
+import com.billkuker.rocketry.motorsim.Fuel;\r
 import com.billkuker.rocketry.motorsim.Motor;\r
 import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;\r
+import com.billkuker.rocketry.motorsim.fuel.EditableFuel;\r
+import com.billkuker.rocketry.motorsim.fuel.KNDX;\r
+import com.billkuker.rocketry.motorsim.fuel.KNER;\r
+import com.billkuker.rocketry.motorsim.fuel.KNSB;\r
+import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
 import com.billkuker.rocketry.motorsim.io.ENGExporter;\r
 import com.billkuker.rocketry.motorsim.io.MotorIO;\r
+import com.billkuker.rocketry.motorsim.visual.FuelPanel;\r
 import com.billkuker.rocketry.motorsim.visual.workbench.WorkbenchTreeModel.FuelEditNode;\r
+import com.billkuker.rocketry.motorsim.visual.workbench.WorkbenchTreeModel.FuelNode;\r
 \r
 public class MotorWorkbench extends JFrame implements TreeSelectionListener {\r
        private static final long serialVersionUID = 1L;\r
+       \r
+       @SuppressWarnings("unchecked")\r
+       private Class[] fuelTypes = { KNSB.class, KNSU.class, KNER.class,\r
+                       KNDX.class };\r
+       \r
        private JPanel top;\r
        private JSplitPane split;\r
        private JTree tree;\r
@@ -54,7 +70,9 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
        private HashMap<File, MotorEditor> f2e = new HashMap<File, MotorEditor>();\r
 \r
        private HashMap<Motor, MotorEditor> m2e = new HashMap<Motor, MotorEditor>();\r
-\r
+       \r
+       private DefaultComboBoxModel fuels = new DefaultComboBoxModel();\r
+       \r
        public MotorWorkbench() {\r
                setTitle("MotorSim 1.0 RC1");\r
                addMenu();\r
@@ -76,16 +94,31 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
                tree.setCellRenderer(new WorkbenchTreeCellRenderer());\r
                tree.getSelectionModel().setSelectionMode(\r
                                TreeSelectionModel.SINGLE_TREE_SELECTION);\r
-               tree.setPreferredSize(new Dimension(200, 100));\r
+               tree.setMinimumSize(new Dimension(200, 100));\r
 \r
                // Listen for when the selection changes.\r
                tree.addTreeSelectionListener(this);\r
 \r
                split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(\r
                                tree), motors);\r
-               // split.setDividerLocation(.25);\r
-               // split.setResizeWeight(.25);\r
+               split.setDividerLocation(200);\r
+               split.setResizeWeight(0);\r
+               split.resetToPreferredSizes();\r
+               split.revalidate();\r
+               \r
                top.add(split, BorderLayout.CENTER);\r
+               \r
+               for ( Class<Fuel> f : fuelTypes){\r
+                       try {\r
+                               addFuel(f.newInstance());\r
+                       } catch (InstantiationException e) {\r
+                               // TODO Auto-generated catch block\r
+                               e.printStackTrace();\r
+                       } catch (IllegalAccessException e) {\r
+                               // TODO Auto-generated catch block\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
 \r
                setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);\r
                setVisible(true);\r
@@ -224,7 +257,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
                                                                addActionListener(new ActionListener() {\r
                                                                        @Override\r
                                                                        public void actionPerformed(ActionEvent arg0) {\r
-                                                                               addFuel();\r
+                                                                               newFuel();\r
                                                                        }\r
                                                                });\r
 \r
@@ -289,8 +322,18 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
                });\r
        }\r
        \r
-       private void addFuel(){\r
+       private void addFuel(Fuel f){\r
+               fuels.addElement(f);\r
+               FuelPanel fp = new FuelPanel(f);\r
+               FuelNode fn = tm.new FuelNode(fp, f);\r
+               tm.getFuels().add(fn);\r
+               tm.nodeStructureChanged(tm.getFuels());\r
+               motors.addTab(f.getName(), fp);\r
+       }\r
+       \r
+       private void newFuel(){\r
                final SRFuelEditor ed = new SRFuelEditor();\r
+               fuels.addElement(ed.getFuel());\r
                final FuelEditNode node = tm.new FuelEditNode(ed);\r
                tm.getFuels().add(node);\r
                tm.nodeStructureChanged(tm.getFuels());\r
@@ -319,7 +362,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
 \r
        public void addMotor(Motor m, File f) {\r
                tm.addMotor(m);\r
-               MotorEditor e = new MotorEditor(m);\r
+               MotorEditor e = new MotorEditor(m, fuels);\r
                e.addBurnWatcher(mb);\r
                String title;\r
                if (f == null) {\r
@@ -340,12 +383,9 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
                        allBurns.toFront();\r
                }\r
                \r
-               if ( e.getPath().getLastPathComponent() instanceof FuelEditNode ){\r
-                       FuelEditNode fen = ((FuelEditNode)e.getPath().getLastPathComponent());\r
-                       SRFuelEditor ed = fen.getUserObject();\r
-                       for ( int i = 0 ; i < motors.getTabCount(); i++ ){\r
-                               motors.setSelectedComponent(ed);\r
-                       }\r
+               if ( e.getPath().getLastPathComponent() instanceof FuelNode ){\r
+                       FuelNode fen = ((FuelNode)e.getPath().getLastPathComponent());\r
+                               motors.setSelectedComponent(fen.getUserObject());                       \r
                }\r
                \r
                Motor m = getMotor(e.getPath());\r
index 07b94a1cf2c145282af60b5de2d56c2b413950b2..a3d31e5870b734170c165c662de30d9e4a9cbb32 100644 (file)
@@ -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<VolumetricDensity> idealDensity = (Amount<VolumetricDensity>) 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();
                        }});
index e1b43553de6d74bd787a96f30f6b89ecd39d3cd3..ae3e3a6f84d65d51ed1b456ea3c040938d9d9c54 100644 (file)
@@ -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 ) {
index 96999f77de9352ab5544cafcd33397bdcc0f3c7e..8e6aaebbcd45203a322a71b6f2092e8d5eb8268b 100644 (file)
@@ -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);
                }