From 1d327e6dbb2eb3d61b2909f2f10a3c0a6c856643 Mon Sep 17 00:00:00 2001 From: Daniel_M_Williams Date: Thu, 17 Sep 2015 09:16:47 -0400 Subject: [PATCH] [Bugfix] Configuration.getActiveComponents() fixed --- .../rocketcomponent/Configuration.java | 36 +++++++++++++++---- .../rocketcomponent/ConfigurationTest.java | 2 +- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/core/src/net/sf/openrocket/rocketcomponent/Configuration.java b/core/src/net/sf/openrocket/rocketcomponent/Configuration.java index f17fedde7..5cf348ff2 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Configuration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Configuration.java @@ -1,10 +1,12 @@ package net.sf.openrocket.rocketcomponent; +import java.util.ArrayDeque; import java.util.Collection; import java.util.EventListener; import java.util.EventObject; import java.util.HashMap; import java.util.List; +import java.util.Queue; import net.sf.openrocket.motor.MotorInstance; import net.sf.openrocket.motor.MotorInstanceConfiguration; @@ -127,10 +129,9 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi public void toggleStage(final int stageNumber) { if ((0 <= stageNumber) && (stageMap.containsKey(stageNumber))) { - StageFlags flags = stageMap.get(stageNumber); - log.error("debug: toggling stage " + stageNumber + " to " + !flags.active); flags.active = !flags.active; + //log.error("debug: toggling stage " + stageNumber + " to " + !flags.active + " " + this.toDebug()); fireChangeEvent(); return; } @@ -154,11 +155,22 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi return stageMap.get(stageNumber).active; } - public List getActiveComponents() { + public Collection getActiveComponents() { + Queue toProcess = new ArrayDeque(this.rocket.getChildren()); ArrayList toReturn = new ArrayList(); - for (StageFlags curFlags : this.stageMap.values()) { - if (curFlags.active) { - toReturn.add(curFlags.stage); + + while (!toProcess.isEmpty()) { + RocketComponent comp = toProcess.poll(); + + if (comp instanceof AxialStage) { + if (!isStageActive(comp.getStageNumber())) { + continue; + } + } + + toReturn.add(comp); + for (RocketComponent child : comp.getChildren()) { + toProcess.offer(child); } } @@ -313,6 +325,17 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi // DEBUG / DEVEL public String toDebug() { + StringBuilder buf = new StringBuilder(); + buf.append(String.format("[")); + for (StageFlags flags : this.stageMap.values()) { + buf.append(String.format(" %d", (flags.active ? 1 : 0))); + } + buf.append("]\n"); + return buf.toString(); + } + + // DEBUG / DEVEL + public String toDebugDetail() { StringBuilder buf = new StringBuilder(); buf.append(String.format("\nDumping stage config: \n")); for (StageFlags flags : this.stageMap.values()) { @@ -352,6 +375,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY; for (RocketComponent component : this.getActiveComponents()) { + System.err.println("..bounds checking component: " + component.getName()); for (Coordinate coord : component.getComponentBounds()) { cachedBounds.add(coord); if (coord.x < minX) diff --git a/core/test/net/sf/openrocket/rocketcomponent/ConfigurationTest.java b/core/test/net/sf/openrocket/rocketcomponent/ConfigurationTest.java index f699f7d53..30976ca12 100644 --- a/core/test/net/sf/openrocket/rocketcomponent/ConfigurationTest.java +++ b/core/test/net/sf/openrocket/rocketcomponent/ConfigurationTest.java @@ -271,7 +271,7 @@ public class ConfigurationTest extends BaseTestCase { // test explicitly setting all stages up to second stage active config.setOnlyStage(1); - assertThat(config.toDebug() + "Setting single stage active: ", config.isStageActive(1), equalTo(true)); + assertThat(config.toDebugDetail() + "Setting single stage active: ", config.isStageActive(1), equalTo(true)); config.clearOnlyStage(0); assertThat(" deactivate stage #0: ", config.isStageActive(0), equalTo(false));