version 1.0.0
[debian/openrocket] / src / net / sf / openrocket / utils / MotorPlot.java
1 package net.sf.openrocket.utils;
2
3 import java.awt.Color;
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;
11
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;
20
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;
26
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;
34
35 public class MotorPlot extends JDialog {
36
37         private int selected = -1;
38         
39         public MotorPlot(List<String> filenames, List<Motor> motors) {
40                 super((JFrame)null, "Motor plot", true);
41                 
42                 JTabbedPane tabs = new JTabbedPane();
43                 for (int i=0; i<filenames.size(); i++) {
44                         JPanel pane = createPlotPanel((ThrustCurveMotor) motors.get(i));
45                         
46                         JButton button = new JButton("Select");
47                         final int number = i;
48                         button.addActionListener(new ActionListener() {
49                                 @Override
50                                 public void actionPerformed(ActionEvent e) {
51                                         selected = number;
52                                         MotorPlot.this.setVisible(false);
53                                 }
54                         });
55                         pane.add(button, "wrap", 0);
56                         
57                         tabs.addTab(filenames.get(i), pane);
58                 }
59                 
60                 this.add(tabs);
61                 
62                 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
63                 this.setLocationByPlatform(true);
64                 this.validate();
65                 this.pack();
66         }
67         
68         
69         private JPanel createPlotPanel(ThrustCurveMotor motor) {
70                 JPanel panel = new JPanel(new MigLayout());
71                 
72
73         XYSeries series = new XYSeries("", false, true);
74         double[] time = motor.getTimePoints();
75         double[] thrust = motor.getThrustPoints();
76                 
77         for (int i=0; i<time.length; i++) {
78                 series.add(time[i], thrust[i]);
79         }
80         
81                 // Create the chart using the factory to get all default settings
82         JFreeChart chart = ChartFactory.createXYLineChart(
83             "Motor thrust curve",
84             "Time / s", 
85             "Thrust / N", 
86             new XYSeriesCollection(series),
87             PlotOrientation.VERTICAL,
88             true,
89             true,
90             false
91         );
92         
93         ((XYLineAndShapeRenderer)chart.getXYPlot().getRenderer()).setShapesVisible(true);
94         
95                 ChartPanel chartPanel = new ChartPanel(chart,
96                                 false, // properties
97                                 true,  // save
98                                 false, // print
99                                 true,  // zoom
100                                 true); // tooltips
101                 chartPanel.setMouseWheelEnabled(true);
102                 chartPanel.setEnforceFileExtensions(true);
103                 chartPanel.setInitialDelay(500);
104                 
105                 chartPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
106                 
107                 panel.add(chartPanel, "grow, wrap para");
108         
109                 
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");
119                 
120                 
121                 return panel;
122         }
123         
124         
125         
126         public int getSelected() {
127                 return selected;
128         }
129
130
131         public static void main(String[] args) throws IOException {
132                 if (args.length == 0) {
133                         System.err.println("MotorPlot <files>");
134                         System.exit(1);
135                 }
136                 
137                 final List<String> filenames = new ArrayList<String>();
138                 final List<Motor> motors = new ArrayList<Motor>();
139                 
140                 GeneralMotorLoader loader = new GeneralMotorLoader();
141                 for (String file: args) {
142                         for (Motor m: loader.load(new FileInputStream(file), file)) {
143                                 filenames.add(file);
144                                 motors.add(m);
145                         }
146                 }
147                 
148                 SwingUtilities.invokeLater(new Runnable() {
149
150                         @Override
151                         public void run() {
152                                 GUIUtil.setBestLAF();
153                                 
154                                 MotorPlot plot = new MotorPlot(filenames, motors);
155                                 plot.setVisible(true);
156                         }
157                         
158                 });
159                 
160         }
161         
162         
163         
164         
165 }