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.GeneralMotorLoader;
23 import net.sf.openrocket.motor.Motor;
24 import net.sf.openrocket.motor.ThrustCurveMotor;
25 import net.sf.openrocket.util.GUIUtil;
27 import org.jfree.chart.ChartFactory;
28 import org.jfree.chart.ChartPanel;
29 import org.jfree.chart.JFreeChart;
30 import org.jfree.chart.plot.PlotOrientation;
31 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
32 import org.jfree.data.xy.XYSeries;
33 import org.jfree.data.xy.XYSeriesCollection;
35 public class MotorPlot extends JDialog {
37 private int selected = -1;
39 public MotorPlot(List<String> filenames, List<Motor> motors) {
40 super((JFrame)null, "Motor plot", true);
42 JTabbedPane tabs = new JTabbedPane();
43 for (int i=0; i<filenames.size(); i++) {
44 JPanel pane = createPlotPanel((ThrustCurveMotor) motors.get(i));
46 JButton button = new JButton("Select");
48 button.addActionListener(new ActionListener() {
50 public void actionPerformed(ActionEvent e) {
52 MotorPlot.this.setVisible(false);
55 pane.add(button, "wrap", 0);
57 tabs.addTab(filenames.get(i), pane);
62 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
63 this.setLocationByPlatform(true);
69 private JPanel createPlotPanel(ThrustCurveMotor motor) {
70 JPanel panel = new JPanel(new MigLayout());
73 XYSeries series = new XYSeries("", false, true);
74 double[] time = motor.getTimePoints();
75 double[] thrust = motor.getThrustPoints();
77 for (int i=0; i<time.length; i++) {
78 series.add(time[i], thrust[i]);
81 // Create the chart using the factory to get all default settings
82 JFreeChart chart = ChartFactory.createXYLineChart(
86 new XYSeriesCollection(series),
87 PlotOrientation.VERTICAL,
93 ((XYLineAndShapeRenderer)chart.getXYPlot().getRenderer()).setShapesVisible(true);
95 ChartPanel chartPanel = new ChartPanel(chart,
101 chartPanel.setMouseWheelEnabled(true);
102 chartPanel.setEnforceFileExtensions(true);
103 chartPanel.setInitialDelay(500);
105 chartPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
107 panel.add(chartPanel, "grow, wrap para");
110 JTextArea area = new JTextArea(5, 40);
111 StringBuilder sb = new StringBuilder();
112 sb.append("Designation: ").append(motor.getDesignation()).append(" ");
113 sb.append("Manufacturer: ").append(motor.getManufacturer()).append(" ");
114 sb.append("Type: ").append(motor.getMotorType()).append('\n');
115 sb.append("Delays: ").append(Arrays.toString(motor.getStandardDelays())).append('\n');
116 sb.append("Comment:\n").append(motor.getDescription());
117 area.setText(sb.toString());
118 panel.add(area, "grow, wrap");
126 public int getSelected() {
131 public static void main(String[] args) throws IOException {
132 if (args.length == 0) {
133 System.err.println("MotorPlot <files>");
137 final List<String> filenames = new ArrayList<String>();
138 final List<Motor> motors = new ArrayList<Motor>();
140 GeneralMotorLoader loader = new GeneralMotorLoader();
141 for (String file: args) {
142 for (Motor m: loader.load(new FileInputStream(file), file)) {
148 SwingUtilities.invokeLater(new Runnable() {
152 GUIUtil.setBestLAF();
154 MotorPlot plot = new MotorPlot(filenames, motors);
155 plot.setVisible(true);