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