diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassObject.java b/core/src/net/sf/openrocket/rocketcomponent/MassObject.java index 2058d1b72..1522fde04 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MassObject.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MassObject.java @@ -65,6 +65,25 @@ public abstract class MassObject extends InternalComponent { return length; } + /** + * Set the length, ignoring the auto radius setting. + * @param length new length + */ + public void setLengthNoAuto(double length) { + for (RocketComponent listener : configListeners) { + if (listener instanceof MassObject) { + ((MassObject) listener).setLengthNoAuto(length); + } + } + + length = Math.max(length, 0); + if (MathUtil.equals(this.length, length)) { + return; + } + this.length = length; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + public void setLength(double length) { for (RocketComponent listener : configListeners) { if (listener instanceof MassObject) { diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java index 407ba5109..4027ed599 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java @@ -126,8 +126,11 @@ public class ScaleDialog extends JDialog { SCALERS_NO_OFFSET.put(FreeformFinSet.class, list); // MassObject - addScaler(MassObject.class, "Length", SCALERS_NO_OFFSET); - addScaler(MassObject.class, "Radius", SCALERS_NO_OFFSET); + list = new ArrayList<>(1); + list.add(new MassObjectScaler()); + SCALERS_NO_OFFSET.put(MassObject.class, list); + //addScaler(MassObject.class, "LengthNoAuto", SCALERS_NO_OFFSET); + addScaler(MassObject.class, "Radius", "isRadiusAutomatic", SCALERS_NO_OFFSET); addScaler(MassObject.class, "RadialPosition", SCALERS_OFFSET); // MassComponent @@ -703,6 +706,25 @@ public class ScaleDialog extends JDialog { } } + + private static class MassObjectScaler implements Scaler { + @Override + public void scale(RocketComponent component, double multiplier, boolean scaleMass) { + if (scaleMass) { + MassObject c = (MassObject) component; + if (c.isRadiusAutomatic()) { + double volume = Math.PI * Math.pow(c.getRadiusNoAuto(), 2) * c.getLengthNoAuto(); + double scaledVolume = volume * MathUtil.pow3(multiplier); + c.setRadius(c.getRadiusNoAuto() * multiplier); + c.setLengthNoAuto(scaledVolume / (Math.PI * Math.pow(c.getRadiusNoAuto(), 2))); + c.setRadiusAutomatic(true); + } else { + c.setLength(c.getLength() * multiplier); + } + } + } + + } private static class FreeformFinSetScaler implements Scaler {