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);
}