1 package com.billkuker.rocketry.motorsim.visual.workbench;
3 import java.awt.BorderLayout;
4 import java.util.HashMap;
5 import java.util.HashSet;
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;
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;
22 import com.billkuker.rocketry.motorsim.Burn;
23 import com.billkuker.rocketry.motorsim.RocketScience;
24 import com.billkuker.rocketry.motorsim.RocketScience.UnitPreferenceListener;
26 public class MultiMotorPressureChart extends JPanel implements BurnWatcher {
27 private static final long serialVersionUID = 1L;
29 private XYSeriesCollection dataset = new XYSeriesCollection();
31 private HashMap<Burn, XYSeries> burnToSeries = new HashMap<Burn, XYSeries>();
32 private Unit<Duration> time;
33 private Unit<Pressure> pressureUnit;
35 public MultiMotorPressureChart() {
36 this.setLayout(new BorderLayout());
37 RocketScience.addUnitPreferenceListener(new UnitPreferenceListener() {
39 public void preferredUnitsChanged() {
40 SwingUtilities.invokeLater(new Runnable() {
44 dataset.removeAllSeries();
45 Set<Burn> burns = new HashSet<Burn>();
46 burns.addAll(burnToSeries.keySet());
49 for ( Burn b : burns ){
61 time = RocketScience.UnitPreference.getUnitPreference()
62 .getPreferredUnit(SI.SECOND);
63 pressureUnit = RocketScience.UnitPreference.getUnitPreference()
64 .getPreferredUnit(SI.PASCAL);
65 JFreeChart chart = ChartFactory.createXYLineChart(
67 "Time (" + time.toString() + ")", // x-axis Label
68 "Pressure (" + pressureUnit.toString() + ")", // y-axis Label
69 dataset, PlotOrientation.VERTICAL, // Plot Orientation
71 true, // Use tool tips
72 false // Configure chart to generate URLs?
74 add(new ChartPanel(chart));
77 public void addBurn(Burn b) {
78 XYSeries s = createSeries(b);
79 burnToSeries.put(b, s);
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));
91 public void removeBurn(Burn b) {
92 XYSeries s = burnToSeries.get(b);
95 dataset.removeSeries(s);
99 public void replace(Burn oldBurn, Burn newBurn) {