Merge pull request #2397 from JoePfeiffer/fix-2394
Clean up and fix mass and CG overrides
This commit is contained in:
commit
43df250e54
@ -344,8 +344,6 @@ public class MassCalculation {
|
||||
}
|
||||
}
|
||||
|
||||
this.merge( children );
|
||||
|
||||
if (this.config.isComponentActive(component) ){
|
||||
Coordinate compCM = component.getComponentCG();
|
||||
|
||||
@ -355,26 +353,25 @@ 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.isSubcomponentsOverriddenMass() || component.isSubcomponentsOverriddenCG()) {
|
||||
if (component.isMassive()) {
|
||||
// if this component mass, merge it in before overriding:
|
||||
this.addMass( compCM );
|
||||
}
|
||||
if (component.isSubcomponentsOverriddenMass() && component.isMassOverridden()) {
|
||||
this.setCM( this.getCM().setWeight(component.getOverrideMass()) );
|
||||
}
|
||||
if (component.isSubcomponentsOverriddenCG() && component.isCGOverridden()) {
|
||||
this.setCM( this.getCM().setX(compZero.x + component.getOverrideCGX()));
|
||||
}
|
||||
}else {
|
||||
if (component.isMassOverridden()) {
|
||||
compCM = compCM.setWeight( component.getOverrideMass() );
|
||||
if (!component.isMassive()) {
|
||||
compCM = children.getCM();
|
||||
}
|
||||
compCM = compCM.setWeight(component.getOverrideMass());
|
||||
|
||||
if (component.isSubcomponentsOverriddenMass()) {
|
||||
children.setCM(children.getCM().setWeight(0));
|
||||
}
|
||||
}
|
||||
|
||||
if (component.isCGOverridden()) {
|
||||
compCM = compCM.setX( compZero.x + component.getOverrideCGX() );
|
||||
|
||||
if (component.isSubcomponentsOverriddenCG()) {
|
||||
children.setCM(children.getCM().setX(compCM.x));
|
||||
}
|
||||
}
|
||||
this.addMass(compCM);
|
||||
}
|
||||
|
||||
if(null != analysisMap){
|
||||
final CMAnalysisEntry entry = analysisMap.get(component.hashCode());
|
||||
@ -399,6 +396,8 @@ public class MassCalculation {
|
||||
// }
|
||||
}
|
||||
|
||||
this.merge( children );
|
||||
|
||||
// // vvv DEBUG
|
||||
// if( this.config.isComponentActive(component) && 0 < this.getMass() ) {
|
||||
// System.err.println(String.format( "%s....<< return data @ %s: %s", prefix, component.getName(), this.toCMDebug() ));
|
||||
|
@ -855,7 +855,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
||||
|
||||
|
||||
/**
|
||||
* Return whether the mass and/or CG override overrides all subcomponent values
|
||||
* Return whether the mass override overrides all subcomponent values
|
||||
* as well. The default implementation is a normal getter/setter implementation,
|
||||
* however, subclasses are allowed to override this behavior if some subclass
|
||||
* always or never overrides subcomponents. In this case the subclass should
|
||||
@ -869,7 +869,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
||||
return overrideSubcomponentsMass;
|
||||
}
|
||||
|
||||
// TODO: delete when compatibility with OR 15.03 is not needed anymore
|
||||
// For compatibility with files created with 15.03
|
||||
public void setSubcomponentsOverridden(boolean override) {
|
||||
setSubcomponentsOverriddenMass(override);
|
||||
setSubcomponentsOverriddenCG(override);
|
||||
@ -878,10 +878,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
||||
|
||||
|
||||
/**
|
||||
* Set whether the mass and/or CG override overrides all subcomponent values
|
||||
* Set whether the mass override overrides all subcomponent values
|
||||
* as well. See {@link #isSubcomponentsOverriddenMass()} for details.
|
||||
*
|
||||
* @param override whether the mass and/or CG override overrides all subcomponent.
|
||||
* @param override whether the mass override overrides all subcomponent.
|
||||
*/
|
||||
public void setSubcomponentsOverriddenMass(boolean override) {
|
||||
for (RocketComponent listener : configListeners) {
|
||||
@ -916,10 +916,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
||||
|
||||
|
||||
/**
|
||||
* Set whether the mass and/or CG override overrides all subcomponent values
|
||||
* Set whether the CG override overrides all subcomponent values
|
||||
* as well. See {@link #isSubcomponentsOverriddenCG()} for details.
|
||||
*
|
||||
* @param override whether the mass and/or CG override overrides all subcomponent.
|
||||
* @param override whether the CG override overrides all subcomponent.
|
||||
*/
|
||||
public void setSubcomponentsOverriddenCG(boolean override) {
|
||||
for (RocketComponent listener : configListeners) {
|
||||
|
@ -48,6 +48,68 @@ public class MassCalculatorTest extends BaseTestCase {
|
||||
assertEquals("Empty Rocket Longitudinal MOI calculated incorrectly: ", 0, actualMOIlong, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStageOverride() {
|
||||
Rocket rocket = new Rocket();
|
||||
|
||||
AxialStage stage = new AxialStage();
|
||||
rocket.addChild(stage);
|
||||
|
||||
FlightConfiguration config = rocket.getEmptyConfiguration();
|
||||
config.setAllStages();
|
||||
rocket.enableEvents();
|
||||
|
||||
BodyTube tube1 = new BodyTube();
|
||||
tube1.setLength(1.0);
|
||||
tube1.setMassOverridden(true);
|
||||
tube1.setOverrideMass(1.0);
|
||||
stage.addChild(tube1);
|
||||
|
||||
BodyTube tube2 = new BodyTube();
|
||||
tube2.setLength(2.0);
|
||||
tube2.setMassOverridden(true);
|
||||
tube2.setOverrideMass(2.0);
|
||||
stage.addChild(tube2);
|
||||
// tube2.setAxialMethod(AxialMethod.ABSOLUTE);
|
||||
// tube2.setAxialOffset(1.0);
|
||||
|
||||
RigidBody structure = MassCalculator.calculateStructure(config);
|
||||
assertEquals("No overrides -- mass incorrect", 3.0, structure.cm.weight, EPSILON);
|
||||
assertEquals("No overrides -- CG incorrect", 1.5, structure.cm.x, EPSILON);
|
||||
|
||||
stage.setMassOverridden(true);
|
||||
stage.setOverrideMass(1.0);
|
||||
structure = MassCalculator.calculateStructure(config);
|
||||
assertEquals("Overrides: mass -- mass incorrect", 4.0, structure.cm.weight, EPSILON);
|
||||
assertEquals("Overrides: mass -- CG incorrect", 1.5, structure.cm.x, EPSILON);
|
||||
|
||||
stage.setSubcomponentsOverriddenMass(true);
|
||||
structure = MassCalculator.calculateStructure(config);
|
||||
assertEquals("Overrides: mass, children mass -- mass incorrect", 1.0, structure.cm.weight, EPSILON);
|
||||
assertEquals("Overrides: mass, children mass -- CG incorrect", 1.5, structure.cm.x, EPSILON);
|
||||
|
||||
stage.setCGOverridden(true);
|
||||
stage.setOverrideCGX(1.0);
|
||||
structure = MassCalculator.calculateStructure(config);
|
||||
assertEquals("Overrides: mass, children mass, CG -- mass incorrect", 1.0, structure.cm.weight, EPSILON);
|
||||
assertEquals("Overrides: mass, children mass, CG -- CG incorrect", 1.0, structure.cm.x, EPSILON);
|
||||
|
||||
stage.setSubcomponentsOverriddenCG(true);
|
||||
structure = MassCalculator.calculateStructure(config);
|
||||
assertEquals("Overrides: mass, children mass, CG, children CG -- mass incorrect", 1.0, structure.cm.weight, EPSILON);
|
||||
assertEquals("Overrides: mass, children mass, CG, children CG -- CG incorrect", 1.0, structure.cm.x, EPSILON);
|
||||
|
||||
stage.setSubcomponentsOverriddenMass(false);
|
||||
structure = MassCalculator.calculateStructure(config);
|
||||
assertEquals("Overrides: mass, CG, children CG -- mass incorrect", 4.0, structure.cm.weight, EPSILON);
|
||||
assertEquals("Overrides: mass, CG, children CG -- CG incorrect", 1.0, structure.cm.x, EPSILON);
|
||||
|
||||
stage.setSubcomponentsOverriddenCG(false);
|
||||
structure = MassCalculator.calculateStructure(config);
|
||||
assertEquals("Overrides: mass, CG -- mass incorrect", 4.0, structure.cm.weight, EPSILON);
|
||||
assertEquals("Overrides: mass, CG -- CG incorrect", 1.375, structure.cm.x, EPSILON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAlphaIIIStructure() {
|
||||
Rocket rocket = TestRockets.makeEstesAlphaIII();
|
||||
@ -1094,7 +1156,6 @@ public class MassCalculatorTest extends BaseTestCase {
|
||||
mmt.setOverrideCGX(0.395);
|
||||
|
||||
RigidBody structure = MassCalculator.calculateStructure(config);
|
||||
|
||||
final double expMass = 0.6063562096046;
|
||||
double calcTotalMass = structure.getMass();
|
||||
assertEquals(" Booster Launch Mass is incorrect: ", expMass, calcTotalMass, EPSILON);
|
||||
|
Loading…
x
Reference in New Issue
Block a user