24#include <QDialogButtonBox>
27#include "moc_qgsmeshrendererscalarsettingswidget.cpp"
36 mScalarMinSpinBox->setSpecialValueText( QString() );
38 mScalarMaxSpinBox->setSpecialValueText( QString() );
40 mScalarMinSpinBox->setEnabled(
true );
41 mScalarMaxSpinBox->setEnabled(
true );
46 mScalarInterpolationTypeComboBox->setCurrentIndex( 0 );
51 mMinMaxValueTypeComboBox->setCurrentIndex( 0 );
53 mUserDefinedRadioButton->setChecked(
true );
54 mMinMaxValueTypeComboBox->setEnabled(
false );
56 mScalarEdgeStrokeWidthUnitSelectionWidget->setUnits( {
64 connect( mScalarRecalculateMinMaxButton, &QPushButton::clicked,
this, &QgsMeshRendererScalarSettingsWidget::recalculateMinMaxButtonClicked );
65 connect( mScalarMinSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, [
this](
double ) { minMaxChanged(); } );
66 connect( mScalarMaxSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, [
this](
double ) { minMaxChanged(); } );
67 connect( mScalarEdgeStrokeWidthVariableRadioButton, &QRadioButton::toggled,
this, &QgsMeshRendererScalarSettingsWidget::onEdgeStrokeWidthMethodChanged );
79 connect( mUserDefinedRadioButton, &QRadioButton::toggled,
this, &QgsMeshRendererScalarSettingsWidget::mUserDefinedRadioButton_toggled );
80 connect( mMinMaxRadioButton, &QRadioButton::toggled,
this, &QgsMeshRendererScalarSettingsWidget::mMinMaxRadioButton_toggled );
82 connect( mMinMaxValueTypeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, &QgsMeshRendererScalarSettingsWidget::recalculateMinMax );
89 mScalarInterpolationTypeComboBox->setEnabled( !dataIsDefinedOnEdges() );
94 mActiveDatasetGroup = groupIndex;
95 mScalarInterpolationTypeComboBox->setEnabled( !dataIsDefinedOnEdges() );
101 settings.setClassificationMinimumMaximum( spinBoxValue( mScalarMinSpinBox ), spinBoxValue( mScalarMaxSpinBox ) );
102 settings.setColorRampShader( mScalarColorRampShaderWidget->shader() );
103 settings.setOpacity( mOpacityWidget->opacity() );
104 settings.setDataResamplingMethod( dataIntepolationMethod() );
108 if ( mUserDefinedRadioButton->isChecked() )
121 edgeStrokeWidth.
setIsVariableWidth( mScalarEdgeStrokeWidthVariableRadioButton->isChecked() );
123 settings.setEdgeStrokeWidth( edgeStrokeWidth );
124 settings.setEdgeStrokeWidthUnit( mScalarEdgeStrokeWidthUnitSelectionWidget->unit() );
135 if ( mActiveDatasetGroup < 0 )
142 const double min =
settings.classificationMinimum();
143 const double max =
settings.classificationMaximum();
145 if ( std::abs( max ) < 1e-2 )
147 mScalarMinSpinBox->setDecimals( 8 );
148 mScalarMaxSpinBox->setDecimals( 8 );
152 mScalarMinSpinBox->setDecimals( 2 );
153 mScalarMaxSpinBox->setDecimals( 2 );
159 whileBlocking( mMinMaxValueTypeComboBox )->setCurrentIndex( mMinMaxValueTypeComboBox->findData( QVariant::fromValue(
settings.extent() ) ) );
163 whileBlocking( mUserDefinedRadioButton )->setChecked(
false );
165 mScalarMinSpinBox->setEnabled(
false );
166 mScalarMaxSpinBox->setEnabled(
false );
167 mMinMaxValueTypeComboBox->setEnabled(
true );
171 whileBlocking( mUserDefinedRadioButton )->setChecked(
true );
173 mScalarMinSpinBox->setEnabled(
true );
174 mScalarMaxSpinBox->setEnabled(
true );
175 mMinMaxValueTypeComboBox->setEnabled(
false );
178 whileBlocking( mScalarColorRampShaderWidget )->setFromShader( shader );
179 whileBlocking( mScalarColorRampShaderWidget )->setMinimumMaximum( min, max );
181 const int index = mScalarInterpolationTypeComboBox->findData(
settings.dataResamplingMethod() );
182 whileBlocking( mScalarInterpolationTypeComboBox )->setCurrentIndex( index );
187 mScalarResamplingWidget->setVisible( hasFaces );
189 mEdgeWidthGroupBox->setVisible( hasEdges );
194 whileBlocking( mScalarEdgeStrokeWidthVariablePushButton )->setVariableStrokeWidth( edgeStrokeWidth );
197 whileBlocking( mScalarEdgeStrokeWidthUnitSelectionWidget )->setUnit(
settings.edgeStrokeWidthUnit() );
199 mOpacityContainerWidget->setVisible(
false );
202 const double min = metadata.
minimum();
203 const double max = metadata.
maximum();
204 mScalarEdgeStrokeWidthVariablePushButton->setDefaultMinMaxValue( min, max );
207 onEdgeStrokeWidthMethodChanged();
210double QgsMeshRendererScalarSettingsWidget::spinBoxValue(
const QgsDoubleSpinBox *spinBox )
const
212 if ( spinBox->value() == spinBox->
clearValue() )
214 return std::numeric_limits<double>::quiet_NaN();
217 return spinBox->value();
220void QgsMeshRendererScalarSettingsWidget::minMaxChanged()
222 const double min = spinBoxValue( mScalarMinSpinBox );
223 const double max = spinBoxValue( mScalarMaxSpinBox );
224 mScalarColorRampShaderWidget->setMinimumMaximumAndClassify( min, max );
227void QgsMeshRendererScalarSettingsWidget::recalculateMinMaxButtonClicked()
229 const QgsMeshDatasetGroupMetadata metadata = mMeshLayer->datasetGroupMetadata( mActiveDatasetGroup );
230 const double min = metadata.
minimum();
231 const double max = metadata.
maximum();
233 if ( std::abs( max ) < 1e-2 )
235 mScalarMinSpinBox->setDecimals( 8 );
236 mScalarMaxSpinBox->setDecimals( 8 );
240 mScalarMinSpinBox->setDecimals( 2 );
241 mScalarMaxSpinBox->setDecimals( 2 );
246 mScalarColorRampShaderWidget->setMinimumMaximumAndClassify( min, max );
249void QgsMeshRendererScalarSettingsWidget::onEdgeStrokeWidthMethodChanged()
251 const bool variableWidth = mScalarEdgeStrokeWidthVariableRadioButton->isChecked();
252 mScalarEdgeStrokeWidthVariablePushButton->setVisible( variableWidth );
253 mScalarEdgeStrokeWidthSpinBox->setVisible( !variableWidth );
258 const int data = mScalarInterpolationTypeComboBox->currentData().toInt();
263bool QgsMeshRendererScalarSettingsWidget::dataIsDefinedOnFaces()
const
268 if ( mActiveDatasetGroup < 0 )
271 const QgsMeshDatasetGroupMetadata meta = mMeshLayer->datasetGroupMetadata( mActiveDatasetGroup );
276bool QgsMeshRendererScalarSettingsWidget::dataIsDefinedOnEdges()
const
281 if ( mActiveDatasetGroup < 0 )
284 const QgsMeshDatasetGroupMetadata meta = mMeshLayer->datasetGroupMetadata( mActiveDatasetGroup );
294void QgsMeshRendererScalarSettingsWidget::recalculateMinMax()
300 switch ( extentRange )
304 searchExtent = mMeshLayer->
extent();
310 QgsCoordinateTransform ct = QgsCoordinateTransform( mCanvas->mapSettings().destinationCrs(), mMeshLayer->crs(),
QgsProject::instance() );
311 searchExtent = mCanvas->extent();
314 searchExtent = ct.
transform( searchExtent );
316 catch (
const QgsCsException &e )
320 searchExtent = mMeshLayer->extent();
330 QgsMeshDatasetIndex datasetIndex = mMeshLayer->activeScalarDatasetAtTime( mCanvas->temporalRange(), mActiveDatasetGroup );
334 found = mMeshLayer->minimumMaximumActiveScalarDataset( searchExtent, datasetIndex, min, max );
344void QgsMeshRendererScalarSettingsWidget::mUserDefinedRadioButton_toggled(
bool toggled )
346 mMinMaxValueTypeComboBox->setEnabled( !toggled );
347 mScalarMinSpinBox->setEnabled( toggled );
348 mScalarMaxSpinBox->setEnabled( toggled );
349 mScalarRecalculateMinMaxButton->setEnabled( toggled );
353void QgsMeshRendererScalarSettingsWidget::mMinMaxRadioButton_toggled(
bool toggled )
355 mMinMaxValueTypeComboBox->setEnabled( toggled );
356 mScalarMinSpinBox->setEnabled( !toggled );
357 mScalarMaxSpinBox->setEnabled( !toggled );
358 mScalarRecalculateMinMaxButton->setEnabled( !toggled );
@ MinimumMaximum
Real min-max values.
MeshRangeExtent
Describes the extent used to compute mesh ranges (min/max values).
@ UpdatedCanvas
Constantly updated extent of the canvas is used to compute statistics.
@ WholeMesh
Whole mesh is used to compute statistics.
@ FixedCanvas
Current extent of the canvas (at the time of computation) is used to compute statistics.
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes).
@ MetersInMapUnits
Meters value as Map units.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value.
@ MinimumValue
Reset value to minimum().
Represents a width that can vary depending on values.
void setFixedStrokeWidth(double fixedWidth)
Sets the fixed width.
void setIsVariableWidth(bool isVariableWidth)
Returns whether the width is variable.
double fixedStrokeWidth() const
Returns the fixed width.
bool isVariableWidth() const
Returns whether the width is variable.
Map canvas is a class for displaying all GIS data types on a canvas.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsRectangle extent() const override
Returns the extent of the layer.
Represents a mesh renderer settings for scalar datasets.
DataResamplingMethod
Resampling of value from dataset.
@ NoResampling
Does not use resampling.
@ NeighbourAverage
Does a simple average of values defined for all surrounding faces/vertices.
Represents all mesh renderer settings.
QgsMeshRendererScalarSettings scalarSettings(int groupIndex) const
Returns renderer settings.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
static QgsProject * instance()
Returns the QgsProject singleton instance.
A rectangle specified with double values.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.