1 package net.sf.openrocket.utils;
3 import java.io.FileInputStream;
4 import java.io.IOException;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.LinkedHashMap;
11 import net.sf.openrocket.file.motor.GeneralMotorLoader;
12 import net.sf.openrocket.motor.Motor;
13 import net.sf.openrocket.motor.ThrustCurveMotor;
14 import net.sf.openrocket.util.Pair;
16 public class GraphicalMotorSelector {
18 public static void main(String[] args) throws IOException {
20 if (args.length == 0) {
21 System.err.println("MotorPlot <files>");
26 Map<String, List<Pair<String, ThrustCurveMotor>>> map =
27 new LinkedHashMap<String, List<Pair<String, ThrustCurveMotor>>>();
29 GeneralMotorLoader loader = new GeneralMotorLoader();
30 for (String file : args) {
32 for (Motor motor : loader.load(new FileInputStream(file), file)) {
33 ThrustCurveMotor m = (ThrustCurveMotor) motor;
34 System.out.println("Loaded " + m + " from file " + file);
36 Pair<String, ThrustCurveMotor> pair = new Pair<String, ThrustCurveMotor>(file, m);
37 String key = m.getManufacturer() + ":" + m.getDesignation();
39 List<Pair<String, ThrustCurveMotor>> list = map.get(key);
41 list = new ArrayList<Pair<String, ThrustCurveMotor>>();
50 // Go through different motors
52 for (String key : map.keySet()) {
54 List<Pair<String, ThrustCurveMotor>> list = map.get(key);
57 // Select best one of identical motors
58 List<String> filenames = new ArrayList<String>();
59 List<ThrustCurveMotor> motors = new ArrayList<ThrustCurveMotor>();
60 for (Pair<String, ThrustCurveMotor> pair : list) {
61 String file = pair.getU();
62 ThrustCurveMotor m = pair.getV();
64 int index = indexOf(motors, m);
66 // Replace previous if this has more delays, a known type or longer comment
67 ThrustCurveMotor m2 = motors.get(index);
68 if (m.getStandardDelays().length > m2.getStandardDelays().length ||
69 (m2.getMotorType() == Motor.Type.UNKNOWN &&
70 m.getMotorType() != Motor.Type.UNKNOWN) ||
71 (m.getDescription().trim().length() >
72 m2.getDescription().trim().length())) {
74 filenames.set(index, file);
84 if (filenames.size() == 0) {
86 System.out.println("ERROR selecting from " + list);
89 } else if (filenames.size() == 1) {
91 select(filenames.get(0), list, false);
95 System.out.println("Choosing from " + filenames +
96 " (" + count + "/" + map.size() + ")");
97 MotorPlot plot = new MotorPlot(filenames, motors);
98 plot.setVisible(true);
100 int n = plot.getSelected();
102 System.out.println("NONE SELECTED from " + filenames);
104 select(filenames.get(n), list, true);
113 private static void select(String selected, List<Pair<String, ThrustCurveMotor>> list, boolean manual) {
114 System.out.print("SELECT " + selected + " ");
116 System.out.println("(manual)");
117 } else if (list.size() == 1) {
118 System.out.println("(only)");
120 System.out.println("(identical)");
123 for (Pair<String, ThrustCurveMotor> pair : list) {
124 String file = pair.getU();
125 if (!file.equals(selected)) {
126 System.out.println("IGNORE " + file);
132 private static int indexOf(List<ThrustCurveMotor> motors, ThrustCurveMotor motor) {
133 for (int i = 0; i < motors.size(); i++) {
134 ThrustCurveMotor m = motors.get(i);
136 if (m.equals(motor)) {
137 if (m.getStandardDelays().length == 0 || motor.getStandardDelays().length == 0 ||
138 Arrays.equals(m.getStandardDelays(), motor.getStandardDelays())) {