X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=core%2Fsrc%2Fnet%2Fsf%2Fopenrocket%2Fsimulation%2Fcustomexpression%2FCustomExpression.java;h=7102b55be9f24e3091e3c4a43c64c657d9b864de;hb=6218a2daf6c70fb87a2897f0cf5688a6d2f448f3;hp=ddafd9bf0624bad8d42ee25c8b8ff2c172a84c3b;hpb=77f2457dc781c8c517ddef157c18491ad770f6c6;p=debian%2Fopenrocket diff --git a/core/src/net/sf/openrocket/simulation/customexpression/CustomExpression.java b/core/src/net/sf/openrocket/simulation/customexpression/CustomExpression.java index ddafd9bf..7102b55b 100644 --- a/core/src/net/sf/openrocket/simulation/customexpression/CustomExpression.java +++ b/core/src/net/sf/openrocket/simulation/customexpression/CustomExpression.java @@ -34,11 +34,12 @@ public class CustomExpression implements Cloneable{ private List subExpressions = new ArrayList(); public CustomExpression(OpenRocketDocument doc){ + this.doc = doc; + setName(""); setSymbol(""); setUnit(""); setExpression(""); - this.doc = doc; } public CustomExpression(OpenRocketDocument doc, @@ -171,6 +172,7 @@ public class CustomExpression implements Cloneable{ // get a list of all the names of all the available variables protected ArrayList getAllNames(){ ArrayList names = new ArrayList(); + /* for (FlightDataType type : FlightDataType.ALL_TYPES) names.add(type.getName()); @@ -181,12 +183,22 @@ public class CustomExpression implements Cloneable{ names.add(exp.getName()); } } + */ + for (FlightDataType type : doc.getFlightDataTypes()){ + String symb = type.getName(); + if (name == null) continue; + + if (!name.equals( this.getName() )){ + names.add(symb); + } + } return names; } // get a list of all the symbols of the available variables ignoring this one protected ArrayList getAllSymbols(){ ArrayList symbols = new ArrayList(); + /* for (FlightDataType type : FlightDataType.ALL_TYPES) symbols.add(type.getSymbol()); @@ -196,15 +208,23 @@ public class CustomExpression implements Cloneable{ symbols.add(exp.getSymbol()); } } + */ + for (FlightDataType type : doc.getFlightDataTypes()){ + String symb = type.getSymbol(); + if (!symb.equals( this.getSymbol() )){ + symbols.add(symb); + } + } + return symbols; } public boolean checkSymbol(){ - if (symbol.trim().isEmpty()) + if ("".equals(symbol.trim())) return false; // No bad characters - for (char c : "0123456789.,()[]{}<>:#@%^&* ".toCharArray()) + for (char c : "0123456789.,()[]{}<>:#@%^&*$ ".toCharArray()) if (symbol.indexOf(c) != -1 ) return false; @@ -226,11 +246,11 @@ public class CustomExpression implements Cloneable{ } public boolean checkName(){ - if (name.trim().isEmpty()) + if ("".equals(name.trim())) return false; // No characters that could mess things up saving etc - for (char c : ",()[]{}<>#".toCharArray()) + for (char c : ",()[]{}<>#$".toCharArray()) if (name.indexOf(c) != -1 ) return false; @@ -275,7 +295,7 @@ public class CustomExpression implements Cloneable{ * building the expression. */ public boolean checkExpression(){ - if (expression.trim().isEmpty()){ + if ("".equals(expression.trim())){ return false; } @@ -293,6 +313,7 @@ public class CustomExpression implements Cloneable{ } else break; case '#' : return false; + case '$' : return false; case '=' : return false; } } @@ -304,6 +325,7 @@ public class CustomExpression implements Cloneable{ //// Define the available variables as empty // The built in data types + /* for (FlightDataType type : FlightDataType.ALL_TYPES){ builder.withVariable(new Variable(type.getSymbol())); } @@ -311,12 +333,16 @@ public class CustomExpression implements Cloneable{ for (String symb : getAllSymbols()){ builder.withVariable(new Variable(symb)); } + */ + for (FlightDataType type : doc.getFlightDataTypes()){ + builder.withVariable(new Variable(type.getSymbol())); + } // Try to build try { builder.build(); } catch (Exception e) { - log.user("Custom expression invalid : " + e.toString()); + log.user("Custom expression " + this.toString() + " invalid : " + e.toString()); return false; } @@ -340,14 +366,14 @@ public class CustomExpression implements Cloneable{ * Builds a specified expression, log any errors and returns null in case of error. */ protected Calculable buildExpression(ExpressionBuilder b){ - Calculable calc; + Calculable calc = null; try { calc = b.build(); } catch (UnknownFunctionException e1) { - log.user("Unknown function. Could not build custom expression "+name); + log.user("Unknown function. Could not build custom expression "+this.toString()); return null; } catch (UnparsableExpressionException e1) { - log.user("Unparsable expression. Could not build custom expression "+name+". "+e1.getMessage()); + log.user("Unparsable expression. Could not build custom expression "+this.toString()+". "+e1.getMessage()); return null; } @@ -395,10 +421,13 @@ public class CustomExpression implements Cloneable{ */ public FlightDataType getType(){ + UnitGroup ug = UnitGroup.SIUNITS.get(unit); if ( ug == null ){ + log.debug("SI unit not found for "+unit+" in expression "+toString()+". Making a new fixed unit."); ug = new FixedUnitGroup(unit); } + //UnitGroup ug = new FixedUnitGroup(unit); FlightDataType type = FlightDataType.getType(name, symbol, ug); @@ -441,7 +470,7 @@ public class CustomExpression implements Cloneable{ @Override public String toString(){ - return "Custom expression : "+this.name.toString()+ " " + this.expression.toString(); + return "[Expression name="+this.name.toString()+ " expression=" + this.expression+" unit="+this.unit+"]"; } @Override @@ -465,12 +494,12 @@ public class CustomExpression implements Cloneable{ } /* - * Returns a simple all upper case string hash code with a proceeding # mark. + * Returns a simple all upper case string hash code with a proceeding $ mark. * Used for temporary substitution when evaluating index and range expressions. */ public String hash(){ Integer hashint = new Integer(this.getExpressionString().hashCode()); - String hash = "#"; + String hash = "$"; for (char c : hashint.toString().toCharArray()){ char newc = (char) (c + 17); hash = hash + newc;