1 package net.sf.openrocket.gui.dialogs.motor.thrustcurve;
3 import java.awt.BasicStroke;
5 import java.awt.Rectangle;
6 import java.awt.Window;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
11 import javax.swing.JButton;
12 import javax.swing.JDialog;
13 import javax.swing.JPanel;
15 import net.miginfocom.swing.MigLayout;
16 import net.sf.openrocket.gui.util.GUIUtil;
17 import net.sf.openrocket.l10n.Translator;
18 import net.sf.openrocket.motor.ThrustCurveMotor;
19 import net.sf.openrocket.startup.Application;
20 import net.sf.openrocket.unit.UnitGroup;
22 import org.jfree.chart.ChartFactory;
23 import org.jfree.chart.ChartPanel;
24 import org.jfree.chart.JFreeChart;
25 import org.jfree.chart.plot.PlotOrientation;
26 import org.jfree.chart.plot.XYPlot;
27 import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
28 import org.jfree.data.xy.XYSeries;
29 import org.jfree.data.xy.XYSeriesCollection;
31 public class ThrustCurveMotorPlotDialog extends JDialog {
32 private static final Translator trans = Application.getTranslator();
34 public ThrustCurveMotorPlotDialog(List<ThrustCurveMotor> motors, int selected, Window parent) {
35 super(parent, "Motor thrust curves", ModalityType.APPLICATION_MODAL);
37 JPanel panel = new JPanel(new MigLayout("fill"));
40 JFreeChart chart = ChartFactory.createXYLineChart(
41 "Motor thrust curves", // title
42 "Time / " + UnitGroup.UNITS_SHORT_TIME.getDefaultUnit().getUnit(), // xAxisLabel
43 "Thrust / " + UnitGroup.UNITS_FORCE.getDefaultUnit().getUnit(), // yAxisLabel
45 PlotOrientation.VERTICAL,
52 // Add the data and formatting to the plot
53 XYPlot plot = chart.getXYPlot();
55 chart.setBackgroundPaint(panel.getBackground());
56 plot.setBackgroundPaint(Color.WHITE);
57 plot.setDomainGridlinePaint(Color.LIGHT_GRAY);
58 plot.setRangeGridlinePaint(Color.LIGHT_GRAY);
60 ChartPanel chartPanel = new ChartPanel(chart,
66 chartPanel.setMouseWheelEnabled(true);
67 chartPanel.setEnforceFileExtensions(true);
68 chartPanel.setInitialDelay(500);
70 StandardXYItemRenderer renderer = new StandardXYItemRenderer();
71 renderer.setBaseShapesVisible(true);
72 renderer.setBaseShapesFilled(true);
73 plot.setRenderer(renderer);
76 // Create the plot data set
77 XYSeriesCollection dataset = new XYSeriesCollection();
79 // Selected thrust curve
82 dataset.addSeries(generateSeries(motors.get(selected)));
83 renderer.setSeriesStroke(n, new BasicStroke(1.5f));
84 renderer.setSeriesPaint(n, ThrustCurveMotorSelectionPanel.getColor(selected));
88 // Other thrust curves
89 for (int i = 0; i < motors.size(); i++) {
93 ThrustCurveMotor m = motors.get(i);
94 dataset.addSeries(generateSeries(m));
95 renderer.setSeriesStroke(n, new BasicStroke(1.5f));
96 renderer.setSeriesPaint(n, ThrustCurveMotorSelectionPanel.getColor(i));
97 renderer.setSeriesShape(n, new Rectangle());
101 plot.setDataset(dataset);
103 panel.add(chartPanel, "width 600:600:, height 400:400:, grow, wrap para");
107 JButton close = new JButton(trans.get("dlg.but.close"));
108 close.addActionListener(new ActionListener() {
110 public void actionPerformed(ActionEvent e) {
111 ThrustCurveMotorPlotDialog.this.setVisible(false);
114 panel.add(close, "right, tag close");
120 GUIUtil.setDisposableDialogOptions(this, null);
124 private XYSeries generateSeries(ThrustCurveMotor motor) {
125 XYSeries series = new XYSeries(motor.getManufacturer() + " " + motor.getDesignation());
126 double[] time = motor.getTimePoints();
127 double[] thrust = motor.getThrustPoints();
129 for (int j = 0; j < time.length; j++) {
130 series.add(time[j], thrust[j]);