[QGIS Commit] r15526 - trunk/qgis/src/analysis/raster

svn_qgis at osgeo.org svn_qgis at osgeo.org
Thu Mar 17 04:58:10 EDT 2011


Author: mhugent
Date: 2011-03-17 01:58:10 -0700 (Thu, 17 Mar 2011)
New Revision: 15526

Modified:
   trunk/qgis/src/analysis/raster/qgsrastercalcnode.cpp
   trunk/qgis/src/analysis/raster/qgsrastercalcnode.h
   trunk/qgis/src/analysis/raster/qgsrastercalcparser.yy
   trunk/qgis/src/analysis/raster/qgsrastermatrix.cpp
   trunk/qgis/src/analysis/raster/qgsrastermatrix.h
Log:
Add support for unary minus in raster calculator. Fixes ticket 3627

Modified: trunk/qgis/src/analysis/raster/qgsrastercalcnode.cpp
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastercalcnode.cpp	2011-03-17 05:33:31 UTC (rev 15525)
+++ trunk/qgis/src/analysis/raster/qgsrastercalcnode.cpp	2011-03-17 08:58:10 UTC (rev 15526)
@@ -122,6 +122,8 @@
         break;
       case opATAN:
         leftMatrix.atangens();
+      case opSIGN:
+        leftMatrix.changeSign();
         break;
       default:
         return false;

Modified: trunk/qgis/src/analysis/raster/qgsrastercalcnode.h
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastercalcnode.h	2011-03-17 05:33:31 UTC (rev 15525)
+++ trunk/qgis/src/analysis/raster/qgsrastercalcnode.h	2011-03-17 08:58:10 UTC (rev 15526)
@@ -56,7 +56,8 @@
       opGE,         // >=
       opLE,         // <=
       opAND,
-      opOR
+      opOR,
+      opSIGN    //change sign
     };
 
     QgsRasterCalcNode();

Modified: trunk/qgis/src/analysis/raster/qgsrastercalcparser.yy
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastercalcparser.yy	2011-03-17 05:33:31 UTC (rev 15525)
+++ trunk/qgis/src/analysis/raster/qgsrastercalcparser.yy	2011-03-17 08:58:10 UTC (rev 15526)
@@ -70,6 +70,7 @@
 %left '+' '-'
 %left '*' '/'
 %left '^'
+%left UMINUS  // fictitious symbol (for unary minus)
 
 %%
 
@@ -92,6 +93,8 @@
   | raster_exp '+' raster_exp   { $$ = new QgsRasterCalcNode(QgsRasterCalcNode::opPLUS, $1, $3); joinTmpNodes($$,$1,$3); }
   | raster_exp '-' raster_exp   { $$ = new QgsRasterCalcNode(QgsRasterCalcNode::opMINUS, $1, $3); joinTmpNodes($$,$1,$3); }
   | '(' raster_exp ')'          { $$ = $2; }
+  | '+' raster_exp %prec UMINUS { $$ = $2; }
+  | '-' raster_exp %prec UMINUS { $$ = new QgsRasterCalcNode( QgsRasterCalcNode::opSIGN, $2, 0 ); joinTmpNodes($$, $2, 0); }
   | NUMBER { $$ = new QgsRasterCalcNode($1); addToTmpNodes($$); }
   | RASTER_BAND_REF { $$ = new QgsRasterCalcNode(QString::fromUtf8(rastertext)); addToTmpNodes($$); }
 ;

Modified: trunk/qgis/src/analysis/raster/qgsrastermatrix.cpp
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastermatrix.cpp	2011-03-17 05:33:31 UTC (rev 15525)
+++ trunk/qgis/src/analysis/raster/qgsrastermatrix.cpp	2011-03-17 08:58:10 UTC (rev 15526)
@@ -167,6 +167,11 @@
   return oneArgumentOperation( opATAN );
 }
 
+bool QgsRasterMatrix::changeSign()
+{
+  return oneArgumentOperation( opSIGN );
+}
+
 bool QgsRasterMatrix::oneArgumentOperation( OneArgOperator op )
 {
   if ( !mData )
@@ -211,6 +216,8 @@
         case opATAN:
           mData[i] = static_cast<float>( atan( value ) );
           break;
+        case opSIGN:
+          mData[i] = -value;
       }
     }
   }

Modified: trunk/qgis/src/analysis/raster/qgsrastermatrix.h
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastermatrix.h	2011-03-17 05:33:31 UTC (rev 15525)
+++ trunk/qgis/src/analysis/raster/qgsrastermatrix.h	2011-03-17 08:58:10 UTC (rev 15526)
@@ -48,6 +48,7 @@
       opASIN,
       opACOS,
       opATAN,
+      opSIGN
     };
 
     /**Takes ownership of data array*/
@@ -97,6 +98,7 @@
     bool acosinus();
     bool tangens();
     bool atangens();
+    bool changeSign();
 
   private:
     int mColumns;



More information about the QGIS-commit mailing list