package net.sf.openrocket.rocketcomponent;
-import net.sf.openrocket.motor.Motor;
-import net.sf.openrocket.util.Coordinate;
-import net.sf.openrocket.util.MathUtil;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.motor.Motor;
+import net.sf.openrocket.startup.Application;
+import net.sf.openrocket.util.Coordinate;
+import net.sf.openrocket.util.MathUtil;
+
/**
* Rocket body tube component. Has only two parameters, a radius and length.
- *
+ *
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class BodyTube extends SymmetricComponent implements MotorMount, Coaxial {
-
- private double radius=0;
- private boolean autoRadius = false; // Radius chosen automatically based on parent component
+ private static final Translator trans = Application.getTranslator();
+
+ private double radius = 0;
+ private boolean autoRadius = false; // Radius chosen automatically based on parent component
// When changing the inner radius, thickness is modified
private double ignitionDelay = 0;
private double overhang = 0;
-
+
public BodyTube() {
super();
- this.length = 8*DEFAULT_RADIUS;
+ this.length = 8 * DEFAULT_RADIUS;
this.radius = DEFAULT_RADIUS;
this.autoRadius = true;
}
public BodyTube(double length, double radius) {
super();
- this.radius = Math.max(radius,0);
- this.length = Math.max(length,0);
+ this.radius = Math.max(radius, 0);
+ this.length = Math.max(length, 0);
}
public BodyTube(double length, double radius, boolean filled) {
- this(length,radius);
+ this(length, radius);
this.filled = filled;
}
public BodyTube(double length, double radius, double thickness) {
- this(length,radius);
+ this(length, radius);
this.filled = false;
this.thickness = thickness;
}
-
+
/************ Get/set component parameter methods ************/
-
+
/**
* Return the outer radius of the body tube.
- *
- * @return the outside radius of the tube
+ *
+ * @return the outside radius of the tube
*/
- @Override
- public double getOuterRadius () {
+ @Override
+ public double getOuterRadius() {
if (autoRadius) {
// Return auto radius from front or rear
double r = -1;
* Set the outer radius of the body tube. If the radius is less than the wall thickness,
* the wall thickness is decreased accordingly of the value of the radius.
* This method sets the automatic radius off.
- *
- * @param radius the outside radius in standard units
+ *
+ * @param radius the outside radius in standard units
*/
- @Override
- public void setOuterRadius (double radius) {
- if ((this.radius == radius) && (autoRadius==false))
+ @Override
+ public void setOuterRadius(double radius) {
+ if ((this.radius == radius) && (autoRadius == false))
return;
this.autoRadius = false;
- this.radius = Math.max(radius,0);
-
+ this.radius = Math.max(radius, 0);
+
if (this.thickness > this.radius)
this.thickness = this.radius;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
/**
* Returns whether the radius is selected automatically or not.
* Returns false also in case automatic radius selection is not possible.
*/
- public boolean isRadiusAutomatic() {
+ public boolean isOuterRadiusAutomatic() {
return autoRadius;
}
-
+
/**
- * Sets whether the radius is selected automatically or not.
+ * Sets whether the radius is selected automatically or not.
*/
- public void setRadiusAutomatic(boolean auto) {
+ public void setOuterRadiusAutomatic(boolean auto) {
if (autoRadius == auto)
return;
@Override
- public double getAftRadius() { return getOuterRadius(); }
- @Override
- public double getForeRadius() { return getOuterRadius(); }
+ public double getAftRadius() {
+ return getOuterRadius();
+ }
+
@Override
- public boolean isAftRadiusAutomatic() { return isRadiusAutomatic(); }
+ public double getForeRadius() {
+ return getOuterRadius();
+ }
+
@Override
- public boolean isForeRadiusAutomatic() { return isRadiusAutomatic(); }
+ public boolean isAftRadiusAutomatic() {
+ return isOuterRadiusAutomatic();
+ }
+ @Override
+ public boolean isForeRadiusAutomatic() {
+ return isOuterRadiusAutomatic();
+ }
+
@Override
protected double getFrontAutoRadius() {
- if (isRadiusAutomatic()) {
+ if (isOuterRadiusAutomatic()) {
// Search for previous SymmetricComponent
SymmetricComponent c = this.getPreviousSymmetricComponent();
if (c != null) {
}
return getOuterRadius();
}
-
+
@Override
protected double getRearAutoRadius() {
- if (isRadiusAutomatic()) {
+ if (isOuterRadiusAutomatic()) {
// Search for next SymmetricComponent
SymmetricComponent c = this.getNextSymmetricComponent();
if (c != null) {
}
return getOuterRadius();
}
-
-
-
-
- @Override
+
+
+
+ @Override
public double getInnerRadius() {
if (filled)
return 0;
- return Math.max(getOuterRadius()-thickness, 0);
+ return Math.max(getOuterRadius() - thickness, 0);
}
- @Override
+ @Override
public void setInnerRadius(double r) {
- setThickness(getOuterRadius()-r);
+ setThickness(getOuterRadius() - r);
}
-
-
+
+
/**
* Return the component name.
*/
@Override
public String getComponentName() {
- return "Body tube";
+ //// Body tube
+ return trans.get("BodyTube.BodyTube");
}
-
- /**
- * Accept a visitor to this BodyTube in the component hierarchy.
- *
- * @param theVisitor the visitor that will be called back with a reference to this BodyTube
- */
- @Override
- public void accept (final ComponentVisitor theVisitor) {
- theVisitor.visit(this);
- }
-
-
+
+
/************ Component calculations ***********/
// From SymmetricComponent
public double getRadius(double x) {
return getOuterRadius();
}
-
+
/**
* Returns the inner radius at the position x. If the tube is filled, returns always zero.
*/
if (filled)
return 0.0;
else
- return Math.max(getOuterRadius()-thickness,0);
+ return Math.max(getOuterRadius() - thickness, 0);
}
-
+
/**
* Returns the body tube's center of gravity.
*/
@Override
public Coordinate getComponentCG() {
- return new Coordinate(length/2,0,0,getComponentMass());
+ return new Coordinate(length / 2, 0, 0, getComponentMass());
}
/**
public double getComponentVolume() {
double r = getOuterRadius();
if (filled)
- return getFilledVolume(r,length);
+ return getFilledVolume(r, length);
else
- return getFilledVolume(r,length) - getFilledVolume(getInnerRadius(0),length);
+ return getFilledVolume(r, length) - getFilledVolume(getInnerRadius(0), length);
}
@Override
- public double getLongitudalUnitInertia() {
+ public double getLongitudinalUnitInertia() {
// 1/12 * (3 * (r1^2 + r2^2) + h^2)
- return (3 * (MathUtil.pow2(getInnerRadius())) + MathUtil.pow2(getOuterRadius()) +
- MathUtil.pow2(getLength())) / 12;
+ return (3 * (MathUtil.pow2(getInnerRadius())) + MathUtil.pow2(getOuterRadius()) + MathUtil.pow2(getLength())) / 12;
}
-
+
@Override
public double getRotationalUnitInertia() {
// 1/2 * (r1^2 + r2^2)
- return (MathUtil.pow2(getInnerRadius()) + MathUtil.pow2(getOuterRadius()))/2;
+ return (MathUtil.pow2(getInnerRadius()) + MathUtil.pow2(getOuterRadius())) / 2;
}
-
-
+
+
/**
* Helper function for cylinder volume.
*/
private static double getFilledVolume(double r, double l) {
- return Math.PI * r*r * l;
+ return Math.PI * r * r * l;
}
-
+
/**
* Adds bounding coordinates to the given set. The body tube will fit within the
* convex hull of the points.
- *
+ *
* Currently the points are simply a rectangular box around the body tube.
*/
@Override
public Collection<Coordinate> getComponentBounds() {
Collection<Coordinate> bounds = new ArrayList<Coordinate>(8);
double r = getOuterRadius();
- addBound(bounds,0,r);
- addBound(bounds,length,r);
+ addBound(bounds, 0, r);
+ addBound(bounds, length, r);
return bounds;
}
+
+
-
+ /**
+ * Check whether the given type can be added to this component. BodyTubes allow any
+ * InternalComponents or ExternalComponents, excluding BodyComponents, to be added.
+ *
+ * @param type The RocketComponent class type to add.
+ * @return Whether such a component can be added.
+ */
+ @Override
+ public boolean isCompatible(Class<? extends RocketComponent> type) {
+ if (InternalComponent.class.isAssignableFrom(type))
+ return true;
+ if (ExternalComponent.class.isAssignableFrom(type) &&
+ !BodyComponent.class.isAssignableFrom(type))
+ return true;
+ return false;
+ }
+
//////////////// Motor mount /////////////////
@Override
public boolean isMotorMount() {
return motorMount;
}
-
+
@Override
public void setMotorMount(boolean mount) {
if (motorMount == mount)
return motors.get(id);
}
-
+
@Override
public void setMotor(String id, Motor motor) {
if (id == null) {
motors.put(id, motor);
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
}
-
+
@Override
public double getMotorDelay(String id) {
Double delay = ejectionDelays.get(id);
return Motor.PLUGGED;
return delay;
}
-
+
@Override
public void setMotorDelay(String id, double delay) {
ejectionDelays.put(id, delay);
@Override
public double getMotorMountDiameter() {
- return getInnerRadius()*2;
+ return getInnerRadius() * 2;
}
-
+
@Override
public IgnitionEvent getIgnitionEvent() {
return ignitionEvent;
}
-
+
@Override
public void setIgnitionEvent(IgnitionEvent event) {
if (ignitionEvent == event)
ignitionEvent = event;
fireComponentChangeEvent(ComponentChangeEvent.EVENT_CHANGE);
}
-
+
@Override
public double getIgnitionDelay() {
return ignitionDelay;
}
-
+
@Override
public void setIgnitionDelay(double delay) {
if (MathUtil.equals(delay, ignitionDelay))
ignitionDelay = delay;
fireComponentChangeEvent(ComponentChangeEvent.EVENT_CHANGE);
}
-
+
@Override
public double getMotorOverhang() {
this.overhang = overhang;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
-
-
+
+
@Override
public Coordinate getMotorPosition(String id) {
Motor motor = motors.get(id);
return new Coordinate(this.getLength() - motor.getLength() + this.getMotorOverhang());
}
-
-
+
+
/*
* (non-Javadoc)
* Copy the motor and ejection delay HashMaps.
- *
+ *
* @see rocketcomponent.RocketComponent#copy()
*/
@SuppressWarnings("unchecked")
@Override
- public RocketComponent copy() {
- RocketComponent c = super.copy();
- ((BodyTube)c).motors = (HashMap<String,Motor>) motors.clone();
- ((BodyTube)c).ejectionDelays = (HashMap<String,Double>) ejectionDelays.clone();
+ protected RocketComponent copyWithOriginalID() {
+ RocketComponent c = super.copyWithOriginalID();
+ ((BodyTube) c).motors = (HashMap<String, Motor>) motors.clone();
+ ((BodyTube) c).ejectionDelays = (HashMap<String, Double>) ejectionDelays.clone();
return c;
}
}