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.Bulkhead;
import net.sf.openrocket.rocketcomponent.CenteringRing;
import net.sf.openrocket.rocketcomponent.EngineBlock;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.FreeformFinSet;
import net.sf.openrocket.rocketcomponent.InnerTube;
import net.sf.openrocket.rocketcomponent.LaunchLug;
import net.sf.openrocket.rocketcomponent.MassObject;
import net.sf.openrocket.rocketcomponent.Parachute;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.Streamer;
import net.sf.openrocket.rocketcomponent.Transition;
import net.sf.openrocket.rocketcomponent.TubeCoupler;
import net.sf.openrocket.rocketcomponent.TubeFinSet;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementRefs;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;
/**
* Models the XML element for a Rocksim body tube.
*/
@XmlRootElement(name = RocksimCommonConstants.BODY_TUBE)
@XmlAccessorType(XmlAccessType.FIELD)
public class BodyTubeDTO extends BasePartDTO implements AttachableParts {
@XmlElement(name = RocksimCommonConstants.OD)
private double od = 0d;
@XmlElement(name = RocksimCommonConstants.ID)
private double id = 0d;
@XmlElement(name = RocksimCommonConstants.IS_MOTOR_MOUNT)
private int isMotorMount = 0;
@XmlElement(name = RocksimCommonConstants.MOTOR_DIA)
private double motorDia = 0d;
@XmlElement(name = RocksimCommonConstants.ENGINE_OVERHANG)
private double engineOverhang = 0d;
@XmlElement(name = RocksimCommonConstants.IS_INSIDE_TUBE)
private int isInsideTube = 0;
@XmlElementWrapper(name = RocksimCommonConstants.ATTACHED_PARTS)
@XmlElementRefs({
@XmlElementRef(name = RocksimCommonConstants.BODY_TUBE, type = BodyTubeDTO.class),
@XmlElementRef(name = RocksimCommonConstants.BODY_TUBE, type = InnerBodyTubeDTO.class),
@XmlElementRef(name = RocksimCommonConstants.RING, type = CenteringRingDTO.class),
@XmlElementRef(name = RocksimCommonConstants.LAUNCH_LUG, type = LaunchLugDTO.class),
@XmlElementRef(name = RocksimCommonConstants.FIN_SET, type = FinSetDTO.class),
@XmlElementRef(name = RocksimCommonConstants.CUSTOM_FIN_SET, type = CustomFinSetDTO.class),
@XmlElementRef(name = RocksimCommonConstants.TUBE_FIN_SET, type = TubeFinSetDTO.class),
@XmlElementRef(name = RocksimCommonConstants.STREAMER, type = StreamerDTO.class),
@XmlElementRef(name = RocksimCommonConstants.PARACHUTE, type = ParachuteDTO.class),
@XmlElementRef(name = RocksimCommonConstants.MASS_OBJECT, type = MassObjectDTO.class)})
List<BasePartDTO> attachedParts = new ArrayList();
/**
* Constructor.
*/
public BodyTubeDTO() {
}
/**
* Copy constructor.
*
* @param theORInnerTube an OR inner tube; used by subclasses
*/
protected BodyTubeDTO(InnerTube theORInnerTube) {
super(theORInnerTube);
}
/**
* Copy constructor.
*
* @param theORBodyTube an OR body tube
*/
protected BodyTubeDTO(BodyTube theORBodyTube) {
super(theORBodyTube);
setEngineOverhang(theORBodyTube.getMotorOverhang() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
setID(theORBodyTube.getInnerRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
setOD(theORBodyTube.getOuterRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
setMotorDia((theORBodyTube.getMotorMountDiameter() / 2) * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
setMotorMount(theORBodyTube.isMotorMount());
List<RocketComponent> children = theORBodyTube.getChildren();
for (int i = 0; i < children.size(); i++) {
RocketComponent rocketComponents = children.get(i);
if (rocketComponents instanceof InnerTube) {
final InnerTube innerTube = (InnerTube) rocketComponents;
final InnerBodyTubeDTO innerBodyTubeDTO = new InnerBodyTubeDTO(innerTube, this);
//Only add the inner tube if it is NOT a cluster.
if (innerTube.getClusterCount() == 1) {
attachedParts.add(innerBodyTubeDTO);
}
} else if (rocketComponents instanceof BodyTube) {
attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents));
} else if (rocketComponents instanceof Transition) {
attachedParts.add(new TransitionDTO((Transition) rocketComponents));
} else if (rocketComponents instanceof EngineBlock) {
attachedParts.add(new EngineBlockDTO((EngineBlock) rocketComponents));
} else if (rocketComponents instanceof TubeCoupler) {
attachedParts.add(new TubeCouplerDTO((TubeCoupler) rocketComponents));
} else if (rocketComponents instanceof CenteringRing) {
attachedParts.add(new CenteringRingDTO((CenteringRing) rocketComponents));
} else if (rocketComponents instanceof Bulkhead) {
attachedParts.add(new BulkheadDTO((Bulkhead) rocketComponents));
} else if (rocketComponents instanceof LaunchLug) {
attachedParts.add(new LaunchLugDTO((LaunchLug) rocketComponents));
} else if (rocketComponents instanceof Streamer) {
attachedParts.add(new StreamerDTO((Streamer) rocketComponents));
} else if (rocketComponents instanceof Parachute) {
attachedParts.add(new ParachuteDTO((Parachute) rocketComponents));
} else if (rocketComponents instanceof MassObject) {
attachedParts.add(new MassObjectDTO((MassObject) rocketComponents));
} else if (rocketComponents instanceof FreeformFinSet) {
attachedParts.add(new CustomFinSetDTO((FreeformFinSet) rocketComponents));
} else if (rocketComponents instanceof FinSet) {
attachedParts.add(new FinSetDTO((FinSet) rocketComponents));
} else if (rocketComponents instanceof TubeFinSet) {
attachedParts.add(new TubeFinSetDTO((TubeFinSet) rocketComponents));
}
}
}
public double getOD() {
return od;
}
public void setOD(double theOd) {
od = theOd;
}
public double getID() {
return id;
}
public void setID(double theId) {
id = theId;
}
public int getMotorMount() {
return isMotorMount;
}
public void setMotorMount(boolean motorMount) {
if (motorMount) {
isMotorMount = 1;
} else {
isMotorMount = 0;
}
}
public void setMotorMount(int theMotorMount) {
isMotorMount = theMotorMount;
}
public double getMotorDia() {
return motorDia;
}
public void setMotorDia(double theMotorDia) {
motorDia = theMotorDia;
}
public double getEngineOverhang() {
return engineOverhang;
}
public void setEngineOverhang(double theEngineOverhang) {
engineOverhang = theEngineOverhang;
}
public int getInsideTube() {
return isInsideTube;
}
public void setInsideTube(boolean inside) {
if (inside) {
isInsideTube = 1;
} else {
isInsideTube = 0;
}
}
public void setInsideTube(int theInsideTube) {
isInsideTube = theInsideTube;
}
public List<BasePartDTO> getAttachedParts() {
return attachedParts;
}
@Override
public void addAttachedPart(BasePartDTO thePart) {
attachedParts.add(thePart);
}
@Override
public void removeAttachedPart(BasePartDTO part) {
attachedParts.remove(part);
}
}