32  setDefaultProfileLineSymbol( color );
 
   33  setDefaultProfileFillSymbol( color );
 
 
   45  QDomElement element = document.createElement( QStringLiteral( 
"elevation" ) );
 
   47  element.setAttribute( QStringLiteral( 
"symbology" ), 
qgsEnumValueToKey( mSymbology ) );
 
   48  if ( !std::isnan( mElevationLimit ) )
 
   49    element.setAttribute( QStringLiteral( 
"elevationLimit" ), 
qgsDoubleToString( mElevationLimit ) );
 
   58      element.setAttribute( QStringLiteral( 
"includeLower" ), mFixedRange.
includeLower() ? 
"1" : 
"0" );
 
   59      element.setAttribute( QStringLiteral( 
"includeUpper" ), mFixedRange.
includeUpper() ? 
"1" : 
"0" );
 
   64      QDomElement ranges = document.createElement( QStringLiteral( 
"ranges" ) );
 
   65      for ( 
auto it = mRangePerGroup.constBegin(); it != mRangePerGroup.constEnd(); ++it )
 
   67        QDomElement range = document.createElement( QStringLiteral( 
"range" ) );
 
   68        range.setAttribute( QStringLiteral( 
"group" ), it.key() );
 
   69        range.setAttribute( QStringLiteral( 
"lower" ), 
qgsDoubleToString( it.value().lower() ) );
 
   70        range.setAttribute( QStringLiteral( 
"upper" ), 
qgsDoubleToString( it.value().upper() ) );
 
   71        range.setAttribute( QStringLiteral( 
"includeLower" ), it.value().includeLower() ? 
"1" : 
"0" );
 
   72        range.setAttribute( QStringLiteral( 
"includeUpper" ), it.value().includeUpper() ? 
"1" : 
"0" );
 
   73        ranges.appendChild( range );
 
   75      element.appendChild( ranges );
 
   83  QDomElement profileLineSymbolElement = document.createElement( QStringLiteral( 
"profileLineSymbol" ) );
 
   85  element.appendChild( profileLineSymbolElement );
 
   87  QDomElement profileFillSymbolElement = document.createElement( QStringLiteral( 
"profileFillSymbol" ) );
 
   89  element.appendChild( profileFillSymbolElement );
 
   91  parentElement.appendChild( element );
 
 
   97  const QDomElement elevationElement = element.firstChildElement( QStringLiteral( 
"elevation" ) ).toElement();
 
  100  if ( elevationElement.hasAttribute( QStringLiteral( 
"elevationLimit" ) ) )
 
  101    mElevationLimit = elevationElement.attribute( QStringLiteral( 
"elevationLimit" ) ).toDouble();
 
  103    mElevationLimit = std::numeric_limits< double >::quiet_NaN();
 
  111      const double lower = elevationElement.attribute( QStringLiteral( 
"lower" ) ).toDouble();
 
  112      const double upper = elevationElement.attribute( QStringLiteral( 
"upper" ) ).toDouble();
 
  113      const bool includeLower = elevationElement.attribute( QStringLiteral( 
"includeLower" ) ).toInt();
 
  114      const bool includeUpper = elevationElement.attribute( QStringLiteral( 
"includeUpper" ) ).toInt();
 
  115      mFixedRange = 
QgsDoubleRange( lower, upper, includeLower, includeUpper );
 
  121      mRangePerGroup.clear();
 
  123      const QDomNodeList ranges = elevationElement.firstChildElement( QStringLiteral( 
"ranges" ) ).childNodes();
 
  124      for ( 
int i = 0; i < ranges.size(); ++i )
 
  126        const QDomElement rangeElement = ranges.at( i ).toElement();
 
  127        const int group = rangeElement.attribute( QStringLiteral( 
"group" ) ).toInt();
 
  128        const double lower = rangeElement.attribute( QStringLiteral( 
"lower" ) ).toDouble();
 
  129        const double upper = rangeElement.attribute( QStringLiteral( 
"upper" ) ).toDouble();
 
  130        const bool includeLower = rangeElement.attribute( QStringLiteral( 
"includeLower" ) ).toInt();
 
  131        const bool includeUpper = rangeElement.attribute( QStringLiteral( 
"includeUpper" ) ).toInt();
 
  132        mRangePerGroup.insert( group, 
QgsDoubleRange( lower, upper, includeLower, includeUpper ) );
 
  143  const QDomElement profileLineSymbolElement = elevationElement.firstChildElement( QStringLiteral( 
"profileLineSymbol" ) ).firstChildElement( QStringLiteral( 
"symbol" ) );
 
  144  mProfileLineSymbol.reset( QgsSymbolLayerUtils::loadSymbol< QgsLineSymbol >( profileLineSymbolElement, context ) );
 
  145  if ( !mProfileLineSymbol )
 
  146    setDefaultProfileLineSymbol( defaultColor );
 
  148  const QDomElement profileFillSymbolElement = elevationElement.firstChildElement( QStringLiteral( 
"profileFillSymbol" ) ).firstChildElement( QStringLiteral( 
"symbol" ) );
 
  149  mProfileFillSymbol.reset( QgsSymbolLayerUtils::loadSymbol< QgsFillSymbol >( profileFillSymbolElement, context ) );
 
  150  if ( !mProfileFillSymbol )
 
  151    setDefaultProfileFillSymbol( defaultColor );
 
 
  158  QStringList properties;
 
  162      properties << tr( 
"Elevation range: %1 to %2" ).arg( mFixedRange.
lower() ).arg( mFixedRange.
upper() );
 
  167      for ( 
auto it = mRangePerGroup.constBegin(); it != mRangePerGroup.constEnd(); ++it )
 
  169        properties << tr( 
"Elevation for group %1: %2 to %3" ).arg( it.key() ).arg( it.value().lower() ).arg( it.value().upper() );
 
  175      properties << tr( 
"Scale: %1" ).arg( 
mZScale );
 
  176      properties << tr( 
"Offset: %1" ).arg( 
mZOffset );
 
  179  return QStringLiteral( 
"<li>%1</li>" ).arg( properties.join( QLatin1String( 
"</li><li>" ) ) );
 
 
  184  std::unique_ptr< QgsMeshLayerElevationProperties > res = std::make_unique< QgsMeshLayerElevationProperties >( 
nullptr );
 
  185  res->setMode( mMode );
 
  186  res->setProfileLineSymbol( mProfileLineSymbol->clone() );
 
  187  res->setProfileFillSymbol( mProfileFillSymbol->clone() );
 
  188  res->setProfileSymbology( mSymbology );
 
  189  res->setElevationLimit( mElevationLimit );
 
  190  res->setFixedRange( mFixedRange );
 
  191  res->setFixedRangePerGroup( mRangePerGroup );
 
  192  res->copyCommonProperties( 
this );
 
  193  return res.release();
 
 
  201      return mFixedRange.
overlaps( range );
 
  205      for ( 
auto it = mRangePerGroup.constBegin(); it != mRangePerGroup.constEnd(); ++it )
 
  207        if ( it.value().overlaps( range ) )
 
 
  229      double lower = std::numeric_limits< double >::max();
 
  230      double upper = std::numeric_limits< double >::min();
 
  231      bool includeLower = 
true;
 
  232      bool includeUpper = 
true;
 
  233      for ( 
auto it = mRangePerGroup.constBegin(); it != mRangePerGroup.constEnd(); ++it )
 
  235        if ( it.value().lower() < lower )
 
  237          lower = it.value().lower();
 
  238          includeLower = it.value().includeLower();
 
  240        else if ( !includeLower && it.value().lower() == lower && it.value().includeLower() )
 
  244        if ( it.value().upper() > upper )
 
  246          upper = it.value().upper();
 
  247          includeUpper = it.value().includeUpper();
 
  249        else if ( !includeUpper && it.value().upper() == upper && it.value().includeUpper() )
 
  254      return QgsDoubleRange( lower, upper, includeLower, includeUpper );
 
 
  271        return { mFixedRange.
lower(), mFixedRange.
upper() };
 
  273        return { mFixedRange.
lower() };
 
  281      for ( 
auto it = mRangePerGroup.constBegin(); it != mRangePerGroup.constEnd(); ++it )
 
  283        if ( it.value().isInfinite() )
 
  286        if ( !res.contains( it.value().lower( ) ) )
 
  287          res.append( it.value().lower() );
 
  288        if ( !res.contains( it.value().upper( ) ) )
 
  289          res.append( it.value().upper() );
 
  291      std::sort( res.begin(), res.end() );
 
 
  341  if ( range == mFixedRange )
 
 
  350  return mRangePerGroup;
 
 
  355  if ( ranges == mRangePerGroup )
 
  358  mRangePerGroup = ranges;
 
 
  364  return mProfileLineSymbol.get();
 
 
  369  mProfileLineSymbol.reset( symbol );
 
 
  376  return mProfileFillSymbol.get();
 
 
  381  mProfileFillSymbol.reset( symbol );
 
 
  388  if ( mSymbology == symbology )
 
  391  mSymbology = symbology;
 
 
  398  return mElevationLimit;
 
 
  406  mElevationLimit = limit;
 
 
  411void QgsMeshLayerElevationProperties::setDefaultProfileLineSymbol( 
const QColor &color )
 
  413  std::unique_ptr< QgsSimpleLineSymbolLayer > profileLineLayer = std::make_unique< QgsSimpleLineSymbolLayer >( color, 0.6 );
 
  414  mProfileLineSymbol = std::make_unique< QgsLineSymbol>( 
QgsSymbolLayerList( { profileLineLayer.release() } ) );
 
  417void QgsMeshLayerElevationProperties::setDefaultProfileFillSymbol( 
const QColor &color )
 
  419  std::unique_ptr< QgsSimpleFillSymbolLayer > profileFillLayer = std::make_unique< QgsSimpleFillSymbolLayer >( color );
 
  420  profileFillLayer->setStrokeStyle( Qt::NoPen );
 
  421  mProfileFillSymbol = std::make_unique< QgsFillSymbol>( 
QgsSymbolLayerList( { profileFillLayer.release() } ) );
 
MeshElevationMode
Mesh layer elevation modes.
 
@ FromVertices
Elevation should be taken from mesh vertices.
 
@ FixedRangePerGroup
Layer has a fixed (manually specified) elevation range per group.
 
@ FixedElevationRange
Layer has a fixed elevation range.
 
ProfileSurfaceSymbology
Surface symbology type for elevation profile plots.
 
@ Line
The elevation surface will be rendered using a line symbol.
 
static QgsColorSchemeRegistry * colorSchemeRegistry()
Returns the application's color scheme registry, used for managing color schemes.
 
QColor fetchRandomStyleColor() const
Returns a random color for use with a new symbol style (e.g.
 
QgsRange which stores a range of double values.
 
bool isInfinite() const
Returns true if the range consists of all possible values.
 
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
 
A line symbol type, for rendering LineString and MultiLineString geometries.
 
Base class for storage of map layer elevation properties.
 
void writeCommonProperties(QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context)
Writes common class properties to a DOM element, to be used later with readXml().
 
void readCommonProperties(const QDomElement &element, const QgsReadWriteContext &context)
Reads common class properties from a DOM element previously written by writeXml().
 
void changed()
Emitted when any of the elevation properties have changed.
 
void profileRenderingPropertyChanged()
Emitted when any of the elevation properties which relate solely to presentation of elevation results...
 
@ FlagDontInvalidateCachedRendersWhenRangeChanges
Any cached rendering will not be invalidated when z range context is modified.
 
Base class for all map layer types.
 
Mesh layer specific subclass of QgsMapLayerElevationProperties.
 
QDomElement writeXml(QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context) override
Writes the properties to a DOM element, to be used later with readXml().
 
QgsLineSymbol * profileLineSymbol() const
Returns the line symbol used to render the mesh profile in elevation profile plots.
 
QgsDoubleRange fixedRange() const
Returns the fixed elevation range for the mesh.
 
bool hasElevation() const override
Returns true if the layer has an elevation or z component.
 
bool isVisibleInZRange(const QgsDoubleRange &range, QgsMapLayer *layer=nullptr) const override
Returns true if the layer should be visible and rendered for the specified z range.
 
Qgis::MeshElevationMode mode() const
Returns the elevation mode.
 
void setFixedRangePerGroup(const QMap< int, QgsDoubleRange > &ranges)
Sets the fixed elevation range for each group.
 
QgsMeshLayerElevationProperties * clone() const override
Creates a clone of the properties.
 
void setElevationLimit(double limit)
Sets the elevation limit, which is used when profileSymbology() is Qgis::ProfileSurfaceSymbology::Fil...
 
QList< double > significantZValues(QgsMapLayer *layer) const override
Returns a list of significant elevation/z-values for the specified layer, using the settings defined ...
 
QgsFillSymbol * profileFillSymbol() const
Returns the fill symbol used to render the mesh profile in elevation profile plots.
 
void setProfileSymbology(Qgis::ProfileSurfaceSymbology symbology)
Sets the symbology option used to render the mesh profile in elevation profile plots.
 
void setProfileFillSymbol(QgsFillSymbol *symbol)
Sets the fill symbol used to render the mesh profile in elevation profile plots.
 
void setProfileLineSymbol(QgsLineSymbol *symbol)
Sets the line symbol used to render the mesh profile in elevation profile plots.
 
~QgsMeshLayerElevationProperties() override
 
QgsMeshLayerElevationProperties(QObject *parent)
Constructor for QgsMeshLayerElevationProperties, with the specified parent object.
 
void setMode(Qgis::MeshElevationMode mode)
Sets the elevation mode.
 
QMap< int, QgsDoubleRange > fixedRangePerGroup() const
Returns the fixed elevation range for each group.
 
QString htmlSummary() const override
Returns a HTML formatted summary of the properties.
 
QgsMapLayerElevationProperties::Flags flags() const override
Returns flags associated to the elevation properties.
 
void setFixedRange(const QgsDoubleRange &range)
Sets the fixed elevation range for the mesh.
 
bool showByDefaultInElevationProfilePlots() const override
Returns true if the layer should be visible by default in newly created elevation profile plots.
 
bool readXml(const QDomElement &element, const QgsReadWriteContext &context) override
Reads the elevation properties from a DOM element previously written by writeXml().
 
double elevationLimit() const
Returns the elevation limit, which is used when profileSymbology() is Qgis::ProfileSurfaceSymbology::...
 
QgsDoubleRange calculateZRange(QgsMapLayer *layer) const override
Attempts to calculate the overall elevation or z range for the specified layer, using the settings de...
 
bool includeUpper() const
Returns true if the upper bound is inclusive, or false if the upper bound is exclusive.
 
bool overlaps(const QgsRange< T > &other) const
Returns true if this range overlaps another range.
 
T lower() const
Returns the lower bound of the range.
 
bool includeLower() const
Returns true if the lower bound is inclusive, or false if the lower bound is exclusive.
 
T upper() const
Returns the upper bound of the range.
 
The class is used as a container of context for various read/write operations on other objects.
 
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
 
T qgsEnumKeyToValue(const QString &key, const T &defaultValue, bool tryValueAsKey=true, bool *returnOk=nullptr)
Returns the value corresponding to the given key of an enum.
 
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
 
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
 
#define BUILTIN_UNREACHABLE
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
QList< QgsSymbolLayer * > QgsSymbolLayerList