From 7a145886376c5d50c8f330754a12559e5717554d Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 8 Sep 2022 22:34:23 +0200 Subject: [PATCH] [#1653] Scale RadiusRingComponent according to scale direction --- .../openrocket/gui/dialogs/ScaleDialog.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java index 407ba5109..de343e35e 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java @@ -121,7 +121,7 @@ public class ScaleDialog extends JDialog { addScaler(EllipticalFinSet.class, "Height", SCALERS_NO_OFFSET); // FreeformFinSet - list = new ArrayList(1); + list = new ArrayList<>(1); list.add(new FreeformFinSetScaler()); SCALERS_NO_OFFSET.put(FreeformFinSet.class, list); @@ -131,7 +131,7 @@ public class ScaleDialog extends JDialog { addScaler(MassObject.class, "RadialPosition", SCALERS_OFFSET); // MassComponent - list = new ArrayList(1); + list = new ArrayList<>(1); list.add(new MassComponentScaler()); SCALERS_NO_OFFSET.put(MassComponent.class, list); @@ -158,8 +158,9 @@ public class ScaleDialog extends JDialog { addScaler(InnerTube.class, "MotorOverhang", SCALERS_NO_OFFSET); // RadiusRingComponent - addScaler(RadiusRingComponent.class, "OuterRadius", "isOuterRadiusAutomatic", SCALERS_NO_OFFSET); - addScaler(RadiusRingComponent.class, "InnerRadius", "isInnerRadiusAutomatic", SCALERS_NO_OFFSET); + list = new ArrayList<>(1); + list.add(new RadiusRingComponentScaler()); + SCALERS_NO_OFFSET.put(RadiusRingComponent.class, list); } private static void addScaler(Class componentClass, String methodName, @@ -719,5 +720,29 @@ public class ScaleDialog extends JDialog { } } + + private static class RadiusRingComponentScaler implements Scaler { + + @Override + public void scale(RocketComponent component, double multiplier, boolean scaleMass) { + final Map, List> scalers = new HashMap<>(); + RadiusRingComponent ring = (RadiusRingComponent) component; + // We need to specify this particular order, otherwise scale the inner/outer radius may clip the dimensions of the other outer/inner radius + if (multiplier >= 1) { + addScaler(RadiusRingComponent.class, "OuterRadius", "isOuterRadiusAutomatic", scalers); + addScaler(RadiusRingComponent.class, "InnerRadius", "isInnerRadiusAutomatic", scalers); + } else { + addScaler(RadiusRingComponent.class, "InnerRadius", "isInnerRadiusAutomatic", scalers); + addScaler(RadiusRingComponent.class, "OuterRadius", "isOuterRadiusAutomatic", scalers); + } + + for (List foo : scalers.values()) { + for (Scaler s : foo) { + s.scale(component, multiplier, scaleMass); + } + } + } + + } }