create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / rocketcomponent / ThicknessRingComponent.java
1 package net.sf.openrocket.rocketcomponent;
2
3 import net.sf.openrocket.preset.ComponentPreset;
4 import net.sf.openrocket.util.Coordinate;
5 import net.sf.openrocket.util.MathUtil;
6
7 /**
8  * An inner component that consists of a hollow cylindrical component.  This can be
9  * an inner tube, tube coupler, centering ring, bulkhead etc.
10  * 
11  * The properties include the inner and outer radii, length and radial position.
12  * 
13  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
14  */
15 public abstract class ThicknessRingComponent extends RingComponent {
16
17         protected double outerRadius = 0;
18         protected double thickness = 0;
19         
20         @Override
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;
30                         }
31                 }
32                 super.loadFromPreset(preset);
33
34                 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
35
36         }
37
38         @Override
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));
48                 }
49                                 
50                 return outerRadius;
51         }
52
53         
54         @Override
55         public void setOuterRadius(double r) {
56                 r = Math.max(r,0);
57                 if (MathUtil.equals(outerRadius, r) && !isOuterRadiusAutomatic())
58                         return;
59                 
60                 outerRadius = r;
61                 outerRadiusAutomatic = false;
62
63                 if (thickness > outerRadius)
64                         thickness = outerRadius;
65                 
66                 clearPreset();
67                 
68                 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
69         }
70         
71         
72
73         @Override
74         public double getThickness() {
75                 return Math.min(thickness, getOuterRadius());
76         }
77         @Override
78         public void setThickness(double thickness) {
79                 double outer = getOuterRadius();
80                 
81                 thickness = MathUtil.clamp(thickness, 0, outer);
82                 if (MathUtil.equals(getThickness(), thickness))
83                         return;
84                 
85                 this.thickness = thickness;
86                 
87                 clearPreset();
88
89                 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
90         }
91
92         
93         @Override
94         public double getInnerRadius() {
95                 return Math.max(getOuterRadius()-thickness, 0);
96         }
97         @Override
98         public void setInnerRadius(double r) {
99                 r = Math.max(r,0);
100                 setThickness(getOuterRadius() - r);
101         }
102         
103         
104 }