package net.sf.openrocket.file.rocksim.export;
import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
import net.sf.openrocket.rocketcomponent.BodyTube;
import net.sf.openrocket.rocketcomponent.NoseCone;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.Stage;
import net.sf.openrocket.rocketcomponent.Transition;
import net.sf.openrocket.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementRefs;
import java.util.List;
/**
* Placeholder for a Rocksim Stage.
*/
@XmlAccessorType(XmlAccessType.FIELD)
public class StageDTO {
@XmlElementRefs({
@XmlElementRef(name = RocksimCommonConstants.BODY_TUBE, type = BodyTubeDTO.class),
@XmlElementRef(name = RocksimCommonConstants.NOSE_CONE, type = NoseConeDTO.class),
@XmlElementRef(name = RocksimCommonConstants.TRANSITION, type = TransitionDTO.class)
})
private List<BasePartDTO> externalPart = new ArrayList<BasePartDTO>();
/**
* Default constructor.
*/
public StageDTO() {
}
/**
* Copy constructor.
*
* @param theORStage the OR stage
* @param design the encompassing container DTO
* @param stageNumber the stage number (3 is always at the top, even if it's the only one)
*/
public StageDTO(Stage theORStage, RocketDesignDTO design, int stageNumber) {
if (stageNumber == 3) {
if (theORStage.isMassOverridden()) {
design.setStage3Mass(theORStage.getMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
design.setUseKnownMass(1);
}
if (theORStage.isCGOverridden()) {
design.setStage3CG(theORStage.getOverrideCGX() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
}
if (stageNumber == 2) {
if (theORStage.isMassOverridden()) {
design.setStage2Mass(theORStage.getMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
design.setUseKnownMass(1);
}
if (theORStage.isCGOverridden()) {
design.setStage2CGAlone(theORStage.getOverrideCGX() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
}
if (stageNumber == 1) {
if (theORStage.isMassOverridden()) {
design.setStage1Mass(theORStage.getMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
design.setUseKnownMass(1);
}
if (theORStage.isCGOverridden()) {
design.setStage1CGAlone(theORStage.getOverrideCGX() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
}
List<RocketComponent> children = theORStage.getChildren();
for (int i = 0; i < children.size(); i++) {
RocketComponent rocketComponents = children.get(i);
if (rocketComponents instanceof NoseCone) {
addExternalPart(toNoseConeDTO((NoseCone) rocketComponents));
} else if (rocketComponents instanceof BodyTube) {
addExternalPart(toBodyTubeDTO((BodyTube) rocketComponents));
} else if (rocketComponents instanceof Transition) {
addExternalPart(toTransitionDTO((Transition) rocketComponents));
}
}
}
public List<BasePartDTO> getExternalPart() {
return externalPart;
}
public void addExternalPart(BasePartDTO theExternalPartDTO) {
externalPart.add(theExternalPartDTO);
}
private NoseConeDTO toNoseConeDTO(NoseCone nc) {
return new NoseConeDTO(nc);
}
private BodyTubeDTO toBodyTubeDTO(BodyTube bt) {
return new BodyTubeDTO(bt);
}
private TransitionDTO toTransitionDTO(Transition tran) {
return new TransitionDTO(tran);
}
}