import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.MotorMount;
+import net.sf.openrocket.rocketcomponent.RecoveryDevice;
+import net.sf.openrocket.rocketcomponent.RecoveryDevice.DeployEvent;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.rocketcomponent.TubeCoupler;
+import net.sf.openrocket.simulation.CustomExpression;
import net.sf.openrocket.simulation.FlightData;
import net.sf.openrocket.simulation.FlightDataBranch;
import net.sf.openrocket.simulation.FlightDataType;
*/
private int calculateNecessaryFileVersion(OpenRocketDocument document, StorageOptions opts) {
/*
+ * File version 1.5 is requires for:
+ * - saving designs using ComponentPrests
+ * - recovery device deployment on lower stage separation
+ *
* File version 1.4 is required for:
* - saving simulation data
* - saving motor data
* Otherwise use version 1.0.
*/
+ // Search the rocket for any ComponentPresets (version 1.5)
+ for (RocketComponent c : document.getRocket()) {
+ if (c.getPresetComponent() != null) {
+ return FILE_VERSION_DIVISOR + 5;
+ }
+ }
+
+ // Search for recovery device deployment type LOWER_STAGE_SEPARATION (version 1.5)
+ for (RocketComponent c : document.getRocket()) {
+ if (c instanceof RecoveryDevice) {
+ if (((RecoveryDevice) c).getDeployEvent() == DeployEvent.LOWER_STAGE_SEPARATION) {
+ return FILE_VERSION_DIVISOR + 5;
+ }
+ }
+ }
+
// Check if design has simulations defined (version 1.4)
if (document.getSimulationCount() > 0) {
return FILE_VERSION_DIVISOR + 4;
}
// Check for motor definitions (version 1.4)
- Iterator<RocketComponent> iterator = document.getRocket().iterator();
- while (iterator.hasNext()) {
- RocketComponent c = iterator.next();
+ for (RocketComponent c : document.getRocket()) {
if (!(c instanceof MotorMount))
continue;
}
// Check for fin tabs (version 1.1)
- iterator = document.getRocket().iterator();
- while (iterator.hasNext()) {
- RocketComponent c = iterator.next();
-
+ for (RocketComponent c : document.getRocket()) {
// Check for fin tabs
if (c instanceof FinSet) {
FinSet fin = (FinSet) c;
writeln("<name>" + escapeXML(simulation.getName()) + "</name>");
// TODO: MEDIUM: Other simulators/calculators
+
writeln("<simulator>RK4Simulator</simulator>");
writeln("<calculator>BarrowmanCalculator</calculator>");
- writeln("<conditions>");
- indent++;
+
+ // Write out custom expressions
+ if (!simulation.getCustomExpressions().isEmpty()){
+ writeln("<customexpressions>"); indent++;
+ for (CustomExpression expression : simulation.getCustomExpressions()){
+ writeln("<expression>"); indent++;
+ writeElement("name", expression.getName());
+ writeElement("symbol", expression.getSymbol());
+ writeElement("unit", expression.getUnit());
+ writeElement("expressionstring", expression.getExpressionString());
+ indent--; writeln("</expression>");
+ }
+ indent--; writeln("</customexpressions>");
+ }
+
+ writeln("<conditions>"); indent++;
writeElement("configid", cond.getMotorConfigurationID());
writeElement("launchrodlength", cond.getLaunchRodLength());
writeElement("listener", escapeXML(s));
}
-
// Write basic simulation data
FlightData data = simulation.getSimulatedData();
StringBuilder sb = new StringBuilder();
sb.append("<databranch name=\"");
sb.append(escapeXML(branch.getBranchName()));
+
+
+ sb.append("\" typekeys=\"");
+ for (int i = 0; i < types.length; i++) {
+ if (i > 0)
+ sb.append(",");
+ sb.append(escapeXML(types[i].getKey()));
+ }
sb.append("\" types=\"");
for (int i = 0; i < types.length; i++) {
if (i > 0)