Skip to content

Commit

Permalink
Add method to create profile request for a layout profile item
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jan 24, 2023
1 parent f3af0df commit e42c3ba
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 1 deletion.
Expand Up @@ -124,6 +124,11 @@ actual profile curve a point can reside within to be included in the results. Ot
ignore this tolerance if it is not appropriate for the particular source.

.. seealso:: :py:func:`setTolerance`
%End

QgsProfileRequest profileRequest() const;
%Docstring
Returns the profile request used to generate the elevation profile.
%End

protected:
Expand Down
24 changes: 24 additions & 0 deletions src/core/layout/qgslayoutitemelevationprofile.cpp
Expand Up @@ -22,6 +22,9 @@
#include "qgsmessagelog.h"
#include "qgsmaplayerlistutils_p.h"
#include "qgscurve.h"
#include "qgsprofilerequest.h"
#include "qgsprojectelevationproperties.h"
#include "qgsterrainprovider.h"

///@cond PRIVATE
class QgsLayoutItemElevationProfilePlot : public Qgs2DPlot
Expand Down Expand Up @@ -431,6 +434,27 @@ double QgsLayoutItemElevationProfile::tolerance() const
return mTolerance;
}

QgsProfileRequest QgsLayoutItemElevationProfile::profileRequest() const
{
QgsProfileRequest req( mCurve ? mCurve.get()->clone() : nullptr );

req.setCrs( mCrs );
req.setTolerance( mTolerance );
req.setExpressionContext( createExpressionContext() );
if ( mLayout )
{
if ( QgsProject *project = mLayout->project() )
{
req.setTransformContext( project->transformContext() );
if ( QgsAbstractTerrainProvider *provider = project->elevationProperties()->terrainProvider() )
{
req.setTerrainProvider( provider->clone() );
}
}
}
return req;
}

void QgsLayoutItemElevationProfile::draw( QgsLayoutItemRenderContext &context )
{
// size must be in pixels, not layout units
Expand Down
6 changes: 6 additions & 0 deletions src/core/layout/qgslayoutitemelevationprofile.h
Expand Up @@ -23,6 +23,7 @@

class QgsLayoutItemElevationProfilePlot;
class Qgs2DPlot;
class QgsProfileRequest;

/**
* \ingroup core
Expand Down Expand Up @@ -141,6 +142,11 @@ class CORE_EXPORT QgsLayoutItemElevationProfile: public QgsLayoutItem
*/
double tolerance() const;

/**
* Returns the profile request used to generate the elevation profile.
*/
QgsProfileRequest profileRequest() const;

protected:
void draw( QgsLayoutItemRenderContext &context ) override;
bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override;
Expand Down
32 changes: 31 additions & 1 deletion tests/src/python/test_qgslayoutelevationprofile.py
Expand Up @@ -44,7 +44,9 @@
QgsRasterLayer,
QgsApplication,
QgsGeometry,
QgsCoordinateReferenceSystem)
QgsCoordinateReferenceSystem,
QgsExpressionContextUtils,
QgsFlatTerrainProvider)
from qgis.testing import (start_app,
unittest
)
Expand Down Expand Up @@ -150,6 +152,34 @@ def test_settings(self):
self.assertEqual(profile2.tolerance(), 101)
self.assertEqual(profile2.profileCurve().asWkt(), 'LineString (0 0, 10 10)')

def test_request(self):
"""
Test generating a request for the item
"""
project = QgsProject()
layout = QgsPrintLayout(project)
profile = QgsLayoutItemElevationProfile(layout)
layout.addLayoutItem(profile)
project.layoutManager().addLayout(layout)

curve = QgsGeometry.fromWkt('LineString(0 0, 10 10)')
profile.setProfileCurve(curve.constGet().clone())
profile.setCrs(QgsCoordinateReferenceSystem('EPSG:3857'))
profile.setTolerance(101)

QgsExpressionContextUtils.setLayoutItemVariable(profile, 'my_var', 202)

req = profile.profileRequest()
self.assertEqual(req.tolerance(), 101)
self.assertEqual(req.profileCurve().asWkt(), 'LineString (0 0, 10 10)')
self.assertEqual(req.crs(), QgsCoordinateReferenceSystem('EPSG:3857'))
self.assertEqual(req.expressionContext().variable('my_var'), '202')

project.elevationProperties().setTerrainProvider(QgsFlatTerrainProvider())

req = profile.profileRequest()
self.assertIsInstance(req.terrainProvider(), QgsFlatTerrainProvider)


if __name__ == '__main__':
unittest.main()

0 comments on commit e42c3ba

Please sign in to comment.