From: Bill Kuker Date: Thu, 13 Aug 2009 01:34:22 +0000 (+0000) Subject: Added multi burn window X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=d7c2d860d5d37081b4324a644b81a1d597e16a4b;p=sw%2Fmotorsim Added multi burn window --- diff --git a/src/MotorSim.java b/src/MotorSim.java new file mode 100644 index 0000000..6f1a07f --- /dev/null +++ b/src/MotorSim.java @@ -0,0 +1,26 @@ +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class MotorSim { + + public static void main(String args[]) throws Exception { + + try { + System.setProperty("apple.laf.useScreenMenuBar", "true"); + System.setProperty( + "com.apple.mrj.application.apple.menu.about.name", + "MotorSim"); + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e1) { + e1.printStackTrace(); + } + SwingUtilities.invokeLater(new Runnable(){ + @Override + public void run() { + new com.billkuker.rocketry.motorsim.visual.workbench.MotorWorkbench().setVisible(true); + } + }); + + } + +} diff --git a/src/MotorWorkbench.java b/src/MotorWorkbench.java deleted file mode 100644 index 716ac06..0000000 --- a/src/MotorWorkbench.java +++ /dev/null @@ -1,26 +0,0 @@ -import javax.swing.SwingUtilities; -import javax.swing.UIManager; - -public class MotorWorkbench { - - public static void main(String args[]) throws Exception { - - try { - System.setProperty("apple.laf.useScreenMenuBar", "true"); - System.setProperty( - "com.apple.mrj.application.apple.menu.about.name", - "MotorWorkbench"); - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception e1) { - e1.printStackTrace(); - } - SwingUtilities.invokeLater(new Runnable(){ - @Override - public void run() { - new com.billkuker.rocketry.motorsim.visual.workbench.MotorWorkbench().setVisible(true); - } - }); - - } - -} diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/BurnWatcher.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/BurnWatcher.java new file mode 100644 index 0000000..7301cbd --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/BurnWatcher.java @@ -0,0 +1,7 @@ +package com.billkuker.rocketry.motorsim.visual.workbench; + +import com.billkuker.rocketry.motorsim.Burn; + +public interface BurnWatcher { + public void replace( Burn oldBurn, Burn newBurn); +} diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java index 315f643..369e441 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java @@ -10,6 +10,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; import java.io.IOException; +import java.util.Vector; import javax.measure.quantity.Pressure; import javax.measure.quantity.Velocity; @@ -63,6 +64,9 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { Motor motor; GrainEditor grainEditor; BurnTab bt; + Burn burn; + + private Vector burnWatchers = new Vector(); private static final int XML_TAB = 0; private static final int CASING_TAB = 1; @@ -133,6 +137,10 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { remove(bar); add(bp, BorderLayout.CENTER); + for( BurnWatcher bw : burnWatchers ) + bw.replace(burn, b); + burn = b; + revalidate(); } }); @@ -371,6 +379,10 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { if (o instanceof Fuel || o instanceof Fuel.CombustionProduct) setSelectedIndex(FUEL_TAB); } + + public void addBurnWatcher(BurnWatcher bw){ + burnWatchers.add(bw); + } @Deprecated public void showAsWindow() { diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java index 7708305..f1f0f20 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java @@ -39,6 +39,8 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { private JTree tree; private JTabbedPane motors; private WorkbenchTreeModel tm; + private MultiBurnChart mb; + private JFrame allBurns; private HashMap e2f = new HashMap(); private HashMap f2e = new HashMap(); @@ -46,12 +48,19 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { private HashMap m2e = new HashMap(); public MotorWorkbench() { - setTitle("MotorWorkbench"); + setTitle("MotorSim 1.0 RC1"); addMenu(); setSize(1024, 768); top = new JPanel(new BorderLayout()); setContentPane(top); - + + mb = new MultiBurnChart(); + allBurns = new JFrame(); + allBurns.setSize(800, 600); + setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); + allBurns.add(mb); + allBurns.setVisible(true); + motors = new JTabbedPane(); tree = new JTree(tm = new WorkbenchTreeModel()); @@ -69,7 +78,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { // split.setResizeWeight(.25); top.add(split, BorderLayout.CENTER); - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } @@ -142,6 +151,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { f2e.remove(e2f.get(e)); e2f.remove(e); m2e.remove(e.getMotor()); + mb.removeBurn(e.burn); } }); } @@ -238,6 +248,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { public void addMotor(Motor m, File f) { tm.addMotor(m); MotorEditor e = new MotorEditor(m); + e.addBurnWatcher(mb); String title; if (f == null) { title = "New Motor"; @@ -252,6 +263,11 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { @Override public void valueChanged(TreeSelectionEvent e) { + if ( e.getPath().getLastPathComponent() == tm.getRoot() ){ + allBurns.setVisible(true); + allBurns.toFront(); + } + Motor m = getMotor(e.getPath()); if ( m == null ) @@ -264,6 +280,8 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { .getLastPathComponent()).getUserObject(); m2e.get(m).focusOnObject(o); } + + } private Motor getMotor(TreePath p) { diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/MultiBurnChart.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/MultiBurnChart.java new file mode 100644 index 0000000..365a8d6 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/MultiBurnChart.java @@ -0,0 +1,106 @@ +package com.billkuker.rocketry.motorsim.visual.workbench; + +import java.awt.BorderLayout; +import java.util.HashMap; + +import javax.measure.quantity.Duration; +import javax.measure.quantity.Force; +import javax.measure.unit.SI; +import javax.measure.unit.Unit; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.WindowConstants; +import javax.swing.plaf.multi.MultiButtonUI; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Burn; +import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle; +import com.billkuker.rocketry.motorsim.Motor; +import com.billkuker.rocketry.motorsim.RocketScience; +import com.billkuker.rocketry.motorsim.grain.MultiGrain; + +public class MultiBurnChart extends JPanel implements BurnWatcher { + + private XYSeriesCollection dataset = new XYSeriesCollection(); + + private HashMap burnToSeries = new HashMap(); + private Unit time; + private Unit force; + + @SuppressWarnings("unchecked") + public MultiBurnChart() { + this.setLayout(new BorderLayout()); + time = RocketScience.UnitPreference.preference + .getPreferredUnit(SI.SECOND); + force = RocketScience.UnitPreference.preference + .getPreferredUnit(SI.NEWTON); + JFreeChart chart = ChartFactory.createXYLineChart( + "Burns", // Title + time.toString(), // x-axis Label + force.toString(), // y-axis Label + dataset, PlotOrientation.VERTICAL, // Plot Orientation + true, // Show Legend + true, // Use tool tips + false // Configure chart to generate URLs? + ); + add(new ChartPanel(chart)); + } + + public void addBurn(Burn b) { + XYSeries s = createSeries(b); + burnToSeries.put(b, s); + dataset.addSeries(s); + } + + private XYSeries createSeries(Burn b) { + XYSeries s = new XYSeries(b.getMotor().getName()); + Amount low = Amount.valueOf(1, SI.NEWTON); + for( Burn.Interval i : b.getData().values() ){ + s.add(i.time.doubleValue(time), i.thrust.doubleValue(force)); + } + return s; + } + + public void removeBurn(Burn b) { + XYSeries s = burnToSeries.get(b); + if (s == null) + return; + dataset.removeSeries(s); + } + + public static void main(String args[]) throws Exception{ + MultiBurnChart c = new MultiBurnChart(); + + JFrame f = new JFrame(); + f.setSize(1024, 768); + f.setContentPane(c); + f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + f.setVisible(true); + + Motor m = MotorEditor.defaultMotor(); + Burn b = new Burn(m); + c.addBurn(b); + + m.setName("Motor2"); + ((ConvergentDivergentNozzle)m.getNozzle()).setThroatDiameter(Amount.valueOf(3, SI.MILLIMETER)); + c.addBurn(new Burn(m)); + + Thread.sleep(5000); + + c.removeBurn(b); + + } + + @Override + public void replace(Burn oldBurn, Burn newBurn) { + removeBurn(oldBurn); + addBurn(newBurn); + } +} diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java index 7acf3f7..03d85c3 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java @@ -44,6 +44,8 @@ public class WorkbenchTreeCellRenderer extends DefaultTreeCellRenderer { if (part instanceof Motor) { setText(((Motor) part).getName()); + } else if ( part instanceof String ) { + setText((String)part); } else if ( part == null ) { setText(""); } else { diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java index 85a0942..db6b523 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java @@ -95,7 +95,7 @@ public class WorkbenchTreeModel extends DefaultTreeModel { } public WorkbenchTreeModel() { - super(new DefaultMutableTreeNode(), true); + super(new DefaultMutableTreeNode("All Motors"), true); } @Override