From 1a1e5b2e623b3d6ff924276eee7a659a261a3c87 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Mon, 29 Aug 2022 13:56:19 -0600 Subject: [PATCH] Changed name of "OverrideSubcomponents" to "SubcomponentsOverridden" to improve method name generated by BooleanModel. isSubcomponentsOverridden() is like fingernails on a blackboard, but it's not as bad as isOverrideSubcomponents(). Added CD override logic to RocketComponent.java --- .../openrocket/importt/DocumentConfig.java | 2 +- .../savers/RocketComponentSaver.java | 2 +- .../file/rocksim/importt/BaseHandler.java | 2 +- .../file/rocksim/importt/RocksimHandler.java | 12 +- .../openrocket/masscalc/MassCalculation.java | 2 +- .../rocketcomponent/ComponentAssembly.java | 4 +- .../rocketcomponent/RocketComponent.java | 98 ++++++++++++--- .../net/sf/openrocket/util/TestRockets.java | 2 +- .../masscalc/MassCalculatorTest.java | 18 +-- .../rocketcomponent/FreeformFinSetTest.java | 6 +- .../rocketcomponent/OverrideTest.java | 116 ++++++++++++++++++ .../configdialog/RocketComponentConfig.java | 4 +- 12 files changed, 224 insertions(+), 44 deletions(-) create mode 100644 core/test/net/sf/openrocket/rocketcomponent/OverrideTest.java diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java index da4978cd4..e9bd33b29 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java @@ -130,7 +130,7 @@ class DocumentConfig { Reflection.findMethod(RocketComponent.class, "setOverrideCD", double.class), Reflection.findMethod(RocketComponent.class, "setCDOverridden", boolean.class))); setters.put("RocketComponent:overridesubcomponents", new BooleanSetter( - Reflection.findMethod(RocketComponent.class, "setOverrideSubcomponents", boolean.class))); + Reflection.findMethod(RocketComponent.class, "setSubcomponentsOverridden", boolean.class))); setters.put("RocketComponent:comment", new StringSetter( Reflection.findMethod(RocketComponent.class, "setComment", String.class))); setters.put("RocketComponent:preset", new ComponentPresetSetter( diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java index 182612544..9e45ee05f 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java @@ -142,7 +142,7 @@ public class RocketComponentSaver { overridden = true; } if (overridden) { - elements.add("" + c.getOverrideSubcomponents() + elements.add("" + c.isSubcomponentsOverridden() + ""); } diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/BaseHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/BaseHandler.java index eec02a8ec..9eafaad71 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/BaseHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/BaseHandler.java @@ -175,7 +175,7 @@ public abstract class BaseHandler extends AbstractEle if (override) { component.setCGOverridden(override); component.setMassOverridden(override); - component.setOverrideSubcomponents(false); //Rocksim does not support this type of override + component.setSubcomponentsOverridden(false); //Rocksim does not support this type of override component.setOverrideMass(mass); component.setOverrideCGX(cg); } diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/RocksimHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/RocksimHandler.java index 5c14afdd4..2dd64e5ea 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/RocksimHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/RocksimHandler.java @@ -208,12 +208,12 @@ class RocketDesignHandler extends AbstractElementHandler { final AxialStage stage = new AxialStage(); if (stage3Mass > 0.0d) { stage.setMassOverridden(true); - stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override + stage.setSubcomponentsOverridden(true); //Rocksim does not support this type of override stage.setOverrideMass(stage3Mass); } if (stage3CG > 0.0d) { stage.setCGOverridden(true); - stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override + stage.setSubcomponentsOverridden(true); //Rocksim does not support this type of override stage.setOverrideCGX(stage3CG); } component.addChild(stage); @@ -224,12 +224,12 @@ class RocketDesignHandler extends AbstractElementHandler { final AxialStage stage = new AxialStage(); if (stage2Mass > 0.0d) { stage.setMassOverridden(true); - stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override + stage.setSubcomponentsOverridden(true); //Rocksim does not support this type of override stage.setOverrideMass(stage2Mass); } if (stage2CG > 0.0d) { stage.setCGOverridden(true); - stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override + stage.setSubcomponentsOverridden(true); //Rocksim does not support this type of override stage.setOverrideCGX(stage2CG); } component.addChild(stage); @@ -241,12 +241,12 @@ class RocketDesignHandler extends AbstractElementHandler { final AxialStage stage = new AxialStage(); if (stage1Mass > 0.0d) { stage.setMassOverridden(true); - stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override + stage.setSubcomponentsOverridden(true); //Rocksim does not support this type of override stage.setOverrideMass(stage1Mass); } if (stage1CG > 0.0d) { stage.setCGOverridden(true); - stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override + stage.setSubcomponentsOverridden(true); //Rocksim does not support this type of override stage.setOverrideCGX(stage1CG); } component.addChild(stage); diff --git a/core/src/net/sf/openrocket/masscalc/MassCalculation.java b/core/src/net/sf/openrocket/masscalc/MassCalculation.java index 28bc0de5b..70c14e1b9 100644 --- a/core/src/net/sf/openrocket/masscalc/MassCalculation.java +++ b/core/src/net/sf/openrocket/masscalc/MassCalculation.java @@ -355,7 +355,7 @@ public class MassCalculation { // setting zero as the CG position means the top of the component, which is component.getPosition() final Coordinate compZero = parentTransform.transform( component.getPosition() ); - if (component.getOverrideSubcomponents()) { + if (component.isSubcomponentsOverridden()) { if( component.isMassive() ){ // if this component mass, merge it in before overriding: this.addMass( compCM ); diff --git a/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java b/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java index ecdc0084c..ea491be27 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java @@ -83,7 +83,7 @@ public abstract class ComponentAssembly extends RocketComponent implements Axial } @Override - public boolean getOverrideSubcomponents() { + public boolean isSubcomponentsOverridden() { return true; } @@ -168,7 +168,7 @@ public abstract class ComponentAssembly extends RocketComponent implements Axial } @Override - public void setOverrideSubcomponents(boolean override) { + public void setSubcomponentsOverridden(boolean override) { // No-op } diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java index 68c62a5a7..7bc136f06 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java @@ -96,14 +96,17 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab private LineStyle lineStyle = null; - // Override mass/CG + // Override mass/CG/CD protected double overrideMass = 0; protected boolean massOverridden = false; + private double overrideCGX = 0; private boolean cgOverridden = false; + private double overrideCD = 0; private boolean cdOverridden = false; - + + private boolean cdOverriddenByAncestor = false; private boolean overrideSubcomponents = false; @@ -679,10 +682,9 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - /** Return the current override CD. The CD is not necessarily overridden. * - * @return the override CG. + * @return the override CD. */ public final double getOverrideCD() { mutex.verify(); @@ -695,6 +697,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param x the override CD to set. */ public final void setOverrideCD(double x) { + System.out.println("set component " + this + " override to " + x); for (RocketComponent listener : configListeners) { listener.setOverrideCD(x); } @@ -703,10 +706,16 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab return; checkState(); this.overrideCD = x; - if (isCDOverridden()) + + if (isCDOverridden()) { + if (isSubcomponentsOverridden()) { + System.out.println("override subcomponents"); + overrideSubcomponentsCD(true); + } fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); - else + } else { fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); + } } @@ -723,11 +732,12 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab /** - * Set whether the CD is currently overridden. + * Set whether the CD is currently directly overridden. * - * @param o whether the CD is overridden + * @param o whether the CD is currently directly overridden */ public final void setCDOverridden(boolean o) { + System.out.println("setting component " + this + " cdOverridden to " + o); for (RocketComponent listener : configListeners) { listener.setCDOverridden(o); } @@ -737,9 +747,27 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } checkState(); cdOverridden = o; + + // if overrideSubcompoents is set, we need to descend the component + // tree. If we are overriding our own CD, we need to override all + // our descendants. If we are not overriding our own CD, we are + // also not overriding our descendants + if (isSubcomponentsOverridden()) { + overrideSubcomponentsCD(o); + } + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); } - + + /** + * Return whether the CD is currently overridden by an ancestor. + * + * @return whether the CD is overridden by an ancestor + */ + public final boolean isCDOverriddenByAncestor() { + mutex.verify(); + return cdOverriddenByAncestor; + } /** @@ -750,9 +778,9 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * also override {@link #isOverrideSubcomponentsEnabled()} to return * false. * - * @return whether the current mass and/or CG override overrides subcomponents as well. + * @return whether the current mass, CG, and/or CD override overrides subcomponents as well. */ - public boolean getOverrideSubcomponents() { + public boolean isSubcomponentsOverridden() { mutex.verify(); return overrideSubcomponents; } @@ -760,13 +788,14 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab /** * Set whether the mass and/or CG override overrides all subcomponent values - * as well. See {@link #getOverrideSubcomponents()} for details. + * as well. See {@link #isSubcomponentsOverridden()} for details. * * @param override whether the mass and/or CG override overrides all subcomponent. */ - public void setOverrideSubcomponents(boolean override) { + public void setSubcomponentsOverridden(boolean override) { + System.out.println("component " + this + " override subcomponents " + override); for (RocketComponent listener : configListeners) { - listener.setOverrideSubcomponents(override); + listener.setSubcomponentsOverridden(override); } if (overrideSubcomponents == override) { @@ -775,9 +804,43 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab checkState(); overrideSubcomponents = override; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + overrideSubcomponentsCD(override); + + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } - + + /** + * Recursively descend component tree and set descendant CD override values + * + * Logic: + * If we are setting the override true, descend the component tree marking + * every component as overridden by ancestor + * + * If we are setting the override false, descend the component tree marking every + * component as not overridden by ancestor. + * If in the course of descending the tree we encounter a descendant whose direct + * CD override and overridesubcomponents flags are both true, descend from there + * setting the ancestoroverride from that component + * + * @param override whether setting or clearing overrides + * + */ + void overrideSubcomponentsCD(boolean override) { + for (RocketComponent c: this.children) { + System.out.println("overriding CD of " + c + " override " + override); + if (c.isCDOverriddenByAncestor() != override) { + + c.cdOverriddenByAncestor = override; + + if (!override && c.isCDOverridden() && c.isSubcomponentsOverridden()) { + c.overrideSubcomponentsCD(true); + } else { + c.overrideSubcomponentsCD(override); + } + } + } + } + /** * Return whether the option to override all subcomponents is enabled or not. * The default implementation returns false if neither mass nor @@ -790,7 +853,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab */ public boolean isOverrideSubcomponentsEnabled() { mutex.verify(); - return isCGOverridden() || isMassOverridden(); + return isCGOverridden() || isMassOverridden() || isCDOverridden(); } /** @@ -2275,6 +2338,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab this.massOverridden = src.massOverridden; this.overrideCGX = src.overrideCGX; this.cgOverridden = src.cgOverridden; + this.cdOverriddenByAncestor = src.cdOverriddenByAncestor; this.overrideSubcomponents = src.overrideSubcomponents; this.name = src.name; this.comment = src.comment; diff --git a/core/src/net/sf/openrocket/util/TestRockets.java b/core/src/net/sf/openrocket/util/TestRockets.java index 632b36a63..13e7c5e45 100644 --- a/core/src/net/sf/openrocket/util/TestRockets.java +++ b/core/src/net/sf/openrocket/util/TestRockets.java @@ -345,7 +345,7 @@ public class TestRockets { c.setMassOverridden(rnd.nextBoolean()); c.setOverrideCGX(rnd(0.2)); c.setOverrideMass(rnd(0.05)); - c.setOverrideSubcomponents(rnd.nextBoolean()); + c.setSubcomponentsOverridden(rnd.nextBoolean()); if (c.isMassive()) { // Only massive components are drawn diff --git a/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java b/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java index f04e0f88f..abbef4482 100644 --- a/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java +++ b/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java @@ -58,7 +58,7 @@ public class MassCalculatorTest extends BaseTestCase { // if we use a mass override, setting to same mass, we should get same result AxialStage sustainer = (AxialStage) rocket.getChild(0); - sustainer.setOverrideSubcomponents(true); + sustainer.setSubcomponentsOverridden(true); sustainer.setMassOverridden(true); sustainer.setOverrideMass(actualRocketDryMass); @@ -196,7 +196,7 @@ public class MassCalculatorTest extends BaseTestCase { assertEquals(expCMx, actualRocketDryCM.x, EPSILON); } - boosterStage.setOverrideSubcomponents(true); + boosterStage.setSubcomponentsOverridden(true); boosterStage.setCGOverridden(true); boosterStage.setOverrideCGX(0.0); @@ -237,7 +237,7 @@ public class MassCalculatorTest extends BaseTestCase { assertEquals(0.05, actualRocketDryCM.x, EPSILON); } - sustainerStage.setOverrideSubcomponents(true); + sustainerStage.setSubcomponentsOverridden(true); sustainerStage.setMassOverridden(true); sustainerStage.setOverrideMass(0.001); // something small, but not zero @@ -279,7 +279,7 @@ public class MassCalculatorTest extends BaseTestCase { assertEquals(0.10, actualStructure.cm.x, EPSILON); } - boosterStage.setOverrideSubcomponents(true); + boosterStage.setSubcomponentsOverridden(true); boosterStage.setMassOverridden(true); boosterStage.setOverrideMass(0.001); // something small, but not zero @@ -323,7 +323,7 @@ public class MassCalculatorTest extends BaseTestCase { assertEquals(expCMx, actualRocketDryCM.x, EPSILON); } - boosterBody.setOverrideSubcomponents(false); + boosterBody.setSubcomponentsOverridden(false); boosterBody.setCGOverridden(true); boosterBody.setOverrideCGX(0.0); @@ -372,7 +372,7 @@ public class MassCalculatorTest extends BaseTestCase { assertEquals(expCMx, actualRocketDryCM.x, EPSILON); } - boosterBody.setOverrideSubcomponents(false); + boosterBody.setSubcomponentsOverridden(false); boosterBody.setMassOverridden(true); boosterBody.setOverrideMass(0.001); @@ -386,7 +386,7 @@ public class MassCalculatorTest extends BaseTestCase { assertEquals(0.06976699, actualRocketDryCM.x, EPSILON); } - boosterBody.setOverrideSubcomponents(true); // change. Also, this body lacks subcomponents. + boosterBody.setSubcomponentsOverridden(true); // change. Also, this body lacks subcomponents. boosterBody.setMassOverridden(true); // repeat boosterBody.setOverrideMass(0.001); // repeat @@ -950,7 +950,7 @@ public class MassCalculatorTest extends BaseTestCase { final AxialStage coreStage = (AxialStage) rocket.getChild(1); final ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0); final double overrideMass = 0.5; - boosters.setOverrideSubcomponents(true); + boosters.setSubcomponentsOverridden(true); boosters.setMassOverridden(true); boosters.setOverrideMass(overrideMass); boosters.setCGOverridden(true); @@ -1117,7 +1117,7 @@ public class MassCalculatorTest extends BaseTestCase { fins.setName("podFins"); fins.setThickness(0.01); fins.setMassOverridden(true); fins.setOverrideMass(0.02835); - fins.setOverrideSubcomponents(false); + fins.setSubcomponentsOverridden(false); fins.setAxialOffset(-0.01); fins.setAxialMethod(AxialMethod.BOTTOM); podBody.addChild(fins); diff --git a/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java b/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java index 9a541288c..f8e343832 100644 --- a/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java +++ b/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java @@ -54,7 +54,7 @@ public class FreeformFinSetTest extends BaseTestCase { sourceSet.setMaterial(Material.newMaterial(Type.BULK, "test-material", 0.1, true)); sourceSet.setOverrideCGX(0.012); sourceSet.setOverrideMass(0.0123); - sourceSet.setOverrideSubcomponents(true); + sourceSet.setSubcomponentsOverridden(true); sourceSet.setAxialMethod(AxialMethod.ABSOLUTE); sourceSet.setAxialOffset(0.1); sourceSet.setTabHeight(0.01); @@ -196,7 +196,7 @@ public class FreeformFinSetTest extends BaseTestCase { } assertEquals(0.012, finSet.getOverrideCGX(), EPSILON); assertEquals(0.0123, finSet.getOverrideMass(), EPSILON); - assertTrue(finSet.getOverrideSubcomponents()); + assertTrue(finSet.isSubcomponentsOverridden()); assertEquals(AxialMethod.ABSOLUTE, finSet.getAxialMethod()); assertEquals(0.1, finSet.getAxialOffset(), EPSILON); @@ -232,7 +232,7 @@ public class FreeformFinSetTest extends BaseTestCase { } assertEquals(0.012, finSet.getOverrideCGX(), EPSILON); assertEquals(0.0123, finSet.getOverrideMass(), EPSILON); - assertTrue(finSet.getOverrideSubcomponents()); + assertTrue(finSet.isSubcomponentsOverridden()); assertEquals(AxialMethod.ABSOLUTE, finSet.getAxialMethod()); assertEquals(0.1, finSet.getAxialOffset(), EPSILON); diff --git a/core/test/net/sf/openrocket/rocketcomponent/OverrideTest.java b/core/test/net/sf/openrocket/rocketcomponent/OverrideTest.java new file mode 100644 index 000000000..dbe739e98 --- /dev/null +++ b/core/test/net/sf/openrocket/rocketcomponent/OverrideTest.java @@ -0,0 +1,116 @@ +package net.sf.openrocket.rocketcomponent; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import org.junit.Test; + +import net.sf.openrocket.aerodynamics.AerodynamicForces; +import net.sf.openrocket.aerodynamics.BarrowmanCalculator; +import net.sf.openrocket.aerodynamics.FlightConditions; +import net.sf.openrocket.aerodynamics.WarningSet; + +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.NoseCone; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.RocketComponent; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.TestRockets; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class OverrideTest extends BaseTestCase { + + @Test + public void testCDAncestorOverrides() { + // create test rocket + Rocket rocket = TestRockets.makeEstesAlphaIII(); + + // obtain sustainer, nose cone, body tube, and fin set + AxialStage sustainer = null; + for (RocketComponent c : rocket.getChildren()){ + if (c instanceof AxialStage) + sustainer = (AxialStage) c; + } + assertNotNull(sustainer); + + NoseCone nosecone = null; + BodyTube bodytube = null; + for (RocketComponent c : sustainer.getChildren()) { + if (c instanceof NoseCone) + nosecone = (NoseCone) c; + + if (c instanceof BodyTube) + bodytube = (BodyTube) c; + } + assertNotNull(nosecone); + assertNotNull(bodytube); + + FinSet finset = null; + for (RocketComponent c : bodytube.getChildren()) { + if (c instanceof FinSet) + finset = (FinSet) c; + } + assertNotNull(finset); + + // We start by just checking the override flags + // Initially no overrides except for sustainer (a componenent assembly) + assertFalse(sustainer.isCDOverridden()); + assertTrue(sustainer.isSubcomponentsOverridden()); + assertFalse(sustainer.isCDOverriddenByAncestor()); + + assertFalse(bodytube.isCDOverridden()); + assertFalse(bodytube.isSubcomponentsOverridden()); + assertFalse(bodytube.isCDOverriddenByAncestor()); + + assertFalse(finset.isCDOverridden()); + assertFalse(finset.isSubcomponentsOverridden()); + assertFalse(finset.isCDOverriddenByAncestor()); + + // SubcomponentsOverridden can't be turned off for component assemblies + sustainer.setSubcomponentsOverridden(false); + + assertTrue(sustainer.isSubcomponentsOverridden()); + + // Override sustainer CD and others get overridden + sustainer.setCDOverridden(true); + sustainer.setOverrideCD(0.5); + + assertTrue(bodytube.isCDOverriddenByAncestor()); + assertTrue(finset.isCDOverriddenByAncestor()); + + // Set body tube to override subcomponents, override its CD; it's still + // overridden by ancestor + bodytube.setCDOverridden(true); + bodytube.setSubcomponentsOverridden(true); + bodytube.setOverrideCD(0.25); + + assertTrue(bodytube.isCDOverriddenByAncestor()); + + // Now see if it's actually working + FlightConfiguration configuration = rocket.getSelectedConfiguration(); + FlightConditions conditions = new FlightConditions(null); + WarningSet warnings = new WarningSet(); + BarrowmanCalculator calc = new BarrowmanCalculator(); + + // total CD should be overrideCD of sustainer + AerodynamicForces forces = calc.getAerodynamicForces(configuration, conditions, warnings); + assertEquals(sustainer.getOverrideCD(), forces.getCD(), MathUtil.EPSILON); + + // Turn off sustainer override; body tube and nose cone aren't overridden by ancestor but fin set is + sustainer.setCDOverridden(false); + + // CD of rocket should be overridden CD of body tube plus calculated CD of nose cone + Map forceMap = calc.getForceAnalysis(configuration, conditions, warnings); + assertEquals(bodytube.getOverrideCD() + forceMap.get(nosecone).getCD(), forceMap.get(rocket).getCD(), MathUtil.EPSILON); + } +} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 77271227e..e0af7f493 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -224,7 +224,7 @@ public class RocketComponentConfig extends JPanel { } for (RocketComponent c = component.getParent(); c != null; c = c.getParent()) { - if (c.isMassOverridden() && c.getOverrideSubcomponents()) { + if (c.isMassOverridden() && c.isSubcomponentsOverridden()) { overridetext = trans.get("RocketCompCfg.lbl.overriddenby") + " " + c.getName() + ")"; } } @@ -526,7 +526,7 @@ public class RocketComponentConfig extends JPanel { // BEGIN OVERRIDE SUBCOMPONENTS -------------------------------------------------- - bm = new BooleanModel(component, "OverrideSubcomponents"); + bm = new BooleanModel(component, "SubcomponentsOverridden"); check = new JCheckBox(bm); //// Override mass, CG, and CD of all subcomponents check.setText(trans.get("RocketCompCfg.checkbox.OverrideSubcomponents"));