Changed default motor to fit default grains
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / grain / Finocyl.java
1 package com.billkuker.rocketry.motorsim.grain;\r
2 \r
3 import java.awt.Shape;\r
4 import java.awt.geom.AffineTransform;\r
5 import java.awt.geom.Ellipse2D;\r
6 import java.awt.geom.Rectangle2D;\r
7 import java.beans.PropertyVetoException;\r
8 \r
9 import javax.measure.quantity.Length;\r
10 import javax.measure.unit.SI;\r
11 \r
12 import org.jscience.physics.amount.Amount;\r
13 \r
14 import com.billkuker.rocketry.motorsim.Validating;\r
15 import com.billkuker.rocketry.motorsim.grain.util.BurningShape;\r
16 import com.billkuker.rocketry.motorsim.grain.util.ExtrudedShapeGrain;\r
17 import com.billkuker.rocketry.motorsim.visual.Editor;\r
18 import com.billkuker.rocketry.motorsim.visual.GrainPanel;\r
19 \r
20 public class Finocyl extends ExtrudedShapeGrain implements Validating {\r
21         private Amount<Length> oD = Amount.valueOf(30, SI.MILLIMETER);\r
22         private Amount<Length> iD = Amount.valueOf(10, SI.MILLIMETER);\r
23         private Amount<Length> finWidth = Amount.valueOf(2, SI.MILLIMETER);\r
24         private Amount<Length> finDiameter = Amount.valueOf(20, SI.MILLIMETER);\r
25         private int finCount = 5;\r
26         \r
27         public Finocyl(){\r
28                 try {\r
29                         setLength(Amount.valueOf(70, SI.MILLIMETER));\r
30                 } catch (PropertyVetoException e) {\r
31                         e.printStackTrace();\r
32                 }\r
33                 generateGeometry();\r
34         }\r
35         \r
36         private void generateGeometry(){\r
37                 double odmm = oD.doubleValue(SI.MILLIMETER);\r
38                 double idmm = iD.doubleValue(SI.MILLIMETER);\r
39                 double fwmm = finWidth.doubleValue(SI.MILLIMETER);\r
40                 double fdmm = finDiameter.doubleValue(SI.MILLIMETER);\r
41                 \r
42                 xsection = new BurningShape();\r
43                 Shape outside = new Ellipse2D.Double(-odmm/2, -odmm/2, odmm, odmm);\r
44                 xsection.add(outside);\r
45                 xsection.inhibit(outside);\r
46                 xsection.subtract(new Ellipse2D.Double(-idmm/2, -idmm/2, idmm, idmm));\r
47                 webThickness = null;\r
48                 \r
49                 for ( int i = 0; i < finCount; i++ ){\r
50                         Shape fin = new Rectangle2D.Double(-fwmm/2,0,fwmm,fdmm/2);\r
51                         xsection.subtract(fin, AffineTransform.getRotateInstance(i*(2.0*Math.PI/finCount)));\r
52                 }\r
53         }\r
54         \r
55         public Amount<Length> getOD() {\r
56                 return oD;\r
57         }\r
58 \r
59         public void setOD(Amount<Length> od) throws PropertyVetoException {\r
60                 if (od.equals(this.oD))\r
61                         return;\r
62                 this.oD = od;\r
63                 generateGeometry();\r
64         }\r
65 \r
66         public Amount<Length> getID() {\r
67                 return iD;\r
68         }\r
69 \r
70         public void setID(Amount<Length> id) throws PropertyVetoException {\r
71                 if (id.equals(this.iD))\r
72                         return;\r
73                 iD = id;\r
74                 generateGeometry();\r
75         }\r
76         \r
77         public Amount<Length> getFinWidth() {\r
78                 return finWidth;\r
79         }\r
80 \r
81         public void setFinWidth(Amount<Length> finWidth) throws PropertyVetoException {\r
82                 if (finWidth.equals(this.finWidth))\r
83                         return;\r
84                 this.finWidth = finWidth;\r
85                 generateGeometry();\r
86         }\r
87         \r
88         \r
89         public Amount<Length> getFinDiameter() {\r
90                 return finDiameter;\r
91         }\r
92 \r
93         public void setFinDiameter(Amount<Length> finDiameter) throws PropertyVetoException {\r
94                 if (finDiameter.equals(this.finDiameter))\r
95                         return;\r
96                 this.finDiameter = finDiameter;\r
97                 generateGeometry();\r
98         }\r
99         \r
100         \r
101         public int getFinCount() {\r
102                 return finCount;\r
103         }\r
104 \r
105         public void setFinCount(int finCount) throws PropertyVetoException {\r
106                 if (finCount==this.finCount)\r
107                         return;\r
108                 this.finCount = finCount;\r
109                 generateGeometry();\r
110         }\r
111         \r
112         public static void main(String args[]) throws Exception {\r
113                 Finocyl e = new Finocyl();\r
114                 new Editor(e).showAsWindow();\r
115                 new GrainPanel(e).showAsWindow();\r
116         }\r
117         \r
118         @Override\r
119         public void validate() throws ValidationException{\r
120                 if ( iD.equals(Amount.ZERO) )\r
121                         throw new ValidationException(this, "Invalid iD");\r
122                 if ( oD.equals(Amount.ZERO) )\r
123                         throw new ValidationException(this, "Invalid oD");\r
124                 if ( getLength().equals(Amount.ZERO) )\r
125                         throw new ValidationException(this, "Invalid Length");\r
126                 if ( iD.isGreaterThan(oD) )\r
127                         throw new ValidationException(this, "iD > oD");         \r
128         }\r
129 }\r