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(
66 connect( mScalarRecalculateMinMaxButton, &QPushButton::clicked,
this, &QgsMeshRendererScalarSettingsWidget::recalculateMinMaxButtonClicked );
67 connect( mScalarMinSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, [
this](
double ) { minMaxChanged(); } );
68 connect( mScalarMaxSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, [
this](
double ) { minMaxChanged(); } );
69 connect( mScalarEdgeStrokeWidthVariableRadioButton, &QRadioButton::toggled,
this, &QgsMeshRendererScalarSettingsWidget::onEdgeStrokeWidthMethodChanged );
81 connect( mUserDefinedRadioButton, &QRadioButton::toggled,
this, &QgsMeshRendererScalarSettingsWidget::mUserDefinedRadioButton_toggled );
82 connect( mMinMaxRadioButton, &QRadioButton::toggled,
this, &QgsMeshRendererScalarSettingsWidget::mMinMaxRadioButton_toggled );
84 connect( mMinMaxValueTypeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, &QgsMeshRendererScalarSettingsWidget::recalculateMinMax );
91 mScalarInterpolationTypeComboBox->setEnabled( !dataIsDefinedOnEdges() );
96 mActiveDatasetGroup = groupIndex;
97 mScalarInterpolationTypeComboBox->setEnabled( !dataIsDefinedOnEdges() );
103 settings.setClassificationMinimumMaximum( spinBoxValue( mScalarMinSpinBox ), spinBoxValue( mScalarMaxSpinBox ) );
104 settings.setColorRampShader( mScalarColorRampShaderWidget->shader() );
105 settings.setOpacity( mOpacityWidget->opacity() );
106 settings.setDataResamplingMethod( dataIntepolationMethod() );
110 if ( mUserDefinedRadioButton->isChecked() )
123 edgeStrokeWidth.
setIsVariableWidth( mScalarEdgeStrokeWidthVariableRadioButton->isChecked() );
125 settings.setEdgeStrokeWidth( edgeStrokeWidth );
126 settings.setEdgeStrokeWidthUnit( mScalarEdgeStrokeWidthUnitSelectionWidget->unit() );
137 if ( mActiveDatasetGroup < 0 )
144 const double min =
settings.classificationMinimum();
145 const double max =
settings.classificationMaximum();
147 if ( std::abs( max ) < 1e-2 )
149 mScalarMinSpinBox->setDecimals( 8 );
150 mScalarMaxSpinBox->setDecimals( 8 );
154 mScalarMinSpinBox->setDecimals( 2 );
155 mScalarMaxSpinBox->setDecimals( 2 );
161 whileBlocking( mMinMaxValueTypeComboBox )->setCurrentIndex( mMinMaxValueTypeComboBox->findData( QVariant::fromValue(
settings.extent() ) ) );
165 whileBlocking( mUserDefinedRadioButton )->setChecked(
false );
167 mScalarMinSpinBox->setEnabled(
false );
168 mScalarMaxSpinBox->setEnabled(
false );
169 mMinMaxValueTypeComboBox->setEnabled(
true );
173 whileBlocking( mUserDefinedRadioButton )->setChecked(
true );
175 mScalarMinSpinBox->setEnabled(
true );
176 mScalarMaxSpinBox->setEnabled(
true );
177 mMinMaxValueTypeComboBox->setEnabled(
false );
180 whileBlocking( mScalarColorRampShaderWidget )->setFromShader( shader );
181 whileBlocking( mScalarColorRampShaderWidget )->setMinimumMaximum( min, max );
183 const int index = mScalarInterpolationTypeComboBox->findData(
settings.dataResamplingMethod() );
184 whileBlocking( mScalarInterpolationTypeComboBox )->setCurrentIndex( index );
189 mScalarResamplingWidget->setVisible( hasFaces );
191 mEdgeWidthGroupBox->setVisible( hasEdges );
196 whileBlocking( mScalarEdgeStrokeWidthVariablePushButton )->setVariableStrokeWidth( edgeStrokeWidth );
199 whileBlocking( mScalarEdgeStrokeWidthUnitSelectionWidget )->setUnit(
settings.edgeStrokeWidthUnit() );
201 mOpacityContainerWidget->setVisible(
false );
204 const double min = metadata.
minimum();
205 const double max = metadata.
maximum();
206 mScalarEdgeStrokeWidthVariablePushButton->setDefaultMinMaxValue( min, max );
209 onEdgeStrokeWidthMethodChanged();
212double QgsMeshRendererScalarSettingsWidget::spinBoxValue(
const QgsDoubleSpinBox *spinBox )
const
214 if ( spinBox->value() == spinBox->
clearValue() )
216 return std::numeric_limits<double>::quiet_NaN();
219 return spinBox->value();
222void QgsMeshRendererScalarSettingsWidget::minMaxChanged()
224 const double min = spinBoxValue( mScalarMinSpinBox );
225 const double max = spinBoxValue( mScalarMaxSpinBox );
226 mScalarColorRampShaderWidget->setMinimumMaximumAndClassify( min, max );
229void QgsMeshRendererScalarSettingsWidget::recalculateMinMaxButtonClicked()
231 const QgsMeshDatasetGroupMetadata metadata = mMeshLayer->datasetGroupMetadata( mActiveDatasetGroup );
232 const double min = metadata.
minimum();
233 const double max = metadata.
maximum();
235 if ( std::abs( max ) < 1e-2 )
237 mScalarMinSpinBox->setDecimals( 8 );
238 mScalarMaxSpinBox->setDecimals( 8 );
242 mScalarMinSpinBox->setDecimals( 2 );
243 mScalarMaxSpinBox->setDecimals( 2 );
248 mScalarColorRampShaderWidget->setMinimumMaximumAndClassify( min, max );
251void QgsMeshRendererScalarSettingsWidget::onEdgeStrokeWidthMethodChanged()
253 const bool variableWidth = mScalarEdgeStrokeWidthVariableRadioButton->isChecked();
254 mScalarEdgeStrokeWidthVariablePushButton->setVisible( variableWidth );
255 mScalarEdgeStrokeWidthSpinBox->setVisible( !variableWidth );
260 const int data = mScalarInterpolationTypeComboBox->currentData().toInt();
265bool QgsMeshRendererScalarSettingsWidget::dataIsDefinedOnFaces()
const
270 if ( mActiveDatasetGroup < 0 )
273 const QgsMeshDatasetGroupMetadata meta = mMeshLayer->datasetGroupMetadata( mActiveDatasetGroup );
278bool QgsMeshRendererScalarSettingsWidget::dataIsDefinedOnEdges()
const
283 if ( mActiveDatasetGroup < 0 )
286 const QgsMeshDatasetGroupMetadata meta = mMeshLayer->datasetGroupMetadata( mActiveDatasetGroup );
296void QgsMeshRendererScalarSettingsWidget::recalculateMinMax()
302 switch ( extentRange )
306 searchExtent = mMeshLayer->
extent();
312 QgsCoordinateTransform ct = QgsCoordinateTransform( mCanvas->mapSettings().destinationCrs(), mMeshLayer->crs(),
QgsProject::instance() );
313 searchExtent = mCanvas->extent();
316 searchExtent = ct.
transform( searchExtent );
318 catch (
const QgsCsException &e )
322 searchExtent = mMeshLayer->extent();
332 QgsMeshDatasetIndex datasetIndex = mMeshLayer->activeScalarDatasetAtTime( mCanvas->temporalRange(), mActiveDatasetGroup );
336 found = mMeshLayer->minimumMaximumActiveScalarDataset( searchExtent, datasetIndex, min, max );
346void QgsMeshRendererScalarSettingsWidget::mUserDefinedRadioButton_toggled(
bool toggled )
348 mMinMaxValueTypeComboBox->setEnabled( !toggled );
349 mScalarMinSpinBox->setEnabled( toggled );
350 mScalarMaxSpinBox->setEnabled( toggled );
351 mScalarRecalculateMinMaxButton->setEnabled( toggled );
355void QgsMeshRendererScalarSettingsWidget::mMinMaxRadioButton_toggled(
bool toggled )
357 mMinMaxValueTypeComboBox->setEnabled( toggled );
358 mScalarMinSpinBox->setEnabled( !toggled );
359 mScalarMaxSpinBox->setEnabled( !toggled );
360 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())
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.