QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsmeshrenderervectorsettingswidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmeshrenderervectorsettingswidget.cpp
3 ---------------------------------------
4 begin : June 2018
5 copyright : (C) 2018 by Peter Petrik
6 email : zilolv at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgis.h"
19#include "qgsmeshlayer.h"
20#include "qgsmessagelog.h"
21
23 : QWidget( parent )
24{
25 setupUi( this );
26
27 QVector<QgsDoubleSpinBox *> widgets;
28 widgets << mMinMagSpinBox << mMaxMagSpinBox
29 << mHeadWidthSpinBox << mHeadLengthSpinBox
30 << mMinimumShaftSpinBox << mMaximumShaftSpinBox
31 << mScaleShaftByFactorOfSpinBox << mShaftLengthSpinBox;
32
33 // Setup defaults and clear values for spin boxes
34 for ( const auto &widget : std::as_const( widgets ) )
35 {
36 widget->setClearValueMode( QgsDoubleSpinBox::ClearValueMode::MinimumValue );
37 widget->setSpecialValueText( QString( ) );
38 widget->setValue( widget->minimum() );
39 }
40
41 mShaftLengthComboBox->setCurrentIndex( -1 );
42
43 mColoringMethodComboBox->addItem( tr( "Single Color" ), QgsInterpolatedLineColor::SingleColor );
44 mColoringMethodComboBox->addItem( tr( "Color Ramp Shader" ), QgsInterpolatedLineColor::ColorRamp );
45
46 mXSpacingSpinBox->setClearValue( 10.0 );
47 mYSpacingSpinBox->setClearValue( 10.0 );
48 mStreamlinesDensitySpinBox->setClearValue( 15.0 );
49 mTracesParticlesCountSpinBox->setClearValue( 1000 );
50 mTracesMaxLengthSpinBox->setClearValue( 100.0 );
51
53 connect( mColoringMethodComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
54 this, &QgsMeshRendererVectorSettingsWidget::onColoringMethodChanged );
55 connect( mColorRampShaderWidget, &QgsColorRampShaderWidget::widgetChanged,
57 connect( mColorRampShaderMinimumSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
58 this, &QgsMeshRendererVectorSettingsWidget::onColorRampMinMaxChanged );
59 connect( mColorRampShaderMaximumSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
60 this, &QgsMeshRendererVectorSettingsWidget::onColorRampMinMaxChanged );
61
62 connect( mLineWidthSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
64
65 connect( mShaftLengthComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
67
68 connect( mShaftLengthComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
69 mShaftOptionsStackedWidget, &QStackedWidget::setCurrentIndex );
70
71 connect( mDisplayVectorsOnGridGroupBox, &QGroupBox::toggled, this, &QgsMeshRendererVectorSettingsWidget::widgetChanged );
72
73 connect( mColorRampShaderLoadButton, &QPushButton::clicked, this, &QgsMeshRendererVectorSettingsWidget::loadColorRampShader );
74
75 onColoringMethodChanged();
76
77 for ( const auto &widget : std::as_const( widgets ) )
78 {
79 connect( widget, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsMeshRendererVectorSettingsWidget::widgetChanged );
80 }
81
82 connect( mXSpacingSpinBox, qOverload<int>( &QgsSpinBox::valueChanged ), this, &QgsMeshRendererVectorSettingsWidget::widgetChanged );
83 connect( mYSpacingSpinBox, qOverload<int>( &QgsSpinBox::valueChanged ), this, &QgsMeshRendererVectorSettingsWidget::widgetChanged );
84
85 connect( mSymbologyVectorComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
86 this, &QgsMeshRendererVectorSettingsWidget::onSymbologyChanged );
87 onSymbologyChanged( 0 );
88
89 connect( mSymbologyVectorComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
91
92 connect( mStreamlinesSeedingMethodComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
93 this, &QgsMeshRendererVectorSettingsWidget::onStreamLineSeedingMethodChanged );
94 onStreamLineSeedingMethodChanged( 0 );
95
96 connect( mStreamlinesSeedingMethodComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
98
99 connect( mStreamlinesDensitySpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
101
102 connect( mTracesMaxLengthSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
104
105 connect( mTracesParticlesCountSpinBox, qOverload<int>( &QgsSpinBox::valueChanged ),
107
108 mTracesTailLengthMapUnitWidget->setUnits( QgsUnitTypes::RenderUnitList()
113
114 connect( mTracesTailLengthMapUnitWidget, &QgsUnitSelectionWidget::changed,
116}
117
119{
120 mMeshLayer = layer;
121}
122
124{
127 static_cast<QgsMeshRendererVectorSettings::Symbology>( mSymbologyVectorComboBox->currentIndex() ) );
128
129 //Arrow settings
131
132 // basic
133 settings.setColor( mColorWidget->color() );
134 settings.setLineWidth( mLineWidthSpinBox->value() );
136 ( mColoringMethodComboBox->currentData().toInt() ) );
137 settings.setColorRampShader( mColorRampShaderWidget->shader() );
138
139 // filter by magnitude
140 double val = filterValue( mMinMagSpinBox, -1 );
141 settings.setFilterMin( val );
142
143 val = filterValue( mMaxMagSpinBox, -1 );
144 settings.setFilterMax( val );
145
146 // arrow head
147 val = filterValue( mHeadWidthSpinBox, arrowSettings.arrowHeadWidthRatio() * 100.0 );
148 arrowSettings.setArrowHeadWidthRatio( val / 100.0 );
149
150 val = filterValue( mHeadLengthSpinBox, arrowSettings.arrowHeadLengthRatio() * 100.0 );
151 arrowSettings.setArrowHeadLengthRatio( val / 100.0 );
152
153 // user grid
154 bool enabled = mDisplayVectorsOnGridGroupBox->isChecked();
156 settings.setUserGridCellWidth( mXSpacingSpinBox->value() );
157 settings.setUserGridCellHeight( mYSpacingSpinBox->value() );
158
159 // shaft length
160 auto method = static_cast<QgsMeshRendererVectorArrowSettings::ArrowScalingMethod>( mShaftLengthComboBox->currentIndex() );
161 arrowSettings.setShaftLengthMethod( method );
162
163 val = filterValue( mMinimumShaftSpinBox, arrowSettings.minShaftLength() );
164 arrowSettings.setMinShaftLength( val );
165
166 val = filterValue( mMaximumShaftSpinBox, arrowSettings.maxShaftLength() );
167 arrowSettings.setMaxShaftLength( val );
168
169 val = filterValue( mScaleShaftByFactorOfSpinBox, arrowSettings.scaleFactor() );
170 arrowSettings.setScaleFactor( val );
171
172 val = filterValue( mShaftLengthSpinBox, arrowSettings.fixedShaftLength() );
173 arrowSettings.setFixedShaftLength( val );
174
175 settings.setArrowsSettings( arrowSettings );
176
177 //Streamline setting
179 streamlineSettings.setSeedingMethod(
180 static_cast<QgsMeshRendererVectorStreamlineSettings::SeedingStartPointsMethod>( mStreamlinesSeedingMethodComboBox->currentIndex() ) );
181
182 streamlineSettings.setSeedingDensity( mStreamlinesDensitySpinBox->value() / 100 );
183
184 settings.setStreamLinesSettings( streamlineSettings );
185
186 //Traces setting
188 tracesSettings.setMaximumTailLength( mTracesMaxLengthSpinBox->value() );
189 tracesSettings.setMaximumTailLengthUnit( mTracesTailLengthMapUnitWidget->unit() );
190 tracesSettings.setParticlesCount( mTracesParticlesCountSpinBox->value() );
191 settings.setTracesSettings( tracesSettings );
192
193 return settings;
194}
195
197{
198 if ( !mMeshLayer || !mMeshLayer->dataProvider() )
199 return;
200
201 if ( mActiveDatasetGroup < 0 )
202 return;
203
204 bool hasFaces = ( mMeshLayer->dataProvider() &&
205 mMeshLayer->dataProvider()->contains( QgsMesh::ElementType::Face ) );
206
207 const QgsMeshRendererSettings rendererSettings = mMeshLayer->rendererSettings();
208 const QgsMeshRendererVectorSettings settings = rendererSettings.vectorSettings( mActiveDatasetGroup );
209
210 symbologyLabel->setVisible( hasFaces );
211 mSymbologyVectorComboBox->setVisible( hasFaces );
212 mSymbologyVectorComboBox->setCurrentIndex( hasFaces ? settings.symbology() : 0 );
213
214 // Arrow settings
216
217 // basic
218 mColorWidget->setColor( settings.color() );
219 mLineWidthSpinBox->setValue( settings.lineWidth() );
220 mColoringMethodComboBox->setCurrentIndex( mColoringMethodComboBox->findData( settings.coloringMethod() ) );
221 mColorRampShaderWidget->setFromShader( settings.colorRampShader() );
222 mColorRampShaderMinimumSpinBox->setValue( settings.colorRampShader().minimumValue() );
223 mColorRampShaderMaximumSpinBox->setValue( settings.colorRampShader().maximumValue() );
224
225 // filter by magnitude
226 if ( settings.filterMin() > 0 )
227 {
228 mMinMagSpinBox->setValue( settings.filterMin() );
229 }
230 if ( settings.filterMax() > 0 )
231 {
232 mMaxMagSpinBox->setValue( settings.filterMax() );
233 }
234
235 // arrow head
236 mHeadWidthSpinBox->setValue( arrowSettings.arrowHeadWidthRatio() * 100.0 );
237 mHeadLengthSpinBox->setValue( arrowSettings.arrowHeadLengthRatio() * 100.0 );
238
239 // user grid
240 mDisplayVectorsOnGridGroupBox->setVisible( hasFaces );
241 mDisplayVectorsOnGridGroupBox->setChecked( settings.isOnUserDefinedGrid() && hasFaces );
242 mXSpacingSpinBox->setValue( settings.userGridCellWidth() );
243 mYSpacingSpinBox->setValue( settings.userGridCellHeight() );
244
245 // shaft length
246 mShaftLengthComboBox->setCurrentIndex( arrowSettings.shaftLengthMethod() );
247
248 mMinimumShaftSpinBox->setValue( arrowSettings.minShaftLength() );
249 mMaximumShaftSpinBox->setValue( arrowSettings.maxShaftLength() );
250 mScaleShaftByFactorOfSpinBox->setValue( arrowSettings.scaleFactor() );
251 mShaftLengthSpinBox->setValue( arrowSettings.fixedShaftLength() );
252
253 //Streamlines settings
255
256 mStreamlinesSeedingMethodComboBox->setCurrentIndex( streamlinesSettings.seedingMethod() );
257 mStreamlinesDensitySpinBox->setValue( streamlinesSettings.seedingDensity() * 100 );
258
259 //Traces settings
261
262 mTracesMaxLengthSpinBox->setValue( tracesSettings.maximumTailLength() );
263 mTracesTailLengthMapUnitWidget->setUnit( tracesSettings.maximumTailLengthUnit() );
264 mTracesParticlesCountSpinBox->setValue( tracesSettings.particlesCount() );
265
266}
267
268void QgsMeshRendererVectorSettingsWidget::onSymbologyChanged( int currentIndex )
269{
270 mStreamlineWidget->setVisible( currentIndex == QgsMeshRendererVectorSettings::Streamlines );
271 mArrowLengthGroupBox->setVisible( currentIndex == QgsMeshRendererVectorSettings::Arrows );
272 mHeadOptionsGroupBox->setVisible( currentIndex == QgsMeshRendererVectorSettings::Arrows );
273 mTracesGroupBox->setVisible( currentIndex == QgsMeshRendererVectorSettings::Traces );
274
275 mDisplayVectorsOnGridGroupBox->setVisible( currentIndex != QgsMeshRendererVectorSettings::Traces );
276 filterByMagnitudeLabel->setVisible( currentIndex != QgsMeshRendererVectorSettings::Traces );
277 minimumMagLabel->setVisible( currentIndex != QgsMeshRendererVectorSettings::Traces );
278 mMinMagSpinBox->setVisible( currentIndex != QgsMeshRendererVectorSettings::Traces );
279 maximumMagLabel->setVisible( currentIndex != QgsMeshRendererVectorSettings::Traces );
280 mMaxMagSpinBox->setVisible( currentIndex != QgsMeshRendererVectorSettings::Traces );
281
282 mDisplayVectorsOnGridGroupBox->setEnabled(
285 mStreamlinesSeedingMethodComboBox->currentIndex() == QgsMeshRendererVectorStreamlineSettings::MeshGridded ) ) ;
286}
287
288void QgsMeshRendererVectorSettingsWidget::onStreamLineSeedingMethodChanged( int currentIndex )
289{
290 bool enabled = currentIndex == QgsMeshRendererVectorStreamlineSettings::Random;
291 mStreamlinesDensityLabel->setEnabled( enabled );
292 mStreamlinesDensitySpinBox->setEnabled( enabled );
293
294 mDisplayVectorsOnGridGroupBox->setEnabled( !enabled );
295}
296
297void QgsMeshRendererVectorSettingsWidget::onColoringMethodChanged()
298{
299 mColorRampShaderGroupBox->setVisible( mColoringMethodComboBox->currentData() == QgsInterpolatedLineColor::ColorRamp );
300 mColorWidget->setVisible( mColoringMethodComboBox->currentData() == QgsInterpolatedLineColor::SingleColor );
301 mSingleColorLabel->setVisible( mColoringMethodComboBox->currentData() == QgsInterpolatedLineColor::SingleColor );
302
303 if ( mColorRampShaderWidget->shader().colorRampItemList().isEmpty() )
304 loadColorRampShader();
305
306 emit widgetChanged();
307}
308
309void QgsMeshRendererVectorSettingsWidget::onColorRampMinMaxChanged()
310{
311 mColorRampShaderWidget->setMinimumMaximumAndClassify(
312 filterValue( mColorRampShaderMinimumSpinBox, 0 ),
313 filterValue( mColorRampShaderMaximumSpinBox, 0 ) );
314}
315
316void QgsMeshRendererVectorSettingsWidget::loadColorRampShader()
317{
318 if ( !mMeshLayer )
319 return;
320
321 int currentVectorDataSetGroupIndex = mMeshLayer->rendererSettings().activeVectorDatasetGroup();
322 if ( currentVectorDataSetGroupIndex < 0 ||
323 !mMeshLayer->datasetGroupMetadata( currentVectorDataSetGroupIndex ).isVector() )
324 return;
325
326 const QgsMeshDatasetGroupMetadata meta = mMeshLayer->datasetGroupMetadata( currentVectorDataSetGroupIndex );
327 double min = meta.minimum();
328 double max = meta.maximum();
329
330 mColorRampShaderWidget->setMinimumMaximumAndClassify( min, max );
331 whileBlocking( mColorRampShaderMinimumSpinBox )->setValue( min );
332 whileBlocking( mColorRampShaderMaximumSpinBox )->setValue( max );
333}
334
335double QgsMeshRendererVectorSettingsWidget::filterValue( const QgsDoubleSpinBox *spinBox, double errVal ) const
336{
337 if ( spinBox->value() == spinBox->clearValue() )
338 return errVal;
339
340 return spinBox->value();
341}
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
void widgetChanged()
Widget changed.
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value.
ColoringMethod
Defines how the color is defined.
@ ColorRamp
Render with a color ramp.
@ SingleColor
Render with a single color.
bool contains(const QgsMesh::ElementType &type) const
Returns whether the mesh contains at mesh elements of given type.
QgsMeshDatasetGroupMetadata is a collection of dataset group metadata such as whether the data is vec...
bool isVector() const
Returns whether dataset group has vector data.
double minimum() const
Returns minimum scalar value/vector magnitude present for whole dataset group.
double maximum() const
Returns maximum scalar value/vector magnitude present for whole dataset group.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Definition: qgsmeshlayer.h:100
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
QgsMeshDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
Represents all mesh renderer settings.
int activeVectorDatasetGroup() const
Returns the active vector dataset group.
QgsMeshRendererVectorSettings vectorSettings(int groupIndex) const
Returns renderer settings.
Represents a mesh renderer settings for vector datasets displayed with arrows.
void setFixedShaftLength(double fixedShaftLength)
Sets fixed length (in millimeters)
void setMaxShaftLength(double maxShaftLength)
Sets maximum shaft length (in millimeters)
QgsMeshRendererVectorArrowSettings::ArrowScalingMethod shaftLengthMethod() const
Returns method used for drawing arrows.
void setMinShaftLength(double minShaftLength)
Sets mininimum shaft length (in millimeters)
double fixedShaftLength() const
Returns fixed arrow length (in millimeters)
void setArrowHeadWidthRatio(double arrowHeadWidthRatio)
Sets ratio of the head width of the arrow (range 0-1)
double scaleFactor() const
Returns scale factor.
double maxShaftLength() const
Returns maximum shaft length (in millimeters)
double arrowHeadWidthRatio() const
Returns ratio of the head width of the arrow (range 0-1)
void setArrowHeadLengthRatio(double arrowHeadLengthRatio)
Sets ratio of the head length of the arrow (range 0-1)
void setScaleFactor(double scaleFactor)
Sets scale factor.
void setShaftLengthMethod(ArrowScalingMethod shaftLengthMethod)
Sets method used for drawing arrows.
ArrowScalingMethod
Algorithm how to transform vector magnitude to length of arrow on the device in pixels.
double minShaftLength() const
Returns mininimum shaft length (in millimeters)
double arrowHeadLengthRatio() const
Returns ratio of the head length of the arrow (range 0-1)
QgsMeshRendererVectorSettingsWidget(QWidget *parent=nullptr)
A widget to hold the renderer Vector settings for a mesh layer.
QgsMeshRendererVectorSettings settings() const
Returns vector settings.
void syncToLayer()
Synchronizes widgets state with associated mesh layer.
void setLayer(QgsMeshLayer *layer)
Associates mesh layer with the widget.
void widgetChanged()
Mesh rendering settings changed.
Represents a renderer settings for vector datasets.
void setColorRampShader(const QgsColorRampShader &colorRampShader)
Returns the color ramp shader used to render vector datasets.
void setStreamLinesSettings(const QgsMeshRendererVectorStreamlineSettings &streamLinesSettings)
Sets settings for vector rendered with streamlines.
int userGridCellWidth() const
Returns width in pixels of user grid cell.
void setArrowsSettings(const QgsMeshRendererVectorArrowSettings &arrowSettings)
Sets settings for vector rendered with arrows.
void setUserGridCellWidth(int width)
Sets width of user grid cell (in pixels)
void setColor(const QColor &color)
Sets color used for drawing arrows.
QgsMeshRendererVectorTracesSettings tracesSettings() const
Returns settings for vector rendered with traces.
QColor color() const
Returns color used for drawing arrows.
int userGridCellHeight() const
Returns height in pixels of user grid cell.
void setOnUserDefinedGrid(bool enabled)
Toggles drawing of vectors on user defined grid.
double lineWidth() const
Returns line width of the arrow (in millimeters)
Symbology
Defines the symbology of vector rendering.
@ Traces
Displaying vector dataset with particle traces.
@ Arrows
Displaying vector dataset with arrows.
@ Streamlines
Displaying vector dataset with streamlines.
void setUserGridCellHeight(int height)
Sets height of user grid cell (in pixels)
Symbology symbology() const
Returns the displaying method used to render vector datasets.
double filterMax() const
Returns filter value for vector magnitudes.
QgsColorRampShader colorRampShader() const
Sets the color ramp shader used to render vector datasets.
void setSymbology(const Symbology &symbology)
Sets the displaying method used to render vector datasets.
void setFilterMin(double filterMin)
Sets filter value for vector magnitudes.
QgsMeshRendererVectorArrowSettings arrowSettings() const
Returns settings for vector rendered with arrows.
void setFilterMax(double filterMax)
Sets filter value for vector magnitudes.
void setTracesSettings(const QgsMeshRendererVectorTracesSettings &tracesSettings)
Sets settings for vector rendered with traces.
void setColoringMethod(const QgsInterpolatedLineColor::ColoringMethod &coloringMethod)
Sets the coloring method used to render vector datasets.
QgsInterpolatedLineColor::ColoringMethod coloringMethod() const
Returns the coloring method used to render vector datasets.
void setLineWidth(double lineWidth)
Sets line width of the arrow in pixels (in millimeters)
bool isOnUserDefinedGrid() const
Returns whether vectors are drawn on user-defined grid.
double filterMin() const
Returns filter value for vector magnitudes.
QgsMeshRendererVectorStreamlineSettings streamLinesSettings() const
Returns settings for vector rendered with streamlines.
Represents a streamline renderer settings for vector datasets displayed by streamlines.
void setSeedingDensity(double seedingDensity)
Sets the density used for seeding start points.
SeedingStartPointsMethod seedingMethod() const
Returns the method used for seeding start points of strealines.
void setSeedingMethod(const SeedingStartPointsMethod &seedingMethod)
Sets the method used for seeding start points of strealines.
SeedingStartPointsMethod
Method used to define start points that are used to draw streamlines.
@ Random
Seeds start points randomly on the mesh.
@ MeshGridded
Seeds start points on the vertices mesh or user regular grid.
double seedingDensity() const
Returns the density used for seeding start points.
Represents a trace renderer settings for vector datasets displayed by particle traces.
void setMaximumTailLength(double maximumTailLength)
Sets the maximums tail length.
double maximumTailLength() const
Returns the maximum tail length.
QgsUnitTypes::RenderUnit maximumTailLengthUnit() const
Returns the maximum tail length unit.
int particlesCount() const
Returns particles count.
void setParticlesCount(int value)
Sets particles count.
void setMaximumTailLengthUnit(const QgsUnitTypes::RenderUnit &maximumTailLengthUnit)
Sets the maximum tail length unit.
double maximumValue() const
Returns the minimum value for the raster shader.
double minimumValue() const
Returns the maximum value for the raster shader.
QList< QgsUnitTypes::RenderUnit > RenderUnitList
List of render units.
Definition: qgsunittypes.h:240
@ RenderMetersInMapUnits
Meters value as Map units.
Definition: qgsunittypes.h:176
@ RenderPoints
Points (e.g., for font sizes)
Definition: qgsunittypes.h:173
@ RenderPixels
Pixels.
Definition: qgsunittypes.h:171
@ RenderMillimeters
Millimeters.
Definition: qgsunittypes.h:169
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition: qgis.h:2453