|
QGIS API Documentation
master-6164ace
|
00001 /*************************************************************************** 00002 qgsmultibandcolorrendererwidget.cpp 00003 ----------------------------------- 00004 begin : February 2012 00005 copyright : (C) 2012 by Marco Hugentobler 00006 email : marco at sourcepole dot ch 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 00015 * * 00016 ***************************************************************************/ 00017 00018 #include "qgsmultibandcolorrendererwidget.h" 00019 #include "qgsmultibandcolorrenderer.h" 00020 #include "qgsrasterlayer.h" 00021 00022 QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ): QgsRasterRendererWidget( layer, extent ) 00023 { 00024 setupUi( this ); 00025 createValidators(); 00026 00027 if ( mRasterLayer ) 00028 { 00029 QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); 00030 if ( !provider ) 00031 { 00032 return; 00033 } 00034 00035 mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this ); 00036 mMinMaxWidget->setExtent( extent ); 00037 layout()->addWidget( mMinMaxWidget ); 00038 connect( mMinMaxWidget, SIGNAL( load( int, double, double, int ) ), 00039 this, SLOT( loadMinMax( int, double, double, int ) ) ); 00040 00041 connect( mRedBandComboBox, SIGNAL( currentIndexChanged( int ) ), 00042 this, SLOT( onBandChanged( int ) ) ); 00043 connect( mGreenBandComboBox, SIGNAL( currentIndexChanged( int ) ), 00044 this, SLOT( onBandChanged( int ) ) ); 00045 connect( mBlueBandComboBox, SIGNAL( currentIndexChanged( int ) ), 00046 this, SLOT( onBandChanged( int ) ) ); 00047 00048 //fill available bands into combo boxes 00049 mRedBandComboBox->addItem( tr( "Not set" ), -1 ); 00050 mGreenBandComboBox->addItem( tr( "Not set" ), -1 ); 00051 mBlueBandComboBox->addItem( tr( "Not set" ), -1 ); 00052 00053 //contrast enhancement algorithms 00054 mContrastEnhancementAlgorithmComboBox->addItem( tr( "No enhancement" ), 0 ); 00055 mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch to MinMax" ), 1 ); 00056 mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch and clip to MinMax" ), 2 ); 00057 mContrastEnhancementAlgorithmComboBox->addItem( tr( "Clip to MinMax" ), 3 ); 00058 00059 int nBands = provider->bandCount(); 00060 for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 00061 { 00062 QString bandName = displayBandName( i ); 00063 mRedBandComboBox->addItem( bandName, i ); 00064 mGreenBandComboBox->addItem( bandName, i ); 00065 mBlueBandComboBox->addItem( bandName, i ); 00066 } 00067 00068 setFromRenderer( mRasterLayer->renderer() ); 00069 onBandChanged( 0 ); // reset mMinMaxWidget bands 00070 } 00071 } 00072 00073 QgsMultiBandColorRendererWidget::~QgsMultiBandColorRendererWidget() 00074 { 00075 } 00076 00077 QgsRasterRenderer* QgsMultiBandColorRendererWidget::renderer() 00078 { 00079 if ( !mRasterLayer ) 00080 { 00081 return 0; 00082 } 00083 QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); 00084 if ( !provider ) 00085 { 00086 return 0; 00087 } 00088 00089 int redBand = mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt(); 00090 int greenBand = mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt(); 00091 int blueBand = mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt(); 00092 00093 QgsMultiBandColorRenderer* r = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand ); 00094 setCustomMinMaxValues( r, provider, redBand, greenBand, blueBand ); 00095 return r; 00096 } 00097 00098 void QgsMultiBandColorRendererWidget::createValidators() 00099 { 00100 mRedMinLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) ); 00101 mRedMaxLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) ); 00102 mGreenMinLineEdit->setValidator( new QDoubleValidator( mGreenMinLineEdit ) ); 00103 mGreenMaxLineEdit->setValidator( new QDoubleValidator( mGreenMinLineEdit ) ); 00104 mBlueMinLineEdit->setValidator( new QDoubleValidator( mBlueMinLineEdit ) ); 00105 mBlueMaxLineEdit->setValidator( new QDoubleValidator( mBlueMinLineEdit ) ); 00106 } 00107 00108 void QgsMultiBandColorRendererWidget::setCustomMinMaxValues( QgsMultiBandColorRenderer* r, 00109 const QgsRasterDataProvider* provider, 00110 int redBand, int greenBand, int blueBand ) 00111 { 00112 if ( !r || !provider ) 00113 { 00114 return; 00115 } 00116 00117 if ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() == 00118 QgsContrastEnhancement::NoEnhancement ) 00119 { 00120 r->setRedContrastEnhancement( 0 ); 00121 r->setGreenContrastEnhancement( 0 ); 00122 r->setBlueContrastEnhancement( 0 ); 00123 return; 00124 } 00125 00126 QgsContrastEnhancement* redEnhancement = 0; 00127 QgsContrastEnhancement* greenEnhancement = 0; 00128 QgsContrastEnhancement* blueEnhancement = 0; 00129 00130 bool redMinOk, redMaxOk; 00131 double redMin = mRedMinLineEdit->text().toDouble( &redMinOk ); 00132 double redMax = mRedMaxLineEdit->text().toDouble( &redMaxOk ); 00133 if ( redMinOk && redMaxOk ) 00134 { 00135 redEnhancement = new QgsContrastEnhancement(( QGis::DataType )( 00136 provider->dataType( redBand ) ) ); 00137 redEnhancement->setMinimumValue( redMin ); 00138 redEnhancement->setMaximumValue( redMax ); 00139 } 00140 00141 bool greenMinOk, greenMaxOk; 00142 double greenMin = mGreenMinLineEdit->text().toDouble( &greenMinOk ); 00143 double greenMax = mGreenMaxLineEdit->text().toDouble( &greenMaxOk ); 00144 if ( greenMinOk && greenMaxOk ) 00145 { 00146 greenEnhancement = new QgsContrastEnhancement(( QGis::DataType )( 00147 provider->dataType( greenBand ) ) ); 00148 greenEnhancement->setMinimumValue( greenMin ); 00149 greenEnhancement->setMaximumValue( greenMax ); 00150 } 00151 00152 bool blueMinOk, blueMaxOk; 00153 double blueMin = mBlueMinLineEdit->text().toDouble( &blueMinOk ); 00154 double blueMax = mBlueMaxLineEdit->text().toDouble( &blueMaxOk ); 00155 if ( blueMinOk && blueMaxOk ) 00156 { 00157 blueEnhancement = new QgsContrastEnhancement(( QGis::DataType )( 00158 provider->dataType( blueBand ) ) ); 00159 blueEnhancement->setMinimumValue( blueMin ); 00160 blueEnhancement->setMaximumValue( blueMax ); 00161 } 00162 00163 if ( redEnhancement ) 00164 { 00165 redEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm ) 00166 ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) ); 00167 } 00168 if ( greenEnhancement ) 00169 { 00170 greenEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm ) 00171 ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) ); 00172 } 00173 if ( blueEnhancement ) 00174 { 00175 blueEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm ) 00176 ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) ); 00177 } 00178 r->setRedContrastEnhancement( redEnhancement ); 00179 r->setGreenContrastEnhancement( greenEnhancement ); 00180 r->setBlueContrastEnhancement( blueEnhancement ); 00181 } 00182 00183 void QgsMultiBandColorRendererWidget::onBandChanged( int index ) 00184 { 00185 Q_UNUSED( index ); 00186 00187 QList<int> myBands; 00188 myBands.append( mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt() ); 00189 myBands.append( mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt() ); 00190 myBands.append( mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt() ); 00191 mMinMaxWidget->setBands( myBands ); 00192 } 00193 00194 void QgsMultiBandColorRendererWidget::loadMinMax( int theBandNo, double theMin, double theMax, int theOrigin ) 00195 { 00196 Q_UNUSED( theOrigin ); 00197 QgsDebugMsg( QString( "theBandNo = %1 theMin = %2 theMax = %3" ).arg( theBandNo ).arg( theMin ).arg( theMax ) ); 00198 00199 QLineEdit *myMinLineEdit, *myMaxLineEdit; 00200 00201 if ( mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt() == theBandNo ) 00202 { 00203 myMinLineEdit = mRedMinLineEdit; 00204 myMaxLineEdit = mRedMaxLineEdit; 00205 } 00206 else if ( mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt() == theBandNo ) 00207 { 00208 myMinLineEdit = mGreenMinLineEdit; 00209 myMaxLineEdit = mGreenMaxLineEdit; 00210 } 00211 else if ( mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt() == theBandNo ) 00212 { 00213 myMinLineEdit = mBlueMinLineEdit; 00214 myMaxLineEdit = mBlueMaxLineEdit; 00215 } 00216 else // should not happen 00217 { 00218 QgsDebugMsg( "Band not found" ); 00219 return; 00220 } 00221 00222 if ( qIsNaN( theMin ) ) 00223 { 00224 myMinLineEdit->clear(); 00225 } 00226 else 00227 { 00228 myMinLineEdit->setText( QString::number( theMin ) ); 00229 } 00230 00231 if ( qIsNaN( theMax ) ) 00232 { 00233 myMaxLineEdit->clear(); 00234 } 00235 else 00236 { 00237 myMaxLineEdit->setText( QString::number( theMax ) ); 00238 } 00239 } 00240 00241 void QgsMultiBandColorRendererWidget::setMinMaxValue( const QgsContrastEnhancement* ce, QLineEdit* minEdit, QLineEdit* maxEdit ) 00242 { 00243 if ( !minEdit || !maxEdit ) 00244 { 00245 return; 00246 } 00247 00248 if ( !ce ) 00249 { 00250 minEdit->clear(); 00251 maxEdit->clear(); 00252 return; 00253 } 00254 00255 minEdit->setText( QString::number( ce->minimumValue() ) ); 00256 maxEdit->setText( QString::number( ce->maximumValue() ) ); 00257 00258 // QgsMultiBandColorRenderer is using individual contrast enhancements for each 00259 // band, but this widget GUI has one for all 00260 mContrastEnhancementAlgorithmComboBox->setCurrentIndex( mContrastEnhancementAlgorithmComboBox->findData( 00261 ( int )( ce->contrastEnhancementAlgorithm() ) ) ); 00262 } 00263 00264 void QgsMultiBandColorRendererWidget::setFromRenderer( const QgsRasterRenderer* r ) 00265 { 00266 const QgsMultiBandColorRenderer* mbcr = dynamic_cast<const QgsMultiBandColorRenderer*>( r ); 00267 if ( mbcr ) 00268 { 00269 mRedBandComboBox->setCurrentIndex( mRedBandComboBox->findData( mbcr->redBand() ) ); 00270 mGreenBandComboBox->setCurrentIndex( mGreenBandComboBox->findData( mbcr->greenBand() ) ); 00271 mBlueBandComboBox->setCurrentIndex( mBlueBandComboBox->findData( mbcr->blueBand() ) ); 00272 00273 setMinMaxValue( mbcr->redContrastEnhancement(), mRedMinLineEdit, mRedMaxLineEdit ); 00274 setMinMaxValue( mbcr->greenContrastEnhancement(), mGreenMinLineEdit, mGreenMaxLineEdit ); 00275 setMinMaxValue( mbcr->blueContrastEnhancement(), mBlueMinLineEdit, mBlueMaxLineEdit ); 00276 } 00277 else 00278 { 00279 mRedBandComboBox->setCurrentIndex( mRedBandComboBox->findText( tr( "Red" ) ) ); 00280 mGreenBandComboBox->setCurrentIndex( mGreenBandComboBox->findText( tr( "Green" ) ) ); 00281 mBlueBandComboBox->setCurrentIndex( mBlueBandComboBox->findText( tr( "Blue" ) ) ); 00282 } 00283 } 00284 00285 QString QgsMultiBandColorRendererWidget::min( int index ) 00286 { 00287 switch ( index ) 00288 { 00289 case 0: 00290 return mRedMinLineEdit->text(); 00291 break; 00292 case 1: 00293 return mGreenMinLineEdit->text(); 00294 break; 00295 case 2: 00296 return mBlueMinLineEdit->text(); 00297 break; 00298 default: 00299 break; 00300 } 00301 return QString( ); 00302 } 00303 00304 QString QgsMultiBandColorRendererWidget::max( int index ) 00305 { 00306 switch ( index ) 00307 { 00308 case 0: 00309 return mRedMaxLineEdit->text(); 00310 break; 00311 case 1: 00312 return mGreenMaxLineEdit->text(); 00313 break; 00314 case 2: 00315 return mBlueMaxLineEdit->text(); 00316 break; 00317 default: 00318 break; 00319 } 00320 return QString( ); 00321 } 00322 00323 void QgsMultiBandColorRendererWidget::setMin( QString value, int index ) 00324 { 00325 switch ( index ) 00326 { 00327 case 0: 00328 mRedMinLineEdit->setText( value ); 00329 break; 00330 case 1: 00331 mGreenMinLineEdit->setText( value ); 00332 break; 00333 case 2: 00334 mBlueMinLineEdit->setText( value ); 00335 break; 00336 default: 00337 break; 00338 } 00339 } 00340 00341 void QgsMultiBandColorRendererWidget::setMax( QString value, int index ) 00342 { 00343 switch ( index ) 00344 { 00345 case 0: 00346 mRedMaxLineEdit->setText( value ); 00347 break; 00348 case 1: 00349 mGreenMaxLineEdit->setText( value ); 00350 break; 00351 case 2: 00352 mBlueMaxLineEdit->setText( value ); 00353 break; 00354 default: 00355 break; 00356 } 00357 } 00358 00359 int QgsMultiBandColorRendererWidget::selectedBand( int index ) 00360 { 00361 switch ( index ) 00362 { 00363 case 0: 00364 return mRedBandComboBox->currentIndex(); 00365 break; 00366 case 1: 00367 return mGreenBandComboBox->currentIndex(); 00368 break; 00369 case 2: 00370 return mBlueBandComboBox->currentIndex(); 00371 break; 00372 default: 00373 break; 00374 } 00375 return -1; 00376 }