QGIS API Documentation 3.99.0-Master (21b3aa880ba)
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 "moc_qgsrenderermeshpropertieswidget.cpp"
27
29 : QgsMapLayerConfigWidget( layer, canvas, parent )
30 , mMeshLayer( layer )
31{
32 if ( !mMeshLayer )
33 return;
34
35 setupUi( this );
36
37 connect( mMeshLayer, &QgsMeshLayer::dataChanged, this, &QgsRendererMeshPropertiesWidget::syncToLayerPrivate );
38
39 mMeshRendererActiveDatasetWidget->setLayer( mMeshLayer );
40 mMeshRendererScalarSettingsWidget->setLayer( mMeshLayer );
41 mMeshRendererScalarSettingsWidget->setCanvas( mMapCanvas );
42 mNativeMeshSettingsWidget->setLayer( mMeshLayer, QgsMeshRendererMeshSettingsWidget::MeshType::Native );
43 mTriangularMeshSettingsWidget->setLayer( mMeshLayer, QgsMeshRendererMeshSettingsWidget::MeshType::Triangular );
44 mEdgeMeshSettingsWidget->setLayer( mMeshLayer, QgsMeshRendererMeshSettingsWidget::MeshType::Edge );
45 mMeshRendererVectorSettingsWidget->setLayer( mMeshLayer );
46 m3dAveragingSettingsWidget->setLayer( mMeshLayer );
47 syncToLayer( mMeshLayer );
48
49 //blend mode
50 mBlendModeComboBox->setShowClippingModes( QgsProjectUtils::layerIsContainedInGroupLayer( QgsProject::instance(), mMeshLayer ) );
51 mBlendModeComboBox->setBlendMode( mMeshLayer->blendMode() );
52 connect( mBlendModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
53
54 mOpacityWidget->setOpacity( mMeshLayer->opacity() );
55 connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsPanelWidget::widgetChanged );
56
57 connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::activeScalarGroupChanged, this, &QgsRendererMeshPropertiesWidget::onActiveScalarGroupChanged );
58 connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::activeVectorGroupChanged, this, &QgsRendererMeshPropertiesWidget::onActiveVectorGroupChanged );
59
60 connect( mNativeMeshGroup, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
61 connect( mEdgeMeshGroup, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
62 connect( mTriangularMeshGroup, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
63 connect( mContoursGroupBox, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
64 connect( mVectorsGroupBox, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
65 connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
66 connect( mMeshRendererScalarSettingsWidget, &QgsMeshRendererScalarSettingsWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
67 connect( mMeshRendererVectorSettingsWidget, &QgsMeshRendererVectorSettingsWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
68 connect( mNativeMeshSettingsWidget, &QgsMeshRendererMeshSettingsWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
69 connect( mTriangularMeshSettingsWidget, &QgsMeshRendererMeshSettingsWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
71 connect( m3dAveragingSettingsWidget, &QgsMeshRenderer3DAveragingWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
72}
73
75{
76 if ( !mMeshLayer )
77 return;
78
79 // 1D EDGE MESH
80 const bool edgeMeshRenderingIsEnabled = mEdgeMeshGroup->isChecked();
81 QgsMeshRendererMeshSettings edgeMeshSettings = mEdgeMeshSettingsWidget->settings();
82 edgeMeshSettings.setEnabled( edgeMeshRenderingIsEnabled );
83
84 // 2D NATIVE MESH
85 const bool nativeMeshRenderingIsEnabled = mNativeMeshGroup->isChecked();
86 QgsMeshRendererMeshSettings nativeMeshSettings = mNativeMeshSettingsWidget->settings();
87 nativeMeshSettings.setEnabled( nativeMeshRenderingIsEnabled );
88
89 // 2D TRIANGULAR MESH
90 const bool triangularMeshRenderingIsEnabled = mTriangularMeshGroup->isChecked();
91 QgsMeshRendererMeshSettings triangularMeshSettings = mTriangularMeshSettingsWidget->settings();
92 triangularMeshSettings.setEnabled( triangularMeshRenderingIsEnabled );
93
94 // SCALAR
95 int activeScalarDatasetGroupIndex = mMeshRendererActiveDatasetWidget->activeScalarDatasetGroup();
96 if ( !mContoursGroupBox->isChecked() )
97 activeScalarDatasetGroupIndex = -1;
98
99 // VECTOR
100 int activeVectorDatasetGroupIndex = mMeshRendererActiveDatasetWidget->activeVectorDatasetGroup();
101 if ( !mVectorsGroupBox->isChecked() )
102 activeVectorDatasetGroupIndex = -1;
103
104 QgsMeshRendererSettings settings = mMeshLayer->rendererSettings();
105 settings.setEdgeMeshSettings( edgeMeshSettings );
106 settings.setNativeMeshSettings( nativeMeshSettings );
107 settings.setTriangularMeshSettings( triangularMeshSettings );
108
109 settings.setActiveScalarDatasetGroup( activeScalarDatasetGroupIndex );
110 if ( activeScalarDatasetGroupIndex > -1 )
111 settings.setScalarSettings( activeScalarDatasetGroupIndex, mMeshRendererScalarSettingsWidget->settings() );
112
113 settings.setActiveVectorDatasetGroup( activeVectorDatasetGroupIndex );
114 if ( activeVectorDatasetGroupIndex > -1 )
115 settings.setVectorSettings( activeVectorDatasetGroupIndex, mMeshRendererVectorSettingsWidget->settings() );
116
117 const QgsMeshDatasetIndex staticScalarDatasetIndex( activeScalarDatasetGroupIndex, mMeshLayer->staticScalarDatasetIndex().dataset() );
118 const QgsMeshDatasetIndex staticVectorDatasetIndex( activeVectorDatasetGroupIndex, mMeshLayer->staticVectorDatasetIndex().dataset() );
119 mMeshLayer->setStaticScalarDatasetIndex( staticScalarDatasetIndex );
120 mMeshLayer->setStaticVectorDatasetIndex( staticVectorDatasetIndex );
121
122 //set the blend mode and opacity for the layer
123 mMeshLayer->setBlendMode( mBlendModeComboBox->blendMode() );
124 mLayer->setOpacity( mOpacityWidget->opacity() );
125 //set the averaging method for the layer
126 const std::unique_ptr<QgsMesh3DAveragingMethod> averagingMethod( m3dAveragingSettingsWidget->averagingMethod() );
127 settings.setAveragingMethod( averagingMethod.get() );
128 mMeshLayer->setRendererSettings( settings );
129 mMeshLayer->triggerRepaint();
130
131 QgsSettings windowsSettings;
132 windowsSettings.setValue( QStringLiteral( "/Windows/RendererMeshProperties/tab" ), mStyleOptionsTab->currentIndex() );
133}
134
136{
137 QgsMeshLayer *ml = qobject_cast<QgsMeshLayer *>( mapLayer );
138 if ( ml )
139 {
140 mLayer = ml;
141 mMeshRendererActiveDatasetWidget->setLayer( ml );
142 mNativeMeshSettingsWidget->setLayer( ml, QgsMeshRendererMeshSettingsWidget::Native );
143 mTriangularMeshSettingsWidget->setLayer( ml, QgsMeshRendererMeshSettingsWidget::Triangular );
144 mEdgeMeshSettingsWidget->setLayer( ml, QgsMeshRendererMeshSettingsWidget::Edge );
145 m3dAveragingSettingsWidget->setLayer( ml );
146 }
147 else
148 return;
149
150 syncToLayerPrivate();
151}
152
153void QgsRendererMeshPropertiesWidget::syncToLayerPrivate()
154{
155 if ( !mMeshLayer )
156 return;
157
158 mMeshRendererActiveDatasetWidget->syncToLayer();
159 mNativeMeshSettingsWidget->syncToLayer();
160 mTriangularMeshSettingsWidget->syncToLayer();
161 mEdgeMeshSettingsWidget->syncToLayer();
162 m3dAveragingSettingsWidget->syncToLayer();
163
164 mNativeMeshGroup->setChecked( mMeshLayer->rendererSettings().nativeMeshSettings().isEnabled() );
165 mTriangularMeshGroup->setChecked( mMeshLayer->rendererSettings().triangularMeshSettings().isEnabled() );
166 mEdgeMeshGroup->setChecked( mMeshLayer->rendererSettings().edgeMeshSettings().isEnabled() );
167
168 onActiveScalarGroupChanged( mMeshLayer->rendererSettings().activeScalarDatasetGroup() );
169 onActiveVectorGroupChanged( mMeshLayer->rendererSettings().activeVectorDatasetGroup() );
170
171 const bool hasFaces = ( mMeshLayer->contains( QgsMesh::ElementType::Face ) );
172 mFaceMeshGroupBox->setVisible( hasFaces || !mMeshLayer->isValid() );
173
174 const bool hasEdges = ( mMeshLayer->contains( QgsMesh::ElementType::Edge ) );
175 mEdgeMeshGroupBox->setVisible( hasEdges || !mMeshLayer->isValid() );
176
177 QgsSettings settings;
178 if ( !settings.contains( QStringLiteral( "/Windows/RendererMeshProperties/tab" ) ) )
179 settings.setValue( QStringLiteral( "/Windows/RendererMeshProperties/tab" ), 0 );
180 else
181 mStyleOptionsTab->setCurrentIndex( settings.value( QStringLiteral( "/Windows/RendererMeshProperties/tab" ) ).toInt() );
182}
183
184void QgsRendererMeshPropertiesWidget::onActiveScalarGroupChanged( int groupIndex )
185{
186 mMeshRendererScalarSettingsWidget->setActiveDatasetGroup( groupIndex );
187 mMeshRendererScalarSettingsWidget->syncToLayer();
188 mContoursGroupBox->setChecked( groupIndex >= 0 );
189 mContoursGroupBox->setEnabled( groupIndex >= 0 );
190}
191
192void QgsRendererMeshPropertiesWidget::onActiveVectorGroupChanged( int groupIndex )
193{
194 if ( groupIndex >= 0 && !mMeshLayer->datasetGroupMetadata( groupIndex ).isVector() )
195 groupIndex = -1;
196 mMeshRendererVectorSettingsWidget->setActiveDatasetGroup( groupIndex );
197 mMeshRendererVectorSettingsWidget->syncToLayer();
198 mVectorsGroupBox->setChecked( groupIndex >= 0 );
199 mVectorsGroupBox->setEnabled( groupIndex >= 0 );
200}
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:80
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:65
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.