diff --git a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java index 9cd011ead..78d4f8260 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java @@ -281,14 +281,25 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou /** - * Calculate CG of the component by integrating over the length of the component. - * The method caches the result, so subsequent calls are instant. Subclasses may + * Return the CG and mass of the component. Subclasses may * override this method for simple shapes and use this method as necessary. * * @return The CG+mass of the component. */ @Override public Coordinate getComponentCG() { + return getSymmetricComponentCG(); + } + + /** + * Calculate CG of the symmetric component by integrating over the length of the component. + * The method caches the result, so subsequent calls are instant. We need this method because subclasses + * override getComponentCG() and include mass of shoulders + * + * @return The CG+mass of the component. + */ + + private Coordinate getSymmetricComponentCG() { if (cg == null) integrate(); return cg; @@ -491,7 +502,7 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou longitudinalInertia /= vol; // Shift longitudinal inertia to CG - longitudinalInertia = Math.max(longitudinalInertia - pow2(getComponentCG().x), 0); + longitudinalInertia = longitudinalInertia - pow2(getSymmetricComponentCG().x); } @@ -548,7 +559,7 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou rotationalInertia /= surface; // Shift longitudinal inertia to CG - longitudinalInertia = Math.max(longitudinalInertia - pow2(getComponentCG().x), 0); + longitudinalInertia = longitudinalInertia - pow2(getSymmetricComponentCG().x); } diff --git a/core/src/net/sf/openrocket/simulation/FlightData.java b/core/src/net/sf/openrocket/simulation/FlightData.java index ae47565af..9b1c3ea98 100644 --- a/core/src/net/sf/openrocket/simulation/FlightData.java +++ b/core/src/net/sf/openrocket/simulation/FlightData.java @@ -89,7 +89,6 @@ public class FlightData { this.launchRodVelocity = launchRodVelocity; this.deploymentVelocity = deploymentVelocity; this.optimumDelay = optimumDelay; - System.out.println("optimum delay " + optimumDelay); } diff --git a/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java b/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java index a790cfc07..a36109567 100644 --- a/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java +++ b/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java @@ -625,7 +625,7 @@ public class MassCalculatorTest extends BaseTestCase { // Component: Nose Cone final NoseCone payloadNose = (NoseCone) payloadStage.getChild(0); assertEquals(payloadNose.getName() + " Rotational MOI calculated incorrectly: ", 3.508155e-5, payloadNose.getRotationalInertia(), EPSILON); - assertEquals(payloadNose.getName() + " Longitudinal MOI calculated incorrectly: ", 2.0400578477e-6, payloadNose.getLongitudinalInertia(), EPSILON); + assertEquals(payloadNose.getName() + " Longitudinal MOI calculated incorrectly: ", 3.993059978352989E-5, payloadNose.getLongitudinalInertia(), EPSILON); // Component: Payload BodyTube final BodyTube payloadBody = (BodyTube) payloadStage.getChild(1); @@ -695,7 +695,7 @@ public class MassCalculatorTest extends BaseTestCase { expInertia = 1.73189409900e-5; compInertia = boosterNose.getRotationalInertia(); assertEquals(boosterNose.getName() + " Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); - expInertia = 4.51796586171e-6; + expInertia = 1.814234981813717E-5; compInertia = boosterNose.getLongitudinalInertia(); assertEquals(boosterNose.getName() + " Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); @@ -946,7 +946,7 @@ public class MassCalculatorTest extends BaseTestCase { double boosterMOIRotational = spent.getRotationalInertia(); assertEquals(" Booster x-axis MOI is incorrect: ", expMOIRotational, boosterMOIRotational, EPSILON); - double expMOI_tr = 0.0573781722; + double expMOI_tr = 0.057405421013859766; double boosterMOI_tr = spent.getLongitudinalInertia(); assertEquals(" Booster transverse MOI is incorrect: ", expMOI_tr, boosterMOI_tr, EPSILON); } @@ -964,7 +964,7 @@ public class MassCalculatorTest extends BaseTestCase { final double expIxx = 0.0122505987; final double actIxx = launchData.getRotationalInertia(); - final double expIyy = 0.0635943662; + final double expIyy = 0.06362161493172772; final double actIyy = launchData.getLongitudinalInertia(); assertEquals(" Booster x-axis MOI is incorrect: ", expIxx, actIxx, EPSILON); @@ -1010,7 +1010,7 @@ public class MassCalculatorTest extends BaseTestCase { double boosterMOI_xx = burnout.getRotationalInertia(); assertEquals(" Booster x-axis MOI is incorrect: ", expMOI_axial, boosterMOI_xx, EPSILON); - double expMOI_tr = 17.78076176335; + double expMOI_tr = 17.78078901211703; double boosterMOI_tr = burnout.getLongitudinalInertia(); assertEquals(" Booster transverse MOI is incorrect: ", expMOI_tr, boosterMOI_tr, EPSILON); } @@ -1064,7 +1064,7 @@ public class MassCalculatorTest extends BaseTestCase { double boosterMOI_xx = boosterData.getRotationalInertia(); assertEquals(" Booster x-axis MOI is incorrect: ", expMOI_axial, boosterMOI_xx, EPSILON); - double expMOI_tr = 0.347611843243; + double expMOI_tr = 0.34852907557064894; double boosterMOI_tr = boosterData.getLongitudinalInertia(); assertEquals(" Booster transverse MOI is incorrect: ", expMOI_tr, boosterMOI_tr, EPSILON); } @@ -1111,7 +1111,7 @@ public class MassCalculatorTest extends BaseTestCase { double boosterMOI_xx = structure.getRotationalInertia(); assertEquals(" Booster x-axis MOI is incorrect: ", expMOI_axial, boosterMOI_xx, EPSILON); - final double expMOI_tr = 0.040598624476; + final double expMOI_tr = 0.04062587324372749; double boosterMOI_tr = structure.getLongitudinalInertia(); assertEquals(" Booster transverse MOI is incorrect: ", expMOI_tr, boosterMOI_tr, EPSILON); } diff --git a/swing/resources/datafiles/examples/A 3D printable model rocket.ork b/swing/resources/datafiles/examples/A 3D printable model rocket.ork deleted file mode 100644 index 3a039e073..000000000 Binary files a/swing/resources/datafiles/examples/A 3D printable model rocket.ork and /dev/null differ diff --git a/swing/src/net/sf/openrocket/file/SimulationTableCSVExport.java b/swing/src/net/sf/openrocket/file/SimulationTableCSVExport.java index 7eb1efb6b..dbf6493eb 100644 --- a/swing/src/net/sf/openrocket/file/SimulationTableCSVExport.java +++ b/swing/src/net/sf/openrocket/file/SimulationTableCSVExport.java @@ -166,10 +166,8 @@ public class SimulationTableCSVExport { } } - // Current "unstable" will have a populated sim table EXCEPT for the optimum delay column on a restart - // after a save. That means any row that WAS simulated will have exactly one null column in it... so we'll - // skip row export for the case where there are MORE than one nulls. Either way the user should run sims. - if (nullCnt > 1) { // ignore rows that have null column fields 1 through 8... + // If there are any null columns, need to run the simulation before we can export it + if (nullCnt > 0) { // ignore rows that have null column fields 1 through 8... continue; } diff --git a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java index d3f745076..4efd23d8e 100644 --- a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java +++ b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java @@ -33,7 +33,7 @@ public final class ExampleDesignFileAction extends JMenu { "Three-stage rocket", "TARC payload rocket", "Tube fin rocket", - "A 3D printable model rocket", + "3D Printable Nose Cone and Fins", null, // Examples demonstrating complex rocket features "Airstart timing",