8eeba3295c09c6aa7c60f9dfa358cd5a3b5a3be2
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / MultiMotorPressureChart.java
1 package com.billkuker.rocketry.motorsim.visual.workbench;
2
3 import java.awt.BorderLayout;
4 import java.util.HashMap;
5 import java.util.HashSet;
6 import java.util.Set;
7
8 import javax.measure.quantity.Duration;
9 import javax.measure.quantity.Pressure;
10 import javax.measure.unit.SI;
11 import javax.measure.unit.Unit;
12 import javax.swing.JPanel;
13 import javax.swing.SwingUtilities;
14
15 import org.jfree.chart.ChartFactory;
16 import org.jfree.chart.ChartPanel;
17 import org.jfree.chart.JFreeChart;
18 import org.jfree.chart.plot.PlotOrientation;
19 import org.jfree.data.xy.XYSeries;
20 import org.jfree.data.xy.XYSeriesCollection;
21
22 import com.billkuker.rocketry.motorsim.Burn;
23 import com.billkuker.rocketry.motorsim.RocketScience;
24 import com.billkuker.rocketry.motorsim.RocketScience.UnitPreferenceListener;
25
26 public class MultiMotorPressureChart extends JPanel implements BurnWatcher {
27         private static final long serialVersionUID = 1L;
28
29         private XYSeriesCollection dataset = new XYSeriesCollection();
30
31         private HashMap<Burn, XYSeries> burnToSeries = new HashMap<Burn, XYSeries>();
32         private Unit<Duration> time;
33         private Unit<Pressure> pressureUnit;
34
35         public MultiMotorPressureChart() {
36                 this.setLayout(new BorderLayout());
37                 RocketScience.addUnitPreferenceListener(new UnitPreferenceListener() {
38                         @Override
39                         public void preferredUnitsChanged() {
40                                 SwingUtilities.invokeLater(new Runnable() {
41                                         @Override
42                                         public void run() {
43                                                 removeAll();
44                                                 dataset.removeAllSeries();
45                                                 Set<Burn> burns = new HashSet<Burn>();
46                                                 burns.addAll(burnToSeries.keySet());
47                                                 burnToSeries.clear();
48                                                 setup();        
49                                                 for ( Burn b : burns ){
50                                                         addBurn(b);
51                                                 }
52                                                 revalidate();
53                                         }
54                                 });
55                         }
56                 });
57                 setup();
58         }
59         
60         private void setup(){
61                 time = RocketScience.UnitPreference.getUnitPreference()
62                                 .getPreferredUnit(SI.SECOND);
63                 pressureUnit = RocketScience.UnitPreference.getUnitPreference()
64                                 .getPreferredUnit(SI.PASCAL);
65                 JFreeChart chart = ChartFactory.createXYLineChart(
66                                 "", // Title
67                                 "Time (" + time.toString() + ")", // x-axis Label
68                                 "Pressure (" + pressureUnit.toString() + ")", // y-axis Label
69                                 dataset, PlotOrientation.VERTICAL, // Plot Orientation
70                                 true, // Show Legend
71                                 true, // Use tool tips
72                                 false // Configure chart to generate URLs?
73                                 );
74                 add(new ChartPanel(chart));
75         }
76
77         public void addBurn(Burn b) {
78                 XYSeries s = createSeries(b);
79                 burnToSeries.put(b, s);
80                 dataset.addSeries(s);
81         }
82
83         private XYSeries createSeries(Burn b) {
84                 XYSeries s = new XYSeries(b.getMotor().getName());
85                 for( Burn.Interval i : b.getData().values() ){
86                         s.add(i.time.doubleValue(time), i.chamberPressure.doubleValue(pressureUnit));
87                 }
88                 return s;
89         }
90
91         public void removeBurn(Burn b) {
92                 XYSeries s = burnToSeries.get(b);
93                 if (s == null)
94                         return;
95                 dataset.removeSeries(s);
96         }
97
98         @Override
99         public void replace(Burn oldBurn, Burn newBurn) {
100                 removeBurn(oldBurn);
101                 addBurn(newBurn);
102         }
103 }