Regenerate multiport geometry
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / grain / MultiPort.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.beans.PropertyVetoException;\r
7 \r
8 import javax.measure.quantity.Angle;\r
9 import javax.measure.quantity.Length;\r
10 import javax.measure.unit.NonSI;\r
11 import javax.measure.unit.SI;\r
12 \r
13 import org.jscience.physics.amount.Amount;\r
14 \r
15 import com.billkuker.rocketry.motorsim.Grain;\r
16 import com.billkuker.rocketry.motorsim.Validating;\r
17 import com.billkuker.rocketry.motorsim.grain.util.BurningShape;\r
18 import com.billkuker.rocketry.motorsim.grain.util.ExtrudedShapeGrain;\r
19 import com.billkuker.rocketry.motorsim.visual.Editor;\r
20 import com.billkuker.rocketry.motorsim.visual.GrainPanel;\r
21 \r
22 public class MultiPort extends ExtrudedShapeGrain implements Validating {\r
23 \r
24         private boolean inhibitOutside = true;\r
25 \r
26         private Amount<Length> oD = Amount.valueOf(30, SI.MILLIMETER);\r
27 \r
28         private Amount<Length> coreD = Amount.valueOf(3, SI.MILLIMETER);\r
29 \r
30         private Amount<Length> r1D = Amount.valueOf(2, SI.MILLIMETER);\r
31         private Amount<Length> r1Offset = Amount.valueOf(5, SI.MILLIMETER);\r
32         private int r1Count = 4;\r
33 \r
34         private Amount<Length> r2D = Amount.valueOf(1, SI.MILLIMETER);\r
35         private Amount<Length> r2Offset = Amount.valueOf(10, SI.MILLIMETER);\r
36         private int r2Count = 8;\r
37 \r
38         private Amount<Angle> ringTwoRot = Amount.valueOf(22.5, NonSI.DEGREE_ANGLE);\r
39 \r
40         @Override\r
41         public void validate() throws ValidationException {\r
42                 // TODO Auto-generated method stub\r
43 \r
44         }\r
45 \r
46         public MultiPort() {\r
47                 try {\r
48                         setLength(Amount.valueOf(70, SI.MILLIMETER));\r
49                 } catch (PropertyVetoException e) {\r
50                         e.printStackTrace();\r
51                 }\r
52                 generateGeometry();\r
53         }\r
54 \r
55         private void generateGeometry() {\r
56                 double odmm = oD.doubleValue(SI.MILLIMETER);\r
57                 double cdmm = coreD.doubleValue(SI.MILLIMETER);\r
58                 double r1dmm = r1D.doubleValue(SI.MILLIMETER);\r
59                 double r1off = r1Offset.doubleValue(SI.MILLIMETER);\r
60 \r
61                 double r2dmm = r2D.doubleValue(SI.MILLIMETER);\r
62                 double r2off = r2Offset.doubleValue(SI.MILLIMETER);\r
63 \r
64                 double r2rot = ringTwoRot.doubleValue(SI.RADIAN);\r
65 \r
66                 xsection = new BurningShape();\r
67                 Shape outside = new Ellipse2D.Double(-odmm / 2, -odmm / 2, odmm, odmm);\r
68                 xsection.add(outside);\r
69 \r
70                 if (isInhibitOutside())\r
71                         xsection.inhibit(outside);\r
72 \r
73                 xsection.subtract(new Ellipse2D.Double(-cdmm / 2, -cdmm / 2, cdmm, cdmm));\r
74                 webThickness = null;\r
75 \r
76                 for (int i = 0; i < r1Count; i++) {\r
77                         Shape port = new Ellipse2D.Double(r1off - r1dmm / 2, -r1dmm / 2,\r
78                                         r1dmm, r1dmm);\r
79                         xsection.subtract(\r
80                                         port,\r
81                                         AffineTransform.getRotateInstance(i\r
82                                                         * (2.0 * Math.PI / r1Count)));\r
83                 }\r
84 \r
85                 for (int i = 0; i < r2Count; i++) {\r
86                         Shape port = new Ellipse2D.Double(r2off - r2dmm / 2, -r2dmm / 2,\r
87                                         r2dmm, r2dmm);\r
88                         xsection.subtract(\r
89                                         port,\r
90                                         AffineTransform.getRotateInstance(r2rot + i\r
91                                                         * (2.0 * Math.PI / r2Count)));\r
92                 }\r
93         }\r
94 \r
95         public static void main(String args[]) {\r
96                 Grain g;\r
97                 new GrainPanel(g = new MultiPort()).showAsWindow();\r
98                 new Editor(g).showAsWindow();\r
99         }\r
100 \r
101         public Amount<Length> getoD() {\r
102                 return oD;\r
103         }\r
104 \r
105         public void setoD(Amount<Length> oD) {\r
106                 this.oD = oD;\r
107                 generateGeometry();\r
108         }\r
109 \r
110         public Amount<Length> getCoreD() {\r
111                 return coreD;\r
112         }\r
113 \r
114         public void setCoreD(Amount<Length> coreD) {\r
115                 this.coreD = coreD;\r
116                 generateGeometry();\r
117         }\r
118 \r
119         public Amount<Length> getR1D() {\r
120                 return r1D;\r
121         }\r
122 \r
123         public void setR1D(Amount<Length> r1d) {\r
124                 r1D = r1d;\r
125                 generateGeometry();\r
126         }\r
127 \r
128         public Amount<Length> getR1Offset() {\r
129                 return r1Offset;\r
130         }\r
131 \r
132         public void setR1Offset(Amount<Length> r1Offset) {\r
133                 this.r1Offset = r1Offset;\r
134                 generateGeometry();\r
135         }\r
136 \r
137         public int getR1Count() {\r
138                 return r1Count;\r
139         }\r
140 \r
141         public void setR1Count(int r1Count) {\r
142                 this.r1Count = r1Count;\r
143                 generateGeometry();\r
144         }\r
145 \r
146         public Amount<Length> getR2D() {\r
147                 return r2D;\r
148         }\r
149 \r
150         public void setR2D(Amount<Length> r2d) {\r
151                 r2D = r2d;\r
152                 generateGeometry();\r
153         }\r
154 \r
155         public Amount<Length> getR2Offset() {\r
156                 return r2Offset;\r
157         }\r
158 \r
159         public void setR2Offset(Amount<Length> r2Offset) {\r
160                 this.r2Offset = r2Offset;\r
161                 generateGeometry();\r
162         }\r
163 \r
164         public int getR2Count() {\r
165                 return r2Count;\r
166         }\r
167 \r
168         public void setR2Count(int r2Count) {\r
169                 this.r2Count = r2Count;\r
170                 generateGeometry();\r
171         }\r
172 \r
173         public Amount<Angle> getRingTwoRot() {\r
174                 return ringTwoRot;\r
175         }\r
176 \r
177         public void setRingTwoRot(Amount<Angle> ringTwoRot) {\r
178                 this.ringTwoRot = ringTwoRot;\r
179                 generateGeometry();\r
180         }\r
181 \r
182         public boolean isInhibitOutside() {\r
183                 return inhibitOutside;\r
184         }\r
185 \r
186         public void setInhibitOutside(boolean inhibitOutside) {\r
187                 this.inhibitOutside = inhibitOutside;\r
188                 generateGeometry();\r
189         }\r
190 }\r