package net.sf.openrocket.file.rocksim.export; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; import net.sf.openrocket.file.rocksim.RocksimNoseConeCode; 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.MassObject; import net.sf.openrocket.rocketcomponent.Parachute; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.Transition; import net.sf.openrocket.rocketcomponent.TubeCoupler; 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 java.util.ArrayList; import java.util.List; /** * A common ancestor class for nose cones and transitions. This class is responsible for adapting an OpenRocket * Transition to a Rocksim Transition. */ @XmlAccessorType(XmlAccessType.FIELD) public class AbstractTransitionDTO extends BasePartDTO implements AttachableParts { @XmlElement(name = RocksimCommonConstants.SHAPE_CODE) private int shapeCode = 1; @XmlElement(name = RocksimCommonConstants.CONSTRUCTION_TYPE) private int constructionType = 1; @XmlElement(name = RocksimCommonConstants.WALL_THICKNESS) private double wallThickness = 0d; @XmlElement(name = RocksimCommonConstants.SHAPE_PARAMETER) private double shapeParameter = 0d; @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.FIN_SET, type = FinSetDTO.class), @XmlElementRef(name = RocksimCommonConstants.CUSTOM_FIN_SET, type = CustomFinSetDTO.class), @XmlElementRef(name = RocksimCommonConstants.RING, type = CenteringRingDTO.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<BasePartDTO>(); /** * Default constructor. */ protected AbstractTransitionDTO() { } /** * Conversion constructor. * * @param nc the OpenRocket component to convert */ protected AbstractTransitionDTO(Transition nc) { super(nc); setConstructionType(nc.isFilled() ? 0 : 1); setShapeCode(RocksimNoseConeCode.toCode(nc.getType())); if (Transition.Shape.POWER.equals(nc.getType()) || Transition.Shape.HAACK.equals(nc.getType()) || Transition.Shape.PARABOLIC.equals(nc.getType())) { setShapeParameter(nc.getShapeParameter()); } setWallThickness(nc.getThickness() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); List<RocketComponent> children = nc.getChildren(); for (int i = 0; i < children.size(); i++) { RocketComponent rocketComponents = children.get(i); if (rocketComponents instanceof InnerTube) { attachedParts.add(new InnerBodyTubeDTO((InnerTube) rocketComponents, this)); } 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 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)); } } } public int getShapeCode() { return shapeCode; } public void setShapeCode(int theShapeCode) { shapeCode = theShapeCode; } public int getConstructionType() { return constructionType; } public void setConstructionType(int theConstructionType) { constructionType = theConstructionType; } public double getWallThickness() { return wallThickness; } public void setWallThickness(double theWallThickness) { wallThickness = theWallThickness; } public double getShapeParameter() { return shapeParameter; } public void setShapeParameter(double theShapeParameter) { shapeParameter = theShapeParameter; } @Override public void addAttachedPart(BasePartDTO part) { attachedParts.add(part); } @Override public void removeAttachedPart(BasePartDTO part) { attachedParts.remove(part); } }