QGIS API Documentation 3.99.0-Master (2fe06baccd8)
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
24#include "moc_qgsprojectelevationproperties.cpp"
25
27 : QObject( parent )
28 , mTerrainProvider( std::make_unique< QgsFlatTerrainProvider >() )
29{
30
31}
32
34
36{
37 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
38 mElevationRange = QgsDoubleRange();
39 emit changed();
40 emit elevationRangeChanged( mElevationRange );
41}
42
44{
45 if ( mTerrainProvider )
46 mTerrainProvider->resolveReferences( project );
47}
48
49bool QgsProjectElevationProperties::readXml( const QDomElement &element, const QgsReadWriteContext &context )
50{
51 const QDomElement providerElement = element.firstChildElement( QStringLiteral( "terrainProvider" ) );
52 if ( !providerElement.isNull() )
53 {
54 const QString type = providerElement.attribute( QStringLiteral( "type" ) );
55 if ( type.compare( QLatin1String( "flat" ) ) == 0 )
56 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
57 else if ( type.compare( QLatin1String( "raster" ) ) == 0 )
58 mTerrainProvider = std::make_unique< QgsRasterDemTerrainProvider >();
59 else if ( type.compare( QLatin1String( "mesh" ) ) == 0 )
60 mTerrainProvider = std::make_unique< QgsMeshTerrainProvider >();
61 else
62 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
63
64 mTerrainProvider->readXml( providerElement, context );
65 }
66 else
67 {
68 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
69 }
70
71 bool ok = false;
72 double rangeLower = std::numeric_limits< double >::lowest();
73 const double storedRangeLower = element.attribute( QStringLiteral( "RangeLower" ) ).toDouble( &ok );
74 if ( ok )
75 rangeLower = storedRangeLower;
76 double rangeUpper = std::numeric_limits< double >::max();
77 const double storedRangeUpper = element.attribute( QStringLiteral( "RangeUpper" ) ).toDouble( &ok );
78 if ( ok )
79 rangeUpper = storedRangeUpper;
80 mElevationRange = QgsDoubleRange( rangeLower, rangeUpper );
81
82 mElevationFilterRangeSize = element.attribute( QStringLiteral( "FilterRangeSize" ) ).toDouble( &ok );
83 if ( !ok )
84 mElevationFilterRangeSize = -1;
85
86 mInvertElevationFilter = element.attribute( QStringLiteral( "FilterInvertSlider" ), QStringLiteral( "0" ) ).toInt();
87
88 emit changed();
89 emit elevationRangeChanged( mElevationRange );
90 return true;
91}
92
93QDomElement QgsProjectElevationProperties::writeXml( QDomDocument &document, const QgsReadWriteContext &context ) const
94{
95 QDomElement element = document.createElement( QStringLiteral( "ElevationProperties" ) );
96
97 if ( mTerrainProvider )
98 {
99 QDomElement providerElement = document.createElement( QStringLiteral( "terrainProvider" ) );
100 providerElement.setAttribute( QStringLiteral( "type" ), mTerrainProvider->type() );
101 providerElement.appendChild( mTerrainProvider->writeXml( document, context ) );
102 element.appendChild( providerElement );
103 }
104
105 if ( mElevationRange.lower() != std::numeric_limits< double >::lowest() )
106 element.setAttribute( QStringLiteral( "RangeLower" ), qgsDoubleToString( mElevationRange.lower() ) );
107 if ( mElevationRange.upper() != std::numeric_limits< double >::max() )
108 element.setAttribute( QStringLiteral( "RangeUpper" ), qgsDoubleToString( mElevationRange.upper() ) );
109
110 if ( mElevationFilterRangeSize >= 0 )
111 {
112 element.setAttribute( QStringLiteral( "FilterRangeSize" ), mElevationFilterRangeSize );
113 }
114 element.setAttribute( QStringLiteral( "FilterInvertSlider" ), mInvertElevationFilter ? "1" : "0" );
115
116 return element;
117}
118
123
125{
126 if ( mTerrainProvider.get() == provider )
127 return;
128
129 const bool hasChanged = ( provider && mTerrainProvider ) ? !mTerrainProvider->equals( provider ) : ( static_cast< bool >( provider ) != static_cast< bool >( mTerrainProvider.get() ) );
130
131 mTerrainProvider.reset( provider );
132 if ( hasChanged )
133 emit changed();
134}
135
137{
138 if ( mElevationFilterRangeSize == size )
139 return;
140
141 mElevationFilterRangeSize = size;
142 emit changed();
143}
144
146{
147 if ( mInvertElevationFilter == invert )
148 return;
149
150 mInvertElevationFilter = invert;
151 emit changed();
152}
153
155{
156 if ( mElevationRange == range )
157 return;
158
159 mElevationRange = range;
160 emit changed();
161 emit elevationRangeChanged( mElevationRange );
162}
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:233
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:109
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:6524