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.motor.ThrustCurveMotor;
17 import net.sf.openrocket.unit.UnitGroup;
18 import net.sf.openrocket.util.GUIUtil;
20 import org.jfree.chart.ChartFactory;
21 import org.jfree.chart.ChartPanel;
22 import org.jfree.chart.JFreeChart;
23 import org.jfree.chart.plot.PlotOrientation;
24 import org.jfree.chart.plot.XYPlot;
25 import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
26 import org.jfree.data.xy.XYSeries;
27 import org.jfree.data.xy.XYSeriesCollection;
29 public class ThrustCurveMotorPlotDialog extends JDialog {
31 public ThrustCurveMotorPlotDialog(List<ThrustCurveMotor> motors, int selected, Window parent) {
32 super(parent, "Motor thrust curves", ModalityType.APPLICATION_MODAL);
34 JPanel panel = new JPanel(new MigLayout("fill"));
37 JFreeChart chart = ChartFactory.createXYLineChart(
38 "Motor thrust curves", // title
39 "Time / " + UnitGroup.UNITS_SHORT_TIME.getDefaultUnit().getUnit(), // xAxisLabel
40 "Thrust / " + UnitGroup.UNITS_FORCE.getDefaultUnit().getUnit(), // yAxisLabel
42 PlotOrientation.VERTICAL,
49 // Add the data and formatting to the plot
50 XYPlot plot = chart.getXYPlot();
52 chart.setBackgroundPaint(panel.getBackground());
53 plot.setBackgroundPaint(Color.WHITE);
54 plot.setDomainGridlinePaint(Color.LIGHT_GRAY);
55 plot.setRangeGridlinePaint(Color.LIGHT_GRAY);
57 ChartPanel chartPanel = new ChartPanel(chart,
63 chartPanel.setMouseWheelEnabled(true);
64 chartPanel.setEnforceFileExtensions(true);
65 chartPanel.setInitialDelay(500);
67 StandardXYItemRenderer renderer = new StandardXYItemRenderer();
68 renderer.setBaseShapesVisible(true);
69 renderer.setBaseShapesFilled(true);
70 plot.setRenderer(renderer);
73 // Create the plot data set
74 XYSeriesCollection dataset = new XYSeriesCollection();
76 // Selected thrust curve
79 dataset.addSeries(generateSeries(motors.get(selected)));
80 renderer.setSeriesStroke(n, new BasicStroke(1.5f));
81 renderer.setSeriesPaint(n, ThrustCurveMotorSelectionPanel.getColor(selected));
85 // Other thrust curves
86 for (int i = 0; i < motors.size(); i++) {
90 ThrustCurveMotor m = motors.get(i);
91 dataset.addSeries(generateSeries(m));
92 renderer.setSeriesStroke(n, new BasicStroke(1.5f));
93 renderer.setSeriesPaint(n, ThrustCurveMotorSelectionPanel.getColor(i));
94 renderer.setSeriesShape(n, new Rectangle());
98 plot.setDataset(dataset);
100 panel.add(chartPanel, "width 600:600:, height 400:400:, grow, wrap para");
104 JButton close = new JButton("Close");
105 close.addActionListener(new ActionListener() {
107 public void actionPerformed(ActionEvent e) {
108 ThrustCurveMotorPlotDialog.this.setVisible(false);
111 panel.add(close, "right, tag close");
117 GUIUtil.setDisposableDialogOptions(this, null);
121 private XYSeries generateSeries(ThrustCurveMotor motor) {
122 XYSeries series = new XYSeries(motor.getManufacturer() + " " + motor.getDesignation());
123 double[] time = motor.getTimePoints();
124 double[] thrust = motor.getThrustPoints();
126 for (int j = 0; j < time.length; j++) {
127 series.add(time[j], thrust[j]);