25#include "moc_qgsprojectelevationproperties.cpp"
27using namespace Qt::StringLiterals;
38 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
46 if ( mTerrainProvider )
47 mTerrainProvider->resolveReferences( project );
52 const QDomElement providerElement = element.firstChildElement( u
"terrainProvider"_s );
53 if ( !providerElement.isNull() )
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 >();
63 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
65 mTerrainProvider->readXml( providerElement, context );
69 mTerrainProvider = std::make_unique< QgsFlatTerrainProvider >();
73 double rangeLower = std::numeric_limits< double >::lowest();
74 const double storedRangeLower = element.attribute( u
"RangeLower"_s ).toDouble( &ok );
76 rangeLower = storedRangeLower;
77 double rangeUpper = std::numeric_limits< double >::max();
78 const double storedRangeUpper = element.attribute( u
"RangeUpper"_s ).toDouble( &ok );
80 rangeUpper = storedRangeUpper;
83 mElevationFilterRangeSize = element.attribute( u
"FilterRangeSize"_s ).toDouble( &ok );
85 mElevationFilterRangeSize = -1;
87 mInvertElevationFilter = element.attribute( u
"FilterInvertSlider"_s, u
"0"_s ).toInt();
96 QDomElement element = document.createElement( u
"ElevationProperties"_s );
98 if ( mTerrainProvider )
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 );
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() ) );
111 if ( mElevationFilterRangeSize >= 0 )
113 element.setAttribute( u
"FilterRangeSize"_s, mElevationFilterRangeSize );
115 element.setAttribute( u
"FilterInvertSlider"_s, mInvertElevationFilter ?
"1" :
"0" );
122 return mTerrainProvider.get();
127 if ( mTerrainProvider.get() == provider )
130 const bool hasChanged = ( provider && mTerrainProvider ) ? !mTerrainProvider->
equals( provider ) : (
static_cast< bool >( provider ) !=
static_cast< bool >( mTerrainProvider.get() ) );
132 mTerrainProvider.reset( provider );
139 if ( mElevationFilterRangeSize == size )
142 mElevationFilterRangeSize = size;
148 if ( mInvertElevationFilter == invert )
151 mInvertElevationFilter = invert;
157 if ( mElevationRange == range )
160 mElevationRange = range;
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.
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,...
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.