1 package net.sf.openrocket.utils;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.util.ArrayList;
9 import javax.swing.BorderFactory;
10 import javax.swing.JFrame;
11 import javax.swing.JPanel;
12 import javax.swing.JTabbedPane;
13 import javax.swing.JTextArea;
14 import javax.swing.SwingUtilities;
16 import net.miginfocom.swing.MigLayout;
17 import net.sf.openrocket.file.GeneralMotorLoader;
18 import net.sf.openrocket.motor.Motor;
19 import net.sf.openrocket.motor.ThrustCurveMotor;
20 import net.sf.openrocket.util.GUIUtil;
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.renderer.xy.XYLineAndShapeRenderer;
27 import org.jfree.data.xy.XYSeries;
28 import org.jfree.data.xy.XYSeriesCollection;
30 public class MotorPlot extends JFrame {
33 public MotorPlot(List<String> filenames, List<Motor> motors) {
35 JTabbedPane tabs = new JTabbedPane();
36 for (int i=0; i<filenames.size(); i++) {
37 JPanel pane = createPlotPanel((ThrustCurveMotor) motors.get(i));
38 tabs.addTab(filenames.get(i), pane);
43 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
44 this.setLocationByPlatform(true);
50 private JPanel createPlotPanel(ThrustCurveMotor motor) {
51 JPanel panel = new JPanel(new MigLayout());
54 XYSeries series = new XYSeries("", false, true);
55 double[] time = motor.getTimePoints();
56 double[] thrust = motor.getThrustPoints();
58 for (int i=0; i<time.length; i++) {
59 series.add(time[i], thrust[i]);
62 // Create the chart using the factory to get all default settings
63 JFreeChart chart = ChartFactory.createXYLineChart(
67 new XYSeriesCollection(series),
68 PlotOrientation.VERTICAL,
74 ((XYLineAndShapeRenderer)chart.getXYPlot().getRenderer()).setShapesVisible(true);
76 ChartPanel chartPanel = new ChartPanel(chart,
82 chartPanel.setMouseWheelEnabled(true);
83 chartPanel.setEnforceFileExtensions(true);
84 chartPanel.setInitialDelay(500);
86 chartPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
88 panel.add(chartPanel, "grow, wrap para");
91 JTextArea area = new JTextArea(5, 40);
92 StringBuilder sb = new StringBuilder();
93 sb.append("Designation: ").append(motor.getDesignation()).append(" ");
94 sb.append("Manufacturer: ").append(motor.getManufacturer()).append('\n');
95 sb.append("Comment:\n").append(motor.getDescription());
96 area.setText(sb.toString());
97 panel.add(area, "grow");
104 public static void main(String[] args) throws IOException {
105 if (args.length == 0) {
106 System.err.println("MotorPlot <files>");
110 final List<String> filenames = new ArrayList<String>();
111 final List<Motor> motors = new ArrayList<Motor>();
113 GeneralMotorLoader loader = new GeneralMotorLoader();
114 for (String file: args) {
115 for (Motor m: loader.load(new FileInputStream(file), file)) {
121 SwingUtilities.invokeLater(new Runnable() {
125 GUIUtil.setBestLAF();
127 MotorPlot plot = new MotorPlot(filenames, motors);
128 plot.setVisible(true);