Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / motor / ThrustCurveMotor.java
index e1ba1d77ca6c7b6f02d8aa4e5870e8a39b6fd107..e795c82308f9197fb241dd01a6fdd290e40a1594 100644 (file)
@@ -7,6 +7,7 @@ import java.util.Locale;
 import net.sf.openrocket.logging.LogHelper;
 import net.sf.openrocket.models.atmosphere.AtmosphericConditions;
 import net.sf.openrocket.startup.Application;
+import net.sf.openrocket.util.ArrayUtils;
 import net.sf.openrocket.util.BugException;
 import net.sf.openrocket.util.Coordinate;
 import net.sf.openrocket.util.Inertia;
@@ -43,6 +44,31 @@ public class ThrustCurveMotor implements Motor, Comparable<ThrustCurveMotor> {
        private double averageThrust;
        private double totalImpulse;
        
+       /**
+        * Deep copy constructor.
+        * Constructs a new ThrustCurveMotor from an existing ThrustCurveMotor.
+        * @param m
+        */
+       protected ThrustCurveMotor( ThrustCurveMotor m ) {
+               this.digest = m.digest;
+               this.manufacturer = m.manufacturer;
+               this.designation = m.designation;
+               this.description = m.description;
+               this.type = m.type;
+               this.delays = ArrayUtils.copyOf(m.delays, m.delays.length);
+               this.diameter = m.diameter;
+               this.length = m.length;
+               this.time = ArrayUtils.copyOf(m.time, m.time.length);
+               this.thrust = ArrayUtils.copyOf(m.thrust, m.thrust.length);
+               this.cg = new Coordinate[ m.cg.length ];
+               for( int i = 0; i< cg.length; i++ ) {
+                       this.cg[i] = m.cg[i].clone();
+               }
+               this.maxThrust = m.maxThrust;
+               this.burnTime = m.burnTime;
+               this.averageThrust = m.averageThrust;
+               this.totalImpulse = m.totalImpulse;
+       }
        
        /**
         * Sole constructor.  Sets all the properties of the motor.
@@ -398,6 +424,7 @@ public class ThrustCurveMotor implements Motor, Comparable<ThrustCurveMotor> {
                
                private final double unitRotationalInertia;
                private final double unitLongitudinalInertia;
+               private final Motor parentMotor;
                
                private int modID = 0;
                
@@ -411,6 +438,12 @@ public class ThrustCurveMotor implements Motor, Comparable<ThrustCurveMotor> {
                        stepCG = cg[0];
                        unitRotationalInertia = Inertia.filledCylinderRotational(getDiameter() / 2);
                        unitLongitudinalInertia = Inertia.filledCylinderLongitudinal(getDiameter() / 2, getLength());
+                       parentMotor = ThrustCurveMotor.this;
+               }
+               
+               @Override
+               public Motor getParentMotor(){
+                       return parentMotor;
                }
                
                @Override