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! } }