1 package net.sf.openrocket.optimization.services;
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.HashMap;
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;
21 public class DefaultSimulationModifierService implements SimulationModifierService {
23 private static final Translator trans = Application.getTranslator();
25 private static final Map<Class<?>, List<ModifierDefinition>> definitions = new HashMap<Class<?>, List<ModifierDefinition>>();
27 //addModifier("optimization.modifier.", unitGroup, multiplier, componentClass, methodName);
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");
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");
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");
46 private static void addModifier(String modifierNameKey, UnitGroup unitGroup, double multiplier,
47 Class<? extends RocketComponent> componentClass, String methodName) {
49 List<ModifierDefinition> list = definitions.get(componentClass);
51 list = new ArrayList<DefaultSimulationModifierService.ModifierDefinition>();
52 definitions.put(componentClass, list);
55 ModifierDefinition definition = new ModifierDefinition(modifierNameKey, unitGroup, multiplier, componentClass, methodName);
63 public Collection<SimulationModifier> getModifiers(OpenRocketDocument document) {
64 List<SimulationModifier> modifiers = new ArrayList<SimulationModifier>();
66 Rocket rocket = document.getRocket();
67 for (RocketComponent c : rocket) {
69 // Attribute modifiers
70 List<ModifierDefinition> list = definitions.get(c.getClass());
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);
80 // TODO: HIGH: Conditional modifiers (overrides)
82 // TODO: Transition / Nose cone shape parameter (conditional)
91 * String modifierName, Object relatedObject, UnitGroup unitGroup,
92 double multiplier, Class<? extends RocketComponent> componentClass, String componentId, String methodName
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;
103 public ModifierDefinition(String modifierNameKey, UnitGroup unitGroup, double multiplier,
104 Class<? extends RocketComponent> componentClass, String methodName) {
106 this.modifierNameKey = modifierNameKey;
107 this.unitGroup = unitGroup;
108 this.multiplier = multiplier;
109 this.componentClass = componentClass;
110 this.methodName = methodName;