DGP - added component serial numbers to allow Rocksim simulations to work correctly

This commit is contained in:
Doug Pedrick 2012-02-13 02:31:24 +00:00
parent 844f2de727
commit f9d621d90a
4 changed files with 45 additions and 11 deletions

View File

@ -30,6 +30,7 @@ public class RocksimCommonConstants {
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";

View File

@ -24,6 +24,12 @@ import javax.xml.bind.annotation.XmlRootElement;
@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)
@ -54,11 +60,14 @@ public abstract class BasePartDTO {
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++;
}
/**
@ -67,6 +76,7 @@ public abstract class BasePartDTO {
* @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);
@ -257,4 +267,14 @@ public abstract class BasePartDTO {
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;
}
}

View File

@ -41,6 +41,8 @@ public class RocketDesignDTO {
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")
@ -60,6 +62,8 @@ public class RocketDesignDTO {
@XmlElement(name = "CPCalcFlags")
private int cpCalcFlags = 1;
@XmlElement(name = "CPSimFlags")
private int cpSimFlags = 1;
@XmlElement(name = "UseKnownMass")
private int useKnownMass = 0;
@XmlElement(name = "Stage3Parts")
@ -186,4 +190,12 @@ public class RocketDesignDTO {
public void setStage32CG(double stage32CG) {
this.stage32CG = stage32CG;
}
public int getLastSerialNumber() {
return lastSerialNumber;
}
public void setLastSerialNumber(int lastSerialNumber) {
this.lastSerialNumber = lastSerialNumber;
}
}

View File

@ -25,14 +25,15 @@ import java.io.StringWriter;
*/
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) {
@ -71,8 +72,7 @@ public class RocksimSaver extends RocketSaver {
/**
* 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) {
@ -94,16 +94,14 @@ public class RocksimSaver extends RocketSaver {
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);
}
@ -118,6 +116,9 @@ public class RocksimSaver extends RocketSaver {
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;
}