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 4a7f88196..035870890 100644 --- a/core/src/main/java/info/openrocket/core/simulation/BasicEventSimulationEngine.java +++ b/core/src/main/java/info/openrocket/core/simulation/BasicEventSimulationEngine.java @@ -63,91 +63,95 @@ public class BasicEventSimulationEngine implements SimulationEngine { @Override public void simulate(SimulationConditions simulationConditions) throws SimulationException { - + // Set up flight data flightData = new FlightData(); - - // Set up rocket configuration - this.fcid = simulationConditions.getFlightConfigurationID(); - FlightConfiguration origConfig = simulationConditions.getRocket().getFlightConfiguration(this.fcid); - FlightConfiguration simulationConfig = origConfig.clone(simulationConditions.getRocket().copyWithOriginalID()); - simulationConfig.copyStages(origConfig); // Clone the stage activation configuration - - currentStatus = new SimulationStatus(simulationConfig, simulationConditions); - // main simulation branch. Need to watch for pathological case with no stages defined - final AxialStage topStage = simulationConfig.getRocket().getTopmostStage(currentStatus.getConfiguration()); - final String branchName; + + try { + // Set up rocket configuration + this.fcid = simulationConditions.getFlightConfigurationID(); + FlightConfiguration origConfig = simulationConditions.getRocket().getFlightConfiguration(this.fcid); + FlightConfiguration simulationConfig = origConfig.clone(simulationConditions.getRocket().copyWithOriginalID()); + simulationConfig.copyStages(origConfig); // Clone the stage activation configuration + + currentStatus = new SimulationStatus(simulationConfig, simulationConditions); + // main simulation branch. Need to watch for pathological case with no stages defined + final AxialStage topStage = simulationConfig.getRocket().getTopmostStage(currentStatus.getConfiguration()); + final String branchName; if (topStage != null) { branchName = topStage.getName(); } else { branchName = trans.get("BasicEventSimulationEngine.nullBranchName"); } - FlightDataBranch initialBranch = new FlightDataBranch( branchName, FlightDataType.TYPE_TIME); - - // put a point on it so we can plot if we get an early abort event - initialBranch.addPoint(); - initialBranch.setValue(FlightDataType.TYPE_TIME, 0.0); - initialBranch.setValue(FlightDataType.TYPE_ALTITUDE, 0.0); - - currentStatus.setFlightDataBranch(initialBranch); - - // Sanity checks on design and configuration - - // Problems that keep us from simulating at all - - // No active stages - if (topStage == null) { - currentStatus.abortSimulation(SimulationAbort.Cause.NO_ACTIVE_STAGES); - } - - // No motors in configuration - if (!simulationConfig.hasMotors() ) { - currentStatus.abortSimulation(SimulationAbort.Cause.NO_MOTORS_DEFINED); - } - - // Problems that let us simulate, but result is likely bad + FlightDataBranch initialBranch = new FlightDataBranch( branchName, FlightDataType.TYPE_TIME); - // No recovery device - if (!simulationConfig.hasRecoveryDevice()) { - currentStatus.getWarnings().add(Warning.NO_RECOVERY_DEVICE); - } - - currentStatus.getEventQueue().add(new FlightEvent(FlightEvent.Type.LAUNCH, 0, simulationConditions.getRocket())); - toSimulate.push(currentStatus); - - SimulationListenerHelper.fireStartSimulation(currentStatus); - do { - if (toSimulate.peek() == null) { - break; + // put a point on it so we can plot if we get an early abort event + initialBranch.addPoint(); + initialBranch.setValue(FlightDataType.TYPE_TIME, 0.0); + initialBranch.setValue(FlightDataType.TYPE_ALTITUDE, 0.0); + + currentStatus.setFlightDataBranch(initialBranch); + + // Sanity checks on design and configuration + + // Problems that keep us from simulating at all + + // No active stages + if (topStage == null) { + currentStatus.abortSimulation(SimulationAbort.Cause.NO_ACTIVE_STAGES); } - currentStatus = toSimulate.pop(); - FlightDataBranch dataBranch = currentStatus.getFlightDataBranch(); - flightData.addBranch(dataBranch); - log.info(">>Starting simulation of branch: " + currentStatus.getFlightDataBranch().getName()); - - simulateLoop(); - dataBranch.immute(); - flightData.getWarningSet().addAll(currentStatus.getWarnings()); - - log.info(String.format("<>Starting simulation of branch: " + currentStatus.getFlightDataBranch().getName()); + + simulateLoop(); + dataBranch.immute(); + flightData.getWarningSet().addAll(currentStatus.getWarnings()); + + log.info(String.format("<