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);
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.
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");
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");
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");
51 private static void addModifier(String modifierNameKey, UnitGroup unitGroup, double multiplier,
52 Class<? extends RocketComponent> componentClass, String methodName) {
54 List<ModifierDefinition> list = definitions.get(componentClass);
56 list = new ArrayList<DefaultSimulationModifierService.ModifierDefinition>();
57 definitions.put(componentClass, list);
60 ModifierDefinition definition = new ModifierDefinition(modifierNameKey, unitGroup, multiplier, componentClass, methodName);
68 public Collection<SimulationModifier> getModifiers(OpenRocketDocument document) {
69 List<SimulationModifier> modifiers = new ArrayList<SimulationModifier>();
71 Rocket rocket = document.getRocket();
72 for (RocketComponent c : rocket) {
74 // Attribute modifiers
75 List<ModifierDefinition> list = definitions.get(c.getClass());
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);
85 // TODO: HIGH: Conditional modifiers (overrides)
87 // TODO: Transition / Nose cone shape parameter (conditional)
96 * String modifierName, Object relatedObject, UnitGroup unitGroup,
97 double multiplier, Class<? extends RocketComponent> componentClass, String componentId, String methodName
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;
108 public ModifierDefinition(String modifierNameKey, UnitGroup unitGroup, double multiplier,
109 Class<? extends RocketComponent> componentClass, String methodName) {
111 this.modifierNameKey = modifierNameKey;
112 this.unitGroup = unitGroup;
113 this.multiplier = multiplier;
114 this.componentClass = componentClass;
115 this.methodName = methodName;