DGP - design report figure honors rotation angle of main figure; added rocksim consta...
[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
7 import net.sf.openrocket.file.RocketSaver;
8 import net.sf.openrocket.material.Material;
9 import net.sf.openrocket.motor.Motor;
10 import net.sf.openrocket.motor.ThrustCurveMotor;
11 import net.sf.openrocket.rocketcomponent.ComponentAssembly;
12 import net.sf.openrocket.rocketcomponent.MotorMount;
13 import net.sf.openrocket.rocketcomponent.Rocket;
14 import net.sf.openrocket.rocketcomponent.RocketComponent;
15 import net.sf.openrocket.util.BugException;
16 import net.sf.openrocket.util.Color;
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                                 ThrustCurveMotor m = (ThrustCurveMotor) motor;
128                                 elements.add("    <manufacturer>" + RocketSaver.escapeXML(m.getManufacturer().getSimpleName()) +
129                                                 "</manufacturer>");
130                                 elements.add("    <digest>" + m.getDigest() + "</digest>");
131                         }
132                         elements.add("    <designation>" + RocketSaver.escapeXML(motor.getDesignation()) + "</designation>");
133                         elements.add("    <diameter>" + motor.getDiameter() + "</diameter>");
134                         elements.add("    <length>" + motor.getLength() + "</length>");
135                         
136                         // Motor delay
137                         if (mount.getMotorDelay(id) == Motor.PLUGGED) {
138                                 elements.add("    <delay>none</delay>");
139                         } else {
140                                 elements.add("    <delay>" + mount.getMotorDelay(id) + "</delay>");
141                         }
142                         
143                         elements.add("  </motor>");
144                 }
145                 
146                 elements.add("  <ignitionevent>"
147                                 + mount.getIgnitionEvent().name().toLowerCase().replace("_", "")
148                                 + "</ignitionevent>");
149                 
150                 elements.add("  <ignitiondelay>" + mount.getIgnitionDelay() + "</ignitiondelay>");
151                 elements.add("  <overhang>" + mount.getMotorOverhang() + "</overhang>");
152                 
153                 elements.add("</motormount>");
154                 
155                 return elements;
156         }
157         
158 }