package net.sf.openrocket.file.rocksim.export;
import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
import net.sf.openrocket.file.rocksim.RocksimDensityType;
import net.sf.openrocket.file.rocksim.RocksimFinishCode;
import net.sf.openrocket.file.rocksim.RocksimLocationMode;
import net.sf.openrocket.file.rocksim.importt.BaseHandler;
import net.sf.openrocket.rocketcomponent.ExternalComponent;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.RecoveryDevice;
import net.sf.openrocket.rocketcomponent.RingComponent;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.StructuralComponent;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* The base class for all OpenRocket to Rocksim conversions.
*/
@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)
private double density = 0d;
@XmlElement(name = RocksimCommonConstants.MATERIAL)
private String material = "";
@XmlElement(name = RocksimCommonConstants.NAME)
private String name = "";
@XmlElement(name = RocksimCommonConstants.KNOWN_CG)
private double knownCG = 0;
@XmlElement(name = RocksimCommonConstants.USE_KNOWN_CG)
private int useKnownCG = 1;
@XmlElement(name = RocksimCommonConstants.XB)
private double xb = 0;
@XmlElement(name = RocksimCommonConstants.CALC_MASS)
private double calcMass = 0d;
@XmlElement(name = RocksimCommonConstants.CALC_CG)
private double calcCG = 0d;
@XmlElement(name = RocksimCommonConstants.DENSITY_TYPE)
private int densityType = 0;
@XmlElement(name = RocksimCommonConstants.RADIAL_LOC)
private double radialLoc = 0;
@XmlElement(name = RocksimCommonConstants.RADIAL_ANGLE)
private double radialAngle = 0;
@XmlElement(name = RocksimCommonConstants.LOCATION_MODE)
private int locationMode = 0;
@XmlElement(name = RocksimCommonConstants.LEN, required = false, nillable = false)
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++;
}
/**
* Copy constructor of sorts, that performs all common conversions for components.
*
* @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);
setKnownMass(ec.getMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
if (! (ec instanceof FinSet)) {
setLen(ec.getLength() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
setUseKnownCG(ec.isCGOverridden() || ec.isMassOverridden() ? 1 : 0);
setName(ec.getName());
setXb(ec.getPositionValue() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
//When the relative position is BOTTOM, the position location of the bottom edge of the component is +
//to the right of the bottom of the parent, and - to the left.
//But in Rocksim, it's + to the left and - to the right
if (ec.getRelativePosition().equals(RocketComponent.Position.BOTTOM)) {
setXb((-1 * ec.getPositionValue()) * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
else if (ec.getRelativePosition().equals(RocketComponent.Position.MIDDLE)) {
//Mapped to TOP, so adjust accordingly
setXb((ec.getPositionValue() + (ec.getParent().getLength() - ec.getLength()) /2)* RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
if (ec instanceof ExternalComponent) {
ExternalComponent comp = (ExternalComponent) ec;
setLocationMode(RocksimLocationMode.toCode(comp.getRelativePosition()));
setDensity(comp.getMaterial().getDensity() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_BULK_DENSITY);
setDensityType(RocksimDensityType.toCode(comp.getMaterial().getType()));
String compMaterial = comp.getMaterial().getName();
if (compMaterial.startsWith(BaseHandler.ROCKSIM_MATERIAL_PREFIX)) {
compMaterial = compMaterial.substring(BaseHandler.ROCKSIM_MATERIAL_PREFIX.length());
}
setMaterial(compMaterial);
setFinishCode(RocksimFinishCode.toCode(comp.getFinish()));
}
else if (ec instanceof StructuralComponent) {
StructuralComponent comp = (StructuralComponent) ec;
setLocationMode(RocksimLocationMode.toCode(comp.getRelativePosition()));
setDensity(comp.getMaterial().getDensity() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_BULK_DENSITY);
setDensityType(RocksimDensityType.toCode(comp.getMaterial().getType()));
String compMaterial = comp.getMaterial().getName();
if (compMaterial.startsWith(BaseHandler.ROCKSIM_MATERIAL_PREFIX)) {
compMaterial = compMaterial.substring(BaseHandler.ROCKSIM_MATERIAL_PREFIX.length());
}
setMaterial(compMaterial);
}
else if (ec instanceof RecoveryDevice) {
RecoveryDevice comp = (RecoveryDevice) ec;
setLocationMode(RocksimLocationMode.toCode(comp.getRelativePosition()));
setDensity(comp.getMaterial().getDensity() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_SURFACE_DENSITY);
setDensityType(RocksimDensityType.toCode(comp.getMaterial().getType()));
String compMaterial = comp.getMaterial().getName();
if (compMaterial.startsWith(BaseHandler.ROCKSIM_MATERIAL_PREFIX)) {
compMaterial = compMaterial.substring(BaseHandler.ROCKSIM_MATERIAL_PREFIX.length());
}
setMaterial(compMaterial);
}
if (ec instanceof RingComponent) {
RingComponent rc = (RingComponent)ec;
setRadialAngle(rc.getRadialDirection());
setRadialLoc(rc.getRadialPosition() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
}
public Double getKnownMass() {
return knownMass;
}
public void setKnownMass(Double theKnownMass) {
knownMass = theKnownMass;
}
public double getDensity() {
return density;
}
public void setDensity(double theDensity) {
density = theDensity;
}
public String getMaterial() {
return material;
}
public void setMaterial(String theMaterial) {
material = theMaterial;
}
public String getName() {
return name;
}
public void setName(String theName) {
name = theName;
}
public Double getKnownCG() {
return knownCG;
}
public void setKnownCG(Double theKnownCG) {
knownCG = theKnownCG;
}
public int getUseKnownCG() {
return useKnownCG;
}
public void setUseKnownCG(int theUseKnownCG) {
useKnownCG = theUseKnownCG;
}
public double getXb() {
return xb;
}
public void setXb(double theXb) {
xb = theXb;
}
public double getCalcMass() {
return calcMass;
}
public void setCalcMass(double theCalcMass) {
calcMass = theCalcMass;
}
public double getCalcCG() {
return calcCG;
}
public void setCalcCG(double theCalcCG) {
calcCG = theCalcCG;
}
public int getDensityType() {
return densityType;
}
public void setDensityType(int theDensityType) {
densityType = theDensityType;
}
public double getRadialLoc() {
return radialLoc;
}
public void setRadialLoc(double theRadialLoc) {
radialLoc = theRadialLoc;
}
public double getRadialAngle() {
return radialAngle;
}
public void setRadialAngle(double theRadialAngle) {
radialAngle = theRadialAngle;
}
public int getLocationMode() {
return locationMode;
}
public void setLocationMode(int theLocationMode) {
locationMode = theLocationMode;
}
public double getLen() {
return len;
}
public void setLen(double theLen) {
len = theLen;
}
public int getFinishCode() {
return finishCode;
}
public void setFinishCode(int theFinishCode) {
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;
}
}