1 package net.sf.openrocket.file.openrocket.savers;
3 import java.util.ArrayList;
4 import java.util.Collections;
6 import java.util.Locale;
8 import net.sf.openrocket.file.RocketSaver;
9 import net.sf.openrocket.l10n.Translator;
10 import net.sf.openrocket.material.Material;
11 import net.sf.openrocket.motor.Motor;
12 import net.sf.openrocket.motor.ThrustCurveMotor;
13 import net.sf.openrocket.preset.ComponentPreset;
14 import net.sf.openrocket.rocketcomponent.ComponentAssembly;
15 import net.sf.openrocket.rocketcomponent.MotorMount;
16 import net.sf.openrocket.rocketcomponent.Rocket;
17 import net.sf.openrocket.rocketcomponent.RocketComponent;
18 import net.sf.openrocket.startup.Application;
19 import net.sf.openrocket.util.BugException;
20 import net.sf.openrocket.util.Color;
21 import net.sf.openrocket.util.LineStyle;
24 public class RocketComponentSaver {
25 private static final Translator trans = Application.getTranslator();
27 protected RocketComponentSaver() {
28 // Prevent instantiation from outside the package
31 protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, List<String> elements) {
32 elements.add("<name>" + RocketSaver.escapeXML(c.getName()) + "</name>");
34 ComponentPreset preset = c.getPresetComponent();
36 elements.add("<preset type=\"" + preset.getType() +
37 "\" manufacturer=\"" + preset.getManufacturer().getSimpleName() +
38 "\" partno=\"" + preset.getPartNo() + "\" digest=\"" + preset.getDigest() + "\"/>");
42 // Save color and line style if significant
43 if (!(c instanceof Rocket || c instanceof ComponentAssembly)) {
44 Color color = c.getColor();
46 elements.add("<color red=\"" + color.getRed() + "\" green=\"" + color.getGreen()
47 + "\" blue=\"" + color.getBlue() + "\"/>");
50 LineStyle style = c.getLineStyle();
52 // Type names currently equivalent to the enum names except for case.
53 elements.add("<linestyle>" + style.name().toLowerCase(Locale.ENGLISH) + "</linestyle>");
58 // Save position unless "AFTER"
59 if (c.getRelativePosition() != RocketComponent.Position.AFTER) {
60 // The type names are currently equivalent to the enum names except for case.
61 String type = c.getRelativePosition().name().toLowerCase(Locale.ENGLISH);
62 elements.add("<position type=\"" + type + "\">" + c.getPositionValue() + "</position>");
67 boolean overridden = false;
68 if (c.isMassOverridden()) {
69 elements.add("<overridemass>" + c.getOverrideMass() + "</overridemass>");
72 if (c.isCGOverridden()) {
73 elements.add("<overridecg>" + c.getOverrideCGX() + "</overridecg>");
77 elements.add("<overridesubcomponents>" + c.getOverrideSubcomponents()
78 + "</overridesubcomponents>");
83 if (c.getComment().length() > 0) {
84 elements.add("<comment>" + RocketSaver.escapeXML(c.getComment()) + "</comment>");
92 protected final String materialParam(Material mat) {
93 return materialParam("material", mat);
97 protected final String materialParam(String tag, Material mat) {
98 String str = "<" + tag;
100 switch (mat.getType()) {
102 str += " type=\"line\"";
105 str += " type=\"surface\"";
108 str += " type=\"bulk\"";
111 throw new BugException("Unknown material type: " + mat.getType());
114 String baseName = trans.getBaseText("material", mat.getName());
116 return str + " density=\"" + mat.getDensity() + "\">" + RocketSaver.escapeXML(baseName) + "</" + tag + ">";
120 protected final List<String> motorMountParams(MotorMount mount) {
121 if (!mount.isMotorMount())
122 return Collections.emptyList();
124 String[] motorConfigIDs = ((RocketComponent) mount).getRocket().getMotorConfigurationIDs();
125 List<String> elements = new ArrayList<String>();
127 elements.add("<motormount>");
129 for (String id : motorConfigIDs) {
130 Motor motor = mount.getMotor(id);
132 // Nothing is stored if no motor loaded
136 elements.add(" <motor configid=\"" + id + "\">");
137 if (motor.getMotorType() != Motor.Type.UNKNOWN) {
138 elements.add(" <type>" + motor.getMotorType().name().toLowerCase(Locale.ENGLISH) + "</type>");
140 if (motor instanceof ThrustCurveMotor) {
141 ThrustCurveMotor m = (ThrustCurveMotor) motor;
142 elements.add(" <manufacturer>" + RocketSaver.escapeXML(m.getManufacturer().getSimpleName()) +
144 elements.add(" <digest>" + m.getDigest() + "</digest>");
146 elements.add(" <designation>" + RocketSaver.escapeXML(motor.getDesignation()) + "</designation>");
147 elements.add(" <diameter>" + motor.getDiameter() + "</diameter>");
148 elements.add(" <length>" + motor.getLength() + "</length>");
151 if (mount.getMotorDelay(id) == Motor.PLUGGED) {
152 elements.add(" <delay>none</delay>");
154 elements.add(" <delay>" + mount.getMotorDelay(id) + "</delay>");
157 elements.add(" </motor>");
160 elements.add(" <ignitionevent>"
161 + mount.getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "")
162 + "</ignitionevent>");
164 elements.add(" <ignitiondelay>" + mount.getIgnitionDelay() + "</ignitiondelay>");
165 elements.add(" <overhang>" + mount.getMotorOverhang() + "</overhang>");
167 elements.add("</motormount>");