874518fcdfc3340350a38dbeedb4b245fdeedb8f
[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
6 import javax.measure.quantity.Duration;
7 import javax.measure.quantity.Pressure;
8 import javax.measure.unit.SI;
9 import javax.measure.unit.Unit;
10 import javax.swing.JPanel;
11
12 import org.jfree.chart.ChartFactory;
13 import org.jfree.chart.ChartPanel;
14 import org.jfree.chart.JFreeChart;
15 import org.jfree.chart.plot.PlotOrientation;
16 import org.jfree.data.xy.XYSeries;
17 import org.jfree.data.xy.XYSeriesCollection;
18
19 import com.billkuker.rocketry.motorsim.Burn;
20 import com.billkuker.rocketry.motorsim.RocketScience;
21
22 public class MultiMotorPressureChart extends JPanel implements BurnWatcher {
23         private static final long serialVersionUID = 1L;
24
25         private XYSeriesCollection dataset = new XYSeriesCollection();
26
27         private HashMap<Burn, XYSeries> burnToSeries = new HashMap<Burn, XYSeries>();
28         private Unit<Duration> time;
29         private Unit<Pressure> pressureUnit;
30
31         public MultiMotorPressureChart() {
32                 this.setLayout(new BorderLayout());
33                 time = RocketScience.UnitPreference.getUnitPreference()
34                                 .getPreferredUnit(SI.SECOND);
35                 pressureUnit = RocketScience.UnitPreference.getUnitPreference()
36                                 .getPreferredUnit(SI.PASCAL);
37                 JFreeChart chart = ChartFactory.createXYLineChart(
38                                 "", // Title
39                                 "Time (" + time.toString() + ")", // x-axis Label
40                                 "Pressure (" + pressureUnit.toString() + ")", // y-axis Label
41                                 dataset, PlotOrientation.VERTICAL, // Plot Orientation
42                                 true, // Show Legend
43                                 true, // Use tool tips
44                                 false // Configure chart to generate URLs?
45                                 );
46                 add(new ChartPanel(chart));
47         }
48
49         public void addBurn(Burn b) {
50                 XYSeries s = createSeries(b);
51                 burnToSeries.put(b, s);
52                 dataset.addSeries(s);
53         }
54
55         private XYSeries createSeries(Burn b) {
56                 XYSeries s = new XYSeries(b.getMotor().getName());
57                 for( Burn.Interval i : b.getData().values() ){
58                         s.add(i.time.doubleValue(time), i.chamberPressure.doubleValue(pressureUnit));
59                 }
60                 return s;
61         }
62
63         public void removeBurn(Burn b) {
64                 XYSeries s = burnToSeries.get(b);
65                 if (s == null)
66                         return;
67                 dataset.removeSeries(s);
68         }
69
70         @Override
71         public void replace(Burn oldBurn, Burn newBurn) {
72                 removeBurn(oldBurn);
73                 addBurn(newBurn);
74         }
75 }