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
This commit is contained in:
parent
9656d8cb5a
commit
1a1e5b2e62
@ -130,7 +130,7 @@ class DocumentConfig {
|
|||||||
Reflection.findMethod(RocketComponent.class, "setOverrideCD", double.class),
|
Reflection.findMethod(RocketComponent.class, "setOverrideCD", double.class),
|
||||||
Reflection.findMethod(RocketComponent.class, "setCDOverridden", boolean.class)));
|
Reflection.findMethod(RocketComponent.class, "setCDOverridden", boolean.class)));
|
||||||
setters.put("RocketComponent:overridesubcomponents", new BooleanSetter(
|
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(
|
setters.put("RocketComponent:comment", new StringSetter(
|
||||||
Reflection.findMethod(RocketComponent.class, "setComment", String.class)));
|
Reflection.findMethod(RocketComponent.class, "setComment", String.class)));
|
||||||
setters.put("RocketComponent:preset", new ComponentPresetSetter(
|
setters.put("RocketComponent:preset", new ComponentPresetSetter(
|
||||||
|
@ -142,7 +142,7 @@ public class RocketComponentSaver {
|
|||||||
overridden = true;
|
overridden = true;
|
||||||
}
|
}
|
||||||
if (overridden) {
|
if (overridden) {
|
||||||
elements.add("<overridesubcomponents>" + c.getOverrideSubcomponents()
|
elements.add("<overridesubcomponents>" + c.isSubcomponentsOverridden()
|
||||||
+ "</overridesubcomponents>");
|
+ "</overridesubcomponents>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ public abstract class BaseHandler<C extends RocketComponent> extends AbstractEle
|
|||||||
if (override) {
|
if (override) {
|
||||||
component.setCGOverridden(override);
|
component.setCGOverridden(override);
|
||||||
component.setMassOverridden(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.setOverrideMass(mass);
|
||||||
component.setOverrideCGX(cg);
|
component.setOverrideCGX(cg);
|
||||||
}
|
}
|
||||||
|
@ -208,12 +208,12 @@ class RocketDesignHandler extends AbstractElementHandler {
|
|||||||
final AxialStage stage = new AxialStage();
|
final AxialStage stage = new AxialStage();
|
||||||
if (stage3Mass > 0.0d) {
|
if (stage3Mass > 0.0d) {
|
||||||
stage.setMassOverridden(true);
|
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);
|
stage.setOverrideMass(stage3Mass);
|
||||||
}
|
}
|
||||||
if (stage3CG > 0.0d) {
|
if (stage3CG > 0.0d) {
|
||||||
stage.setCGOverridden(true);
|
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);
|
stage.setOverrideCGX(stage3CG);
|
||||||
}
|
}
|
||||||
component.addChild(stage);
|
component.addChild(stage);
|
||||||
@ -224,12 +224,12 @@ class RocketDesignHandler extends AbstractElementHandler {
|
|||||||
final AxialStage stage = new AxialStage();
|
final AxialStage stage = new AxialStage();
|
||||||
if (stage2Mass > 0.0d) {
|
if (stage2Mass > 0.0d) {
|
||||||
stage.setMassOverridden(true);
|
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);
|
stage.setOverrideMass(stage2Mass);
|
||||||
}
|
}
|
||||||
if (stage2CG > 0.0d) {
|
if (stage2CG > 0.0d) {
|
||||||
stage.setCGOverridden(true);
|
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);
|
stage.setOverrideCGX(stage2CG);
|
||||||
}
|
}
|
||||||
component.addChild(stage);
|
component.addChild(stage);
|
||||||
@ -241,12 +241,12 @@ class RocketDesignHandler extends AbstractElementHandler {
|
|||||||
final AxialStage stage = new AxialStage();
|
final AxialStage stage = new AxialStage();
|
||||||
if (stage1Mass > 0.0d) {
|
if (stage1Mass > 0.0d) {
|
||||||
stage.setMassOverridden(true);
|
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);
|
stage.setOverrideMass(stage1Mass);
|
||||||
}
|
}
|
||||||
if (stage1CG > 0.0d) {
|
if (stage1CG > 0.0d) {
|
||||||
stage.setCGOverridden(true);
|
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);
|
stage.setOverrideCGX(stage1CG);
|
||||||
}
|
}
|
||||||
component.addChild(stage);
|
component.addChild(stage);
|
||||||
|
@ -355,7 +355,7 @@ public class MassCalculation {
|
|||||||
// setting zero as the CG position means the top of the component, which is component.getPosition()
|
// setting zero as the CG position means the top of the component, which is component.getPosition()
|
||||||
final Coordinate compZero = parentTransform.transform( component.getPosition() );
|
final Coordinate compZero = parentTransform.transform( component.getPosition() );
|
||||||
|
|
||||||
if (component.getOverrideSubcomponents()) {
|
if (component.isSubcomponentsOverridden()) {
|
||||||
if( component.isMassive() ){
|
if( component.isMassive() ){
|
||||||
// if this component mass, merge it in before overriding:
|
// if this component mass, merge it in before overriding:
|
||||||
this.addMass( compCM );
|
this.addMass( compCM );
|
||||||
|
@ -83,7 +83,7 @@ public abstract class ComponentAssembly extends RocketComponent implements Axial
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getOverrideSubcomponents() {
|
public boolean isSubcomponentsOverridden() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,7 +168,7 @@ public abstract class ComponentAssembly extends RocketComponent implements Axial
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setOverrideSubcomponents(boolean override) {
|
public void setSubcomponentsOverridden(boolean override) {
|
||||||
// No-op
|
// No-op
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,14 +96,17 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
private LineStyle lineStyle = null;
|
private LineStyle lineStyle = null;
|
||||||
|
|
||||||
|
|
||||||
// Override mass/CG
|
// Override mass/CG/CD
|
||||||
protected double overrideMass = 0;
|
protected double overrideMass = 0;
|
||||||
protected boolean massOverridden = false;
|
protected boolean massOverridden = false;
|
||||||
|
|
||||||
private double overrideCGX = 0;
|
private double overrideCGX = 0;
|
||||||
private boolean cgOverridden = false;
|
private boolean cgOverridden = false;
|
||||||
|
|
||||||
private double overrideCD = 0;
|
private double overrideCD = 0;
|
||||||
private boolean cdOverridden = false;
|
private boolean cdOverridden = false;
|
||||||
|
|
||||||
|
private boolean cdOverriddenByAncestor = false;
|
||||||
private boolean overrideSubcomponents = 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 current override CD. The CD is not necessarily overridden.
|
||||||
*
|
*
|
||||||
* @return the override CG.
|
* @return the override CD.
|
||||||
*/
|
*/
|
||||||
public final double getOverrideCD() {
|
public final double getOverrideCD() {
|
||||||
mutex.verify();
|
mutex.verify();
|
||||||
@ -695,6 +697,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
* @param x the override CD to set.
|
* @param x the override CD to set.
|
||||||
*/
|
*/
|
||||||
public final void setOverrideCD(double x) {
|
public final void setOverrideCD(double x) {
|
||||||
|
System.out.println("set component " + this + " override to " + x);
|
||||||
for (RocketComponent listener : configListeners) {
|
for (RocketComponent listener : configListeners) {
|
||||||
listener.setOverrideCD(x);
|
listener.setOverrideCD(x);
|
||||||
}
|
}
|
||||||
@ -703,10 +706,16 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
return;
|
return;
|
||||||
checkState();
|
checkState();
|
||||||
this.overrideCD = x;
|
this.overrideCD = x;
|
||||||
if (isCDOverridden())
|
|
||||||
|
if (isCDOverridden()) {
|
||||||
|
if (isSubcomponentsOverridden()) {
|
||||||
|
System.out.println("override subcomponents");
|
||||||
|
overrideSubcomponentsCD(true);
|
||||||
|
}
|
||||||
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
|
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
|
||||||
else
|
} else {
|
||||||
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
|
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) {
|
public final void setCDOverridden(boolean o) {
|
||||||
|
System.out.println("setting component " + this + " cdOverridden to " + o);
|
||||||
for (RocketComponent listener : configListeners) {
|
for (RocketComponent listener : configListeners) {
|
||||||
listener.setCDOverridden(o);
|
listener.setCDOverridden(o);
|
||||||
}
|
}
|
||||||
@ -737,9 +747,27 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
}
|
}
|
||||||
checkState();
|
checkState();
|
||||||
cdOverridden = o;
|
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);
|
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
|
* also override {@link #isOverrideSubcomponentsEnabled()} to return
|
||||||
* <code>false</code>.
|
* <code>false</code>.
|
||||||
*
|
*
|
||||||
* @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();
|
mutex.verify();
|
||||||
return overrideSubcomponents;
|
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
|
* 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.
|
* @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) {
|
for (RocketComponent listener : configListeners) {
|
||||||
listener.setOverrideSubcomponents(override);
|
listener.setSubcomponentsOverridden(override);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overrideSubcomponents == override) {
|
if (overrideSubcomponents == override) {
|
||||||
@ -775,7 +804,41 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
checkState();
|
checkState();
|
||||||
overrideSubcomponents = override;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -790,7 +853,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
*/
|
*/
|
||||||
public boolean isOverrideSubcomponentsEnabled() {
|
public boolean isOverrideSubcomponentsEnabled() {
|
||||||
mutex.verify();
|
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.massOverridden = src.massOverridden;
|
||||||
this.overrideCGX = src.overrideCGX;
|
this.overrideCGX = src.overrideCGX;
|
||||||
this.cgOverridden = src.cgOverridden;
|
this.cgOverridden = src.cgOverridden;
|
||||||
|
this.cdOverriddenByAncestor = src.cdOverriddenByAncestor;
|
||||||
this.overrideSubcomponents = src.overrideSubcomponents;
|
this.overrideSubcomponents = src.overrideSubcomponents;
|
||||||
this.name = src.name;
|
this.name = src.name;
|
||||||
this.comment = src.comment;
|
this.comment = src.comment;
|
||||||
|
@ -345,7 +345,7 @@ public class TestRockets {
|
|||||||
c.setMassOverridden(rnd.nextBoolean());
|
c.setMassOverridden(rnd.nextBoolean());
|
||||||
c.setOverrideCGX(rnd(0.2));
|
c.setOverrideCGX(rnd(0.2));
|
||||||
c.setOverrideMass(rnd(0.05));
|
c.setOverrideMass(rnd(0.05));
|
||||||
c.setOverrideSubcomponents(rnd.nextBoolean());
|
c.setSubcomponentsOverridden(rnd.nextBoolean());
|
||||||
|
|
||||||
if (c.isMassive()) {
|
if (c.isMassive()) {
|
||||||
// Only massive components are drawn
|
// Only massive components are drawn
|
||||||
|
@ -58,7 +58,7 @@ public class MassCalculatorTest extends BaseTestCase {
|
|||||||
// if we use a mass override, setting to same mass, we should get same result
|
// if we use a mass override, setting to same mass, we should get same result
|
||||||
AxialStage sustainer = (AxialStage) rocket.getChild(0);
|
AxialStage sustainer = (AxialStage) rocket.getChild(0);
|
||||||
|
|
||||||
sustainer.setOverrideSubcomponents(true);
|
sustainer.setSubcomponentsOverridden(true);
|
||||||
sustainer.setMassOverridden(true);
|
sustainer.setMassOverridden(true);
|
||||||
sustainer.setOverrideMass(actualRocketDryMass);
|
sustainer.setOverrideMass(actualRocketDryMass);
|
||||||
|
|
||||||
@ -196,7 +196,7 @@ public class MassCalculatorTest extends BaseTestCase {
|
|||||||
assertEquals(expCMx, actualRocketDryCM.x, EPSILON);
|
assertEquals(expCMx, actualRocketDryCM.x, EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
boosterStage.setOverrideSubcomponents(true);
|
boosterStage.setSubcomponentsOverridden(true);
|
||||||
boosterStage.setCGOverridden(true);
|
boosterStage.setCGOverridden(true);
|
||||||
boosterStage.setOverrideCGX(0.0);
|
boosterStage.setOverrideCGX(0.0);
|
||||||
|
|
||||||
@ -237,7 +237,7 @@ public class MassCalculatorTest extends BaseTestCase {
|
|||||||
assertEquals(0.05, actualRocketDryCM.x, EPSILON);
|
assertEquals(0.05, actualRocketDryCM.x, EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
sustainerStage.setOverrideSubcomponents(true);
|
sustainerStage.setSubcomponentsOverridden(true);
|
||||||
sustainerStage.setMassOverridden(true);
|
sustainerStage.setMassOverridden(true);
|
||||||
sustainerStage.setOverrideMass(0.001); // something small, but not zero
|
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);
|
assertEquals(0.10, actualStructure.cm.x, EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
boosterStage.setOverrideSubcomponents(true);
|
boosterStage.setSubcomponentsOverridden(true);
|
||||||
boosterStage.setMassOverridden(true);
|
boosterStage.setMassOverridden(true);
|
||||||
boosterStage.setOverrideMass(0.001); // something small, but not zero
|
boosterStage.setOverrideMass(0.001); // something small, but not zero
|
||||||
|
|
||||||
@ -323,7 +323,7 @@ public class MassCalculatorTest extends BaseTestCase {
|
|||||||
assertEquals(expCMx, actualRocketDryCM.x, EPSILON);
|
assertEquals(expCMx, actualRocketDryCM.x, EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
boosterBody.setOverrideSubcomponents(false);
|
boosterBody.setSubcomponentsOverridden(false);
|
||||||
boosterBody.setCGOverridden(true);
|
boosterBody.setCGOverridden(true);
|
||||||
boosterBody.setOverrideCGX(0.0);
|
boosterBody.setOverrideCGX(0.0);
|
||||||
|
|
||||||
@ -372,7 +372,7 @@ public class MassCalculatorTest extends BaseTestCase {
|
|||||||
assertEquals(expCMx, actualRocketDryCM.x, EPSILON);
|
assertEquals(expCMx, actualRocketDryCM.x, EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
boosterBody.setOverrideSubcomponents(false);
|
boosterBody.setSubcomponentsOverridden(false);
|
||||||
boosterBody.setMassOverridden(true);
|
boosterBody.setMassOverridden(true);
|
||||||
boosterBody.setOverrideMass(0.001);
|
boosterBody.setOverrideMass(0.001);
|
||||||
|
|
||||||
@ -386,7 +386,7 @@ public class MassCalculatorTest extends BaseTestCase {
|
|||||||
assertEquals(0.06976699, actualRocketDryCM.x, EPSILON);
|
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.setMassOverridden(true); // repeat
|
||||||
boosterBody.setOverrideMass(0.001); // repeat
|
boosterBody.setOverrideMass(0.001); // repeat
|
||||||
|
|
||||||
@ -950,7 +950,7 @@ public class MassCalculatorTest extends BaseTestCase {
|
|||||||
final AxialStage coreStage = (AxialStage) rocket.getChild(1);
|
final AxialStage coreStage = (AxialStage) rocket.getChild(1);
|
||||||
final ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0);
|
final ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0);
|
||||||
final double overrideMass = 0.5;
|
final double overrideMass = 0.5;
|
||||||
boosters.setOverrideSubcomponents(true);
|
boosters.setSubcomponentsOverridden(true);
|
||||||
boosters.setMassOverridden(true);
|
boosters.setMassOverridden(true);
|
||||||
boosters.setOverrideMass(overrideMass);
|
boosters.setOverrideMass(overrideMass);
|
||||||
boosters.setCGOverridden(true);
|
boosters.setCGOverridden(true);
|
||||||
@ -1117,7 +1117,7 @@ public class MassCalculatorTest extends BaseTestCase {
|
|||||||
fins.setName("podFins");
|
fins.setName("podFins");
|
||||||
fins.setThickness(0.01);
|
fins.setThickness(0.01);
|
||||||
fins.setMassOverridden(true); fins.setOverrideMass(0.02835);
|
fins.setMassOverridden(true); fins.setOverrideMass(0.02835);
|
||||||
fins.setOverrideSubcomponents(false);
|
fins.setSubcomponentsOverridden(false);
|
||||||
fins.setAxialOffset(-0.01); fins.setAxialMethod(AxialMethod.BOTTOM);
|
fins.setAxialOffset(-0.01); fins.setAxialMethod(AxialMethod.BOTTOM);
|
||||||
podBody.addChild(fins);
|
podBody.addChild(fins);
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ public class FreeformFinSetTest extends BaseTestCase {
|
|||||||
sourceSet.setMaterial(Material.newMaterial(Type.BULK, "test-material", 0.1, true));
|
sourceSet.setMaterial(Material.newMaterial(Type.BULK, "test-material", 0.1, true));
|
||||||
sourceSet.setOverrideCGX(0.012);
|
sourceSet.setOverrideCGX(0.012);
|
||||||
sourceSet.setOverrideMass(0.0123);
|
sourceSet.setOverrideMass(0.0123);
|
||||||
sourceSet.setOverrideSubcomponents(true);
|
sourceSet.setSubcomponentsOverridden(true);
|
||||||
sourceSet.setAxialMethod(AxialMethod.ABSOLUTE);
|
sourceSet.setAxialMethod(AxialMethod.ABSOLUTE);
|
||||||
sourceSet.setAxialOffset(0.1);
|
sourceSet.setAxialOffset(0.1);
|
||||||
sourceSet.setTabHeight(0.01);
|
sourceSet.setTabHeight(0.01);
|
||||||
@ -196,7 +196,7 @@ public class FreeformFinSetTest extends BaseTestCase {
|
|||||||
}
|
}
|
||||||
assertEquals(0.012, finSet.getOverrideCGX(), EPSILON);
|
assertEquals(0.012, finSet.getOverrideCGX(), EPSILON);
|
||||||
assertEquals(0.0123, finSet.getOverrideMass(), EPSILON);
|
assertEquals(0.0123, finSet.getOverrideMass(), EPSILON);
|
||||||
assertTrue(finSet.getOverrideSubcomponents());
|
assertTrue(finSet.isSubcomponentsOverridden());
|
||||||
|
|
||||||
assertEquals(AxialMethod.ABSOLUTE, finSet.getAxialMethod());
|
assertEquals(AxialMethod.ABSOLUTE, finSet.getAxialMethod());
|
||||||
assertEquals(0.1, finSet.getAxialOffset(), EPSILON);
|
assertEquals(0.1, finSet.getAxialOffset(), EPSILON);
|
||||||
@ -232,7 +232,7 @@ public class FreeformFinSetTest extends BaseTestCase {
|
|||||||
}
|
}
|
||||||
assertEquals(0.012, finSet.getOverrideCGX(), EPSILON);
|
assertEquals(0.012, finSet.getOverrideCGX(), EPSILON);
|
||||||
assertEquals(0.0123, finSet.getOverrideMass(), EPSILON);
|
assertEquals(0.0123, finSet.getOverrideMass(), EPSILON);
|
||||||
assertTrue(finSet.getOverrideSubcomponents());
|
assertTrue(finSet.isSubcomponentsOverridden());
|
||||||
|
|
||||||
assertEquals(AxialMethod.ABSOLUTE, finSet.getAxialMethod());
|
assertEquals(AxialMethod.ABSOLUTE, finSet.getAxialMethod());
|
||||||
assertEquals(0.1, finSet.getAxialOffset(), EPSILON);
|
assertEquals(0.1, finSet.getAxialOffset(), EPSILON);
|
||||||
|
116
core/test/net/sf/openrocket/rocketcomponent/OverrideTest.java
Normal file
116
core/test/net/sf/openrocket/rocketcomponent/OverrideTest.java
Normal file
@ -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<RocketComponent, AerodynamicForces> forceMap = calc.getForceAnalysis(configuration, conditions, warnings);
|
||||||
|
assertEquals(bodytube.getOverrideCD() + forceMap.get(nosecone).getCD(), forceMap.get(rocket).getCD(), MathUtil.EPSILON);
|
||||||
|
}
|
||||||
|
}
|
@ -224,7 +224,7 @@ public class RocketComponentConfig extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (RocketComponent c = component.getParent(); c != null; c = c.getParent()) {
|
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() + ")";
|
overridetext = trans.get("RocketCompCfg.lbl.overriddenby") + " " + c.getName() + ")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -526,7 +526,7 @@ public class RocketComponentConfig extends JPanel {
|
|||||||
|
|
||||||
// BEGIN OVERRIDE SUBCOMPONENTS --------------------------------------------------
|
// BEGIN OVERRIDE SUBCOMPONENTS --------------------------------------------------
|
||||||
|
|
||||||
bm = new BooleanModel(component, "OverrideSubcomponents");
|
bm = new BooleanModel(component, "SubcomponentsOverridden");
|
||||||
check = new JCheckBox(bm);
|
check = new JCheckBox(bm);
|
||||||
//// Override mass, CG, and CD of all subcomponents
|
//// Override mass, CG, and CD of all subcomponents
|
||||||
check.setText(trans.get("RocketCompCfg.checkbox.OverrideSubcomponents"));
|
check.setText(trans.get("RocketCompCfg.checkbox.OverrideSubcomponents"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user