92d5286cf6cbb578e14b4ab5894024beccb0fa27
[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                 addModifier("optimization.modifier.nosecone.length", UnitGroup.UNITS_LENGTH, 1.0, NoseCone.class, "Length");
30                 addModifier("optimization.modifier.nosecone.diameter", UnitGroup.UNITS_LENGTH, 2.0, NoseCone.class, "AftRadius");
31                 addModifier("optimization.modifier.nosecone.thickness", UnitGroup.UNITS_LENGTH, 1.0, NoseCone.class, "Thickness");
32                 
33                 addModifier("optimization.modifier.transition.length", UnitGroup.UNITS_LENGTH, 1.0, Transition.class, "Length");
34                 addModifier("optimization.modifier.transition.forediameter", UnitGroup.UNITS_LENGTH, 2.0, Transition.class, "ForeRadius");
35                 addModifier("optimization.modifier.transition.aftdiameter", UnitGroup.UNITS_LENGTH, 2.0, Transition.class, "AftRadius");
36                 addModifier("optimization.modifier.transition.thickness", UnitGroup.UNITS_LENGTH, 1.0, Transition.class, "Thickness");
37                 
38                 addModifier("optimization.modifier.bodytube.length", UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, "Length");
39                 addModifier("optimization.modifier.bodytube.outerDiameter", UnitGroup.UNITS_LENGTH, 2.0, BodyTube.class, "OuterRadius");
40                 addModifier("optimization.modifier.bodytube.innerDiameter", UnitGroup.UNITS_LENGTH, 2.0, BodyTube.class, "InnerRadius");
41                 addModifier("optimization.modifier.bodytube.thickness", UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, "Thickness");
42                 
43
44         }
45         
46         private static void addModifier(String modifierNameKey, UnitGroup unitGroup, double multiplier,
47                                 Class<? extends RocketComponent> componentClass, String methodName) {
48                 
49                 List<ModifierDefinition> list = definitions.get(componentClass);
50                 if (list == null) {
51                         list = new ArrayList<DefaultSimulationModifierService.ModifierDefinition>();
52                         definitions.put(componentClass, list);
53                 }
54                 
55                 ModifierDefinition definition = new ModifierDefinition(modifierNameKey, unitGroup, multiplier, componentClass, methodName);
56                 list.add(definition);
57         }
58         
59         
60
61
62         @Override
63         public Collection<SimulationModifier> getModifiers(OpenRocketDocument document) {
64                 List<SimulationModifier> modifiers = new ArrayList<SimulationModifier>();
65                 
66                 Rocket rocket = document.getRocket();
67                 for (RocketComponent c : rocket) {
68                         
69                         // Attribute modifiers
70                         List<ModifierDefinition> list = definitions.get(c.getClass());
71                         if (list != null) {
72                                 for (ModifierDefinition def : list) {
73                                         SimulationModifier mod = new GenericComponentModifier(
74                                                         trans.get(def.modifierNameKey), c, def.unitGroup, def.multiplier, def.componentClass,
75                                                         c.getID(), def.methodName);
76                                         modifiers.add(mod);
77                                 }
78                         }
79                         
80                         // TODO: HIGH: Conditional modifiers (overrides)
81                         
82                         // TODO: Transition / Nose cone shape parameter (conditional)
83                 }
84                 
85                 return modifiers;
86         }
87         
88         
89
90         /*
91          * String modifierName, Object relatedObject, UnitGroup unitGroup,
92                         double multiplier, Class<? extends RocketComponent> componentClass, String componentId, String methodName
93          */
94
95         private static class ModifierDefinition {
96                 private final String modifierNameKey;
97                 private final UnitGroup unitGroup;
98                 private final double multiplier;
99                 private final Class<? extends RocketComponent> componentClass;
100                 private final String methodName;
101                 
102                 
103                 public ModifierDefinition(String modifierNameKey, UnitGroup unitGroup, double multiplier,
104                                 Class<? extends RocketComponent> componentClass, String methodName) {
105                         super();
106                         this.modifierNameKey = modifierNameKey;
107                         this.unitGroup = unitGroup;
108                         this.multiplier = multiplier;
109                         this.componentClass = componentClass;
110                         this.methodName = methodName;
111                 }
112                 
113         }
114 }