diff --git a/core/src/net/sf/openrocket/masscalc/MassCalculator.java b/core/src/net/sf/openrocket/masscalc/MassCalculator.java index a27561c90..44e726fcb 100644 --- a/core/src/net/sf/openrocket/masscalc/MassCalculator.java +++ b/core/src/net/sf/openrocket/masscalc/MassCalculator.java @@ -318,10 +318,13 @@ public class MassCalculator implements Monitorable { childrenData = childrenData.add( childData ); } - assemblyData = assemblyData.add( childrenData); + + // if instanced, adjust children's data too. - if ( 1 < component.getInstanceCount() ){ + if( 1 == component.getInstanceCount() ){ + assemblyData = assemblyData.add( childrenData ); + }else if( 0 < component.getChildCount()){ final double curIxx = childrenData.getIxx(); // MOI about x-axis final double curIyy = childrenData.getIyy(); // MOI about y axis final double curIzz = childrenData.getIzz(); // MOI about z axis @@ -337,8 +340,8 @@ public class MassCalculator implements Monitorable { // and add to the total instAccumData = instAccumData.add( instanceData); } - - assemblyData = instAccumData; + + assemblyData = assemblyData.add( instAccumData ); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/Clusterable.java b/core/src/net/sf/openrocket/rocketcomponent/Clusterable.java index 86ec92622..8051fc13e 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Clusterable.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Clusterable.java @@ -4,6 +4,10 @@ import net.sf.openrocket.util.ChangeSource; public interface Clusterable extends ChangeSource, Instanceable { + @Deprecated + // redundant with Instanceable#getInstanceCount() + public int getClusterCount(); + public ClusterConfiguration getClusterConfiguration(); public void setClusterConfiguration(ClusterConfiguration cluster); diff --git a/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java index f91811aa8..bbf6b08ad 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java @@ -162,16 +162,6 @@ public abstract class RingComponent extends StructuralComponent implements Coaxi fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - - /** - * Return the number of times the component is multiplied. - */ - public int getClusterCount() { - if (this instanceof Clusterable) - return ((Clusterable) this).getClusterConfiguration().getClusterCount(); - return 1; - } - @Override public Collection getComponentBounds() { List bounds = new ArrayList(); @@ -180,17 +170,29 @@ public abstract class RingComponent extends StructuralComponent implements Coaxi return bounds; } - - @Override public Coordinate getComponentCG() { - return new Coordinate(length / 2, 0, 0, getComponentMass()); + Coordinate cg = Coordinate.ZERO; + int instanceCount = getInstanceCount(); + double instanceMass = ringMass(getOuterRadius(), getInnerRadius(), getLength(), + getMaterial().getDensity()); + + if (1 == instanceCount ) { + cg = new Coordinate( length/2, 0, 0, instanceMass ); + }else{ + Coordinate offsets[] = getInstanceOffsets(); + for( Coordinate c : offsets) { + cg = cg.average(c); + } + cg.add( length/2, 0, 0); + } + return cg; } @Override public double getComponentMass() { return ringMass(getOuterRadius(), getInnerRadius(), getLength(), - getMaterial().getDensity()) * getClusterCount(); + getMaterial().getDensity()) * getInstanceCount(); }