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;