Merge pull request #1223 from SiboVG/issue-1204

[fixes #1204] Fix stage CG override incorrect location
This commit is contained in:
Joe Pfeiffer 2022-03-05 19:00:17 -07:00 committed by GitHub
commit c98b90a829
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 74 additions and 9 deletions

View File

@ -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 = <html>The overridden mass does not include motors.<br>
RocketCompCfg.lbl.longB1 = <html>The overridden mass and center of gravity does not include motors.<br>
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:

View File

@ -72,6 +72,10 @@ public class MassCalculation {
}
}
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);
}
@ -84,6 +88,10 @@ public class MassCalculation {
return this.centerOfMass.weight;
}
public void setMass(double mass) {
this.centerOfMass = this.centerOfMass.setWeight(mass);
}
public double getLongitudinalInertia() {
return this.inertia.Iyy;
}
@ -449,6 +457,7 @@ public class MassCalculation {
//System.err.println(String.format( "%s....assembly mass (incl/children): %s", prefix, this.toCMDebug()));
}
// // vvv DEBUG
// if( this.config.isComponentActive(component) && 0 < this.getMass() ) {
// System.err.println(String.format( "%s....<< return assemblyData: %s (tree @%s)", prefix, this.toCMDebug(), component.getName() ));

View File

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

View File

@ -1624,6 +1624,23 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
return parent;
}
/**
* Get all the parent and super-parent components of this component.
* @return parent and super-parents of this component
*/
public final List<RocketComponent> getParents() {
checkState();
List<RocketComponent> 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.
*
@ -1711,6 +1728,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<RocketComponent> getParentAssemblies() {
checkState();
List<RocketComponent> result = new LinkedList<>();
RocketComponent currComp = this;
while (currComp.parent != null) {
currComp = currComp.parent;
if (currComp instanceof ComponentAssembly) {
result.add(currComp);
}
}
return result;
}
/**
* Return the stage number of the stage this component belongs to. The stages

View File

@ -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;
if (component.getChildCount() > 0) {
Iterator<RocketComponent> iterator = component.iterator(true);
double minL = Double.MAX_VALUE;
double maxL = Double.MIN_VALUE;
Iterator<RocketComponent> iterator = component.iterator(false);
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);
}