diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/MassObjectSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/MassObjectSaver.java
index cefbb9345..9842dc26e 100644
--- a/core/src/net/sf/openrocket/file/openrocket/savers/MassObjectSaver.java
+++ b/core/src/net/sf/openrocket/file/openrocket/savers/MassObjectSaver.java
@@ -13,7 +13,7 @@ public class MassObjectSaver extends InternalComponentSaver {
MassObject mass = (MassObject) c;
- elements.add("" + mass.getLength() + "");
+ elements.add("" + mass.getLengthNoAuto() + "");
if (mass.isRadiusAutomatic()) {
elements.add("auto " + mass.getRadiusNoAuto() + "");
} else {
diff --git a/core/src/net/sf/openrocket/file/rocksim/export/BasePartDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/BasePartDTO.java
index 45f7e8989..d2b705830 100644
--- a/core/src/net/sf/openrocket/file/rocksim/export/BasePartDTO.java
+++ b/core/src/net/sf/openrocket/file/rocksim/export/BasePartDTO.java
@@ -12,6 +12,7 @@ import net.sf.openrocket.file.rocksim.RocksimLocationMode;
import net.sf.openrocket.file.rocksim.importt.BaseHandler;
import net.sf.openrocket.rocketcomponent.ExternalComponent;
import net.sf.openrocket.rocketcomponent.FinSet;
+import net.sf.openrocket.rocketcomponent.MassObject;
import net.sf.openrocket.rocketcomponent.RecoveryDevice;
import net.sf.openrocket.rocketcomponent.RingComponent;
import net.sf.openrocket.rocketcomponent.RocketComponent;
@@ -83,7 +84,7 @@ public abstract class BasePartDTO {
setKnownCG(ec.getOverrideCGX() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
setKnownMass(ec.getMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
- if (! (ec instanceof FinSet)) {
+ if (!(ec instanceof FinSet || ec instanceof MassObject)) {
setLen(ec.getLength() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
setUseKnownCG(ec.isCGOverridden() || ec.isMassOverridden() ? 1 : 0);
@@ -146,6 +147,10 @@ public abstract class BasePartDTO {
setRadialAngle(rc.getRadialDirection());
setRadialLoc(rc.getRadialPosition() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
}
+
+ if (ec instanceof MassObject) {
+ setLen(((MassObject)ec).getLengthNoAuto() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
+ }
}
public Double getKnownMass() {
diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassObject.java b/core/src/net/sf/openrocket/rocketcomponent/MassObject.java
index 4c2c30b0a..394a9ac0c 100644
--- a/core/src/net/sf/openrocket/rocketcomponent/MassObject.java
+++ b/core/src/net/sf/openrocket/rocketcomponent/MassObject.java
@@ -50,7 +50,21 @@ public abstract class MassObject extends InternalComponent {
return false;
}
-
+ @Override
+ public double getLength() {
+ if (this.autoRadius) {
+ // Calculate the parachute volume using the non auto radius and the non auto length, and transform that back
+ // to the auto radius situation to get the auto radius length (the volume in both situations is the same).
+ double parachuteVolume = Math.pow(this.radius, 2) * this.length; // Math.PI left out, not needed
+ return parachuteVolume / Math.pow(getRadius(), 2);
+ }
+ return length;
+ }
+
+ public double getLengthNoAuto() {
+ return length;
+ }
+
public void setLength(double length) {
for (RocketComponent listener : configListeners) {
if (listener instanceof MassObject) {
@@ -59,10 +73,17 @@ public abstract class MassObject extends InternalComponent {
}
length = Math.max(length, 0);
- if (MathUtil.equals(this.length, length)) {
- return;
+ if (this.autoRadius) {
+ // Calculate the parachute volume using the auto radius and the new "auto" length, and transform that back
+ // to the non auto radius situation to set this.length (the volume in both situations is the same).
+ double parachuteVolume = Math.pow(getRadius(), 2) * length; // Math.PI left out, not needed
+ this.length = parachuteVolume / Math.pow(this.radius, 2);
+ } else {
+ if (MathUtil.equals(this.length, length)) {
+ return;
+ }
+ this.length = length;
}
- this.length = length;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
@@ -114,8 +135,8 @@ public abstract class MassObject extends InternalComponent {
public void setRadiusAutomatic(boolean auto) {
for (RocketComponent listener : configListeners) {
- if (listener instanceof Parachute) {
- ((Parachute) listener).setRadiusAutomatic(auto);
+ if (listener instanceof MassObject) {
+ ((MassObject) listener).setRadiusAutomatic(auto);
}
}
@@ -124,6 +145,10 @@ public abstract class MassObject extends InternalComponent {
autoRadius = auto;
+ // Set the length
+ double parachuteVolume = (Math.PI * Math.pow(getRadius(), 2) * length);
+ length = parachuteVolume / (Math.PI * Math.pow(getRadius(), 2));
+
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
diff --git a/core/src/net/sf/openrocket/rocketcomponent/Parachute.java b/core/src/net/sf/openrocket/rocketcomponent/Parachute.java
index 8a2fbf43b..e62158f90 100644
--- a/core/src/net/sf/openrocket/rocketcomponent/Parachute.java
+++ b/core/src/net/sf/openrocket/rocketcomponent/Parachute.java
@@ -18,8 +18,6 @@ public class Parachute extends RecoveryDevice {
private int lineCount;
private final double DEFAULT_LINE_LENGTH = 0.3;
private double lineLength;
- private final double InitialPackedLength = this.length;
- private final double InitialPackedRadius = this.radius;
public Parachute() {
this.diameter = DEFAULT_DIAMETER;
@@ -213,23 +211,15 @@ public class Parachute extends RecoveryDevice {
// // Set preset parachute packed length
if ((preset.has(ComponentPreset.PACKED_LENGTH)) && preset.get(ComponentPreset.PACKED_LENGTH) > 0) {
- this.PackedLength = preset.get(ComponentPreset.PACKED_LENGTH);
- length = PackedLength;
- } else {
- length = InitialPackedLength;
+ length = preset.get(ComponentPreset.PACKED_LENGTH);
}
// // Set preset parachute packed diameter
if ((preset.has(ComponentPreset.PACKED_DIAMETER)) && preset.get(ComponentPreset.PACKED_DIAMETER) > 0) {
- this.PackedDiameter = preset.get(ComponentPreset.PACKED_DIAMETER);
- radius = PackedDiameter / 2;
- } else {
- radius = InitialPackedRadius;
+ radius = preset.get(ComponentPreset.PACKED_DIAMETER) / 2;
}
// // Size parachute packed diameter within parent inner diameter
if (length > 0 && radius > 0) {
- double parachuteVolume = (Math.PI * Math.pow(radius, 2) * length);
setRadiusAutomatic(true);
- length = parachuteVolume / (Math.PI * Math.pow(getRadius(), 2));
}
// SUBSTITUTE / ACTIVATE Override Mass Preset
diff --git a/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java b/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java
index 99f4a2c86..3b0c0bbde 100644
--- a/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java
+++ b/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java
@@ -19,9 +19,6 @@ import net.sf.openrocket.util.MathUtil;
* @author Sampo Niskanen
*/
public abstract class RecoveryDevice extends MassObject implements FlightConfigurableComponent {
- ////
- protected double PackedDiameter;
- protected double PackedLength;
////
protected double DragCoefficient;
protected double cd = Parachute.DEFAULT_CD;