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.GeneralMotorLoader;
12 import net.sf.openrocket.motor.Motor;
13 import net.sf.openrocket.util.Pair;
15 public class GraphicalMotorSelector {
17 public static void main(String[] args) throws IOException {
19 if (args.length == 0) {
20 System.err.println("MotorPlot <files>");
25 Map<String, List<Pair<String, Motor>>> map =
26 new LinkedHashMap<String, List<Pair<String, Motor>>>();
28 GeneralMotorLoader loader = new GeneralMotorLoader();
29 for (String file: args) {
31 for (Motor m: loader.load(new FileInputStream(file), file)) {
32 System.out.println("Loaded " + m + " from file "+file);
34 Pair<String, Motor> pair = new Pair<String, Motor>(file, m);
35 String key = m.getManufacturer() + ":" + m.getDesignation();
37 List<Pair<String, Motor>> list = map.get(key);
39 list = new ArrayList<Pair<String, Motor>>();
48 // Go through different motors
50 for (String key: map.keySet()) {
52 List<Pair<String, Motor>> list = map.get(key);
55 // Select best one of identical motors
56 List<String> filenames = new ArrayList<String>();
57 List<Motor> motors = new ArrayList<Motor>();
58 for (Pair<String, Motor> pair: list) {
59 String file = pair.getU();
60 Motor m = pair.getV();
62 int index = indexOf(motors, m);
64 // Replace previous if this has more delays, a known type or longer comment
65 Motor m2 = motors.get(index);
66 if (m.getStandardDelays().length > m2.getStandardDelays().length ||
67 (m2.getMotorType() == Motor.Type.UNKNOWN &&
68 m.getMotorType() != Motor.Type.UNKNOWN) ||
69 (m.getDescription().trim().length() >
70 m2.getDescription().trim().length())) {
72 filenames.set(index, file);
82 if (filenames.size() == 0) {
84 System.out.println("ERROR selecting from " + list);
87 } else if (filenames.size() == 1) {
89 select(filenames.get(0), list, false);
93 System.out.println("Choosing from " + filenames +
94 " (" + count + "/" + map.size() + ")");
95 MotorPlot plot = new MotorPlot(filenames, motors);
96 plot.setVisible(true);
98 int n = plot.getSelected();
100 System.out.println("NONE SELECTED from " + filenames);
102 select(filenames.get(n), list, true);
111 private static void select(String selected, List<Pair<String, Motor>> list, boolean manual) {
112 System.out.print("SELECT " + selected + " ");
114 System.out.println("(manual)");
115 } else if (list.size() == 1) {
116 System.out.println("(only)");
118 System.out.println("(identical)");
121 boolean started = false;
122 for (Pair<String, Motor> pair: list) {
123 String file = pair.getU();
124 if (!file.equals(selected)) {
125 System.out.println("IGNORE " + file);
131 private static int indexOf(List<Motor> motors, Motor motor) {
132 for (int i=0; i<motors.size(); i++) {
133 Motor m = motors.get(i);
134 if (m.similar(motor)) {
135 if (m.getStandardDelays().length == 0 || motor.getStandardDelays().length == 0 ||
136 Arrays.equals(m.getStandardDelays(), motor.getStandardDelays())) {