package net.sf.openrocket.rocketcomponent;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
/**
* An inner component that consists of a hollow cylindrical component. This can be
* an inner tube, tube coupler, centering ring, bulkhead etc.
*
* The properties include the inner and outer radii, length and radial position.
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public abstract class ThicknessRingComponent extends RingComponent {
protected double outerRadius = 0;
protected double thickness = 0;
@Override
protected void loadFromPreset(ComponentPreset preset) {
if ( preset.has(ComponentPreset.OUTER_DIAMETER) ) {
this.outerRadiusAutomatic = false;
this.innerRadiusAutomatic = false;
double outerDiameter = preset.get(ComponentPreset.OUTER_DIAMETER);
this.outerRadius = outerDiameter/2.0;
if ( preset.has(ComponentPreset.INNER_DIAMETER) ) {
double innerDiameter = preset.get(ComponentPreset.INNER_DIAMETER);
this.thickness = (outerDiameter-innerDiameter) / 2.0;
}
}
super.loadFromPreset(preset);
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
@Override
public double getOuterRadius() {
if (isOuterRadiusAutomatic() && getParent() instanceof RadialParent) {
RocketComponent parent = getParent();
double pos1 = this.toRelative(Coordinate.NUL, parent)[0].x;
double pos2 = this.toRelative(new Coordinate(getLength()), parent)[0].x;
pos1 = MathUtil.clamp(pos1, 0, parent.getLength());
pos2 = MathUtil.clamp(pos2, 0, parent.getLength());
outerRadius = Math.min(((RadialParent)parent).getInnerRadius(pos1),
((RadialParent)parent).getInnerRadius(pos2));
}
return outerRadius;
}
@Override
public void setOuterRadius(double r) {
r = Math.max(r,0);
if (MathUtil.equals(outerRadius, r) && !isOuterRadiusAutomatic())
return;
outerRadius = r;
outerRadiusAutomatic = false;
if (thickness > outerRadius)
thickness = outerRadius;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
@Override
public double getThickness() {
return Math.min(thickness, getOuterRadius());
}
@Override
public void setThickness(double thickness) {
double outer = getOuterRadius();
thickness = MathUtil.clamp(thickness, 0, outer);
if (MathUtil.equals(getThickness(), thickness))
return;
this.thickness = thickness;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
@Override
public double getInnerRadius() {
return Math.max(getOuterRadius()-thickness, 0);
}
@Override
public void setInnerRadius(double r) {
r = Math.max(r,0);
setThickness(getOuterRadius() - r);
}
}