Skip to content

Commit d91e12d

Browse files
committedAug 17, 2018
Fix missing min/max values for classification when changing datasets
The min/max values were stored in the color ramp shader, but to my surprise these values were never persisted or copied: pseudo-color raster renderer has a separate storage for the min/max values, so we need that for mesh renderer as well. The QgsRasterShaderFunction is not really useful, and QgsColorRamp should not be derived from it, making things just more confusing.
1 parent 2f5ef8e commit d91e12d

File tree

7 files changed

+41
-6
lines changed

7 files changed

+41
-6
lines changed
 

‎python/core/auto_generated/mesh/qgsmeshrenderersettings.sip.in

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,19 @@ Returns color ramp shader function
9090
void setColorRampShader( const QgsColorRampShader &shader );
9191
%Docstring
9292
Sets color ramp shader function
93+
%End
94+
95+
double classificationMin() const;
96+
%Docstring
97+
Returns min value used for creation of the color ramp shader
98+
%End
99+
double classificationMax() const;
100+
%Docstring
101+
Returns max value used for creation of the color ramp shader
102+
%End
103+
void setClassificationMinMax( double vMin, double vMax );
104+
%Docstring
105+
Sets min/max values used for creation of the color ramp shader
93106
%End
94107

95108
QDomElement writeXml( QDomDocument &doc ) const;

‎src/app/mesh/qgsmeshrendererscalarsettingswidget.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ QgsMeshRendererScalarSettings QgsMeshRendererScalarSettingsWidget::settings() co
4545
{
4646
QgsMeshRendererScalarSettings settings;
4747
settings.setColorRampShader( mScalarColorRampShaderWidget->shader() );
48+
settings.setClassificationMinMax( lineEditValue( mScalarMinLineEdit ), lineEditValue( mScalarMaxLineEdit ) );
4849
return settings;
4950
}
5051

@@ -59,8 +60,8 @@ void QgsMeshRendererScalarSettingsWidget::syncToLayer( )
5960
const QgsMeshRendererSettings rendererSettings = mMeshLayer->rendererSettings();
6061
const QgsMeshRendererScalarSettings settings = rendererSettings.scalarSettings( mActiveDatasetGroup );
6162
const QgsColorRampShader shader = settings.colorRampShader();
62-
whileBlocking( mScalarMinLineEdit )->setText( QString::number( shader.minimumValue() ) );
63-
whileBlocking( mScalarMaxLineEdit )->setText( QString::number( shader.maximumValue() ) );
63+
whileBlocking( mScalarMinLineEdit )->setText( QString::number( settings.classificationMin() ) );
64+
whileBlocking( mScalarMaxLineEdit )->setText( QString::number( settings.classificationMax() ) );
6465
whileBlocking( mScalarColorRampShaderWidget )->setFromShader( shader );
6566
}
6667

‎src/core/mesh/qgsmeshlayer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ void QgsMeshLayer::assignDefaultStyleToDatasetGroup( int groupIndex )
216216
fcn.classifyColorRamp( 5, -1, QgsRectangle(), nullptr );
217217

218218
QgsMeshRendererScalarSettings scalarSettings;
219+
scalarSettings.setClassificationMinMax( groupMin, groupMax );
219220
scalarSettings.setColorRampShader( fcn );
220221
mRendererSettings.setScalarSettings( groupIndex, scalarSettings );
221222
}

‎src/core/mesh/qgsmeshlayerrenderer.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,13 +205,14 @@ void QgsMeshLayerRenderer::renderScalarDataset()
205205
if ( !index.isValid() )
206206
return; // no shader
207207

208-
QgsColorRampShader *fcn = new QgsColorRampShader( mRendererSettings.scalarSettings( index.group() ).colorRampShader() );
208+
const QgsMeshRendererScalarSettings scalarSettings = mRendererSettings.scalarSettings( index.group() );
209+
QgsColorRampShader *fcn = new QgsColorRampShader( scalarSettings.colorRampShader() );
209210
QgsRasterShader *sh = new QgsRasterShader();
210211
sh->setRasterShaderFunction( fcn ); // takes ownership of fcn
211212
QgsMeshLayerInterpolator interpolator( mTriangularMesh, mScalarDatasetValues, mScalarDataOnVertices, mContext, mOutputSize );
212213
QgsSingleBandPseudoColorRenderer renderer( &interpolator, 0, sh ); // takes ownership of sh
213-
renderer.setClassificationMin( fcn->minimumValue() );
214-
renderer.setClassificationMax( fcn->maximumValue() );
214+
renderer.setClassificationMin( scalarSettings.classificationMin() );
215+
renderer.setClassificationMax( scalarSettings.classificationMax() );
215216

216217
std::unique_ptr<QgsRasterBlock> bl( renderer.block( 0, mContext.extent(), mOutputSize.width(), mOutputSize.height(), mFeedback.get() ) );
217218
QImage img = bl->image();

‎src/core/mesh/qgsmeshrenderersettings.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,26 @@ void QgsMeshRendererScalarSettings::setColorRampShader( const QgsColorRampShader
7878
mColorRampShader = shader;
7979
}
8080

81+
void QgsMeshRendererScalarSettings::setClassificationMinMax( double vMin, double vMax )
82+
{
83+
mClassificationMin = vMin;
84+
mClassificationMax = vMax;
85+
}
86+
8187
QDomElement QgsMeshRendererScalarSettings::writeXml( QDomDocument &doc ) const
8288
{
8389
QDomElement elem = doc.createElement( "scalar-settings" );
90+
elem.setAttribute( "min-val", mClassificationMin );
91+
elem.setAttribute( "max-val", mClassificationMax );
8492
QDomElement elemShader = mColorRampShader.writeXml( doc );
8593
elem.appendChild( elemShader );
8694
return elem;
8795
}
8896

8997
void QgsMeshRendererScalarSettings::readXml( const QDomElement &elem )
9098
{
99+
mClassificationMin = elem.attribute( "min-val" ).toDouble();
100+
mClassificationMax = elem.attribute( "max-val" ).toDouble();
91101
QDomElement elemShader = elem.firstChildElement( QStringLiteral( "colorrampshader" ) );
92102
mColorRampShader.readXml( elemShader );
93103
}

‎src/core/mesh/qgsmeshrenderersettings.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,22 @@ class CORE_EXPORT QgsMeshRendererScalarSettings
8282
//! Sets color ramp shader function
8383
void setColorRampShader( const QgsColorRampShader &shader );
8484

85+
//! Returns min value used for creation of the color ramp shader
86+
double classificationMin() const { return mClassificationMin; }
87+
//! Returns max value used for creation of the color ramp shader
88+
double classificationMax() const { return mClassificationMax; }
89+
//! Sets min/max values used for creation of the color ramp shader
90+
void setClassificationMinMax( double vMin, double vMax );
91+
8592
//! Writes configuration to a new DOM element
8693
QDomElement writeXml( QDomDocument &doc ) const;
8794
//! Reads configuration from the given DOM element
8895
void readXml( const QDomElement &elem );
8996

9097
private:
9198
QgsColorRampShader mColorRampShader;
99+
double mClassificationMin = 0;
100+
double mClassificationMax = 0;
92101
};
93102

94103
/**

‎src/ui/mesh/qgsmeshrendererscalarsettingswidgetbase.ui

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
<item>
4848
<widget class="QPushButton" name="mScalarRecalculateMinMaxButton">
4949
<property name="text">
50-
<string>Recalculate</string>
50+
<string>Load</string>
5151
</property>
5252
</widget>
5353
</item>

0 commit comments

Comments
 (0)
Please sign in to comment.