import net.sf.openrocket.rocketcomponent.Transition;
import net.sf.openrocket.rocketcomponent.TrapezoidFinSet;
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;
}
class SingleSimulationHandler extends AbstractElementHandler {
+
private final DocumentLoadingContext context;
private final OpenRocketDocument doc;
private SimulationConditionsHandler conditionHandler;
private FlightDataHandler dataHandler;
-
+ private CustomExpressionsHandler customExpressionsHandler;
+
+ private ArrayList<CustomExpression> customExpressions = new ArrayList<CustomExpression>();
private final List<String> listeners = new ArrayList<String>();
public SingleSimulationHandler(OpenRocketDocument doc, DocumentLoadingContext context) {
this.context = context;
}
-
+ public void setCustomExpressions(ArrayList<CustomExpression> expressions){
+ this.customExpressions = expressions;
+ }
+
+ public ArrayList<CustomExpression> getCustomExpressions(){
+ return customExpressions;
+ }
@Override
public ElementHandler openElement(String element, HashMap<String, String> attributes,
if (element.equals("name") || element.equals("simulator") ||
element.equals("calculator") || element.equals("listener")) {
return PlainTextHandler.INSTANCE;
+ } else if (element.equals("customexpressions")) {
+ customExpressionsHandler = new CustomExpressionsHandler(this, context);
+ return customExpressionsHandler;
} else if (element.equals("conditions")) {
conditionHandler = new SimulationConditionsHandler(doc.getRocket(), context);
return conditionHandler;
} else if (element.equals("flightdata")) {
- dataHandler = new FlightDataHandler(context);
+ dataHandler = new FlightDataHandler(this, context);
return dataHandler;
} else {
warnings.add("Unknown element '" + element + "', ignoring.");
Simulation simulation = new Simulation(doc.getRocket(), status, name,
conditions, listeners, data);
-
+
+ // Note : arraylist implementation in simulation different from standard one
+ for (CustomExpression exp : customExpressions){
+ exp.setSimulation(simulation);
+ if (exp.checkAll())
+ simulation.addCustomExpression(exp);
+ }
+
doc.addSimulation(simulation);
}
}
+class CustomExpressionsHandler extends AbstractElementHandler {
+ private final DocumentLoadingContext context;
+ private final SingleSimulationHandler simHandler;
+ public CustomExpression currentExpression = new CustomExpression();
+ private final ArrayList<CustomExpression> customExpressions = new ArrayList<CustomExpression>();
+
+ public CustomExpressionsHandler(SingleSimulationHandler simHandler, DocumentLoadingContext context) {
+ this.context = context;
+ this.simHandler = simHandler;
+ }
+
+ @Override
+ public ElementHandler openElement(String element,
+ HashMap<String, String> attributes, WarningSet warnings)
+ throws SAXException {
+
+ if (element.equals("expression")){
+ currentExpression = new CustomExpression();
+ }
+
+ return this;
+ }
+ @Override
+ public void closeElement(String element, HashMap<String, String> attributes,
+ String content, WarningSet warnings) {
+
+ if (element.equals("expression"))
+ customExpressions.add(currentExpression);
+
+ if (element.equals("name"))
+ currentExpression.setName(content);
+
+ else if (element.equals("symbol"))
+ currentExpression.setSymbol(content);
+
+ else if (element.equals("unit"))
+ currentExpression.setUnit(content);
+
+ else if (element.equals("expressionstring"))
+ currentExpression.setExpression(content);
+
+ }
+
+ @Override
+ public void endHandler(String element, HashMap<String, String> attributes,
+ String content, WarningSet warnings) {
+ simHandler.setCustomExpressions(customExpressions);
+ }
+}
+
class SimulationConditionsHandler extends AbstractElementHandler {
private final DocumentLoadingContext context;
private SimulationOptions conditions;
private FlightDataBranchHandler dataHandler;
private WarningSet warningSet = new WarningSet();
private List<FlightDataBranch> branches = new ArrayList<FlightDataBranch>();
-
+
+ private SingleSimulationHandler simHandler;
private FlightData data;
- public FlightDataHandler(DocumentLoadingContext context) {
+ public FlightDataHandler(SingleSimulationHandler simHandler, DocumentLoadingContext context) {
this.context = context;
+ this.simHandler = simHandler;
}
public FlightData getFlightData() {
warnings.add("Illegal flight data definition, ignoring.");
return null;
}
- dataHandler = new FlightDataBranchHandler(attributes.get("name"),
- attributes.get("types"), context);
+ dataHandler = new FlightDataBranchHandler( attributes.get("name"),
+ attributes.get("types"),
+ simHandler, context);
return dataHandler;
}
private final DocumentLoadingContext context;
private final FlightDataType[] types;
private final FlightDataBranch branch;
-
- public FlightDataBranchHandler(String name, String typeList, DocumentLoadingContext context) {
+
+ private static final LogHelper log = Application.getLogger();
+ private final SingleSimulationHandler simHandler;
+
+ public FlightDataBranchHandler(String name, String typeList, SingleSimulationHandler simHandler, DocumentLoadingContext context) {
+ this.simHandler = simHandler;
this.context = context;
String[] split = typeList.split(",");
types = new FlightDataType[split.length];
for (int i = 0; i < split.length; i++) {
- types[i] = FlightDataType.getType(split[i], UnitGroup.UNITS_NONE);
+ String typeName = split[i];
+ FlightDataType matching = findFlightDataType(typeName);
+ types[i] = matching;
+ //types[i] = FlightDataType.getType(typeName, matching.getSymbol(), matching.getUnitGroup());
}
// TODO: LOW: May throw an IllegalArgumentException
branch = new FlightDataBranch(name, types);
}
+
+ // Find the full flight data type given name only
+ // Note: this way of doing it requires that custom expressions always come before flight data in the file,
+ // not the nicest but this is always the case anyway.
+ private FlightDataType findFlightDataType(String name){
+
+ // Look in built in types
+ for (FlightDataType t : FlightDataType.ALL_TYPES){
+ if (t.getName().equals(name) ){
+ return t;
+ }
+ }
+
+ // Look in custom expressions, meanwhile set priority based on order in file
+ int totalExpressions = simHandler.getCustomExpressions().size();
+ for (int i=0; i<totalExpressions; i++){
+ CustomExpression exp = simHandler.getCustomExpressions().get(i);
+ if (exp.getName().equals(name) ){
+ FlightDataType t = exp.getType();
+ t.setPriority(-1*(totalExpressions-i));
+ return exp.getType();
+ }
+ }
+
+ log.warn("Could not find the flight data type '"+name+"' used in the XML file. Substituted type with unknown symbol and units.");
+ return FlightDataType.getType(name, "Unknown", UnitGroup.UNITS_NONE);
+ }
public FlightDataBranch getBranch() {
branch.immute();