diff --git a/ChangeLog b/ChangeLog
index 2bef3cadc..fc0cab4f6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2010-09-05 Sampo Niskanen
+
+ * [BUG] Fixed bug that prevents adding stages to a rocket
+
2010-09-04 Sampo Niskanen
* Added launch rod velocity to FlightData
diff --git a/src/net/sf/openrocket/aerodynamics/AbstractAerodynamicCalculator.java b/src/net/sf/openrocket/aerodynamics/AbstractAerodynamicCalculator.java
index 0fc79ca88..cf730b6ab 100644
--- a/src/net/sf/openrocket/aerodynamics/AbstractAerodynamicCalculator.java
+++ b/src/net/sf/openrocket/aerodynamics/AbstractAerodynamicCalculator.java
@@ -3,19 +3,13 @@ package net.sf.openrocket.aerodynamics;
import java.util.Map;
import net.sf.openrocket.rocketcomponent.Configuration;
-import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.util.Coordinate;
/**
- * A class that is the base of all aerodynamical calculations.
- *
- * A rocket must be assigned to this class before any operations are allowed.
- * This can be done using the constructor or using the
- * {@link #setRocket(Rocket)} method. The default is a
- * null
configuration, in which case the calculation
- * methods throw {@link NullPointerException}.
+ * An abstract aerodynamic calculator implementation, that offers basic implementation
+ * of some methods and methods for cache validation and purging.
*
* @author Sampo Niskanen
*/
@@ -33,11 +27,11 @@ public abstract class AbstractAerodynamicCalculator implements AerodynamicCalcul
/** The aerodynamic modification ID of the latest rocket */
private int rocketAeroModID = -1;
+ private int stageCount = -1;
-
//////////////// Aerodynamic calculators ////////////////
public abstract Coordinate getCP(Configuration configuration, FlightConditions conditions,
@@ -89,8 +83,10 @@ public abstract class AbstractAerodynamicCalculator implements AerodynamicCalcul
* @param configuration the configuration of the current call
*/
protected final void checkCache(Configuration configuration) {
- if (rocketAeroModID != configuration.getRocket().getAerodynamicModID()) {
+ if (rocketAeroModID != configuration.getRocket().getAerodynamicModID() ||
+ stageCount != configuration.getStageCount()) {
rocketAeroModID = configuration.getRocket().getAerodynamicModID();
+ stageCount = configuration.getStageCount();
voidAerodynamicCache();
}
}
diff --git a/src/net/sf/openrocket/masscalc/AbstractMassCalculator.java b/src/net/sf/openrocket/masscalc/AbstractMassCalculator.java
index da0348748..cfcf496bc 100644
--- a/src/net/sf/openrocket/masscalc/AbstractMassCalculator.java
+++ b/src/net/sf/openrocket/masscalc/AbstractMassCalculator.java
@@ -10,6 +10,7 @@ import net.sf.openrocket.rocketcomponent.Configuration;
public abstract class AbstractMassCalculator implements MassCalculator {
private int rocketMassModID = -1;
+ private int stageCount = -1;
/**
@@ -24,8 +25,10 @@ public abstract class AbstractMassCalculator implements MassCalculator {
* @param configuration the configuration of the current call
*/
protected final void checkCache(Configuration configuration) {
- if (rocketMassModID != configuration.getRocket().getMassModID()) {
+ if (rocketMassModID != configuration.getRocket().getMassModID() ||
+ stageCount != configuration.getStageCount()) {
rocketMassModID = configuration.getRocket().getMassModID();
+ stageCount = configuration.getStageCount();
voidMassCache();
}
}
diff --git a/src/net/sf/openrocket/rocketcomponent/Configuration.java b/src/net/sf/openrocket/rocketcomponent/Configuration.java
index cf4303bc0..837e9fea7 100644
--- a/src/net/sf/openrocket/rocketcomponent/Configuration.java
+++ b/src/net/sf/openrocket/rocketcomponent/Configuration.java
@@ -26,9 +26,9 @@ import net.sf.openrocket.util.Monitorable;
*
* @author Sampo Niskanen
*/
-public class Configuration implements Cloneable, ChangeSource, ComponentChangeListener,
+public class Configuration implements Cloneable, ChangeSource, ComponentChangeListener,
Iterable, Monitorable {
-
+
private Rocket rocket;
private BitSet stages = new BitSet();
@@ -41,13 +41,12 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
private int boundsModID = -1;
private ArrayList cachedBounds = new ArrayList();
private double cachedLength = -1;
-
+
private int refLengthModID = -1;
private double cachedRefLength = -1;
-
+
private int modID = 0;
- private int modIDadd = 0;
/**
@@ -61,9 +60,9 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
setAllStages();
rocket.addComponentChangeListener(this);
}
+
+
-
-
public Rocket getRocket() {
return rocket;
}
@@ -71,7 +70,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
public void setAllStages() {
stages.clear();
- stages.set(0,rocket.getStageCount());
+ stages.set(0, rocket.getStageCount());
fireChangeEvent();
}
@@ -84,8 +83,8 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
*/
public void setToStage(int stage) {
stages.clear();
- stages.set(0, stage+1, true);
-// stages.set(stage+1, rocket.getStageCount(), false);
+ stages.set(0, stage + 1, true);
+ // stages.set(stage+1, rocket.getStageCount(), false);
fireChangeEvent();
}
@@ -101,7 +100,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
public boolean isStageActive(RocketComponent stage) {
if (!(stage instanceof Stage)) {
- throw new IllegalArgumentException("called with component "+stage);
+ throw new IllegalArgumentException("called with component " + stage);
}
return stages.get(stage.getParent().getChildPosition(stage));
}
@@ -116,31 +115,31 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
public int getStageCount() {
return rocket.getStageCount();
}
-
+
public int getActiveStageCount() {
int count = 0;
int s = rocket.getStageCount();
- for (int i=0; i < s; i++) {
+ for (int i = 0; i < s; i++) {
if (stages.get(i))
count++;
}
return count;
}
-
+
public int[] getActiveStages() {
int stageCount = rocket.getStageCount();
List active = new ArrayList();
int[] ret;
-
- for (int i=0; i < stageCount; i++) {
+
+ for (int i = 0; i < stageCount; i++) {
if (stages.get(i)) {
active.add(i);
}
}
ret = new int[active.size()];
- for (int i=0; i < ret.length; i++) {
+ for (int i = 0; i < ret.length; i++) {
ret[i] = active.get(i);
}
@@ -164,7 +163,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
public double getReferenceArea() {
- return Math.PI * MathUtil.pow2(getReferenceLength()/2);
+ return Math.PI * MathUtil.pow2(getReferenceLength() / 2);
}
@@ -173,7 +172,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
}
public void setMotorConfigurationID(String id) {
- if ((motorConfiguration == null && id == null) ||
+ if ((motorConfiguration == null && id == null) ||
(id != null && id.equals(motorConfiguration)))
return;
@@ -186,10 +185,9 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
}
-
-
-
+
+
/**
* Removes the listener connection to the rocket and listeners of this object.
* This configuration may not be used after a call to this method!
@@ -207,7 +205,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
public void addChangeListener(ChangeListener listener) {
listenerList.add(ChangeListener.class, listener);
}
-
+
@Override
public void removeChangeListener(ChangeListener listener) {
listenerList.remove(ChangeListener.class, listener);
@@ -221,13 +219,13 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
boundsModID = -1;
refLengthModID = -1;
- for (int i = listeners.length-2; i>=0; i-=2) {
+ for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ChangeListener.class) {
- ((ChangeListener) listeners[i+1]).stateChanged(e);
+ ((ChangeListener) listeners[i + 1]).stateChanged(e);
}
}
}
-
+
@Override
public void componentChanged(ComponentChangeEvent e) {
@@ -243,7 +241,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
* @return true if this configuration has active motor mounts with motors defined to them.
*/
public boolean hasMotors() {
- for (RocketComponent c: this) {
+ for (RocketComponent c : this) {
if (c instanceof MotorMount) {
MotorMount mount = (MotorMount) c;
if (!mount.isMotorMount())
@@ -269,9 +267,9 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
cachedBounds.clear();
double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY;
- for (RocketComponent component: this) {
- for (Coordinate c: component.getComponentBounds()) {
- for (Coordinate coord: component.toAbsolute(c)) {
+ for (RocketComponent component : this) {
+ for (Coordinate c : component.getComponentBounds()) {
+ for (Coordinate coord : component.toAbsolute(c)) {
cachedBounds.add(coord);
if (coord.x < minX)
minX = coord.x;
@@ -299,13 +297,13 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
*/
public double getLength() {
if (rocket.getModID() != boundsModID)
- getBounds(); // Calculates the length
-
+ getBounds(); // Calculates the length
+
return cachedLength;
}
-
+
/**
* Return an iterator that iterates over the currently active components.
@@ -345,17 +343,17 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
rocket.addComponentChangeListener(config);
return config;
} catch (CloneNotSupportedException e) {
- throw new BugException("BUG: clone not supported!",e);
+ throw new BugException("BUG: clone not supported!", e);
}
}
-
-
+
+
@Override
public int getModID() {
return modID + rocket.getModID();
}
-
+
/**
* A class that iterates over all currently active components.
*
@@ -368,7 +366,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
public ConfigurationIterator() {
List> list = new ArrayList>();
- for (RocketComponent stage: rocket.getChildren()) {
+ for (RocketComponent stage : rocket.getChildren()) {
if (isStageActive(stage)) {
list.add(stage.deepIterator());
}
@@ -392,7 +390,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
return current.hasNext();
}
-
+
@Override
public RocketComponent next() {
if (!current.hasNext())
@@ -400,7 +398,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
return current.next();
}
-
+
/**
* Get the next iterator that has items. If such an iterator does
* not exist, current is left to an empty iterator.
@@ -424,13 +422,13 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
public MotorIterator() {
this.iterator = iterator();
}
-
+
@Override
public boolean hasNext() {
getNext();
return (next != null);
}
-
+
@Override
public MotorMount next() {
getNext();
@@ -442,7 +440,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
next = null;
return ret;
}
-
+
@Override
public void remove() {
throw new UnsupportedOperationException("remove unsupported");
@@ -463,5 +461,5 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
}
}
}
-
+
}