move gui to another source package
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / MultiBurnChart.java
1 package com.billkuker.rocketry.motorsim.visual.workbench;
2
3 import java.awt.BorderLayout;
4 import java.util.HashMap;
5
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;
13
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;
21
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;
26
27 public class MultiBurnChart extends JPanel implements BurnWatcher {
28         private static final long serialVersionUID = 1L;
29
30         private XYSeriesCollection dataset = new XYSeriesCollection();
31
32         private HashMap<Burn, XYSeries> burnToSeries = new HashMap<Burn, XYSeries>();
33         private Unit<Duration> time;
34         private Unit<Force> force;
35
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(
44                                 "", // Title
45                                 time.toString(), // x-axis Label
46                                 force.toString(), // y-axis Label
47                                 dataset, PlotOrientation.VERTICAL, // Plot Orientation
48                                 true, // Show Legend
49                                 true, // Use tool tips
50                                 false // Configure chart to generate URLs?
51                                 );
52                 add(new ChartPanel(chart));
53         }
54
55         public void addBurn(Burn b) {
56                 XYSeries s = createSeries(b);
57                 burnToSeries.put(b, s);
58                 dataset.addSeries(s);
59         }
60
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));
65                 }
66                 return s;
67         }
68
69         public void removeBurn(Burn b) {
70                 XYSeries s = burnToSeries.get(b);
71                 if (s == null)
72                         return;
73                 dataset.removeSeries(s);
74         }
75         
76         public static void main(String args[]) throws Exception{
77                 MultiBurnChart c = new MultiBurnChart();
78                 
79                 JFrame f = new JFrame();
80                 f.setSize(1024, 768);
81                 f.setContentPane(c);
82                 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
83                 f.setVisible(true);
84
85                 Motor m = MotorEditor.defaultMotor();
86                 Burn b = new Burn(m);
87                 c.addBurn(b);
88                 
89                 m.setName("Motor2");
90                 ((ConvergentDivergentNozzle)m.getNozzle()).setThroatDiameter(Amount.valueOf(3, SI.MILLIMETER));
91                 c.addBurn(new Burn(m));
92                 
93                 Thread.sleep(5000);
94                 
95                 c.removeBurn(b);
96                 
97         }
98
99         @Override
100         public void replace(Burn oldBurn, Burn newBurn) {
101                 removeBurn(oldBurn);
102                 addBurn(newBurn);
103         }
104 }