diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 650a40db7..9e4a2782b 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -885,7 +885,7 @@ RocketCompCfg.checkbox.Overridemass = Override mass: RocketCompCfg.checkbox.Overridecenterofgrav = Override center of gravity: RocketCompCfg.checkbox.SetDragCoeff = Set 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.longB1 = The overridden mass and center of gravity does not include motors.
RocketCompCfg.lbl.longB2 = The center of gravity is measured from the front end of the RocketCompCfg.lbl.Commentsonthe = Comments on the RocketCompCfg.lbl.Figurestyle = Figure style: diff --git a/core/src/net/sf/openrocket/masscalc/MassCalculation.java b/core/src/net/sf/openrocket/masscalc/MassCalculation.java index 03724b1f8..28bc0de5b 100644 --- a/core/src/net/sf/openrocket/masscalc/MassCalculation.java +++ b/core/src/net/sf/openrocket/masscalc/MassCalculation.java @@ -71,6 +71,10 @@ public class MassCalculation { this.centerOfMass = this.centerOfMass.average( pointMass); } } + + public void addMass(double mass) { + this.centerOfMass = this.centerOfMass.setWeight(getMass() + mass); + } public MassCalculation copy( final RocketComponent _root, final Transformation _transform){ return new MassCalculation( this.type, this.config, this.simulationTime, this.activeMotorList, _root, _transform, this.analysisMap); @@ -83,6 +87,10 @@ public class MassCalculation { public double getMass() { return this.centerOfMass.weight; } + + public void setMass(double mass) { + this.centerOfMass = this.centerOfMass.setWeight(mass); + } public double getLongitudinalInertia() { return this.inertia.Iyy; @@ -448,6 +456,7 @@ public class MassCalculation { this.merge( children ); //System.err.println(String.format( "%s....assembly mass (incl/children): %s", prefix, this.toCMDebug())); } + // // vvv DEBUG // if( this.config.isComponentActive(component) && 0 < this.getMass() ) { diff --git a/core/src/net/sf/openrocket/masscalc/RigidBody.java b/core/src/net/sf/openrocket/masscalc/RigidBody.java index 01543c58b..9c1ad7aab 100644 --- a/core/src/net/sf/openrocket/masscalc/RigidBody.java +++ b/core/src/net/sf/openrocket/masscalc/RigidBody.java @@ -76,6 +76,11 @@ public class RigidBody { MathUtil.equals(this.Izz, other.Izz)) ; } + /** + * Rebase the current moment of inertia from this.cm reference system to newLocation reference system + * @param newLocation new moment of inertia reference system + * @return RigidBody with rebased moment of inertia + */ public RigidBody rebase( final Coordinate newLocation ){ final Coordinate delta = this.cm.sub( newLocation ).setWeight(0.); double x2 = pow2(delta.x); diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java index 43fad2d51..bcdca0897 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java @@ -1623,6 +1623,23 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab checkState(); return parent; } + + /** + * Get all the parent and super-parent components of this component. + * @return parent and super-parents of this component + */ + public final List getParents() { + checkState(); + List result = new LinkedList<>(); + RocketComponent currComp = this; + + while (currComp.parent != null) { + currComp = currComp.parent; + result.add(currComp); + } + + return result; + } /** * Get the root component of the component tree. @@ -1710,6 +1727,26 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } return result; } + + /** + * Return all the component assemblies that are a parent or super-parent of this component + * @return list of ComponentAssembly components that are a parent or super-parent of this component + */ + public final List getParentAssemblies() { + checkState(); + + List result = new LinkedList<>(); + RocketComponent currComp = this; + + while (currComp.parent != null) { + currComp = currComp.parent; + if (currComp instanceof ComponentAssembly) { + result.add(currComp); + } + } + + return result; + } /** diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 55b4dce42..66c94148e 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -6,7 +6,6 @@ import java.awt.Container; import java.awt.event.*; import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Locale; @@ -339,16 +338,31 @@ public class RocketComponentConfig extends JPanel { m = new DoubleModel(component, "OverrideCGX", UnitGroup.UNITS_LENGTH, 0); // Calculate suitable length for slider DoubleModel length; - if (component instanceof ComponentAssembly) { - double l = 0; - - Iterator iterator = component.iterator(false); + if (component.getChildCount() > 0) { + Iterator iterator = component.iterator(true); + double minL = Double.MAX_VALUE; + double maxL = Double.MIN_VALUE; + while (iterator.hasNext()) { RocketComponent c = iterator.next(); - if (c.getAxialMethod() == AxialMethod.AFTER) - l += c.getLength(); + + double compPos = c.getAxialOffset(AxialMethod.ABSOLUTE); + if (compPos < minL) { + minL = compPos; + } + + double compLen = c.getLength(); + if (c instanceof FinSet) { + compLen = ((FinSet) c).getInstanceBoundingBox().span().x; + } + if (compPos + compLen > maxL) { + maxL = compPos + compLen; + } } - length = new DoubleModel(l); + length = new DoubleModel(maxL - minL); + } else if (component instanceof FinSet) { + double compLen = ((FinSet) component).getInstanceBoundingBox().span().x; + length = new DoubleModel(compLen); } else { length = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0); }