diff --git a/core/src/net/sf/openrocket/rocketcomponent/Configuration.java b/core/src/net/sf/openrocket/rocketcomponent/Configuration.java index 5cf348ff2..75a20682f 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Configuration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Configuration.java @@ -98,7 +98,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi * @param stageNumber stage number to inactivate */ public void clearOnlyStage(final int stageNumber) { - setStage(stageNumber, false); + setStageActive(stageNumber, false); } /** @@ -107,7 +107,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi * @param stageNumber stage number to activate */ public void setOnlyStage(final int stageNumber) { - setStage(stageNumber, true); + setStageActive(stageNumber, true); } /** @@ -116,9 +116,10 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi * @param stageNumber stage number to flag * @param _active inactive (false) or active (true) */ - public void setStage(final int stageNumber, final boolean _active) { + public void setStageActive(final int stageNumber, final boolean _active) { if ((0 <= stageNumber) && (stageMap.containsKey(stageNumber))) { - log.error("debug: setting stage " + stageNumber + " to " + _active); + String activeString = (_active ? "active" : "inactive"); + log.error("debug: setting stage " + stageNumber + " to " + activeString + " " + this.toDebug()); stageMap.get(stageNumber).active = _active; fireChangeEvent(); return; @@ -131,20 +132,21 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi if ((0 <= stageNumber) && (stageMap.containsKey(stageNumber))) { StageFlags flags = stageMap.get(stageNumber); flags.active = !flags.active; - //log.error("debug: toggling stage " + stageNumber + " to " + !flags.active + " " + this.toDebug()); + String activeString = (flags.active ? "active" : "inactive"); + log.error("debug: toggling stage " + stageNumber + " to " + activeString + " " + this.toDebug()); fireChangeEvent(); return; } log.error("error: attempt to retrieve via a bad stage number: " + stageNumber); } - /** - * Check whether the stage is active. - */ - public boolean isStageActive(final AxialStage stage) { - return this.isStageActive(stage.getStageNumber()); - } - + // /** + // * Check whether the stage is active. + // */ + // public boolean isStageActive(final AxialStage stage) { + // return this.isStageActive(stage.getStageNumber()); + // } + // /** * Check whether the stage specified by the index is active. */ @@ -156,21 +158,19 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi } public Collection getActiveComponents() { - Queue toProcess = new ArrayDeque(this.rocket.getChildren()); + Queue toProcess = new ArrayDeque(this.getActiveStages()); ArrayList toReturn = new ArrayList(); 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); + if (child instanceof AxialStage) { + continue; + } else { + toProcess.offer(child); + } } } @@ -196,7 +196,9 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi List activeStages = new ArrayList(); for (StageFlags flags : this.stageMap.values()) { - activeStages.add(flags.stage); + if (flags.active) { + activeStages.add(flags.stage); + } } return activeStages; @@ -375,7 +377,6 @@ 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/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java index f26c3b549..5facc1246 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java @@ -17,6 +17,7 @@ import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashSet; +import java.util.List; import net.sf.openrocket.gui.figureelements.FigureElement; import net.sf.openrocket.gui.util.ColorConversion; @@ -25,6 +26,7 @@ import net.sf.openrocket.motor.Motor; import net.sf.openrocket.motor.MotorInstance; import net.sf.openrocket.motor.MotorInstanceConfiguration; import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.BoosterSet; import net.sf.openrocket.rocketcomponent.ComponentAssembly; import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.MotorMount; @@ -186,9 +188,7 @@ public class RocketFigure extends AbstractScaleFigure { figureShapes.clear(); calculateSize(); - Rocket theRocket = configuration.getRocket(); - Coordinate zero = new Coordinate(0,0,0); - getShapeTree( figureShapes, theRocket, zero); + getShapes( figureShapes, configuration); repaint(); fireChangeEvent(); @@ -436,57 +436,46 @@ public class RocketFigure extends AbstractScaleFigure { return l.toArray(new RocketComponent[0]); } - // NOTE: Recursive function - private void getShapeTree( - ArrayList allShapes, // this is the output parameter - final RocketComponent comp, - final Coordinate parentLocation){ - - RocketPanel.VIEW_TYPE viewType = this.currentViewType; - Transformation viewTransform = this.transformation; - - Coordinate componentAbsoluteLocation = parentLocation.add(comp.getOffset()); - - if( comp instanceof AxialStage){ - int num = ((AxialStage) comp).getStageNumber(); - if( ! this.configuration.isStageActive(num)){ - return; - } - } - - // generate shapes: - if( comp instanceof Rocket){ - // no-op. no shapes - }else if( comp instanceof ComponentAssembly ){ - // no-op; no shapes here, either. - }else{ - // get all shapes for this component, add to return list. - RocketComponentShape[] childShapes = getThisShape( viewType, comp, componentAbsoluteLocation, viewTransform); - for ( RocketComponentShape curShape : childShapes ){ - allShapes.add( curShape ); - } - } - - // recurse differently, depending on if this node has instances or not.... - if( comp.isCenterline() ){ - // recurse to each child with just the center - for( RocketComponent child: comp.getChildren() ){ - getShapeTree( allShapes, child, componentAbsoluteLocation); - } - }else{ - // get the offsets for each component instance - Coordinate[] instanceOffsets = new Coordinate[]{ parentLocation }; - instanceOffsets = comp.shiftCoordinates( instanceOffsets); + // facade for the recursive function below + private void getShapes(ArrayList allShapes, Configuration configuration){ + System.err.println("getting shapes for stages: " + this.configuration.toDebug()); + for( AxialStage stage : configuration.getActiveStages()){ + int stageNumber = stage.getStageNumber(); + String activeString = ( configuration.isStageActive(stageNumber) ? "active" : "inactive"); + System.err.println(" "+stage.getName()+ "[" + stageNumber + "] is " + activeString ); - // recurse to each child with each instance of this component - for( RocketComponent child: comp.getChildren() ){ - for( Coordinate curInstanceCoordinate : instanceOffsets){ - getShapeTree( allShapes, child, curInstanceCoordinate); - } - } + getShapeTree( allShapes, stage, Coordinate.ZERO); } + } + + // NOTE: Recursive function + private void getShapeTree( + ArrayList allShapes, // this is the output parameter + final RocketComponent comp, + final Coordinate parentLocation){ + + RocketPanel.VIEW_TYPE viewType = this.currentViewType; + Transformation viewTransform = this.transformation; + Coordinate[] locs = comp.getLocation(); + + // generate shapes + for( Coordinate curLocation : locs){ + allShapes = addThisShape( allShapes, viewType, comp, curLocation, viewTransform); + } - return; + // recurse into component's children + for( RocketComponent child: comp.getChildren() ){ + if( child instanceof AxialStage ){ + // recursing into BoosterSet here would double count its tree + continue; + } + + for( Coordinate curLocation : locs){ + getShapeTree( allShapes, child, curLocation); + } + } + + return; } /** @@ -494,11 +483,21 @@ public class RocketFigure extends AbstractScaleFigure { * * @param component * @param params - * @return + * @return the ArrayList containing all the shapes to draw. */ - private static RocketComponentShape[] getThisShape(final RocketPanel.VIEW_TYPE viewType, final RocketComponent component, final Coordinate instanceOffset, final Transformation transformation) { + private static ArrayList addThisShape( + ArrayList allShapes, // this is the output parameter + final RocketPanel.VIEW_TYPE viewType, + final RocketComponent component, + final Coordinate instanceOffset, + final Transformation transformation) { Reflection.Method m; + if(( component instanceof Rocket)||( component instanceof ComponentAssembly )){ + // no-op; no shapes here, either. + return allShapes; + } + // Find the appropriate method switch (viewType) { case SideView: @@ -518,10 +517,15 @@ public class RocketFigure extends AbstractScaleFigure { if (m == null) { Application.getExceptionHandler().handleErrorCondition("ERROR: Rocket figure paint method not found for " + component); - return new RocketComponentShape[0]; + return allShapes; } - return (RocketComponentShape[]) m.invokeStatic(component, transformation, instanceOffset); + + RocketComponentShape[] returnValue = (RocketComponentShape[]) m.invokeStatic(component, transformation, instanceOffset); + for ( RocketComponentShape curShape : returnValue ){ + allShapes.add( curShape ); + } + return allShapes; }