977cd1866dc5d8242a86ad4b09231705bdfa8f99
[debian/openrocket] / src / net / sf / openrocket / optimization / services / DefaultSimulationModifierService.java
1 package net.sf.openrocket.optimization.services;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8
9 import net.sf.openrocket.document.OpenRocketDocument;
10 import net.sf.openrocket.l10n.Translator;
11 import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier;
12 import net.sf.openrocket.optimization.rocketoptimization.modifiers.GenericComponentModifier;
13 import net.sf.openrocket.rocketcomponent.BodyTube;
14 import net.sf.openrocket.rocketcomponent.NoseCone;
15 import net.sf.openrocket.rocketcomponent.Rocket;
16 import net.sf.openrocket.rocketcomponent.RocketComponent;
17 import net.sf.openrocket.rocketcomponent.Transition;
18 import net.sf.openrocket.startup.Application;
19 import net.sf.openrocket.unit.UnitGroup;
20
21 public class DefaultSimulationModifierService implements SimulationModifierService {
22         
23         private static final Translator trans = Application.getTranslator();
24         
25         private static final Map<Class<?>, List<ModifierDefinition>> definitions = new HashMap<Class<?>, List<ModifierDefinition>>();
26         static {
27                 //addModifier("optimization.modifier.", unitGroup, multiplier, componentClass, methodName);
28                 
29                 /*
30                  * Note:  Each component type must contain only mutually exclusive variables.
31                  * For example, body tube does not have inner diameter definition because it is
32                  * defined by the outer diameter and thickness.
33                  */
34
35                 addModifier("optimization.modifier.nosecone.length", UnitGroup.UNITS_LENGTH, 1.0, NoseCone.class, "Length");
36                 addModifier("optimization.modifier.nosecone.diameter", UnitGroup.UNITS_LENGTH, 2.0, NoseCone.class, "AftRadius");
37                 addModifier("optimization.modifier.nosecone.thickness", UnitGroup.UNITS_LENGTH, 1.0, NoseCone.class, "Thickness");
38                 
39                 addModifier("optimization.modifier.transition.length", UnitGroup.UNITS_LENGTH, 1.0, Transition.class, "Length");
40                 addModifier("optimization.modifier.transition.forediameter", UnitGroup.UNITS_LENGTH, 2.0, Transition.class, "ForeRadius");
41                 addModifier("optimization.modifier.transition.aftdiameter", UnitGroup.UNITS_LENGTH, 2.0, Transition.class, "AftRadius");
42                 addModifier("optimization.modifier.transition.thickness", UnitGroup.UNITS_LENGTH, 1.0, Transition.class, "Thickness");
43                 
44                 addModifier("optimization.modifier.bodytube.length", UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, "Length");
45                 addModifier("optimization.modifier.bodytube.outerDiameter", UnitGroup.UNITS_LENGTH, 2.0, BodyTube.class, "OuterRadius");
46                 addModifier("optimization.modifier.bodytube.thickness", UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, "Thickness");
47                 
48
49         }
50         
51         private static void addModifier(String modifierNameKey, UnitGroup unitGroup, double multiplier,
52                                 Class<? extends RocketComponent> componentClass, String methodName) {
53                 
54                 List<ModifierDefinition> list = definitions.get(componentClass);
55                 if (list == null) {
56                         list = new ArrayList<DefaultSimulationModifierService.ModifierDefinition>();
57                         definitions.put(componentClass, list);
58                 }
59                 
60                 ModifierDefinition definition = new ModifierDefinition(modifierNameKey, unitGroup, multiplier, componentClass, methodName);
61                 list.add(definition);
62         }
63         
64         
65
66
67         @Override
68         public Collection<SimulationModifier> getModifiers(OpenRocketDocument document) {
69                 List<SimulationModifier> modifiers = new ArrayList<SimulationModifier>();
70                 
71                 Rocket rocket = document.getRocket();
72                 for (RocketComponent c : rocket) {
73                         
74                         // Attribute modifiers
75                         List<ModifierDefinition> list = definitions.get(c.getClass());
76                         if (list != null) {
77                                 for (ModifierDefinition def : list) {
78                                         SimulationModifier mod = new GenericComponentModifier(
79                                                         trans.get(def.modifierNameKey), c, def.unitGroup, def.multiplier, def.componentClass,
80                                                         c.getID(), def.methodName);
81                                         modifiers.add(mod);
82                                 }
83                         }
84                         
85                         // TODO: HIGH: Conditional modifiers (overrides)
86                         
87                         // TODO: Transition / Nose cone shape parameter (conditional)
88                 }
89                 
90                 return modifiers;
91         }
92         
93         
94
95         /*
96          * String modifierName, Object relatedObject, UnitGroup unitGroup,
97                         double multiplier, Class<? extends RocketComponent> componentClass, String componentId, String methodName
98          */
99
100         private static class ModifierDefinition {
101                 private final String modifierNameKey;
102                 private final UnitGroup unitGroup;
103                 private final double multiplier;
104                 private final Class<? extends RocketComponent> componentClass;
105                 private final String methodName;
106                 
107                 
108                 public ModifierDefinition(String modifierNameKey, UnitGroup unitGroup, double multiplier,
109                                 Class<? extends RocketComponent> componentClass, String methodName) {
110                         super();
111                         this.modifierNameKey = modifierNameKey;
112                         this.unitGroup = unitGroup;
113                         this.multiplier = multiplier;
114                         this.componentClass = componentClass;
115                         this.methodName = methodName;
116                 }
117                 
118         }
119 }