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