Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / tridimensional / grid3DFromFunction / Grid3DFromFunctionAlgorithm.java @ 59

History | View | Annotate | Download (4.47 KB)

1

    
2

    
3
package es.unex.sextante.tridimensional.grid3DFromFunction;
4

    
5
import org.nfunk.jep.JEP;
6

    
7
import es.unex.sextante.additionalInfo.AdditionalInfoNumericalValue;
8
import es.unex.sextante.core.GeoAlgorithm;
9
import es.unex.sextante.core.Sextante;
10
import es.unex.sextante.dataObjects.I3DRasterLayer;
11
import es.unex.sextante.dataObjects.IRasterLayer;
12
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
13
import es.unex.sextante.exceptions.RepeatedParameterNameException;
14

    
15

    
16
public class Grid3DFromFunctionAlgorithm
17
         extends
18
            GeoAlgorithm {
19

    
20
   public static final String MINX    = "MINX";
21
   public static final String MINY    = "MINY";
22
   public static final String MINZ    = "MINZ";
23
   public static final String MAXX    = "MAXX";
24
   public static final String MAXY    = "MAXY";
25
   public static final String MAXZ    = "MAXZ";
26
   public static final String FORMULA = "FORMULA";
27
   public static final String RESULT  = "RESULT";
28

    
29

    
30
   @Override
31
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
32

    
33
      int x, y, z;
34
      int iNX, iNY, iNZ;
35
      double dx, dy, dz;
36
      double dMinX, dMinY, dMinZ, dMaxX, dMaxY, dMaxZ;
37
      double dRangeX, dRangeY;
38
      final double dRangeZ;
39
      double dValue;
40

    
41
      String sFormula;
42
      final JEP jep = new JEP();
43
      I3DRasterLayer result;
44

    
45
      jep.addStandardConstants();
46
      jep.addStandardFunctions();
47
      jep.addVariable("x", 0);
48
      jep.addVariable("y", 0);
49
      jep.addVariable("z", 0);
50

    
51
      dMinX = m_Parameters.getParameterValueAsInt(MINX);
52
      dMinY = m_Parameters.getParameterValueAsInt(MINY);
53
      dMinZ = m_Parameters.getParameterValueAsInt(MINY);
54
      dMaxX = m_Parameters.getParameterValueAsInt(MAXX);
55
      dMaxY = m_Parameters.getParameterValueAsInt(MAXY);
56
      dMaxZ = m_Parameters.getParameterValueAsInt(MAXZ);
57
      sFormula = m_Parameters.getParameterValueAsString(FORMULA).toLowerCase();
58

    
59
      dRangeX = dMaxX - dMinX;
60
      dRangeY = dMaxY - dMinY;
61
      dRangeZ = dMaxZ - dMinZ;
62

    
63
      result = getNew3DRasterLayer(RESULT, Sextante.getText("3D_Layer_from_function"), IRasterLayer.RASTER_DATA_TYPE_FLOAT);
64

    
65
      iNX = result.getLayerExtent().getNX();
66
      iNY = result.getLayerExtent().getNY();
67
      iNZ = result.getLayerExtent().getNZ();
68

    
69
      jep.parseExpression(sFormula);
70
      if (!jep.hasError()) {
71
         for (z = 0; (z < iNZ) && setProgress(z, iNZ); z++) {
72
            dz = dMinZ + dRangeZ * ((double) z / (double) iNZ);
73
            jep.addVariable("z", dz);
74
            for (y = 0; (y < iNY) && !m_Task.isCanceled(); y++) {
75
               dy = dMinY + dRangeY * ((double) y / (double) iNY);
76
               jep.addVariable("y", dy);
77
               for (x = 0; x < iNX; x++) {
78
                  dx = dMinX + dRangeX * ((double) x / (double) iNX);
79
                  jep.addVariable("x", dx);
80
                  dValue = jep.getValue();
81
                  result.setCellValue(x, y, z, dValue);
82
               }
83
            }
84
         }
85
      }
86
      else {
87
         throw new GeoAlgorithmExecutionException(Sextante.getText("Wrong_formula"));
88
      }
89

    
90
      return !m_Task.isCanceled();
91

    
92
   }
93

    
94

    
95
   @Override
96
   public void defineCharacteristics() {
97

    
98
      setName(Sextante.getText("3D_Layer_from_function"));
99
      setGroup(Sextante.getText("3D"));
100
      setUserCanDefineAnalysisExtent(true);
101

    
102
      try {
103
         m_Parameters.addNumericalValue(MINX, "X min", -1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
104
         m_Parameters.addNumericalValue(MAXX, "X Max", 1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
105
         m_Parameters.addNumericalValue(MINY, "Y Min", -1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
106
         m_Parameters.addNumericalValue(MAXY, "Y Max", 1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
107
         m_Parameters.addNumericalValue(MINZ, "Z Min", -1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
108
         m_Parameters.addNumericalValue(MAXZ, "Z Max", 1, AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
109
         m_Parameters.addString(FORMULA, Sextante.getText("Formula"));
110
         addOutput3DRasterLayer(RESULT, Sextante.getText("3D_Layer_from_function"));
111
      }
112
      catch (final RepeatedParameterNameException e) {
113
         Sextante.addErrorToLog(e);
114
      }
115

    
116
   }
117

    
118

    
119
   @Override
120
   public boolean is3D() {
121

    
122
      return true;
123

    
124
   }
125

    
126

    
127
   @Override
128
   public boolean isActive() {
129

    
130
      return false;
131

    
132
   }
133

    
134

    
135
}