1 package com.billkuker.rocketry.motorsim.visual.workbench;
3 import java.awt.BorderLayout;
4 import java.util.HashMap;
6 import javax.measure.quantity.Duration;
7 import javax.measure.quantity.Force;
8 import javax.measure.unit.SI;
9 import javax.measure.unit.Unit;
10 import javax.swing.JFrame;
11 import javax.swing.JPanel;
12 import javax.swing.WindowConstants;
14 import org.jfree.chart.ChartFactory;
15 import org.jfree.chart.ChartPanel;
16 import org.jfree.chart.JFreeChart;
17 import org.jfree.chart.plot.PlotOrientation;
18 import org.jfree.data.xy.XYSeries;
19 import org.jfree.data.xy.XYSeriesCollection;
20 import org.jscience.physics.amount.Amount;
22 import com.billkuker.rocketry.motorsim.Burn;
23 import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;
24 import com.billkuker.rocketry.motorsim.Motor;
25 import com.billkuker.rocketry.motorsim.RocketScience;
27 public class MultiBurnChart extends JPanel implements BurnWatcher {
28 private static final long serialVersionUID = 1L;
30 private XYSeriesCollection dataset = new XYSeriesCollection();
32 private HashMap<Burn, XYSeries> burnToSeries = new HashMap<Burn, XYSeries>();
33 private Unit<Duration> time;
34 private Unit<Force> force;
36 @SuppressWarnings("unchecked")
37 public MultiBurnChart() {
38 this.setLayout(new BorderLayout());
39 time = RocketScience.UnitPreference.getUnitPreference()
40 .getPreferredUnit(SI.SECOND);
41 force = RocketScience.UnitPreference.getUnitPreference()
42 .getPreferredUnit(SI.NEWTON);
43 JFreeChart chart = ChartFactory.createXYLineChart(
45 time.toString(), // x-axis Label
46 force.toString(), // y-axis Label
47 dataset, PlotOrientation.VERTICAL, // Plot Orientation
49 true, // Use tool tips
50 false // Configure chart to generate URLs?
52 add(new ChartPanel(chart));
55 public void addBurn(Burn b) {
56 XYSeries s = createSeries(b);
57 burnToSeries.put(b, s);
61 private XYSeries createSeries(Burn b) {
62 XYSeries s = new XYSeries(b.getMotor().getName());
63 for( Burn.Interval i : b.getData().values() ){
64 s.add(i.time.doubleValue(time), i.thrust.doubleValue(force));
69 public void removeBurn(Burn b) {
70 XYSeries s = burnToSeries.get(b);
73 dataset.removeSeries(s);
76 public static void main(String args[]) throws Exception{
77 MultiBurnChart c = new MultiBurnChart();
79 JFrame f = new JFrame();
82 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
85 Motor m = MotorEditor.defaultMotor();
90 ((ConvergentDivergentNozzle)m.getNozzle()).setThroatDiameter(Amount.valueOf(3, SI.MILLIMETER));
91 c.addBurn(new Burn(m));
100 public void replace(Burn oldBurn, Burn newBurn) {