diff --git a/core/resources/l10n/messages_fr.properties b/core/resources/l10n/messages_fr.properties
index 166943359..c5fd19271 100644
--- a/core/resources/l10n/messages_fr.properties
+++ b/core/resources/l10n/messages_fr.properties
@@ -819,6 +819,7 @@ RocketCompCfg.but.Setforall = Appliquer \u00E0 tous
RocketCompCfg.but.ttip.Setforall = R\u00E9gler la finition pour tous les composants de la fus\u00E9e.
RocketCompCfg.checkbox.Endcapped = Arri\u00E8re clos
RocketCompCfg.checkbox.Overridecenterofgrav = Forcer le centre de gravit\u00E9:
+RocketCompCfg.checkbox.Overridecoeffofdrag = Modifier le coefficient de trainee:
RocketCompCfg.checkbox.Overridemass = Forcer la masse:
RocketCompCfg.checkbox.OverridemassandCG = Forcer la masse et le centre de gravit\u00E9 de tous les sous composants
RocketCompCfg.checkbox.Usedefaultcolor = Utiliser la couleur par d\u00E9faut
diff --git a/core/resources/l10n/messages_pt.properties b/core/resources/l10n/messages_pt.properties
index 25603129c..33b1c387a 100644
--- a/core/resources/l10n/messages_pt.properties
+++ b/core/resources/l10n/messages_pt.properties
@@ -804,6 +804,7 @@ RocketCompCfg.but.Setforall = Definir para todos
RocketCompCfg.but.ttip.Setforall = Definir este acabamento para todos os componentes do foguete.
RocketCompCfg.checkbox.Endcapped = Fim tampado
RocketCompCfg.checkbox.Overridecenterofgrav = Modificar o centro de gravidade:
+RocketCompCfg.checkbox.Overridecoeffofdrag = Modificar o coeficiente de arrasto:
RocketCompCfg.checkbox.Overridemass = Modificar massa:
RocketCompCfg.checkbox.OverridemassandCG = Modificar a massa e o CG de todos os subcomponentes
RocketCompCfg.checkbox.Usedefaultcolor = Use a cor padr\u00e3o
diff --git a/core/resources/l10n/messages_uk_UA.properties b/core/resources/l10n/messages_uk_UA.properties
index d2a159432..05fbebbc7 100644
--- a/core/resources/l10n/messages_uk_UA.properties
+++ b/core/resources/l10n/messages_uk_UA.properties
@@ -799,6 +799,7 @@ RocketCompCfg.but.ttip.Setforall = Set this finish for all components of the roc
RocketCompCfg.lbl.Overridemassorcenter = Override the mass or center of gravity of the
RocketCompCfg.checkbox.Overridemass = Override mass:
RocketCompCfg.checkbox.Overridecenterofgrav = Override center of gravity:
+RocketCompCfg.checkbox.Overridecoeffofdrag = Override coefficient of drag:
RocketCompCfg.checkbox.OverridemassandCG = Override mass and CG of all subcomponents
RocketCompCfg.lbl.longB1 = The overridden mass does not include motors.
RocketCompCfg.lbl.longB2 = The center of gravity is measured from the front end of the
diff --git a/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java b/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java
index ebf11c01e..cbfc3ddb7 100644
--- a/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java
+++ b/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java
@@ -196,6 +196,10 @@ public class AerodynamicForces implements Cloneable, Monitorable {
}
public double getCD() {
+ if(component == null) return CD;
+ if(component.isCDOverridden()) {
+ return component.getOverrideCD();
+ }
return CD;
}
@@ -205,6 +209,10 @@ public class AerodynamicForces implements Cloneable, Monitorable {
}
public double getPressureCD() {
+ if(component == null) return pressureCD;
+ if(component.isCDOverridden()) {
+ return 0;
+ }
return pressureCD;
}
@@ -214,6 +222,10 @@ public class AerodynamicForces implements Cloneable, Monitorable {
}
public double getBaseCD() {
+ if(component == null) return baseCD;
+ if(component.isCDOverridden()) {
+ return component.getOverrideCD();
+ }
return baseCD;
}
@@ -223,6 +235,10 @@ public class AerodynamicForces implements Cloneable, Monitorable {
}
public double getFrictionCD() {
+ if(component == null) return frictionCD;
+ if(component.isCDOverridden()) {
+ return 0;
+ }
return frictionCD;
}
diff --git a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java
index 95ea867f4..cd5d07759 100644
--- a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java
+++ b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java
@@ -463,6 +463,10 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
}
+ //Handle Overriden CD for Whole Rocket
+ if(c.isCDOverridden()) {
+ continue;
+ }
// Calculate the friction drag:
@@ -496,6 +500,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
}
}
+
+
}
// fB may be POSITIVE_INFINITY, but that's ok for us
@@ -510,6 +516,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
}
}
}
+
+
return (finFriction + correction * bodyFriction) / conditions.getRefArea();
}
@@ -550,7 +558,9 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
map.get(c).setPressureCD(cd);
}
-
+ if(c.isCDOverridden()) continue;
+
+
// Stagnation drag
if (c instanceof SymmetricComponent) {
SymmetricComponent s = (SymmetricComponent) c;
@@ -599,6 +609,11 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
continue;
SymmetricComponent s = (SymmetricComponent) c;
+
+ if(c.isCDOverridden()) {
+ total += c.getOverrideCD();
+ continue;
+ }
if (radius > s.getForeRadius()) {
double area = Math.PI * (pow2(radius) - pow2(s.getForeRadius()));
diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java
index 0e0ae9d2f..8f143c463 100644
--- a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java
+++ b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java
@@ -125,6 +125,9 @@ class DocumentConfig {
setters.put("RocketComponent:overridecg", new OverrideSetter(
Reflection.findMethod(RocketComponent.class, "setOverrideCGX", double.class),
Reflection.findMethod(RocketComponent.class, "setCGOverridden", boolean.class)));
+ setters.put("RocketComponent:overridecd", new OverrideSetter(
+ Reflection.findMethod(RocketComponent.class, "setOverrideCD", double.class),
+ Reflection.findMethod(RocketComponent.class, "setCDOverridden", boolean.class)));
setters.put("RocketComponent:overridesubcomponents", new BooleanSetter(
Reflection.findMethod(RocketComponent.class, "setOverrideSubcomponents", boolean.class)));
setters.put("RocketComponent:comment", new StringSetter(
diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java
index 45c7eaa1f..960def5a3 100644
--- a/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java
+++ b/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java
@@ -125,6 +125,10 @@ public class RocketComponentSaver {
elements.add("" + c.getOverrideCGX() + "");
overridden = true;
}
+ if (c.isCDOverridden()) {
+ elements.add("" + c.getOverrideCD() + "");
+ overridden = true;
+ }
if (overridden) {
elements.add("" + c.getOverrideSubcomponents()
+ "");
diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java
index 50c45a61e..ccb33fb05 100644
--- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java
+++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java
@@ -133,6 +133,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
private boolean massOverriden = false;
private double overrideCGX = 0;
private boolean cgOverriden = false;
+ private double overrideCD = 0;
+ private boolean cdOverriden = false;
private boolean overrideSubcomponents = false;
@@ -635,6 +637,60 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
cgOverriden = o;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
+
+
+
+ /** Return the current override CD. The CD is not neccesarily overriden.
+ *
+ * @return the override CG.
+ */
+ public final double getOverrideCD() {
+ mutex.verify();
+ return overrideCD;
+ }
+
+ /**
+ * Set the current override CD to x.
+ *
+ * @param x the override CD to set.
+ */
+ public final void setOverrideCD(double x) {
+ if (MathUtil.equals(overrideCD, x))
+ return;
+ checkState();
+ this.overrideCD = x;
+ if (isCDOverridden())
+ fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
+ else
+ fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
+ }
+
+
+
+ /**
+ * Return whether the CD is currently overriden.
+ *
+ * @return whether the CD is overridden
+ */
+ public final boolean isCDOverridden() {
+ mutex.verify();
+ return cdOverriden;
+ }
+
+
+ /**
+ * Set whether the CD is currently overriden.
+ *
+ * @param o whether the CD is overriden
+ */
+ public final void setCDOverridden(boolean o) {
+ if(cdOverriden == o) {
+ return;
+ }
+ checkState();
+ cdOverriden = o;
+ fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
+ }
diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java
index b40a87c20..8730f1d73 100644
--- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java
+++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java
@@ -24,6 +24,8 @@ import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
+import java.text.DecimalFormat;
+
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.database.ComponentPresetDatabase;
import net.sf.openrocket.document.OpenRocketDocument;
@@ -330,7 +332,9 @@ public class RocketComponentConfig extends JPanel {
bm.addEnableComponent(bs);
panel.add(bs, "growx 5, w 100lp, wrap");
-
+
+ //OVERRIDES CG ----------------------------------
+
//// CG override
bm = new BooleanModel(component, "CGOverridden");
check = new JCheckBox(bm);
@@ -368,6 +372,37 @@ public class RocketComponentConfig extends JPanel {
bm.addEnableComponent(bs);
panel.add(bs, "growx 5, w 100lp, wrap 35lp");
+
+ //END OVERRIDES CG ---------------------------------------------------
+
+
+ //BEGIN OVERRIDES CD ---------------------------------------------------
+
+
+ bm = new BooleanModel(component, "CDOverridden");
+ check = new JCheckBox(bm);
+ //// Override mass:
+ check.setText("Set coefficient of drag:");
+ panel.add(check, "growx 1, gapright 20lp");
+
+ m = new DoubleModel(component, "OverrideCD", UnitGroup.UNITS_NONE, 0);
+
+ spin = new JSpinner(m.getSpinnerModel());
+
+ spin.setEditor(new SpinnerEditor(spin));
+ bm.addEnableComponent(spin, true);
+ panel.add(spin, "growx 1");
+
+
+ bs = new BasicSlider(m.getSliderModel(0, 0.01, 1.0));
+ bm.addEnableComponent(bs);
+ panel.add(bs, "growx 5, w 100lp, wrap");
+
+
+ //END OVERRIDES CP --------------------------------------------------
+
+
+
// Override subcomponents checkbox
bm = new BooleanModel(component, "OverrideSubcomponents");
@@ -596,6 +631,7 @@ public class RocketComponentConfig extends JPanel {
}
+
protected static void setDeepEnabled(Component component, boolean enabled) {
component.setEnabled(enabled);
if (component instanceof Container) {
@@ -604,4 +640,4 @@ public class RocketComponentConfig extends JPanel {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java
index f6fff0f8b..49da90aef 100644
--- a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java
+++ b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java
@@ -589,6 +589,8 @@ public class ScaleDialog extends JDialog {
mass = mass * MathUtil.pow3(multiplier);
component.setOverrideMass(mass);
}
+
+ //TODO: Fix overridden pressure!
}
}