Refactor SimulationHandler to separate class
This commit is contained in:
parent
6084ba6512
commit
6490b08847
@ -0,0 +1,179 @@
|
|||||||
|
package net.sf.openrocket.file.rasaero.importt;
|
||||||
|
|
||||||
|
import net.sf.openrocket.aerodynamics.WarningSet;
|
||||||
|
import net.sf.openrocket.document.Simulation;
|
||||||
|
import net.sf.openrocket.file.DocumentLoadingContext;
|
||||||
|
import net.sf.openrocket.file.simplesax.AbstractElementHandler;
|
||||||
|
import net.sf.openrocket.file.simplesax.ElementHandler;
|
||||||
|
import net.sf.openrocket.file.simplesax.PlainTextHandler;
|
||||||
|
import net.sf.openrocket.motor.IgnitionEvent;
|
||||||
|
import net.sf.openrocket.motor.Motor;
|
||||||
|
import net.sf.openrocket.motor.MotorConfiguration;
|
||||||
|
import net.sf.openrocket.motor.ThrustCurveMotor;
|
||||||
|
import net.sf.openrocket.rocketcomponent.FlightConfigurationId;
|
||||||
|
import net.sf.openrocket.rocketcomponent.MotorMount;
|
||||||
|
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||||
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
|
import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration;
|
||||||
|
import net.sf.openrocket.simulation.SimulationOptions;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles RASAero simulation elements.
|
||||||
|
* We will only import the motor information from it.
|
||||||
|
*/
|
||||||
|
public class SimulationHandler extends AbstractElementHandler {
|
||||||
|
private final DocumentLoadingContext context;
|
||||||
|
private final Rocket rocket;
|
||||||
|
private final SimulationOptions launchSiteSettings;
|
||||||
|
private final int simulationNr;
|
||||||
|
|
||||||
|
// Motor information
|
||||||
|
private ThrustCurveMotor sustainerEngine;
|
||||||
|
private Double sustainerIgnitionDelay;
|
||||||
|
private ThrustCurveMotor booster1Engine;
|
||||||
|
private Double booster1IgnitionDelay;
|
||||||
|
private Double booster1SeparationDelay;
|
||||||
|
private Boolean includeBooster1;
|
||||||
|
private ThrustCurveMotor booster2Engine;
|
||||||
|
private Double booster2SeparationDelay;
|
||||||
|
private Boolean includeBooster2;
|
||||||
|
|
||||||
|
public SimulationHandler(DocumentLoadingContext context, Rocket rocket, SimulationOptions launchSiteSettings, int simulationNr) {
|
||||||
|
this.context = context;
|
||||||
|
this.rocket = rocket;
|
||||||
|
this.launchSiteSettings = launchSiteSettings;
|
||||||
|
this.simulationNr = simulationNr;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) throws SAXException {
|
||||||
|
if (RASAeroCommonConstants.SUSTAINER_ENGINE.equals(element) || RASAeroCommonConstants.SUSTAINER_IGNITION_DELAY.equals(element)
|
||||||
|
|| RASAeroCommonConstants.BOOSTER1_ENGINE.equals(element) || RASAeroCommonConstants.BOOSTER1_IGNITION_DELAY.equals(element)
|
||||||
|
|| RASAeroCommonConstants.BOOSTER1_SEPARATION_DELAY.equals(element) || RASAeroCommonConstants.INCLUDE_BOOSTER1.equals(element)
|
||||||
|
|| RASAeroCommonConstants.BOOSTER2_ENGINE.equals(element) || RASAeroCommonConstants.BOOSTER2_SEPARATION_DELAY.equals(element)
|
||||||
|
|| RASAeroCommonConstants.INCLUDE_BOOSTER2.equals(element)) {
|
||||||
|
return PlainTextHandler.INSTANCE;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
|
||||||
|
if (RASAeroCommonConstants.SUSTAINER_ENGINE.equals(element)) {
|
||||||
|
sustainerEngine = RASAeroMotorsLoader.getMotorFromRASAero(content, warnings);
|
||||||
|
} else if (RASAeroCommonConstants.SUSTAINER_IGNITION_DELAY.equals(element)) {
|
||||||
|
sustainerIgnitionDelay = Double.parseDouble(content);
|
||||||
|
} else if (RASAeroCommonConstants.BOOSTER1_ENGINE.equals(element)) {
|
||||||
|
booster1Engine = RASAeroMotorsLoader.getMotorFromRASAero(content, warnings);
|
||||||
|
} else if (RASAeroCommonConstants.BOOSTER1_IGNITION_DELAY.equals(element)) {
|
||||||
|
booster1IgnitionDelay = Double.parseDouble(content);
|
||||||
|
} else if (RASAeroCommonConstants.BOOSTER1_SEPARATION_DELAY.equals(element)) {
|
||||||
|
booster1SeparationDelay = Double.parseDouble(content);
|
||||||
|
} else if (RASAeroCommonConstants.INCLUDE_BOOSTER1.equals(element)) {
|
||||||
|
includeBooster1 = Boolean.parseBoolean(content);
|
||||||
|
} else if (RASAeroCommonConstants.BOOSTER2_ENGINE.equals(element)) {
|
||||||
|
booster2Engine = RASAeroMotorsLoader.getMotorFromRASAero(content, warnings);
|
||||||
|
} else if (RASAeroCommonConstants.BOOSTER2_SEPARATION_DELAY.equals(element)) {
|
||||||
|
booster2SeparationDelay = Double.parseDouble(content);
|
||||||
|
} else if (RASAeroCommonConstants.INCLUDE_BOOSTER2.equals(element)) {
|
||||||
|
includeBooster2 = Boolean.parseBoolean(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
|
||||||
|
FlightConfigurationId id = new FlightConfigurationId();
|
||||||
|
rocket.createFlightConfiguration(id);
|
||||||
|
// Select if this is the first config
|
||||||
|
if (rocket.getSelectedConfiguration().getId().equals(FlightConfigurationId.DEFAULT_VALUE_FCID)) {
|
||||||
|
rocket.setSelectedConfiguration(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add motors to the rocket
|
||||||
|
addMotorToStage(0, sustainerEngine, sustainerIgnitionDelay, id, warnings);
|
||||||
|
if (includeBooster1) {
|
||||||
|
addMotorToStage(1, booster1Engine, booster1IgnitionDelay, id, warnings);
|
||||||
|
}
|
||||||
|
if (includeBooster2) {
|
||||||
|
addMotorToStage(2, booster2Engine, 0.0, id, warnings);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set separation settings
|
||||||
|
setSeparationDelay(0, 0.0, id);
|
||||||
|
if (includeBooster1) {
|
||||||
|
setSeparationDelay(1, booster1SeparationDelay, id);
|
||||||
|
}
|
||||||
|
if (includeBooster2) {
|
||||||
|
setSeparationDelay(2, booster2SeparationDelay, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a new simulation
|
||||||
|
Simulation sim = new Simulation(rocket);
|
||||||
|
sim.setFlightConfigurationId(id);
|
||||||
|
sim.setName("Simulation " + simulationNr);
|
||||||
|
sim.copySimulationOptionsFrom(launchSiteSettings);
|
||||||
|
context.getOpenRocketDocument().addSimulation(sim);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addMotorToStage(final int stageNr, final Motor motor, final Double ignitionDelay,
|
||||||
|
final FlightConfigurationId id, final WarningSet warnings) {
|
||||||
|
if (motor == null || rocket.getStage(stageNr) == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MotorMount mount = getMotorMountForStage(stageNr);
|
||||||
|
if (mount == null) {
|
||||||
|
warnings.add("No motor mount found for stage " + stageNr + ". Ignoring motor.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MotorConfiguration motorConfig = new MotorConfiguration(mount, id);
|
||||||
|
motorConfig.setMotor(motor);
|
||||||
|
|
||||||
|
// RASAero requires apogee deployment, so the sustainer motor should always be plugged
|
||||||
|
if (stageNr == 0) {
|
||||||
|
motorConfig.setEjectionDelay(Motor.PLUGGED_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double delay = ignitionDelay != null ? ignitionDelay : 0.0;
|
||||||
|
motorConfig.setIgnitionDelay(delay);
|
||||||
|
if (stageNr < rocket.getStageCount() - 1) { // Use burnout non-last if multi-staged rocket
|
||||||
|
motorConfig.setIgnitionEvent(IgnitionEvent.BURNOUT);
|
||||||
|
} else {
|
||||||
|
motorConfig.setIgnitionEvent(IgnitionEvent.AUTOMATIC);
|
||||||
|
}
|
||||||
|
mount.setMotorConfig(motorConfig, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSeparationDelay(final int stageNr, Double separationDelay,
|
||||||
|
final FlightConfigurationId id) {
|
||||||
|
if (rocket.getStage(stageNr) == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
StageSeparationConfiguration config = rocket.getStage(stageNr).getSeparationConfigurations().get(id);
|
||||||
|
if (separationDelay != null) {
|
||||||
|
config.setSeparationDelay(separationDelay);
|
||||||
|
}
|
||||||
|
config.setSeparationEvent(StageSeparationConfiguration.SeparationEvent.BURNOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the furthest back motor mount in the stage.
|
||||||
|
* @param stage stage number
|
||||||
|
* @return furthest back motor mount of the stage
|
||||||
|
*/
|
||||||
|
private MotorMount getMotorMountForStage(int stage) {
|
||||||
|
MotorMount mount = null;
|
||||||
|
for (RocketComponent component : rocket.getStage(stage)) {
|
||||||
|
if (component instanceof MotorMount) {
|
||||||
|
mount = (MotorMount) component;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mount != null) {
|
||||||
|
mount.setMotorMount(true);
|
||||||
|
}
|
||||||
|
return mount;
|
||||||
|
}
|
||||||
|
}
|
@ -1,20 +1,10 @@
|
|||||||
package net.sf.openrocket.file.rasaero.importt;
|
package net.sf.openrocket.file.rasaero.importt;
|
||||||
|
|
||||||
import net.sf.openrocket.aerodynamics.WarningSet;
|
import net.sf.openrocket.aerodynamics.WarningSet;
|
||||||
import net.sf.openrocket.document.Simulation;
|
|
||||||
import net.sf.openrocket.file.DocumentLoadingContext;
|
import net.sf.openrocket.file.DocumentLoadingContext;
|
||||||
import net.sf.openrocket.file.simplesax.AbstractElementHandler;
|
import net.sf.openrocket.file.simplesax.AbstractElementHandler;
|
||||||
import net.sf.openrocket.file.simplesax.ElementHandler;
|
import net.sf.openrocket.file.simplesax.ElementHandler;
|
||||||
import net.sf.openrocket.file.simplesax.PlainTextHandler;
|
|
||||||
import net.sf.openrocket.motor.IgnitionEvent;
|
|
||||||
import net.sf.openrocket.motor.Motor;
|
|
||||||
import net.sf.openrocket.motor.MotorConfiguration;
|
|
||||||
import net.sf.openrocket.motor.ThrustCurveMotor;
|
|
||||||
import net.sf.openrocket.rocketcomponent.FlightConfigurationId;
|
|
||||||
import net.sf.openrocket.rocketcomponent.MotorMount;
|
|
||||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
|
||||||
import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration;
|
|
||||||
import net.sf.openrocket.simulation.SimulationOptions;
|
import net.sf.openrocket.simulation.SimulationOptions;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
@ -52,162 +42,4 @@ public class SimulationListHandler extends AbstractElementHandler {
|
|||||||
public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
|
public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
|
||||||
RASAeroMotorsLoader.clearAllMotors();
|
RASAeroMotorsLoader.clearAllMotors();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles RASAero simulation elements.
|
|
||||||
* We will only import the motor information from it.
|
|
||||||
*/
|
|
||||||
private static class SimulationHandler extends AbstractElementHandler {
|
|
||||||
private final DocumentLoadingContext context;
|
|
||||||
private final Rocket rocket;
|
|
||||||
private final SimulationOptions launchSiteSettings;
|
|
||||||
private final int simulationNr;
|
|
||||||
|
|
||||||
// Motor information
|
|
||||||
private ThrustCurveMotor sustainerEngine;
|
|
||||||
private Double sustainerIgnitionDelay;
|
|
||||||
private ThrustCurveMotor booster1Engine;
|
|
||||||
private Double booster1IgnitionDelay;
|
|
||||||
private Double booster1SeparationDelay;
|
|
||||||
private Boolean includeBooster1;
|
|
||||||
private ThrustCurveMotor booster2Engine;
|
|
||||||
private Double booster2SeparationDelay;
|
|
||||||
private Boolean includeBooster2;
|
|
||||||
|
|
||||||
public SimulationHandler(DocumentLoadingContext context, Rocket rocket, SimulationOptions launchSiteSettings, int simulationNr) {
|
|
||||||
this.context = context;
|
|
||||||
this.rocket = rocket;
|
|
||||||
this.launchSiteSettings = launchSiteSettings;
|
|
||||||
this.simulationNr = simulationNr;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) throws SAXException {
|
|
||||||
if (RASAeroCommonConstants.SUSTAINER_ENGINE.equals(element) || RASAeroCommonConstants.SUSTAINER_IGNITION_DELAY.equals(element)
|
|
||||||
|| RASAeroCommonConstants.BOOSTER1_ENGINE.equals(element) || RASAeroCommonConstants.BOOSTER1_IGNITION_DELAY.equals(element)
|
|
||||||
|| RASAeroCommonConstants.BOOSTER1_SEPARATION_DELAY.equals(element) || RASAeroCommonConstants.INCLUDE_BOOSTER1.equals(element)
|
|
||||||
|| RASAeroCommonConstants.BOOSTER2_ENGINE.equals(element) || RASAeroCommonConstants.BOOSTER2_SEPARATION_DELAY.equals(element)
|
|
||||||
|| RASAeroCommonConstants.INCLUDE_BOOSTER2.equals(element)) {
|
|
||||||
return PlainTextHandler.INSTANCE;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
|
|
||||||
if (RASAeroCommonConstants.SUSTAINER_ENGINE.equals(element)) {
|
|
||||||
sustainerEngine = RASAeroMotorsLoader.getMotorFromRASAero(content, warnings);
|
|
||||||
} else if (RASAeroCommonConstants.SUSTAINER_IGNITION_DELAY.equals(element)) {
|
|
||||||
sustainerIgnitionDelay = Double.parseDouble(content);
|
|
||||||
} else if (RASAeroCommonConstants.BOOSTER1_ENGINE.equals(element)) {
|
|
||||||
booster1Engine = RASAeroMotorsLoader.getMotorFromRASAero(content, warnings);
|
|
||||||
} else if (RASAeroCommonConstants.BOOSTER1_IGNITION_DELAY.equals(element)) {
|
|
||||||
booster1IgnitionDelay = Double.parseDouble(content);
|
|
||||||
} else if (RASAeroCommonConstants.BOOSTER1_SEPARATION_DELAY.equals(element)) {
|
|
||||||
booster1SeparationDelay = Double.parseDouble(content);
|
|
||||||
} else if (RASAeroCommonConstants.INCLUDE_BOOSTER1.equals(element)) {
|
|
||||||
includeBooster1 = Boolean.parseBoolean(content);
|
|
||||||
} else if (RASAeroCommonConstants.BOOSTER2_ENGINE.equals(element)) {
|
|
||||||
booster2Engine = RASAeroMotorsLoader.getMotorFromRASAero(content, warnings);
|
|
||||||
} else if (RASAeroCommonConstants.BOOSTER2_SEPARATION_DELAY.equals(element)) {
|
|
||||||
booster2SeparationDelay = Double.parseDouble(content);
|
|
||||||
} else if (RASAeroCommonConstants.INCLUDE_BOOSTER2.equals(element)) {
|
|
||||||
includeBooster2 = Boolean.parseBoolean(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
|
|
||||||
FlightConfigurationId id = new FlightConfigurationId();
|
|
||||||
rocket.createFlightConfiguration(id);
|
|
||||||
// Select if this is the first config
|
|
||||||
if (rocket.getSelectedConfiguration().getId().equals(FlightConfigurationId.DEFAULT_VALUE_FCID)) {
|
|
||||||
rocket.setSelectedConfiguration(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add motors to the rocket
|
|
||||||
addMotorToStage(0, sustainerEngine, sustainerIgnitionDelay, id, warnings);
|
|
||||||
if (includeBooster1) {
|
|
||||||
addMotorToStage(1, booster1Engine, booster1IgnitionDelay, id, warnings);
|
|
||||||
}
|
|
||||||
if (includeBooster2) {
|
|
||||||
addMotorToStage(2, booster2Engine, 0.0, id, warnings);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set separation settings
|
|
||||||
setSeparationDelay(0, 0.0, id);
|
|
||||||
if (includeBooster1) {
|
|
||||||
setSeparationDelay(1, booster1SeparationDelay, id);
|
|
||||||
}
|
|
||||||
if (includeBooster2) {
|
|
||||||
setSeparationDelay(2, booster2SeparationDelay, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a new simulation
|
|
||||||
Simulation sim = new Simulation(rocket);
|
|
||||||
sim.setFlightConfigurationId(id);
|
|
||||||
sim.setName("Simulation " + simulationNr);
|
|
||||||
sim.copySimulationOptionsFrom(launchSiteSettings);
|
|
||||||
context.getOpenRocketDocument().addSimulation(sim);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addMotorToStage(final int stageNr, final Motor motor, final Double ignitionDelay,
|
|
||||||
final FlightConfigurationId id, final WarningSet warnings) {
|
|
||||||
if (motor == null || rocket.getStage(stageNr) == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
MotorMount mount = getMotorMountForStage(stageNr);
|
|
||||||
if (mount == null) {
|
|
||||||
warnings.add("No motor mount found for stage " + stageNr + ". Ignoring motor.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
MotorConfiguration motorConfig = new MotorConfiguration(mount, id);
|
|
||||||
motorConfig.setMotor(motor);
|
|
||||||
|
|
||||||
// RASAero requires apogee deployment, so the sustainer motor should always be plugged
|
|
||||||
if (stageNr == 0) {
|
|
||||||
motorConfig.setEjectionDelay(Motor.PLUGGED_DELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
double delay = ignitionDelay != null ? ignitionDelay : 0.0;
|
|
||||||
motorConfig.setIgnitionDelay(delay);
|
|
||||||
if (stageNr < rocket.getStageCount() - 1) { // Use burnout non-last if multi-staged rocket
|
|
||||||
motorConfig.setIgnitionEvent(IgnitionEvent.BURNOUT);
|
|
||||||
} else {
|
|
||||||
motorConfig.setIgnitionEvent(IgnitionEvent.AUTOMATIC);
|
|
||||||
}
|
|
||||||
mount.setMotorConfig(motorConfig, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setSeparationDelay(final int stageNr, Double separationDelay,
|
|
||||||
final FlightConfigurationId id) {
|
|
||||||
if (rocket.getStage(stageNr) == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
StageSeparationConfiguration config = rocket.getStage(stageNr).getSeparationConfigurations().get(id);
|
|
||||||
if (separationDelay != null) {
|
|
||||||
config.setSeparationDelay(separationDelay);
|
|
||||||
}
|
|
||||||
config.setSeparationEvent(StageSeparationConfiguration.SeparationEvent.BURNOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the furthest back motor mount in the stage.
|
|
||||||
* @param stage stage number
|
|
||||||
* @return furthest back motor mount of the stage
|
|
||||||
*/
|
|
||||||
private MotorMount getMotorMountForStage(int stage) {
|
|
||||||
MotorMount mount = null;
|
|
||||||
for (RocketComponent component : rocket.getStage(stage)) {
|
|
||||||
if (component instanceof MotorMount) {
|
|
||||||
mount = (MotorMount) component;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mount != null) {
|
|
||||||
mount.setMotorMount(true);
|
|
||||||
}
|
|
||||||
return mount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user