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/aerodynamics/BarrowmanCalculator.java b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java index 69ed97e14..af76e37ff 100644 --- a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java @@ -852,8 +852,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { private void buildCalcMap(FlightConfiguration configuration) { calcMap = new HashMap<>(); - // because this is not a per-instance iteration... this usage of 'getActiveComponents' is probably fine. - for (RocketComponent comp: configuration.getActiveComponents()) { + for (RocketComponent comp: configuration.getAllComponents()) { if (!comp.isAerodynamic()) continue; diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/FinSetHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/FinSetHandler.java index 84f9d473e..5be672c72 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/FinSetHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/FinSetHandler.java @@ -6,6 +6,7 @@ package net.sf.openrocket.file.rocksim.importt; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import org.xml.sax.SAXException; @@ -359,17 +360,25 @@ class FinSetHandler extends AbstractElementHandler { * @return an array of OpenRocket Coordinates */ private Coordinate[] toCoordinates(String newPointList, WarningSet warnings) { - List result = new ArrayList(); + List result = new LinkedList<>(); if (newPointList != null && newPointList.length() > 0) { String[] points = newPointList.split("\\Q|\\E"); - for (String point : points) { - String[] aPoint = point.split(","); + for (int i = 0; i < points.length; i++) { + String[] aPoint = points[i].split(","); try { if (aPoint.length > 1) { Coordinate c = new Coordinate( Double.parseDouble(aPoint[0]) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, Double.parseDouble(aPoint[1]) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); - result.add(c); + if (result.size() == 0) { + result.add(c); + continue; + } + Coordinate lastCoord = result.get(result.size() - 1); + // RockSim sometimes saves a multitude of '0,0' coordinates, so ignore this + if (! ((lastCoord.x == 0) && (lastCoord.y == 0) && (c.x == 0) && (c.y == 0))) { + result.add(c); + } } else { warnings.add("Invalid fin point pair."); 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); }