e009f863770a0a415d47c5c3af53aa1396dd8e05
[debian/openrocket] / core / src / net / sf / openrocket / file / openrocket / savers / RocketComponentSaver.java
1 package net.sf.openrocket.file.openrocket.savers;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6 import java.util.Locale;
7
8 import net.sf.openrocket.file.RocketSaver;
9 import net.sf.openrocket.material.Material;
10 import net.sf.openrocket.motor.Motor;
11 import net.sf.openrocket.motor.ThrustCurveMotor;
12 import net.sf.openrocket.preset.ComponentPreset;
13 import net.sf.openrocket.rocketcomponent.ComponentAssembly;
14 import net.sf.openrocket.rocketcomponent.MotorMount;
15 import net.sf.openrocket.rocketcomponent.Rocket;
16 import net.sf.openrocket.rocketcomponent.RocketComponent;
17 import net.sf.openrocket.util.BugException;
18 import net.sf.openrocket.util.Color;
19 import net.sf.openrocket.util.LineStyle;
20
21
22 public class RocketComponentSaver {
23
24         protected RocketComponentSaver() {
25                 // Prevent instantiation from outside the package
26         }
27
28         protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, List<String> elements) {
29                 elements.add("<name>" + RocketSaver.escapeXML(c.getName()) + "</name>");
30
31                 ComponentPreset preset = c.getPresetComponent();
32                 if ( preset != null ) {
33                         elements.add("<preset type=\"" + preset.getType() +
34                                         "\" manufacturer=\"" + preset.getManufacturer().getSimpleName() +
35                                         "\" partno=\"" + preset.getPartNo() + "\" digest=\"" + preset.getDigest() +"\"/>");
36                 }
37
38
39                 // Save color and line style if significant
40                 if (!(c instanceof Rocket || c instanceof ComponentAssembly)) {
41                         Color color = c.getColor();
42                         if (color != null) {
43                                 elements.add("<color red=\"" + color.getRed() + "\" green=\"" + color.getGreen()
44                                                 + "\" blue=\"" + color.getBlue() + "\"/>");
45                         }
46
47                         LineStyle style = c.getLineStyle();
48                         if (style != null) {
49                                 // Type names currently equivalent to the enum names except for case.
50                                 elements.add("<linestyle>" + style.name().toLowerCase(Locale.ENGLISH) + "</linestyle>");
51                         }
52                 }
53
54
55                 // Save position unless "AFTER"
56                 if (c.getRelativePosition() != RocketComponent.Position.AFTER) {
57                         // The type names are currently equivalent to the enum names except for case.
58                         String type = c.getRelativePosition().name().toLowerCase(Locale.ENGLISH);
59                         elements.add("<position type=\"" + type + "\">" + c.getPositionValue() + "</position>");
60                 }
61
62
63                 // Overrides
64                 boolean overridden = false;
65                 if (c.isMassOverridden()) {
66                         elements.add("<overridemass>" + c.getOverrideMass() + "</overridemass>");
67                         overridden = true;
68                 }
69                 if (c.isCGOverridden()) {
70                         elements.add("<overridecg>" + c.getOverrideCGX() + "</overridecg>");
71                         overridden = true;
72                 }
73                 if (overridden) {
74                         elements.add("<overridesubcomponents>" + c.getOverrideSubcomponents()
75                                         + "</overridesubcomponents>");
76                 }
77
78
79                 // Comment
80                 if (c.getComment().length() > 0) {
81                         elements.add("<comment>" + RocketSaver.escapeXML(c.getComment()) + "</comment>");
82                 }
83
84         }
85
86
87
88
89         protected final String materialParam(Material mat) {
90                 return materialParam("material", mat);
91         }
92
93
94         protected final String materialParam(String tag, Material mat) {
95                 String str = "<" + tag;
96
97                 switch (mat.getType()) {
98                 case LINE:
99                         str += " type=\"line\"";
100                         break;
101                 case SURFACE:
102                         str += " type=\"surface\"";
103                         break;
104                 case BULK:
105                         str += " type=\"bulk\"";
106                         break;
107                 default:
108                         throw new BugException("Unknown material type: " + mat.getType());
109                 }
110
111                 return str + " density=\"" + mat.getDensity() + "\" key=\"" + mat.getKey() + "\">" + RocketSaver.escapeXML(mat.getName()) + "</" + tag + ">";
112         }
113
114
115         protected final List<String> motorMountParams(MotorMount mount) {
116                 if (!mount.isMotorMount())
117                         return Collections.emptyList();
118
119                 String[] motorConfigIDs = ((RocketComponent) mount).getRocket().getMotorConfigurationIDs();
120                 List<String> elements = new ArrayList<String>();
121
122                 elements.add("<motormount>");
123
124                 for (String id : motorConfigIDs) {
125                         Motor motor = mount.getMotor(id);
126
127                         // Nothing is stored if no motor loaded
128                         if (motor == null)
129                                 continue;
130
131                         elements.add("  <motor configid=\"" + id + "\">");
132                         if (motor.getMotorType() != Motor.Type.UNKNOWN) {
133                                 elements.add("    <type>" + motor.getMotorType().name().toLowerCase(Locale.ENGLISH) + "</type>");
134                         }
135                         if (motor instanceof ThrustCurveMotor) {
136                                 ThrustCurveMotor m = (ThrustCurveMotor) motor;
137                                 elements.add("    <manufacturer>" + RocketSaver.escapeXML(m.getManufacturer().getSimpleName()) +
138                                                 "</manufacturer>");
139                                 elements.add("    <digest>" + m.getDigest() + "</digest>");
140                         }
141                         elements.add("    <designation>" + RocketSaver.escapeXML(motor.getDesignation()) + "</designation>");
142                         elements.add("    <diameter>" + motor.getDiameter() + "</diameter>");
143                         elements.add("    <length>" + motor.getLength() + "</length>");
144
145                         // Motor delay
146                         if (mount.getMotorDelay(id) == Motor.PLUGGED) {
147                                 elements.add("    <delay>none</delay>");
148                         } else {
149                                 elements.add("    <delay>" + mount.getMotorDelay(id) + "</delay>");
150                         }
151
152                         elements.add("  </motor>");
153                 }
154
155                 elements.add("  <ignitionevent>"
156                                 + mount.getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "")
157                                 + "</ignitionevent>");
158
159                 elements.add("  <ignitiondelay>" + mount.getIgnitionDelay() + "</ignitiondelay>");
160                 elements.add("  <overhang>" + mount.getMotorOverhang() + "</overhang>");
161
162                 elements.add("</motormount>");
163
164                 return elements;
165         }
166
167 }