QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgsprojectelevationproperties.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprojectelevationproperties.cpp
3 ---------------
4 begin : February 2022
5 copyright : (C) 2022 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
18
19#include "qgis.h"
20#include "qgsterrainprovider.h"
21
22#include <QDomElement>
23#include <QString>
24
25#include "moc_qgsprojectelevationproperties.cpp"
26
27using namespace Qt::StringLiterals;
28
30 : QObject( parent )
31 , mTerrainProvider( std::make_unique< QgsFlatTerrainProvider >() )
32{
33
34}
35
37
39{
40 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
41 mElevationRange = QgsDoubleRange();
42 emit changed();
43 emit elevationRangeChanged( mElevationRange );
44}
45
47{
48 if ( mTerrainProvider )
49 mTerrainProvider->resolveReferences( project );
50}
51
52bool QgsProjectElevationProperties::readXml( const QDomElement &element, const QgsReadWriteContext &context )
53{
54 const QDomElement providerElement = element.firstChildElement( u"terrainProvider"_s );
55 if ( !providerElement.isNull() )
56 {
57 const QString type = providerElement.attribute( u"type"_s );
58 if ( type.compare( "flat"_L1 ) == 0 )
59 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
60 else if ( type.compare( "raster"_L1 ) == 0 )
61 mTerrainProvider = std::make_unique< QgsRasterDemTerrainProvider >();
62 else if ( type.compare( "mesh"_L1 ) == 0 )
63 mTerrainProvider = std::make_unique< QgsMeshTerrainProvider >();
64 else
65 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
66
67 mTerrainProvider->readXml( providerElement, context );
68 }
69 else
70 {
71 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
72 }
73
74 bool ok = false;
75 double rangeLower = std::numeric_limits< double >::lowest();
76 const double storedRangeLower = element.attribute( u"RangeLower"_s ).toDouble( &ok );
77 if ( ok )
78 rangeLower = storedRangeLower;
79 double rangeUpper = std::numeric_limits< double >::max();
80 const double storedRangeUpper = element.attribute( u"RangeUpper"_s ).toDouble( &ok );
81 if ( ok )
82 rangeUpper = storedRangeUpper;
83 mElevationRange = QgsDoubleRange( rangeLower, rangeUpper );
84
85 mElevationFilterRangeSize = element.attribute( u"FilterRangeSize"_s ).toDouble( &ok );
86 if ( !ok )
87 mElevationFilterRangeSize = -1;
88
89 mInvertElevationFilter = element.attribute( u"FilterInvertSlider"_s, u"0"_s ).toInt();
90
91 emit changed();
92 emit elevationRangeChanged( mElevationRange );
93 return true;
94}
95
96QDomElement QgsProjectElevationProperties::writeXml( QDomDocument &document, const QgsReadWriteContext &context ) const
97{
98 QDomElement element = document.createElement( u"ElevationProperties"_s );
99
100 if ( mTerrainProvider )
101 {
102 QDomElement providerElement = document.createElement( u"terrainProvider"_s );
103 providerElement.setAttribute( u"type"_s, mTerrainProvider->type() );
104 providerElement.appendChild( mTerrainProvider->writeXml( document, context ) );
105 element.appendChild( providerElement );
106 }
107
108 if ( mElevationRange.lower() != std::numeric_limits< double >::lowest() )
109 element.setAttribute( u"RangeLower"_s, qgsDoubleToString( mElevationRange.lower() ) );
110 if ( mElevationRange.upper() != std::numeric_limits< double >::max() )
111 element.setAttribute( u"RangeUpper"_s, qgsDoubleToString( mElevationRange.upper() ) );
112
113 if ( mElevationFilterRangeSize >= 0 )
114 {
115 element.setAttribute( u"FilterRangeSize"_s, mElevationFilterRangeSize );
116 }
117 element.setAttribute( u"FilterInvertSlider"_s, mInvertElevationFilter ? "1" : "0" );
118
119 return element;
120}
121
126
128{
129 if ( mTerrainProvider.get() == provider )
130 return;
131
132 const bool hasChanged = ( provider && mTerrainProvider ) ? !mTerrainProvider->equals( provider ) : ( static_cast< bool >( provider ) != static_cast< bool >( mTerrainProvider.get() ) );
133
134 mTerrainProvider.reset( provider );
135 if ( hasChanged )
136 emit changed();
137}
138
140{
141 if ( mElevationFilterRangeSize == size )
142 return;
143
144 mElevationFilterRangeSize = size;
145 emit changed();
146}
147
149{
150 if ( mInvertElevationFilter == invert )
151 return;
152
153 mInvertElevationFilter = invert;
154 emit changed();
155}
156
158{
159 if ( mElevationRange == range )
160 return;
161
162 mElevationRange = range;
163 emit changed();
164 emit elevationRangeChanged( mElevationRange );
165}
Abstract base class for terrain providers.
virtual bool equals(const QgsAbstractTerrainProvider *other) const =0
Returns true if the provider is equal to other.
QgsRange which stores a range of double values.
Definition qgsrange.h:236
A terrain provider where the terrain is a simple flat surface.
void setElevationFilterRangeSize(double size)
Sets the fixed size for elevation range filtering in the project, used when interactively filtering b...
bool readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads the property state from a DOM element.
void reset()
Resets the properties to a default state.
QgsProjectElevationProperties(QObject *parent=nullptr)
Constructor for QgsProjectElevationProperties with the specified parent object.
QDomElement writeXml(QDomDocument &document, const QgsReadWriteContext &context) const
Returns a DOM element representing the properties.
~QgsProjectElevationProperties() override
void setElevationRange(const QgsDoubleRange &range)
Sets the project's elevation range, which indicates the upper and lower elevation limits associated w...
QgsAbstractTerrainProvider * terrainProvider()
Returns the project's terrain provider.
void elevationRangeChanged(const QgsDoubleRange &range)
Emitted when the project's elevation is changed.
void changed()
Emitted when the elevation properties change.
void resolveReferences(const QgsProject *project)
Resolves reference to layers from stored layer ID.
void setInvertElevationFilter(bool invert)
Sets whether the elevation range filter slider should be inverted for this project.
void setTerrainProvider(QgsAbstractTerrainProvider *provider)
Sets the project's terrain provider.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:112
A container for the context for various read/write operations on objects.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Definition qgis.h:6817