6439e85e8d11883ea3c2efad7320ffca30abd6ff
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / grain / EndBurner.java
1 package com.billkuker.rocketry.motorsim.grain;
2
3 import java.awt.geom.Rectangle2D;
4 import java.beans.PropertyChangeEvent;
5 import java.beans.PropertyChangeListener;
6
7 import javax.measure.quantity.Length;
8 import javax.measure.unit.SI;
9
10 import org.jscience.physics.amount.Amount;
11
12 import com.billkuker.rocketry.motorsim.Validating;
13 import com.billkuker.rocketry.motorsim.grain.util.BurningShape;
14 import com.billkuker.rocketry.motorsim.grain.util.RotatedShapeGrain;
15
16 public class EndBurner extends RotatedShapeGrain implements Validating {
17
18         private Amount<Length> length = Amount.valueOf(70, SI.MILLIMETER);
19         private Amount<Length> oD = Amount.valueOf(30, SI.MILLIMETER);
20         private Amount<Length> puntDiameter = Amount.valueOf(10, SI.MILLIMETER);
21         private Amount<Length> puntDepth = Amount.valueOf(10, SI.MILLIMETER);
22         
23         private void generateGeometry(){
24                 double len = length.doubleValue(SI.MILLIMETER);
25                 double od = oD.doubleValue(SI.MILLIMETER);
26                 double pdi = puntDiameter.doubleValue(SI.MILLIMETER);
27                 double plen = puntDepth.doubleValue(SI.MILLIMETER);
28                 
29                 Rectangle2D.Double grain, punt, end;
30                 grain = new Rectangle2D.Double(0,0,od/2.0,len);
31                 punt = new Rectangle2D.Double(0,len-plen, pdi/2.0, plen);
32                 end = new Rectangle2D.Double(0,len,od,0);
33                 
34                 shape = new BurningShape();
35                 web = null;
36                 
37                 shape.add(grain);
38                 shape.inhibit(grain);
39                 shape.subtract(punt);
40                 shape.subtract(end);
41         }
42         
43         public EndBurner(){
44                 this.addPropertyChangeListener(new PropertyChangeListener(){
45                         @Override
46                         public void propertyChange(PropertyChangeEvent evt) {
47                                 generateGeometry();
48                         }});
49                 generateGeometry();
50         }
51         
52         @Override
53         public void validate() throws ValidationException {
54                 if ( oD.equals(Amount.ZERO) )
55                         throw new ValidationException(this, "Invalid oD");
56                 if ( getLength().equals(Amount.ZERO) )
57                         throw new ValidationException(this, "Invalid Length");
58                 if ( puntDiameter.isGreaterThan(oD) )
59                         throw new ValidationException(this, "puntDiameter > oD");
60                 if ( puntDepth.isGreaterThan(length) )
61                         throw new ValidationException(this, "puntDepth > length");
62         }
63
64         public Amount<Length> getLength() {
65                 return length;
66         }
67
68         public void setLength(Amount<Length> length) {
69                 this.length = length;
70         }
71
72         public Amount<Length> getOD() {
73                 return oD;
74         }
75
76         public void setOD(Amount<Length> oD) {
77                 this.oD = oD;
78         }
79
80         public Amount<Length> getPuntDiameter() {
81                 return puntDiameter;
82         }
83
84         public void setPuntDiameter(Amount<Length> puntDiameter) {
85                 this.puntDiameter = puntDiameter;
86         }
87
88         public Amount<Length> getPuntDepth() {
89                 return puntDepth;
90         }
91
92         public void setPuntDepth(Amount<Length> puntDepth) {
93                 this.puntDepth = puntDepth;
94         }
95
96 }