QGIS API Documentation 3.99.0-Master (e9821da5c6b)
Loading...
Searching...
No Matches
qgsrenderermeshpropertieswidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsrenderermeshpropertieswidget.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 "qgsmapcanvas.h"
20#include "qgsmeshlayer.h"
23#include "qgsproject.h"
24#include "qgsprojectutils.h"
25
26#include <QString>
27
28#include "moc_qgsrenderermeshpropertieswidget.cpp"
29
30using namespace Qt::StringLiterals;
31
33 : QgsMapLayerConfigWidget( layer, canvas, parent )
34 , mMeshLayer( layer )
35{
36 if ( !mMeshLayer )
37 return;
38
39 setupUi( this );
40
41 connect( mMeshLayer, &QgsMeshLayer::dataChanged, this, &QgsRendererMeshPropertiesWidget::syncToLayerPrivate );
42
43 mMeshRendererActiveDatasetWidget->setLayer( mMeshLayer );
44 mMeshRendererScalarSettingsWidget->setLayer( mMeshLayer );
45 mMeshRendererScalarSettingsWidget->setCanvas( mMapCanvas );
46 mNativeMeshSettingsWidget->setLayer( mMeshLayer, QgsMeshRendererMeshSettingsWidget::MeshType::Native );
47 mTriangularMeshSettingsWidget->setLayer( mMeshLayer, QgsMeshRendererMeshSettingsWidget::MeshType::Triangular );
48 mEdgeMeshSettingsWidget->setLayer( mMeshLayer, QgsMeshRendererMeshSettingsWidget::MeshType::Edge );
49 mMeshRendererVectorSettingsWidget->setLayer( mMeshLayer );
50 m3dAveragingSettingsWidget->setLayer( mMeshLayer );
51 syncToLayer( mMeshLayer );
52
53 //blend mode
54 mBlendModeComboBox->setShowClippingModes( QgsProjectUtils::layerIsContainedInGroupLayer( QgsProject::instance(), mMeshLayer ) );
55 mBlendModeComboBox->setBlendMode( mMeshLayer->blendMode() );
56 connect( mBlendModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
57
58 mOpacityWidget->setOpacity( mMeshLayer->opacity() );
59 connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsPanelWidget::widgetChanged );
60
61 connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::activeScalarGroupChanged, this, &QgsRendererMeshPropertiesWidget::onActiveScalarGroupChanged );
62 connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::activeVectorGroupChanged, this, &QgsRendererMeshPropertiesWidget::onActiveVectorGroupChanged );
63
64 connect( mNativeMeshGroup, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
65 connect( mEdgeMeshGroup, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
66 connect( mTriangularMeshGroup, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
67 connect( mContoursGroupBox, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
68 connect( mVectorsGroupBox, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
69 connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
70 connect( mMeshRendererScalarSettingsWidget, &QgsMeshRendererScalarSettingsWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
71 connect( mMeshRendererVectorSettingsWidget, &QgsMeshRendererVectorSettingsWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
72 connect( mNativeMeshSettingsWidget, &QgsMeshRendererMeshSettingsWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
73 connect( mTriangularMeshSettingsWidget, &QgsMeshRendererMeshSettingsWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
75 connect( m3dAveragingSettingsWidget, &QgsMeshRenderer3DAveragingWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
76}
77
79{
80 if ( !mMeshLayer )
81 return;
82
83 // 1D EDGE MESH
84 const bool edgeMeshRenderingIsEnabled = mEdgeMeshGroup->isChecked();
85 QgsMeshRendererMeshSettings edgeMeshSettings = mEdgeMeshSettingsWidget->settings();
86 edgeMeshSettings.setEnabled( edgeMeshRenderingIsEnabled );
87
88 // 2D NATIVE MESH
89 const bool nativeMeshRenderingIsEnabled = mNativeMeshGroup->isChecked();
90 QgsMeshRendererMeshSettings nativeMeshSettings = mNativeMeshSettingsWidget->settings();
91 nativeMeshSettings.setEnabled( nativeMeshRenderingIsEnabled );
92
93 // 2D TRIANGULAR MESH
94 const bool triangularMeshRenderingIsEnabled = mTriangularMeshGroup->isChecked();
95 QgsMeshRendererMeshSettings triangularMeshSettings = mTriangularMeshSettingsWidget->settings();
96 triangularMeshSettings.setEnabled( triangularMeshRenderingIsEnabled );
97
98 // SCALAR
99 int activeScalarDatasetGroupIndex = mMeshRendererActiveDatasetWidget->activeScalarDatasetGroup();
100 if ( !mContoursGroupBox->isChecked() )
101 activeScalarDatasetGroupIndex = -1;
102
103 // VECTOR
104 int activeVectorDatasetGroupIndex = mMeshRendererActiveDatasetWidget->activeVectorDatasetGroup();
105 if ( !mVectorsGroupBox->isChecked() )
106 activeVectorDatasetGroupIndex = -1;
107
108 QgsMeshRendererSettings settings = mMeshLayer->rendererSettings();
109 settings.setEdgeMeshSettings( edgeMeshSettings );
110 settings.setNativeMeshSettings( nativeMeshSettings );
111 settings.setTriangularMeshSettings( triangularMeshSettings );
112
113 settings.setActiveScalarDatasetGroup( activeScalarDatasetGroupIndex );
114 if ( activeScalarDatasetGroupIndex > -1 )
115 settings.setScalarSettings( activeScalarDatasetGroupIndex, mMeshRendererScalarSettingsWidget->settings() );
116
117 settings.setActiveVectorDatasetGroup( activeVectorDatasetGroupIndex );
118 if ( activeVectorDatasetGroupIndex > -1 )
119 settings.setVectorSettings( activeVectorDatasetGroupIndex, mMeshRendererVectorSettingsWidget->settings() );
120
121 const QgsMeshDatasetIndex staticScalarDatasetIndex( activeScalarDatasetGroupIndex, mMeshLayer->staticScalarDatasetIndex().dataset() );
122 const QgsMeshDatasetIndex staticVectorDatasetIndex( activeVectorDatasetGroupIndex, mMeshLayer->staticVectorDatasetIndex().dataset() );
123 mMeshLayer->setStaticScalarDatasetIndex( staticScalarDatasetIndex );
124 mMeshLayer->setStaticVectorDatasetIndex( staticVectorDatasetIndex );
125
126 //set the blend mode and opacity for the layer
127 mMeshLayer->setBlendMode( mBlendModeComboBox->blendMode() );
128 mLayer->setOpacity( mOpacityWidget->opacity() );
129 //set the averaging method for the layer
130 const std::unique_ptr<QgsMesh3DAveragingMethod> averagingMethod( m3dAveragingSettingsWidget->averagingMethod() );
131 settings.setAveragingMethod( averagingMethod.get() );
132 mMeshLayer->setRendererSettings( settings );
133 mMeshLayer->triggerRepaint();
134
135 QgsSettings windowsSettings;
136 windowsSettings.setValue( u"/Windows/RendererMeshProperties/tab"_s, mStyleOptionsTab->currentIndex() );
137}
138
140{
141 QgsMeshLayer *ml = qobject_cast<QgsMeshLayer *>( mapLayer );
142 if ( ml )
143 {
144 mLayer = ml;
145 mMeshRendererActiveDatasetWidget->setLayer( ml );
146 mNativeMeshSettingsWidget->setLayer( ml, QgsMeshRendererMeshSettingsWidget::Native );
147 mTriangularMeshSettingsWidget->setLayer( ml, QgsMeshRendererMeshSettingsWidget::Triangular );
148 mEdgeMeshSettingsWidget->setLayer( ml, QgsMeshRendererMeshSettingsWidget::Edge );
149 m3dAveragingSettingsWidget->setLayer( ml );
150 }
151 else
152 return;
153
154 syncToLayerPrivate();
155}
156
157void QgsRendererMeshPropertiesWidget::syncToLayerPrivate()
158{
159 if ( !mMeshLayer )
160 return;
161
162 mMeshRendererActiveDatasetWidget->syncToLayer();
163 mNativeMeshSettingsWidget->syncToLayer();
164 mTriangularMeshSettingsWidget->syncToLayer();
165 mEdgeMeshSettingsWidget->syncToLayer();
166 m3dAveragingSettingsWidget->syncToLayer();
167
168 mNativeMeshGroup->setChecked( mMeshLayer->rendererSettings().nativeMeshSettings().isEnabled() );
169 mTriangularMeshGroup->setChecked( mMeshLayer->rendererSettings().triangularMeshSettings().isEnabled() );
170 mEdgeMeshGroup->setChecked( mMeshLayer->rendererSettings().edgeMeshSettings().isEnabled() );
171
172 onActiveScalarGroupChanged( mMeshLayer->rendererSettings().activeScalarDatasetGroup() );
173 onActiveVectorGroupChanged( mMeshLayer->rendererSettings().activeVectorDatasetGroup() );
174
175 const bool hasFaces = ( mMeshLayer->contains( QgsMesh::ElementType::Face ) );
176 mFaceMeshGroupBox->setVisible( hasFaces || !mMeshLayer->isValid() );
177
178 const bool hasEdges = ( mMeshLayer->contains( QgsMesh::ElementType::Edge ) );
179 mEdgeMeshGroupBox->setVisible( hasEdges || !mMeshLayer->isValid() );
180
181 QgsSettings settings;
182 if ( !settings.contains( u"/Windows/RendererMeshProperties/tab"_s ) )
183 settings.setValue( u"/Windows/RendererMeshProperties/tab"_s, 0 );
184 else
185 mStyleOptionsTab->setCurrentIndex( settings.value( u"/Windows/RendererMeshProperties/tab"_s ).toInt() );
186}
187
188void QgsRendererMeshPropertiesWidget::onActiveScalarGroupChanged( int groupIndex )
189{
190 mMeshRendererScalarSettingsWidget->setActiveDatasetGroup( groupIndex );
191 mMeshRendererScalarSettingsWidget->syncToLayer();
192 mContoursGroupBox->setChecked( groupIndex >= 0 );
193 mContoursGroupBox->setEnabled( groupIndex >= 0 );
194}
195
196void QgsRendererMeshPropertiesWidget::onActiveVectorGroupChanged( int groupIndex )
197{
198 if ( groupIndex >= 0 && !mMeshLayer->datasetGroupMetadata( groupIndex ).isVector() )
199 groupIndex = -1;
200 mMeshRendererVectorSettingsWidget->setActiveDatasetGroup( groupIndex );
201 mMeshRendererVectorSettingsWidget->syncToLayer();
202 mVectorsGroupBox->setChecked( groupIndex >= 0 );
203 mVectorsGroupBox->setEnabled( groupIndex >= 0 );
204}
Map canvas is a class for displaying all GIS data types on a canvas.
QgsMapLayerConfigWidget(QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent=nullptr)
A panel widget that can be shown in the map style dock.
Base class for all map layer types.
Definition qgsmaplayer.h:83
void dataChanged()
Data of layer changed.
An index that identifies the dataset group (e.g.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
bool contains(const QgsMesh::ElementType &type) const
Returns whether the mesh contains at mesh elements of given type.
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
void widgetChanged()
Mesh rendering settings changed.
void widgetChanged()
Emitted when any settings related to rendering changed.
void activeScalarGroupChanged(int groupIndex)
Emitted when the current scalar group gets changed.
void activeVectorGroupChanged(int groupIndex)
Emitted when the current vector group gets changed.
void widgetChanged()
Mesh rendering settings changed.
Represents a mesh renderer settings for mesh objects.
void setEnabled(bool enabled)
Sets whether mesh structure rendering is enabled.
bool isEnabled() const
Returns whether mesh structure rendering is enabled.
void widgetChanged()
Mesh rendering settings changed.
Represents all mesh renderer settings.
void setAveragingMethod(QgsMesh3DAveragingMethod *method)
Sets averaging method for conversion of 3d stacked mesh data to 2d data.
void setActiveVectorDatasetGroup(int activeVectorDatasetGroup)
Sets the active vector dataset group.
int activeVectorDatasetGroup() const
Returns the active vector dataset group.
void setEdgeMeshSettings(const QgsMeshRendererMeshSettings &settings)
Sets new edge mesh renderer settings.
int activeScalarDatasetGroup() const
Returns the active scalar dataset group.
void setActiveScalarDatasetGroup(int activeScalarDatasetGroup)
Sets the active scalar dataset group.
void setVectorSettings(int groupIndex, const QgsMeshRendererVectorSettings &settings)
Sets new renderer settings.
void setTriangularMeshSettings(const QgsMeshRendererMeshSettings &settings)
Sets new triangular mesh renderer settings.
QgsMeshRendererMeshSettings edgeMeshSettings() const
Returns edge mesh renderer settings.
QgsMeshRendererMeshSettings nativeMeshSettings() const
Returns native mesh renderer settings.
void setScalarSettings(int groupIndex, const QgsMeshRendererScalarSettings &settings)
Sets new renderer settings.
QgsMeshRendererMeshSettings triangularMeshSettings() const
Returns triangular mesh renderer settings.
void setNativeMeshSettings(const QgsMeshRendererMeshSettings &settings)
Sets new native mesh renderer settings, triggers repaint.
void widgetChanged()
Mesh rendering settings changed.
void opacityChanged(double opacity)
Emitted when the opacity is changed in the widget, where opacity ranges from 0.0 (transparent) to 1....
void widgetChanged()
Emitted when the widget state changes.
static bool layerIsContainedInGroupLayer(QgsProject *project, QgsMapLayer *layer)
Returns true if the specified layer is a child layer from any QgsGroupLayer in the given project.
static QgsProject * instance()
Returns the QgsProject singleton instance.
void syncToLayer(QgsMapLayer *mapLayer) final
Synchronize widgets state with associated map layer.
void apply() override
Applies the settings made in the dialog.
QgsRendererMeshPropertiesWidget(QgsMeshLayer *layer, QgsMapCanvas *canvas, QWidget *parent=nullptr)
A widget to hold the renderer properties for a mesh layer.
Stores settings for use within QGIS.
Definition qgssettings.h:68
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
bool contains(const QString &key, QgsSettings::Section section=QgsSettings::NoSection) const
Returns true if there exists a setting called key; returns false otherwise.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.