1 package net.sf.openrocket.rocketcomponent;
3 import net.sf.openrocket.preset.ComponentPreset;
4 import net.sf.openrocket.util.Coordinate;
5 import net.sf.openrocket.util.MathUtil;
8 * An inner component that consists of a hollow cylindrical component. This can be
9 * an inner tube, tube coupler, centering ring, bulkhead etc.
11 * The properties include the inner and outer radii, length and radial position.
13 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
15 public abstract class ThicknessRingComponent extends RingComponent {
17 protected double outerRadius = 0;
18 protected double thickness = 0;
21 protected void loadFromPreset(ComponentPreset preset) {
22 if ( preset.has(ComponentPreset.OUTER_DIAMETER) ) {
23 this.outerRadiusAutomatic = false;
24 this.innerRadiusAutomatic = false;
25 double outerDiameter = preset.get(ComponentPreset.OUTER_DIAMETER);
26 this.outerRadius = outerDiameter/2.0;
27 if ( preset.has(ComponentPreset.INNER_DIAMETER) ) {
28 double innerDiameter = preset.get(ComponentPreset.INNER_DIAMETER);
29 this.thickness = (outerDiameter-innerDiameter) / 2.0;
32 super.loadFromPreset(preset);
34 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
39 public double getOuterRadius() {
40 if (isOuterRadiusAutomatic() && getParent() instanceof RadialParent) {
41 RocketComponent parent = getParent();
42 double pos1 = this.toRelative(Coordinate.NUL, parent)[0].x;
43 double pos2 = this.toRelative(new Coordinate(getLength()), parent)[0].x;
44 pos1 = MathUtil.clamp(pos1, 0, parent.getLength());
45 pos2 = MathUtil.clamp(pos2, 0, parent.getLength());
46 outerRadius = Math.min(((RadialParent)parent).getInnerRadius(pos1),
47 ((RadialParent)parent).getInnerRadius(pos2));
55 public void setOuterRadius(double r) {
57 if (MathUtil.equals(outerRadius, r) && !isOuterRadiusAutomatic())
61 outerRadiusAutomatic = false;
63 if (thickness > outerRadius)
64 thickness = outerRadius;
68 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
74 public double getThickness() {
75 return Math.min(thickness, getOuterRadius());
78 public void setThickness(double thickness) {
79 double outer = getOuterRadius();
81 thickness = MathUtil.clamp(thickness, 0, outer);
82 if (MathUtil.equals(getThickness(), thickness))
85 this.thickness = thickness;
89 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
94 public double getInnerRadius() {
95 return Math.max(getOuterRadius()-thickness, 0);
98 public void setInnerRadius(double r) {
100 setThickness(getOuterRadius() - r);