1 package net.sf.openrocket.utils;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.io.FileInputStream;
7 import java.io.IOException;
8 import java.util.ArrayList;
9 import java.util.Arrays;
10 import java.util.List;
12 import javax.swing.BorderFactory;
13 import javax.swing.JButton;
14 import javax.swing.JDialog;
15 import javax.swing.JFrame;
16 import javax.swing.JPanel;
17 import javax.swing.JTabbedPane;
18 import javax.swing.JTextArea;
19 import javax.swing.SwingUtilities;
21 import net.miginfocom.swing.MigLayout;
22 import net.sf.openrocket.file.motor.GeneralMotorLoader;
23 import net.sf.openrocket.gui.util.GUIUtil;
24 import net.sf.openrocket.l10n.Translator;
25 import net.sf.openrocket.motor.Motor;
26 import net.sf.openrocket.motor.ThrustCurveMotor;
27 import net.sf.openrocket.startup.Application;
29 import org.jfree.chart.ChartFactory;
30 import org.jfree.chart.ChartPanel;
31 import org.jfree.chart.JFreeChart;
32 import org.jfree.chart.plot.PlotOrientation;
33 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
34 import org.jfree.data.xy.XYSeries;
35 import org.jfree.data.xy.XYSeriesCollection;
37 public class MotorPlot extends JDialog {
39 private int selected = -1;
40 private static final Translator trans = Application.getTranslator();
42 public MotorPlot(List<String> filenames, List<ThrustCurveMotor> motors) {
44 super((JFrame) null, trans.get("MotorPlot.title.Motorplot"), true);
46 JTabbedPane tabs = new JTabbedPane();
47 for (int i = 0; i < filenames.size(); i++) {
48 JPanel pane = createPlotPanel((ThrustCurveMotor) motors.get(i));
51 JButton button = new JButton(trans.get("MotorPlot.but.Select"));
53 button.addActionListener(new ActionListener() {
55 public void actionPerformed(ActionEvent e) {
57 MotorPlot.this.setVisible(false);
60 pane.add(button, "wrap", 0);
62 tabs.addTab(filenames.get(i), pane);
67 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
68 this.setLocationByPlatform(true);
74 private JPanel createPlotPanel(ThrustCurveMotor motor) {
75 JPanel panel = new JPanel(new MigLayout());
78 XYSeries series = new XYSeries("", false, true);
79 double[] time = motor.getTimePoints();
80 double[] thrust = motor.getThrustPoints();
82 for (int i = 0; i < time.length; i++) {
83 series.add(time[i], thrust[i]);
86 // Create the chart using the factory to get all default settings
87 JFreeChart chart = ChartFactory.createXYLineChart(
88 //// Motor thrust curve
89 trans.get("MotorPlot.Chart.Motorthrustcurve"),
91 trans.get("MotorPlot.Chart.Time"),
93 trans.get("MotorPlot.Chart.Thrust"),
94 new XYSeriesCollection(series),
95 PlotOrientation.VERTICAL,
101 ((XYLineAndShapeRenderer) chart.getXYPlot().getRenderer()).setShapesVisible(true);
103 ChartPanel chartPanel = new ChartPanel(chart,
109 chartPanel.setMouseWheelEnabled(true);
110 chartPanel.setEnforceFileExtensions(true);
111 chartPanel.setInitialDelay(500);
113 chartPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
115 panel.add(chartPanel, "grow, wrap para");
118 JTextArea area = new JTextArea(5, 40);
119 StringBuilder sb = new StringBuilder();
121 sb.append("MotorPlot.txt.Designation" + " ").append(motor.getDesignation()).append(" ");
123 sb.append("MotorPlot.txt.Manufacturer" + " ").append(motor.getManufacturer()).append(" ");
125 sb.append("MotorPlot.txt.Type" + " ").append(motor.getMotorType()).append('\n');
127 sb.append("MotorPlot.txt.Delays" +" ").append(Arrays.toString(motor.getStandardDelays())).append('\n');
129 sb.append("MotorPlot.txt.Comment" + " ").append(motor.getDescription());
130 area.setText(sb.toString());
131 panel.add(area, "grow, wrap");
139 public int getSelected() {
144 public static void main(String[] args) throws IOException {
145 if (args.length == 0) {
146 System.err.println("MotorPlot <files>");
150 final List<String> filenames = new ArrayList<String>();
151 final List<ThrustCurveMotor> motors = new ArrayList<ThrustCurveMotor>();
153 GeneralMotorLoader loader = new GeneralMotorLoader();
154 for (String file : args) {
155 for (Motor m : loader.load(new FileInputStream(file), file)) {
157 motors.add((ThrustCurveMotor) m);
161 SwingUtilities.invokeLater(new Runnable() {
165 GUIUtil.setBestLAF();
167 MotorPlot plot = new MotorPlot(filenames, motors);
168 plot.setVisible(true);