Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / gridCalculus / gridFromFunction / GridFromFunctionAlgorithm.java @ 59

History | View | Annotate | Download (3.46 KB)

1
package es.unex.sextante.gridCalculus.gridFromFunction;
2

    
3
import org.nfunk.jep.JEP;
4

    
5
import es.unex.sextante.additionalInfo.AdditionalInfoNumericalValue;
6
import es.unex.sextante.core.GeoAlgorithm;
7
import es.unex.sextante.core.Sextante;
8
import es.unex.sextante.dataObjects.IRasterLayer;
9
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
10
import es.unex.sextante.exceptions.RepeatedParameterNameException;
11

    
12
public class GridFromFunctionAlgorithm
13
         extends
14
            GeoAlgorithm {
15

    
16
   public static final String MINX    = "MINX";
17
   public static final String MINY    = "MINY";
18
   public static final String MAXX    = "MAXX";
19
   public static final String MAXY    = "MAXY";
20
   public static final String FORMULA = "FORMULA";
21
   public static final String RESULT  = "RESULT";
22

    
23

    
24
   @Override
25
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
26

    
27
      int x, y;
28
      int iNX, iNY;
29
      double dx, dy;
30
      double dMinX, dMinY, dMaxX, dMaxY;
31
      double dRangeX, dRangeY;
32
      double dValue;
33

    
34
      String sFormula;
35
      final JEP jep = new JEP();
36
      IRasterLayer result;
37

    
38
      jep.addStandardConstants();
39
      jep.addStandardFunctions();
40
      jep.addVariable("x", 0);
41
      jep.addVariable("y", 0);
42

    
43
      dMinX = m_Parameters.getParameterValueAsInt(MINX);
44
      dMinY = m_Parameters.getParameterValueAsInt(MINY);
45
      dMaxX = m_Parameters.getParameterValueAsInt(MAXX);
46
      dMaxY = m_Parameters.getParameterValueAsInt(MAXY);
47
      sFormula = m_Parameters.getParameterValueAsString(FORMULA).toLowerCase();
48

    
49
      dRangeX = dMaxX - dMinX;
50
      dRangeY = dMaxY - dMinY;
51

    
52
      result = getNewRasterLayer(RESULT, Sextante.getText("Layer_from_function"), IRasterLayer.RASTER_DATA_TYPE_DOUBLE);
53

    
54
      iNX = result.getWindowGridExtent().getNX();
55
      iNY = result.getWindowGridExtent().getNY();
56

    
57
      jep.parseExpression(sFormula);
58
      if (!jep.hasError()) {
59
         for (y = 0; (y < iNY) && setProgress(y, iNY); y++) {
60
            dy = dMinY + dRangeY * ((double) y / (double) iNY);
61
            jep.addVariable("y", dy);
62
            for (x = 0; x < iNX; x++) {
63
               dx = dMinX + dRangeX * ((double) x / (double) iNX);
64
               jep.addVariable("x", dx);
65
               dValue = jep.getValue();
66
               result.setCellValue(x, y, dValue);
67
            }
68
         }
69
      }
70
      else {
71
         throw new GeoAlgorithmExecutionException(Sextante.getText("Wrong_formula"));
72
      }
73

    
74
      return !m_Task.isCanceled();
75

    
76
   }
77

    
78

    
79
   @Override
80
   public void defineCharacteristics() {
81

    
82
      setName(Sextante.getText("Grid_from_function"));
83
      setGroup(Sextante.getText("Raster_creation_tools"));
84
      setUserCanDefineAnalysisExtent(true);
85

    
86
      try {
87
         m_Parameters.addNumericalValue(MINX, "X min", -1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
88
         m_Parameters.addNumericalValue(MAXX, "X Max", 1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
89
         m_Parameters.addNumericalValue(MINY, "Y Min", -1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
90
         m_Parameters.addNumericalValue(MAXY, "Y Max", 1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
91
         m_Parameters.addString(FORMULA, Sextante.getText("Formula"));
92
         addOutputRasterLayer(RESULT, Sextante.getText("Grid_from_function"));
93
      }
94
      catch (final RepeatedParameterNameException e) {
95
         Sextante.addErrorToLog(e);
96
      }
97

    
98
   }
99

    
100

    
101
}