create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / unit / CaliberUnit.java
1 package net.sf.openrocket.unit;
2
3 import java.util.Iterator;
4
5 import net.sf.openrocket.rocketcomponent.Configuration;
6 import net.sf.openrocket.rocketcomponent.Rocket;
7 import net.sf.openrocket.rocketcomponent.RocketComponent;
8 import net.sf.openrocket.rocketcomponent.SymmetricComponent;
9 import net.sf.openrocket.util.BugException;
10 import net.sf.openrocket.util.MathUtil;
11
12
13 public class CaliberUnit extends GeneralUnit {
14         
15         public static final double DEFAULT_CALIBER = 0.01;
16         
17         private final Configuration configuration;
18         private final Rocket rocket;
19         
20         private int rocketModId = -1;
21         private int configurationModId = -1;
22         
23         private double caliber = -1;
24         
25         
26
27
28         public CaliberUnit(Configuration configuration) {
29                 super(1.0, "cal");
30                 this.configuration = configuration;
31                 
32                 if (configuration == null) {
33                         this.rocket = null;
34                 } else {
35                         this.rocket = configuration.getRocket();
36                 }
37         }
38         
39         public CaliberUnit(Rocket rocket) {
40                 super(1.0, "cal");
41                 this.configuration = null;
42                 this.rocket = rocket;
43         }
44         
45         public CaliberUnit(double reference) {
46                 super(1.0, "cal");
47                 this.configuration = null;
48                 this.rocket = null;
49                 this.caliber = reference;
50                 
51                 if (reference <= 0) {
52                         throw new IllegalArgumentException("Illegal reference = " + reference);
53                 }
54         }
55         
56         
57         @Override
58         public double fromUnit(double value) {
59                 checkCaliber();
60                 
61                 return value * caliber;
62         }
63         
64         @Override
65         public double toUnit(double value) {
66                 checkCaliber();
67                 
68                 return value / caliber;
69         }
70         
71         
72
73         private void checkCaliber() {
74                 if (configuration != null && configuration.getModID() != configurationModId) {
75                         caliber = -1;
76                         configurationModId = configuration.getModID();
77                 }
78                 if (rocket != null && rocket.getModID() != rocketModId) {
79                         caliber = -1;
80                         rocketModId = rocket.getModID();
81                 }
82                 if (caliber < 0) {
83                         if (configuration != null) {
84                                 caliber = calculateCaliber(configuration);
85                         } else if (rocket != null) {
86                                 caliber = calculateCaliber(rocket);
87                         } else {
88                                 throw new BugException("Both rocket and configuration are null");
89                         }
90                 }
91         }
92         
93         
94         /**
95          * Calculate the caliber of a rocket configuration.
96          * 
97          * @param config        the rocket configuration
98          * @return                      the caliber of the rocket, or the default caliber.
99          */
100         public static double calculateCaliber(Configuration config) {
101                 return calculateCaliber(config.iterator());
102         }
103         
104         /**
105          * Calculate the caliber of a rocket.
106          * 
107          * @param rocket        the rocket
108          * @return                      the caliber of the rocket, or the default caliber.
109          */
110         public static double calculateCaliber(Rocket rocket) {
111                 return calculateCaliber(rocket.iterator());
112         }
113         
114         
115
116         private static double calculateCaliber(Iterator<RocketComponent> iterator) {
117                 double cal = 0;
118                 
119                 while (iterator.hasNext()) {
120                         RocketComponent c = iterator.next();
121                         if (c instanceof SymmetricComponent) {
122                                 double r1 = ((SymmetricComponent) c).getForeRadius() * 2;
123                                 double r2 = ((SymmetricComponent) c).getAftRadius() * 2;
124                                 cal = MathUtil.max(cal, r1, r2);
125                         }
126                 }
127                 
128                 if (cal < 0.0001)
129                         cal = DEFAULT_CALIBER;
130                 
131                 return cal;
132         }
133 }