public static final String RADIAL_ANGLE = "RadialAngle";
public static final String LOCATION_MODE = "LocationMode";
public static final String FINISH_CODE = "FinishCode";
+ public static final String SERIAL_NUMBER = "SerialNo";
public static final String LEN = "Len";
public static final String OD = "OD";
public static final String ID = "ID";
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class BasePartDTO {
+ /**
+ * The very important Rocksim serial number. Each component needs one. This is not multi-thread safe. Trying
+ * to save multiple files at the same time will have unpredictable results with respect to the serial numbering.
+ */
+ private static int currentSerialNumber = 1;
+
@XmlElement(name = RocksimCommonConstants.KNOWN_MASS)
private double knownMass = 0d;
@XmlElement(name = RocksimCommonConstants.DENSITY)
private double len = 0d;
@XmlElement(name = RocksimCommonConstants.FINISH_CODE)
private int finishCode = 0;
+ @XmlElement(name = RocksimCommonConstants.SERIAL_NUMBER)
+ private int serialNumber = -1;
/**
* Default constructor.
*/
protected BasePartDTO() {
+ serialNumber = currentSerialNumber++;
}
/**
* @param ec
*/
protected BasePartDTO(RocketComponent ec) {
+ serialNumber = currentSerialNumber++;
setCalcCG(ec.getCG().x * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
setCalcMass(ec.getComponentMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
setKnownCG(ec.getOverrideCGX() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
finishCode = theFinishCode;
}
+ public static int getCurrentSerialNumber() {
+ return currentSerialNumber - 1;
+ }
+
+ /**
+ * Reset the serial number, which needs to happen after each file save.
+ */
+ public static void resetCurrentSerialNumber() {
+ currentSerialNumber = 0;
+ }
}
private int threeDFlags = 0;
@XmlElement(name = "ThreeDFlagsEdit")
private int threeDFlagsEdit = 0;
+ @XmlElement(name = "LastSerialNumber")
+ private int lastSerialNumber = -1;
@XmlElement(name = "Stage3Mass")
private double stage3Mass = 0d;
@XmlElement(name = "Stage2Mass")
@XmlElement(name = "CPCalcFlags")
private int cpCalcFlags = 1;
+ @XmlElement(name = "CPSimFlags")
+ private int cpSimFlags = 1;
@XmlElement(name = "UseKnownMass")
private int useKnownMass = 0;
@XmlElement(name = "Stage3Parts")
public void setStage32CG(double stage32CG) {
this.stage32CG = stage32CG;
}
+
+ public int getLastSerialNumber() {
+ return lastSerialNumber;
+ }
+
+ public void setLastSerialNumber(int lastSerialNumber) {
+ this.lastSerialNumber = lastSerialNumber;
+ }
}
*/
public class RocksimSaver extends RocketSaver {
- /** The logger. */
+ /**
+ * The logger.
+ */
private static final LogHelper log = Application.getLogger();
/**
* This method marshals an OpenRocketDocument (OR design) to Rocksim-compliant XML.
*
- * @param doc the OR design
- *
+ * @param doc the OR design
* @return Rocksim-compliant XML
*/
public String marshalToRocksim(OpenRocketDocument doc) {
/**
* Root conversion method. It iterates over all subcomponents.
*
- * @param doc the OR design
- *
+ * @param doc the OR design
* @return a corresponding Rocksim representation
*/
private RocksimDocumentDTO toRocksimDocumentDTO(OpenRocketDocument doc) {
MassCalculator massCalc = new BasicMassCalculator();
- final double cg = massCalc.getCG(new Configuration(rocket), MassCalculator.MassCalcType.NO_MOTORS).x *
- RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
+ final double cg = massCalc.getCG(new Configuration(rocket), MassCalculator.MassCalcType.NO_MOTORS).x *
+ RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
int stageCount = rocket.getStageCount();
if (stageCount == 3) {
result.setStage321CG(cg);
- }
- else if (stageCount == 2) {
+ } else if (stageCount == 2) {
result.setStage32CG(cg);
- }
- else {
+ } else {
result.setStage3CG(cg);
}
if (stageCount > 2) {
result.setStage1(toStageDTO(rocket.getChild(2).getStage(), result, 1));
}
+ //Set the last serial number element and reset it.
+ result.setLastSerialNumber(BasePartDTO.getCurrentSerialNumber());
+ BasePartDTO.resetCurrentSerialNumber();
return result;
}