- Workaround for bug with plotting when given INF value.
[debian/openrocket] / core / src / net / sf / openrocket / simulation / customexpression / CustomExpression.java
index 40b3d700c4a76686980b324a7ea845648ff89067..e233deff992fdfcebb990801bb63289875072664 100644 (file)
@@ -34,11 +34,12 @@ public class CustomExpression implements Cloneable{
        private List<CustomExpression> subExpressions = new ArrayList<CustomExpression>();
        
        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<String> getAllNames(){
                ArrayList<String> names = new ArrayList<String>();
+               /*
                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<String> getAllSymbols(){
                ArrayList<String> symbols = new ArrayList<String>();
+               /*
                for (FlightDataType type : FlightDataType.ALL_TYPES)
                        symbols.add(type.getSymbol());
                
@@ -196,6 +208,14 @@ 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;
        }
        
@@ -204,7 +224,7 @@ public class CustomExpression implements Cloneable{
                        return false;
                
                // No bad characters
-               for (char c : "0123456789.,()[]{}<>:#@%^&* ".toCharArray())
+               for (char c : "0123456789.,()[]{}<>:#@%^&*$ ".toCharArray())
                        if (symbol.indexOf(c) != -1 )
                                return false;
                
@@ -230,7 +250,7 @@ public class CustomExpression implements Cloneable{
                        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;
                
@@ -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;
                }
                
@@ -326,7 +352,9 @@ public class CustomExpression implements Cloneable{
        }
        
        public Double evaluateDouble(SimulationStatus status){
-               return evaluate(status).getDoubleValue();
+               double result = evaluate(status).getDoubleValue();
+               if (result == Double.NEGATIVE_INFINITY || result == Double.POSITIVE_INFINITY) result = Double.NaN;
+               return result;
        }
        
        /*
@@ -340,14 +368,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 +423,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 +472,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,13 +496,14 @@ 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 = "#";
+               Integer hashint = new Integer(this.getExpressionString().hashCode() + symbol.hashCode());
+               String hash = "$";
                for (char c : hashint.toString().toCharArray()){
+                       if (c == '-') c = '0';
                        char newc = (char) (c + 17);
                        hash = hash + newc;
                }