diff --git a/core/src/net/sf/openrocket/document/Simulation.java b/core/src/net/sf/openrocket/document/Simulation.java index 23eee5016..c6371b354 100644 --- a/core/src/net/sf/openrocket/document/Simulation.java +++ b/core/src/net/sf/openrocket/document/Simulation.java @@ -523,6 +523,37 @@ public class Simulation implements ChangeSource, Cloneable { mutex.unlock("copy"); } } + + public Simulation clone() { + mutex.lock("clone"); + try { + Simulation clone = (Simulation) super.clone(); + + clone.mutex = SafetyMutex.newInstance(); + clone.status = status; + clone.options = this.options.clone(); + clone.simulationExtensions = new ArrayList<>(); + for (SimulationExtension c : this.simulationExtensions) { + clone.simulationExtensions.add(c.clone()); + } + clone.listeners = new ArrayList<>(); + if (simulatedConditions != null) { + clone.simulatedConditions = simulatedConditions.clone(); + } else { + clone.simulatedConditions = null; + } + clone.simulatedConfigurationDescription = simulatedConfigurationDescription; + clone.simulatedData = simulatedData.clone(); + clone.simulatedConfigurationID = simulatedConfigurationID; + + return clone; + + } catch (CloneNotSupportedException e) { + throw new BugException("Clone not supported, BUG", e); + } finally { + mutex.unlock("clone"); + } + } /** diff --git a/core/src/net/sf/openrocket/simulation/FlightData.java b/core/src/net/sf/openrocket/simulation/FlightData.java index 27f6c1318..0bc41ae76 100644 --- a/core/src/net/sf/openrocket/simulation/FlightData.java +++ b/core/src/net/sf/openrocket/simulation/FlightData.java @@ -273,7 +273,23 @@ public class FlightData { return mutable.isMutable(); } - + public FlightData clone() { + FlightData clone = new FlightData(); + clone.warnings.addAll(warnings); + for (FlightDataBranch b : branches) { + clone.branches.add(b.clone()); + } + clone.maxAltitude = maxAltitude; + clone.maxVelocity = maxVelocity; + clone.maxAcceleration = maxAcceleration; + clone.maxMachNumber = maxMachNumber; + clone.timeToApogee = timeToApogee; + clone.flightTime = flightTime; + clone.groundHitVelocity = groundHitVelocity; + clone.launchRodVelocity = launchRodVelocity; + clone.deploymentVelocity = deploymentVelocity; + return clone; + } /** * Find the maximum acceleration before apogee. diff --git a/core/src/net/sf/openrocket/simulation/FlightDataBranch.java b/core/src/net/sf/openrocket/simulation/FlightDataBranch.java index 77bc60f56..e2547e4c4 100644 --- a/core/src/net/sf/openrocket/simulation/FlightDataBranch.java +++ b/core/src/net/sf/openrocket/simulation/FlightDataBranch.java @@ -363,5 +363,20 @@ public class FlightDataBranch implements Monitorable { public int getModID() { return modID; } + + public FlightDataBranch clone() { + FlightDataType[] types = getTypes(); + FlightDataBranch clone = new FlightDataBranch(branchName, types); + for (FlightDataType type : values.keySet()) { + clone.values.put(type, values.get(type).clone()); + } + clone.minValues.putAll(minValues); + clone.maxValues.putAll(maxValues); + clone.events.addAll(events); + clone.timeToOptimumAltitude = timeToOptimumAltitude; + clone.optimumAltitude = optimumAltitude; + clone.modID = modID; + return clone; + } }