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 | 59 | nbrodin | 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 | } |