release 0.9.6
[debian/openrocket] / src / net / sf / openrocket / utils / MotorPlot.java
1 package net.sf.openrocket.utils;
2
3 import java.awt.Color;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.util.ArrayList;
7 import java.util.List;
8
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;
15
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;
21
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;
29
30 public class MotorPlot extends JFrame {
31
32         
33         public MotorPlot(List<String> filenames, List<Motor> motors) {
34                 
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);
39                 }
40                 
41                 this.add(tabs);
42                 
43                 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
44                 this.setLocationByPlatform(true);
45                 this.validate();
46                 this.pack();
47         }
48         
49         
50         private JPanel createPlotPanel(ThrustCurveMotor motor) {
51                 JPanel panel = new JPanel(new MigLayout());
52                 
53
54         XYSeries series = new XYSeries("", false, true);
55         double[] time = motor.getTimePoints();
56         double[] thrust = motor.getThrustPoints();
57                 
58         for (int i=0; i<time.length; i++) {
59                 series.add(time[i], thrust[i]);
60         }
61         
62                 // Create the chart using the factory to get all default settings
63         JFreeChart chart = ChartFactory.createXYLineChart(
64             "Motor thrust curve",
65             "Time / s", 
66             "Thrust / N", 
67             new XYSeriesCollection(series),
68             PlotOrientation.VERTICAL,
69             true,
70             true,
71             false
72         );
73         
74         ((XYLineAndShapeRenderer)chart.getXYPlot().getRenderer()).setShapesVisible(true);
75         
76                 ChartPanel chartPanel = new ChartPanel(chart,
77                                 false, // properties
78                                 true,  // save
79                                 false, // print
80                                 true,  // zoom
81                                 true); // tooltips
82                 chartPanel.setMouseWheelEnabled(true);
83                 chartPanel.setEnforceFileExtensions(true);
84                 chartPanel.setInitialDelay(500);
85                 
86                 chartPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
87                 
88                 panel.add(chartPanel, "grow, wrap para");
89         
90                 
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");
98                 
99                 
100                 return panel;
101         }
102         
103         
104         public static void main(String[] args) throws IOException {
105                 if (args.length == 0) {
106                         System.err.println("MotorPlot <files>");
107                         System.exit(1);
108                 }
109                 
110                 final List<String> filenames = new ArrayList<String>();
111                 final List<Motor> motors = new ArrayList<Motor>();
112                 
113                 GeneralMotorLoader loader = new GeneralMotorLoader();
114                 for (String file: args) {
115                         for (Motor m: loader.load(new FileInputStream(file), file)) {
116                                 filenames.add(file);
117                                 motors.add(m);
118                         }
119                 }
120                 
121                 SwingUtilities.invokeLater(new Runnable() {
122
123                         @Override
124                         public void run() {
125                                 GUIUtil.setBestLAF();
126                                 
127                                 MotorPlot plot = new MotorPlot(filenames, motors);
128                                 plot.setVisible(true);
129                         }
130                         
131                 });
132                 
133         }
134         
135         
136         
137         
138 }