Add boattail export support
This commit is contained in:
parent
4da46d6869
commit
c7aa226995
@ -1412,6 +1412,8 @@ RASAeroExport.error25 = Invalid stage number '%d' for simulation '%s'
|
||||
RASAeroExport.error26 = RASAero only supports conical transitions.
|
||||
RASAeroExport.error27 = Transition '%s' has no previous component.
|
||||
RASAeroExport.error28 = Transition '%s' should have the same fore radius as the aft radius (%f) of its previous component, not %f.
|
||||
RASAeroExport.error29 = Boattail length may not be zero.
|
||||
RASAeroExport.error30 = Boattail rear diameter may not be zero.
|
||||
|
||||
! SaveAsFileChooser
|
||||
SaveAsFileChooser.illegalFilename.title = Illegal filename
|
||||
|
@ -0,0 +1,28 @@
|
||||
package net.sf.openrocket.file.rasaero.export;
|
||||
|
||||
import net.sf.openrocket.file.rasaero.RASAeroCommonConstants;
|
||||
import net.sf.openrocket.logging.ErrorSet;
|
||||
import net.sf.openrocket.logging.WarningSet;
|
||||
import net.sf.openrocket.rocketcomponent.Transition;
|
||||
import net.sf.openrocket.file.rasaero.export.RASAeroSaver.RASAeroExportException;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
@XmlRootElement(name = RASAeroCommonConstants.BOATTAIL)
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class BoattailDTO extends TransitionDTO {
|
||||
/**
|
||||
* We need a default no-args constructor.
|
||||
*/
|
||||
public BoattailDTO() {
|
||||
super();
|
||||
}
|
||||
|
||||
public BoattailDTO(Transition boattail, WarningSet warnings, ErrorSet errors) throws RASAeroExportException {
|
||||
super(boattail, warnings, errors);
|
||||
|
||||
setPartType(RASAeroCommonConstants.BOATTAIL);
|
||||
}
|
||||
}
|
@ -89,11 +89,11 @@ public interface BodyTubeDTOAdapter {
|
||||
|
||||
Double getBoattailLength();
|
||||
|
||||
void setBoattailLength(Double boattailLength);
|
||||
void setBoattailLength(Double boattailLength) throws RASAeroExportException;
|
||||
|
||||
Double getBoattailRearDiameter();
|
||||
|
||||
void setBoattailRearDiameter(Double boattailRearDiameter);
|
||||
void setBoattailRearDiameter(Double boattailRearDiameter) throws RASAeroExportException;
|
||||
|
||||
FinDTO getFin();
|
||||
|
||||
|
@ -168,6 +168,14 @@ public class BoosterDTO implements BodyTubeDTOAdapter {
|
||||
finSet = getFinSetFromBodyTube((BodyTube) comp);
|
||||
}
|
||||
} else {
|
||||
// If this booster is the last stage, and the last component is a transition, it could be a boattail
|
||||
if (stageNr == rocket.getChildCount() - 1 && (comp instanceof Transition && !(comp instanceof NoseCone)) &&
|
||||
i == stage.getChildCount() - 1) {
|
||||
Transition transition = (Transition) comp;
|
||||
setBoattailLength(transition.getLength() * RASAeroCommonConstants.OPENROCKET_TO_RASAERO_LENGTH);
|
||||
setBoattailRearDiameter(transition.getAftRadius() * 2 * RASAeroCommonConstants.OPENROCKET_TO_RASAERO_LENGTH);
|
||||
}
|
||||
|
||||
// Case: normal body tube
|
||||
if (stage.getChildPosition(firstTube) == 0) {
|
||||
warnings.add(String.format(trans.get("RASAeroExport.warning10"),
|
||||
@ -324,7 +332,10 @@ public class BoosterDTO implements BodyTubeDTOAdapter {
|
||||
return boattailLength;
|
||||
}
|
||||
|
||||
public void setBoattailLength(Double boattailLength) {
|
||||
public void setBoattailLength(Double boattailLength) throws RASAeroExportException {
|
||||
if (boattailLength == 0) {
|
||||
throw new RASAeroExportException(trans.get("RASAeroExport.error29"));
|
||||
}
|
||||
this.boattailLength = boattailLength;
|
||||
}
|
||||
|
||||
@ -332,7 +343,10 @@ public class BoosterDTO implements BodyTubeDTOAdapter {
|
||||
return boattailRearDiameter;
|
||||
}
|
||||
|
||||
public void setBoattailRearDiameter(Double boattailRearDiameter) {
|
||||
public void setBoattailRearDiameter(Double boattailRearDiameter) throws RASAeroExportException {
|
||||
if (boattailRearDiameter == 0) {
|
||||
throw new RASAeroExportException(trans.get("RASAeroExport.error30"));
|
||||
}
|
||||
this.boattailRearDiameter = boattailRearDiameter;
|
||||
}
|
||||
|
||||
|
@ -78,8 +78,8 @@ public class RocketDesignDTO {
|
||||
if (rocket.getChildCount() > 3) {
|
||||
warnings.add(trans.get("RASAeroExport.warning12"));
|
||||
}
|
||||
setUseBooster1(rocket.getStageCount() >= 2);
|
||||
setUseBooster2(rocket.getStageCount() == 3);
|
||||
setUseBooster1(rocket.getChildCount() >= 2);
|
||||
setUseBooster2(rocket.getChildCount() == 3);
|
||||
|
||||
AxialStage sustainer = rocket.getStage(0);
|
||||
|
||||
@ -106,7 +106,12 @@ public class RocketDesignDTO {
|
||||
setSurface(RASAeroCommonConstants.OPENROCKET_TO_RASAERO_SURFACE(((NoseCone) component).getFinish(),
|
||||
warnings));
|
||||
} else if (component instanceof Transition) {
|
||||
addExternalPart(new TransitionDTO((Transition) component, warnings, errors));
|
||||
// If there is only a sustainer & this is the last child of the sustainer, it's a boattail
|
||||
if (rocket.getChildCount() == 1 && (i == sustainer.getChildCount() - 1)) {
|
||||
addExternalPart(new BoattailDTO((Transition) component, warnings, errors));
|
||||
} else {
|
||||
addExternalPart(new TransitionDTO((Transition) component, warnings, errors));
|
||||
}
|
||||
}
|
||||
} catch (RASAeroExportException e) {
|
||||
errors.add(e.getMessage());
|
||||
|
@ -10,6 +10,7 @@ import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
import javax.xml.bind.annotation.XmlSeeAlso;
|
||||
import javax.xml.bind.annotation.XmlTransient;
|
||||
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
||||
|
||||
@ -19,10 +20,9 @@ import net.sf.openrocket.rocketcomponent.Transition;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.util.MathUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@XmlRootElement(name = RASAeroCommonConstants.TRANSITION)
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@XmlSeeAlso({BoattailDTO.class})
|
||||
public class TransitionDTO extends BasePartDTO {
|
||||
|
||||
@XmlElement(name = RASAeroCommonConstants.REAR_DIAMETER)
|
||||
@ -31,6 +31,8 @@ public class TransitionDTO extends BasePartDTO {
|
||||
|
||||
@XmlTransient
|
||||
private static final Translator trans = Application.getTranslator();
|
||||
@XmlTransient
|
||||
private static Transition component = null;
|
||||
|
||||
/**
|
||||
* We need a default no-args constructor.
|
||||
@ -41,6 +43,8 @@ public class TransitionDTO extends BasePartDTO {
|
||||
public TransitionDTO(Transition transition, WarningSet warnings, ErrorSet errors) throws RASAeroExportException {
|
||||
super(transition, warnings, errors);
|
||||
|
||||
component = transition;
|
||||
|
||||
if (!transition.getShapeType().equals(Transition.Shape.CONICAL)) {
|
||||
throw new RASAeroExportException(trans.get("RASAeroExport.error26"));
|
||||
}
|
||||
@ -62,7 +66,10 @@ public class TransitionDTO extends BasePartDTO {
|
||||
return rearDiameter;
|
||||
}
|
||||
|
||||
public void setRearDiameter(Double rearDiameter) {
|
||||
public void setRearDiameter(Double rearDiameter) throws RASAeroExportException {
|
||||
if (rearDiameter < 0.0001) {
|
||||
throw new RASAeroExportException(String.format("'%s' rear diameter must be greater than 0.0001 inch", component));
|
||||
}
|
||||
this.rearDiameter = rearDiameter;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user