version 1.0.0
[debian/openrocket] / src / net / sf / openrocket / utils / GraphicalMotorSelector.java
1 package net.sf.openrocket.utils;
2
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;
8 import java.util.List;
9 import java.util.Map;
10
11 import net.sf.openrocket.file.GeneralMotorLoader;
12 import net.sf.openrocket.motor.Motor;
13 import net.sf.openrocket.util.Pair;
14
15 public class GraphicalMotorSelector {
16         
17         public static void main(String[] args) throws IOException {
18
19                 if (args.length == 0) {
20                         System.err.println("MotorPlot <files>");
21                         System.exit(1);
22                 }
23                 
24                 // Load files
25                 Map<String, List<Pair<String, Motor>>> map = 
26                         new LinkedHashMap<String, List<Pair<String, Motor>>>(); 
27                 
28                 GeneralMotorLoader loader = new GeneralMotorLoader();
29                 for (String file: args) {
30
31                         for (Motor m: loader.load(new FileInputStream(file), file)) {
32                                 System.out.println("Loaded " + m + " from file "+file);
33                                 
34                                 Pair<String, Motor> pair = new Pair<String, Motor>(file, m);
35                                 String key = m.getManufacturer() + ":" + m.getDesignation();
36                                 
37                                 List<Pair<String, Motor>> list = map.get(key);
38                                 if (list == null) {
39                                         list = new ArrayList<Pair<String, Motor>>();
40                                         map.put(key, list);
41                                 }
42                                 
43                                 list.add(pair);
44                         }
45                 }
46                 
47                 
48                 // Go through different motors
49                 int count = 0;
50                 for (String key: map.keySet()) {
51                         count++;
52                         List<Pair<String, Motor>> list = map.get(key);
53                         
54                         
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();
61                                 
62                                 int index = indexOf(motors, m);
63                                 if (index >= 0) {
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())) {
71                                                 
72                                                 filenames.set(index, file);
73                                                 motors.set(index, m);
74                                                 
75                                         }
76                                 } else {
77                                         filenames.add(file);
78                                         motors.add(m);
79                                 }
80                         }
81                         
82                         if (filenames.size() == 0) {
83                                 
84                                 System.out.println("ERROR selecting from " + list);
85                                 System.exit(1);
86                                 
87                         } else if (filenames.size() == 1) {
88                                 
89                                 select(filenames.get(0), list, false);
90                                 
91                         } else {
92                                 
93                                 System.out.println("Choosing from " + filenames + 
94                                                 " (" + count + "/" + map.size() + ")");
95                                 MotorPlot plot = new MotorPlot(filenames, motors);
96                                 plot.setVisible(true);
97                                 plot.dispose();
98                                 int n = plot.getSelected();
99                                 if (n < 0) {
100                                         System.out.println("NONE SELECTED from " + filenames);
101                                 } else {
102                                         select(filenames.get(n), list, true);
103                                 }
104
105                         }
106                         
107                 }
108
109         }
110         
111         private static void select(String selected, List<Pair<String, Motor>> list, boolean manual) {
112                 System.out.print("SELECT " + selected + " ");
113                 if (manual) {
114                         System.out.println("(manual)");
115                 } else if (list.size() == 1) {
116                         System.out.println("(only)");
117                 } else {
118                         System.out.println("(identical)");
119                 }
120                 
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);
126                         }
127                 }
128         }
129
130         
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())) {
137                                         return i;
138                                 }
139                         }
140                 }
141                 return -1;
142         }
143 }