QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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#include "qgis.h"
19#include "qgsterrainprovider.h"
20
21#include <QDomElement>
22
24 : QObject( parent )
25 , mTerrainProvider( std::make_unique< QgsFlatTerrainProvider >() )
26{
27
28}
29
31
33{
34 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
35 mElevationRange = QgsDoubleRange();
36 emit changed();
37 emit elevationRangeChanged( mElevationRange );
38}
39
41{
42 if ( mTerrainProvider )
43 mTerrainProvider->resolveReferences( project );
44}
45
46bool QgsProjectElevationProperties::readXml( const QDomElement &element, const QgsReadWriteContext &context )
47{
48 const QDomElement providerElement = element.firstChildElement( QStringLiteral( "terrainProvider" ) );
49 if ( !providerElement.isNull() )
50 {
51 const QString type = providerElement.attribute( QStringLiteral( "type" ) );
52 if ( type.compare( QLatin1String( "flat" ) ) == 0 )
53 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
54 else if ( type.compare( QLatin1String( "raster" ) ) == 0 )
55 mTerrainProvider = std::make_unique< QgsRasterDemTerrainProvider >();
56 else if ( type.compare( QLatin1String( "mesh" ) ) == 0 )
57 mTerrainProvider = std::make_unique< QgsMeshTerrainProvider >();
58 else
59 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
60
61 mTerrainProvider->readXml( providerElement, context );
62 }
63 else
64 {
65 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
66 }
67
68 bool ok = false;
69 double rangeLower = std::numeric_limits< double >::lowest();
70 const double storedRangeLower = element.attribute( QStringLiteral( "RangeLower" ) ).toDouble( &ok );
71 if ( ok )
72 rangeLower = storedRangeLower;
73 double rangeUpper = std::numeric_limits< double >::max();
74 const double storedRangeUpper = element.attribute( QStringLiteral( "RangeUpper" ) ).toDouble( &ok );
75 if ( ok )
76 rangeUpper = storedRangeUpper;
77 mElevationRange = QgsDoubleRange( rangeLower, rangeUpper );
78
79 emit changed();
80 emit elevationRangeChanged( mElevationRange );
81 return true;
82}
83
84QDomElement QgsProjectElevationProperties::writeXml( QDomDocument &document, const QgsReadWriteContext &context ) const
85{
86 QDomElement element = document.createElement( QStringLiteral( "ElevationProperties" ) );
87
88 if ( mTerrainProvider )
89 {
90 QDomElement providerElement = document.createElement( QStringLiteral( "terrainProvider" ) );
91 providerElement.setAttribute( QStringLiteral( "type" ), mTerrainProvider->type() );
92 providerElement.appendChild( mTerrainProvider->writeXml( document, context ) );
93 element.appendChild( providerElement );
94 }
95
96 if ( mElevationRange.lower() != std::numeric_limits< double >::lowest() )
97 element.setAttribute( QStringLiteral( "RangeLower" ), qgsDoubleToString( mElevationRange.lower() ) );
98 if ( mElevationRange.upper() != std::numeric_limits< double >::max() )
99 element.setAttribute( QStringLiteral( "RangeUpper" ), qgsDoubleToString( mElevationRange.upper() ) );
100
101 return element;
102}
103
105{
106 return mTerrainProvider.get();
107}
108
110{
111 if ( mTerrainProvider.get() == provider )
112 return;
113
114 mTerrainProvider.reset( provider );
115 emit changed();
116}
117
119{
120 if ( mElevationRange == range )
121 return;
122
123 mElevationRange = range;
124 emit changed();
125 emit elevationRangeChanged( mElevationRange );
126}
Abstract base class for terrain providers.
QgsRange which stores a range of double values.
Definition: qgsrange.h:231
A terrain provider where the terrain is a simple flat surface.
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 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:107
T lower() const
Returns the lower bound of the range.
Definition: qgsrange.h:78
T upper() const
Returns the upper bound of the range.
Definition: qgsrange.h:85
The class is used as a container of context for various read/write operations on other objects.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Definition: qgis.h:5124