package net.sf.openrocket.file.openrocket.savers;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import net.sf.openrocket.appearance.Appearance;
import net.sf.openrocket.appearance.Decal;
import net.sf.openrocket.appearance.Decal.EdgeMode;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.ThrustCurveMotor;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.rocketcomponent.ComponentAssembly;
import net.sf.openrocket.rocketcomponent.IgnitionConfiguration;
import net.sf.openrocket.rocketcomponent.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Color;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.LineStyle;
import net.sf.openrocket.util.TextUtil;
public class RocketComponentSaver {
private static final Translator trans = Application.getTranslator();
protected RocketComponentSaver() {
// Prevent instantiation from outside the package
}
protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, List<String> elements) {
elements.add("<name>" + TextUtil.escapeXML(c.getName()) + "</name>");
ComponentPreset preset = c.getPresetComponent();
if (preset != null) {
elements.add("<preset type=\"" + preset.getType() +
"\" manufacturer=\"" + preset.getManufacturer().getSimpleName() +
"\" partno=\"" + preset.getPartNo() + "\" digest=\"" + preset.getDigest() + "\"/>");
}
Appearance ap = c.getAppearance();
if (ap != null) {
elements.add("<appearance>");
Color paint = ap.getPaint();
emitColor("paint", elements, paint);
elements.add("<shine>" + ap.getShine() + "</shine>");
Decal decal = ap.getTexture();
if (decal != null) {
String name = decal.getImage().getName();
double rotation = decal.getRotation();
EdgeMode edgeMode = decal.getEdgeMode();
elements.add("<decal name=\"" + TextUtil.escapeXML(name) + "\" rotation=\"" + rotation + "\" edgemode=\"" + edgeMode.name() + "\">");
Coordinate center = decal.getCenter();
elements.add("<center x=\"" + center.x + "\" y=\"" + center.y + "\"/>");
Coordinate offset = decal.getOffset();
elements.add("<offset x=\"" + offset.x + "\" y=\"" + offset.y + "\"/>");
Coordinate scale = decal.getScale();
elements.add("<scale x=\"" + scale.x + "\" y=\"" + scale.y + "\"/>");
elements.add("</decal>");
}
elements.add("</appearance>");
}
// Save color and line style if significant
if (!(c instanceof Rocket || c instanceof ComponentAssembly)) {
Color color = c.getColor();
emitColor("color", elements, color);
LineStyle style = c.getLineStyle();
if (style != null) {
// Type names currently equivalent to the enum names except for case.
elements.add("<linestyle>" + style.name().toLowerCase(Locale.ENGLISH) + "</linestyle>");
}
}
// Save position unless "AFTER"
if (c.getRelativePosition() != RocketComponent.Position.AFTER) {
// The type names are currently equivalent to the enum names except for case.
String type = c.getRelativePosition().name().toLowerCase(Locale.ENGLISH);
elements.add("<position type=\"" + type + "\">" + c.getPositionValue() + "</position>");
}
// Overrides
boolean overridden = false;
if (c.isMassOverridden()) {
elements.add("<overridemass>" + c.getOverrideMass() + "</overridemass>");
overridden = true;
}
if (c.isCGOverridden()) {
elements.add("<overridecg>" + c.getOverrideCGX() + "</overridecg>");
overridden = true;
}
if (overridden) {
elements.add("<overridesubcomponents>" + c.getOverrideSubcomponents()
+ "</overridesubcomponents>");
}
// Comment
if (c.getComment().length() > 0) {
elements.add("<comment>" + TextUtil.escapeXML(c.getComment()) + "</comment>");
}
}
protected final String materialParam(Material mat) {
return materialParam("material", mat);
}
protected final String materialParam(String tag, Material mat) {
String str = "<" + tag;
switch (mat.getType()) {
case LINE:
str += " type=\"line\"";
break;
case SURFACE:
str += " type=\"surface\"";
break;
case BULK:
str += " type=\"bulk\"";
break;
default:
throw new BugException("Unknown material type: " + mat.getType());
}
String baseName = trans.getBaseText("material", mat.getName());
return str + " density=\"" + mat.getDensity() + "\">" + TextUtil.escapeXML(baseName) + "</" + tag + ">";
}
protected final List<String> motorMountParams(MotorMount mount) {
if (!mount.isMotorMount())
return Collections.emptyList();
String[] motorConfigIDs = ((RocketComponent) mount).getRocket().getFlightConfigurationIDs();
List<String> elements = new ArrayList<String>();
elements.add("<motormount>");
// NOTE: Default config must be BEFORE overridden config for proper backward compatibility later on
elements.add(" <ignitionevent>"
+ mount.getIgnitionConfiguration().getDefault().getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "")
+ "</ignitionevent>");
elements.add(" <ignitiondelay>" + mount.getIgnitionConfiguration().getDefault().getIgnitionDelay() + "</ignitiondelay>");
elements.add(" <overhang>" + mount.getMotorOverhang() + "</overhang>");
for (String id : motorConfigIDs) {
MotorConfiguration motorConfig = mount.getMotorConfiguration().get(id);
Motor motor = motorConfig.getMotor();
// Nothing is stored if no motor loaded
if (motor == null)
continue;
elements.add(" <motor configid=\"" + id + "\">");
if (motor.getMotorType() != Motor.Type.UNKNOWN) {
elements.add(" <type>" + motor.getMotorType().name().toLowerCase(Locale.ENGLISH) + "</type>");
}
if (motor instanceof ThrustCurveMotor) {
ThrustCurveMotor m = (ThrustCurveMotor) motor;
elements.add(" <manufacturer>" + TextUtil.escapeXML(m.getManufacturer().getSimpleName()) +
"</manufacturer>");
elements.add(" <digest>" + m.getDigest() + "</digest>");
}
elements.add(" <designation>" + TextUtil.escapeXML(motor.getDesignation()) + "</designation>");
elements.add(" <diameter>" + motor.getDiameter() + "</diameter>");
elements.add(" <length>" + motor.getLength() + "</length>");
// Motor delay
if (motorConfig.getEjectionDelay() == Motor.PLUGGED) {
elements.add(" <delay>none</delay>");
} else {
elements.add(" <delay>" + motorConfig.getEjectionDelay() + "</delay>");
}
elements.add(" </motor>");
if (!mount.getIgnitionConfiguration().isDefault(id)) {
IgnitionConfiguration ignition = mount.getIgnitionConfiguration().get(id);
elements.add(" <ignitionconfiguration configid=\"" + id + "\">");
elements.add(" <ignitionevent>" + ignition.getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "") + "</ignitionevent>");
elements.add(" <ignitiondelay>" + ignition.getIgnitionDelay() + "</ignitiondelay>");
elements.add(" </ignitionconfiguration>");
}
}
elements.add("</motormount>");
return elements;
}
private final static void emitColor(String elementName, List<String> elements, Color color) {
if (color != null) {
elements.add("<" + elementName + " red=\"" + color.getRed() + "\" green=\"" + color.getGreen()
+ "\" blue=\"" + color.getBlue() + "\"/>");
}
}
}