[#1629] Show calculated CD in override tab if not overridden
This commit is contained in:
parent
bb2ad98d98
commit
9c14e0ce84
@ -7,8 +7,16 @@ import java.util.EventObject;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
|
import net.sf.openrocket.aerodynamics.AerodynamicCalculator;
|
||||||
|
import net.sf.openrocket.aerodynamics.AerodynamicForces;
|
||||||
|
import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
|
||||||
|
import net.sf.openrocket.aerodynamics.FlightConditions;
|
||||||
|
import net.sf.openrocket.logging.WarningSet;
|
||||||
|
import net.sf.openrocket.startup.Application;
|
||||||
|
import net.sf.openrocket.startup.Preferences;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -712,6 +720,43 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
|
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates and returns the CD of the component.
|
||||||
|
* TODO: LOW: should this value be cached instead of recalculated every time?
|
||||||
|
* @param AOA angle of attack to use in the calculations (in radians)
|
||||||
|
* @param theta wind direction to use in the calculations (in radians)
|
||||||
|
* @param mach mach number to use in the calculations
|
||||||
|
* @param rollRate roll rate to use in the calculations (in radians per second)
|
||||||
|
* @return the CD of the component
|
||||||
|
*/
|
||||||
|
public double getComponentCD(double AOA, double theta, double mach, double rollRate) {
|
||||||
|
Rocket rocket;
|
||||||
|
try {
|
||||||
|
rocket = getRocket();
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
// This can happen due to a race condition when a loadFrom() action is performed of the rocket (after
|
||||||
|
// an undo operation) but the rocket is not yet fully loaded (the sustainer does not yet have the rocket as
|
||||||
|
// its parent => getRocket() will not return the rocket, but the sustainer). In that case, just return 0 and
|
||||||
|
// hope that a future call of this method will succeed 🤞.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
final FlightConfiguration configuration = rocket.getSelectedConfiguration();
|
||||||
|
FlightConditions conditions = new FlightConditions(configuration);
|
||||||
|
WarningSet warnings = new WarningSet();
|
||||||
|
AerodynamicCalculator aerodynamicCalculator = new BarrowmanCalculator();
|
||||||
|
|
||||||
|
conditions.setAOA(AOA);
|
||||||
|
conditions.setTheta(theta);
|
||||||
|
conditions.setMach(mach);
|
||||||
|
conditions.setRollRate(rollRate);
|
||||||
|
|
||||||
|
Map<RocketComponent, AerodynamicForces> aeroData = aerodynamicCalculator.getForceAnalysis(configuration, conditions, warnings);
|
||||||
|
AerodynamicForces forces = aeroData.get(this);
|
||||||
|
if (forces != null) {
|
||||||
|
return forces.getCD();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** Return the current override CD. The CD is not necessarily overridden.
|
/** Return the current override CD. The CD is not necessarily overridden.
|
||||||
*
|
*
|
||||||
@ -719,6 +764,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
*/
|
*/
|
||||||
public final double getOverrideCD() {
|
public final double getOverrideCD() {
|
||||||
mutex.verify();
|
mutex.verify();
|
||||||
|
if (!isCDOverridden()) {
|
||||||
|
Preferences preferences = Application.getPreferences();
|
||||||
|
overrideCD = getComponentCD(0, 0, preferences.getDefaultMach(), 0);
|
||||||
|
}
|
||||||
return overrideCD;
|
return overrideCD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -770,7 +819,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
listener.setCDOverridden(o);
|
listener.setCDOverridden(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cdOverridden == o) {
|
if (cdOverridden == o) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
checkState();
|
checkState();
|
||||||
@ -785,6 +834,11 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
overrideSubcomponentsCD(o);
|
overrideSubcomponentsCD(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!cdOverridden) {
|
||||||
|
Preferences preferences = Application.getPreferences();
|
||||||
|
overrideCD = getComponentCD(0, 0, preferences.getDefaultMach(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
|
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2634,7 +2688,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
|||||||
*/
|
*/
|
||||||
protected List<RocketComponent> copyFrom(RocketComponent src) {
|
protected List<RocketComponent> copyFrom(RocketComponent src) {
|
||||||
checkState();
|
checkState();
|
||||||
List<RocketComponent> toInvalidate = new ArrayList<RocketComponent>();
|
List<RocketComponent> toInvalidate = new ArrayList<>();
|
||||||
|
|
||||||
if (this.parent != null) {
|
if (this.parent != null) {
|
||||||
throw new UnsupportedOperationException("copyFrom called for non-root component, parent=" +
|
throw new UnsupportedOperationException("copyFrom called for non-root component, parent=" +
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user