Skip to content

Commit 2cba2e7

Browse files
author
mhugent
committed
Add support for unary minus in raster calculator. Fixes ticket 3627
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@15526 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent e5334f7 commit 2cba2e7

File tree

5 files changed

+16
-1
lines changed

5 files changed

+16
-1
lines changed

src/analysis/raster/qgsrastercalcnode.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ bool QgsRasterCalcNode::calculate( QMap<QString, QgsRasterMatrix*>& rasterData,
122122
break;
123123
case opATAN:
124124
leftMatrix.atangens();
125+
case opSIGN:
126+
leftMatrix.changeSign();
125127
break;
126128
default:
127129
return false;

src/analysis/raster/qgsrastercalcnode.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ class ANALYSIS_EXPORT QgsRasterCalcNode
5656
opGE, // >=
5757
opLE, // <=
5858
opAND,
59-
opOR
59+
opOR,
60+
opSIGN //change sign
6061
};
6162

6263
QgsRasterCalcNode();

src/analysis/raster/qgsrastercalcparser.yy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
%left '+' '-'
7171
%left '*' '/'
7272
%left '^'
73+
%left UMINUS // fictitious symbol (for unary minus)
7374

7475
%%
7576

@@ -92,6 +93,8 @@ raster_exp:
9293
| raster_exp '+' raster_exp { $$ = new QgsRasterCalcNode(QgsRasterCalcNode::opPLUS, $1, $3); joinTmpNodes($$,$1,$3); }
9394
| raster_exp '-' raster_exp { $$ = new QgsRasterCalcNode(QgsRasterCalcNode::opMINUS, $1, $3); joinTmpNodes($$,$1,$3); }
9495
| '(' raster_exp ')' { $$ = $2; }
96+
| '+' raster_exp %prec UMINUS { $$ = $2; }
97+
| '-' raster_exp %prec UMINUS { $$ = new QgsRasterCalcNode( QgsRasterCalcNode::opSIGN, $2, 0 ); joinTmpNodes($$, $2, 0); }
9598
| NUMBER { $$ = new QgsRasterCalcNode($1); addToTmpNodes($$); }
9699
| RASTER_BAND_REF { $$ = new QgsRasterCalcNode(QString::fromUtf8(rastertext)); addToTmpNodes($$); }
97100
;

src/analysis/raster/qgsrastermatrix.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ bool QgsRasterMatrix::atangens()
167167
return oneArgumentOperation( opATAN );
168168
}
169169

170+
bool QgsRasterMatrix::changeSign()
171+
{
172+
return oneArgumentOperation( opSIGN );
173+
}
174+
170175
bool QgsRasterMatrix::oneArgumentOperation( OneArgOperator op )
171176
{
172177
if ( !mData )
@@ -211,6 +216,8 @@ bool QgsRasterMatrix::oneArgumentOperation( OneArgOperator op )
211216
case opATAN:
212217
mData[i] = static_cast<float>( atan( value ) );
213218
break;
219+
case opSIGN:
220+
mData[i] = -value;
214221
}
215222
}
216223
}

src/analysis/raster/qgsrastermatrix.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class ANALYSIS_EXPORT QgsRasterMatrix
4848
opASIN,
4949
opACOS,
5050
opATAN,
51+
opSIGN
5152
};
5253

5354
/**Takes ownership of data array*/
@@ -97,6 +98,7 @@ class ANALYSIS_EXPORT QgsRasterMatrix
9798
bool acosinus();
9899
bool tangens();
99100
bool atangens();
101+
bool changeSign();
100102

101103
private:
102104
int mColumns;

0 commit comments

Comments
 (0)