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
\r
public Amount<Pressure> burstPressure();\r
\r
+ public Shape chamberShape();\r
}\r
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
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
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
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
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
public String getName(){\r
return this.getClass().getSimpleName();\r
}\r
+ \r
+ public String toString(){\r
+ return getName();\r
+ }\r
}\r
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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
+++ /dev/null
-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
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
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
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
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
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
\r
public BurnTab() {\r
setLayout(new BorderLayout());\r
- setName("Burn");\r
+ setName("Simulation Results");\r
reBurn();\r
}\r
\r
\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
}\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
\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
\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
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
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
} 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
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
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
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
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
addActionListener(new ActionListener() {\r
@Override\r
public void actionPerformed(ActionEvent arg0) {\r
- addFuel();\r
+ newFuel();\r
}\r
});\r
\r
});\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
\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
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
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;
}
}
- public class EditablePSRFuel extends PiecewiseSaintRobertFuel {
+ public static class EditablePSRFuel extends PiecewiseSaintRobertFuel {
private Amount<VolumetricDensity> idealDensity = (Amount<VolumetricDensity>) Amount
.valueOf("1 g/mm^3");
cp = new EditableCombustionProduct();
}
+ public void clear(){
+ super.clear();
+ }
+
public void setType(Type t){
super.setType(t);
}
}
- EditablePSRFuel f = new EditablePSRFuel(SaintRobertFuel.Type.SI);
+ final EditablePSRFuel f = new EditablePSRFuel(SaintRobertFuel.Type.SI);
private class TM extends AbstractTableModel {
}
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();
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();
}});
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;
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 ) {
package com.billkuker.rocketry.motorsim.visual.workbench;
+import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Enumeration;
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;
}
}
- 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
public SRFuelEditor getUserObject(){
return (SRFuelEditor)super.getUserObject();
}
+
}
public class PartNode extends DefaultMutableTreeNode implements PropertyChangeListener {
gn = new PartNode(m.getGrain());
}
add(gn);
- add( fn = new PartNode(m.getFuel()));
if (m instanceof ChangeListening.Subject) {
((ChangeListening.Subject) m).addPropertyChangeListener(this);
}
@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);
}