diff --git a/core/src/main/java/info/openrocket/core/document/Simulation.java b/core/src/main/java/info/openrocket/core/document/Simulation.java index d9d1530fb..3ec5ae0f3 100644 --- a/core/src/main/java/info/openrocket/core/document/Simulation.java +++ b/core/src/main/java/info/openrocket/core/document/Simulation.java @@ -399,14 +399,14 @@ public class Simulation implements ChangeSource, Cloneable { public void simulate(SimulationListener... additionalListeners) throws SimulationException { mutex.lock("simulate"); + SimulationEngine simulator = null; + simulatedData = null; try { if (this.status == Status.EXTERNAL) { throw new SimulationException("Cannot simulate imported simulation."); } - SimulationEngine simulator; - try { simulator = simulationEngineClass.getConstructor().newInstance(); } catch (InstantiationException e) { @@ -430,18 +430,20 @@ public class Simulation implements ChangeSource, Cloneable { long t1, t2; log.debug("Simulation: calling simulator"); t1 = System.currentTimeMillis(); - simulatedData = simulator.simulate(simulationConditions); + simulator.simulate(simulationConditions); t2 = System.currentTimeMillis(); log.debug("Simulation: returning from simulator, simulation took " + (t2 - t1) + "ms"); } catch (SimulationException e) { - simulatedData = e.getFlightData(); throw e; } finally { // Set simulated info after simulation simulatedConditions = options.clone(); simulatedConfigurationDescription = descriptor.format(this.rocket, getId()); simulatedConfigurationID = getActiveConfiguration().getModID(); + if (simulator != null) { + simulatedData = simulator.getFlightData(); + } status = Status.UPTODATE; fireChangeEvent(); diff --git a/core/src/main/java/info/openrocket/core/simulation/BasicEventSimulationEngine.java b/core/src/main/java/info/openrocket/core/simulation/BasicEventSimulationEngine.java index 54796229f..9df170e61 100644 --- a/core/src/main/java/info/openrocket/core/simulation/BasicEventSimulationEngine.java +++ b/core/src/main/java/info/openrocket/core/simulation/BasicEventSimulationEngine.java @@ -62,7 +62,7 @@ public class BasicEventSimulationEngine implements SimulationEngine { FlightData flightData; @Override - public FlightData simulate(SimulationConditions simulationConditions) throws SimulationException { + public void simulate(SimulationConditions simulationConditions) throws SimulationException { // Set up flight data flightData = new FlightData(); @@ -148,7 +148,6 @@ public class BasicEventSimulationEngine implements SimulationEngine { } flightData.calculateInterestingValues(); - return flightData; } private void simulateLoop() throws SimulationException { @@ -740,10 +739,10 @@ public class BasicEventSimulationEngine implements SimulationEngine { try { SimulationConditions conds = currentStatus.getSimulationConditions().clone(); conds.getSimulationListenerList().add(OptimumCoastListener.INSTANCE); - BasicEventSimulationEngine e = new BasicEventSimulationEngine(); + BasicEventSimulationEngine coastEngine = new BasicEventSimulationEngine(); - FlightData d = e.simulate(conds); - return d; + coastEngine.simulate(conds); + return coastEngine.getFlightData(); } catch (SimulationException e) { throw e; } catch (Exception e) { @@ -751,4 +750,8 @@ public class BasicEventSimulationEngine implements SimulationEngine { return null; } } + + public FlightData getFlightData() { + return flightData; + } } diff --git a/core/src/main/java/info/openrocket/core/simulation/SimulationEngine.java b/core/src/main/java/info/openrocket/core/simulation/SimulationEngine.java index fcda5efec..d4ddb3e8f 100644 --- a/core/src/main/java/info/openrocket/core/simulation/SimulationEngine.java +++ b/core/src/main/java/info/openrocket/core/simulation/SimulationEngine.java @@ -17,10 +17,16 @@ public interface SimulationEngine { * Simulate the flight of a rocket. * * @param simulation the simulation conditions which to simulate. - * @return a FlightData object containing the simulated data. * @throws SimulationException if an error occurs during simulation */ - public FlightData simulate(SimulationConditions simulation) + public void simulate(SimulationConditions simulation) throws SimulationException; + /** + * Obtain data generated by simulation + * + * @return flight data + */ + public FlightData getFlightData(); + }