mirror of
https://github.com/qgis/QGIS.git
synced 2025-11-27 00:07:16 -05:00
Add api to allow redrawing of previously collected results for a single
elevation profile source And use this to just redraw the existing results whenever a setting relating only to the appearance of the profile chart is changed, instead of regenerating the whole chart
This commit is contained in:
parent
1ecf9dce5e
commit
a35e74c656
@ -140,6 +140,16 @@ Returns the range of the retrieved elevation values
|
|||||||
virtual QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context );
|
virtual QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context );
|
||||||
%Docstring
|
%Docstring
|
||||||
Snaps a ``point`` to the generated elevation profile.
|
Snaps a ``point`` to the generated elevation profile.
|
||||||
|
%End
|
||||||
|
|
||||||
|
virtual void updateFromGenerator( const QgsAbstractProfileGenerator *generator );
|
||||||
|
%Docstring
|
||||||
|
Updates the results to match the properties from the specified ``generator``.
|
||||||
|
|
||||||
|
For instance, this method can be used to replace any stored properties relating to rendering
|
||||||
|
the gathered results to reflect the ``generator``'s current properties.
|
||||||
|
|
||||||
|
The base class method does nothing.
|
||||||
%End
|
%End
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -46,6 +46,11 @@ results.
|
|||||||
|
|
||||||
~QgsProfilePlotRenderer();
|
~QgsProfilePlotRenderer();
|
||||||
|
|
||||||
|
QStringList sourceIds() const;
|
||||||
|
%Docstring
|
||||||
|
Returns the ordered list of source IDs for the sources used by the renderer.
|
||||||
|
%End
|
||||||
|
|
||||||
void startGeneration();
|
void startGeneration();
|
||||||
%Docstring
|
%Docstring
|
||||||
Start the generation job and immediately return.
|
Start the generation job and immediately return.
|
||||||
@ -73,6 +78,13 @@ Block until the current job has finished.
|
|||||||
bool isActive() const;
|
bool isActive() const;
|
||||||
%Docstring
|
%Docstring
|
||||||
Returns ``True`` if the generation job is currently running in background.
|
Returns ``True`` if the generation job is currently running in background.
|
||||||
|
%End
|
||||||
|
|
||||||
|
void replaceSource( QgsAbstractProfileSource *source );
|
||||||
|
%Docstring
|
||||||
|
Replaces the existing source with matching ID.
|
||||||
|
|
||||||
|
The matching stored source will be deleted and replaced with ``source``.
|
||||||
%End
|
%End
|
||||||
|
|
||||||
bool invalidateResults( QgsAbstractProfileSource *source );
|
bool invalidateResults( QgsAbstractProfileSource *source );
|
||||||
@ -100,14 +112,18 @@ Does nothing if the generation is already in progress.
|
|||||||
Returns the limits of the retrieved elevation values.
|
Returns the limits of the retrieved elevation values.
|
||||||
%End
|
%End
|
||||||
|
|
||||||
QImage renderToImage( int width, int height, double distanceMin, double distanceMax, double zMin, double zMax );
|
QImage renderToImage( int width, int height, double distanceMin, double distanceMax, double zMin, double zMax, const QString &sourceId = QString() );
|
||||||
%Docstring
|
%Docstring
|
||||||
Renders a portion of the profile to an image with the given ``width`` and ``height``.
|
Renders a portion of the profile to an image with the given ``width`` and ``height``.
|
||||||
|
|
||||||
|
If ``sourceId`` is empty then all sources will be rendered, otherwise only the matching source will be rendered.
|
||||||
%End
|
%End
|
||||||
|
|
||||||
void render( QgsRenderContext &context, double width, double height, double distanceMin, double distanceMax, double zMin, double zMax );
|
void render( QgsRenderContext &context, double width, double height, double distanceMin, double distanceMax, double zMin, double zMax, const QString &sourceId = QString() );
|
||||||
%Docstring
|
%Docstring
|
||||||
Renders a portion of the profile using the specified render ``context``.
|
Renders a portion of the profile using the specified render ``context``.
|
||||||
|
|
||||||
|
If ``sourceId`` is empty then all sources will be rendered, otherwise only the matching source will be rendered.
|
||||||
%End
|
%End
|
||||||
|
|
||||||
QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context );
|
QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context );
|
||||||
|
|||||||
@ -63,3 +63,8 @@ QgsProfileSnapResult QgsAbstractProfileResults::snapPoint( const QgsProfilePoint
|
|||||||
{
|
{
|
||||||
return QgsProfileSnapResult();
|
return QgsProfileSnapResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsAbstractProfileResults::updateFromGenerator( const QgsAbstractProfileGenerator * )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@ -116,6 +116,7 @@ class CORE_EXPORT QgsProfileRenderContext
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class QgsAbstractProfileGenerator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Abstract base class for storage of elevation profiles.
|
* \brief Abstract base class for storage of elevation profiles.
|
||||||
@ -164,6 +165,16 @@ class CORE_EXPORT QgsAbstractProfileResults
|
|||||||
* Snaps a \a point to the generated elevation profile.
|
* Snaps a \a point to the generated elevation profile.
|
||||||
*/
|
*/
|
||||||
virtual QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context );
|
virtual QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the results to match the properties from the specified \a generator.
|
||||||
|
*
|
||||||
|
* For instance, this method can be used to replace any stored properties relating to rendering
|
||||||
|
* the gathered results to reflect the \a generator's current properties.
|
||||||
|
*
|
||||||
|
* The base class method does nothing.
|
||||||
|
*/
|
||||||
|
virtual void updateFromGenerator( const QgsAbstractProfileGenerator *generator );
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -46,6 +46,17 @@ QgsProfilePlotRenderer::~QgsProfilePlotRenderer()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList QgsProfilePlotRenderer::sourceIds() const
|
||||||
|
{
|
||||||
|
QStringList res;
|
||||||
|
res.reserve( mGenerators.size() );
|
||||||
|
for ( const auto &it : mGenerators )
|
||||||
|
{
|
||||||
|
res.append( it->sourceId() );
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
void QgsProfilePlotRenderer::startGeneration()
|
void QgsProfilePlotRenderer::startGeneration()
|
||||||
{
|
{
|
||||||
if ( isActive() )
|
if ( isActive() )
|
||||||
@ -125,7 +136,17 @@ bool QgsProfilePlotRenderer::isActive() const
|
|||||||
return mStatus != Idle;
|
return mStatus != Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsProfilePlotRenderer::replaceSource( QgsAbstractProfileSource *source )
|
||||||
|
{
|
||||||
|
replaceSourceInternal( source, false );
|
||||||
|
}
|
||||||
|
|
||||||
bool QgsProfilePlotRenderer::invalidateResults( QgsAbstractProfileSource *source )
|
bool QgsProfilePlotRenderer::invalidateResults( QgsAbstractProfileSource *source )
|
||||||
|
{
|
||||||
|
return replaceSourceInternal( source, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QgsProfilePlotRenderer::replaceSourceInternal( QgsAbstractProfileSource *source, bool clearPreviousResults )
|
||||||
{
|
{
|
||||||
if ( !source )
|
if ( !source )
|
||||||
return false;
|
return false;
|
||||||
@ -141,9 +162,16 @@ bool QgsProfilePlotRenderer::invalidateResults( QgsAbstractProfileSource *source
|
|||||||
if ( job.generator && job.generator->sourceId() == sourceId )
|
if ( job.generator && job.generator->sourceId() == sourceId )
|
||||||
{
|
{
|
||||||
res = true;
|
res = true;
|
||||||
job.results.reset();
|
if ( clearPreviousResults )
|
||||||
|
{
|
||||||
|
job.results.reset();
|
||||||
|
job.complete = false;
|
||||||
|
}
|
||||||
|
else if ( job.results )
|
||||||
|
{
|
||||||
|
job.results->updateFromGenerator( generator.get() );
|
||||||
|
}
|
||||||
job.generator = generator.get();
|
job.generator = generator.get();
|
||||||
job.complete = false;
|
|
||||||
for ( auto it = mGenerators.begin(); it != mGenerators.end(); )
|
for ( auto it = mGenerators.begin(); it != mGenerators.end(); )
|
||||||
{
|
{
|
||||||
if ( ( *it )->sourceId() == sourceId )
|
if ( ( *it )->sourceId() == sourceId )
|
||||||
@ -186,7 +214,7 @@ QgsDoubleRange QgsProfilePlotRenderer::zRange() const
|
|||||||
return QgsDoubleRange( min, max );
|
return QgsDoubleRange( min, max );
|
||||||
}
|
}
|
||||||
|
|
||||||
QImage QgsProfilePlotRenderer::renderToImage( int width, int height, double distanceMin, double distanceMax, double zMin, double zMax )
|
QImage QgsProfilePlotRenderer::renderToImage( int width, int height, double distanceMin, double distanceMax, double zMin, double zMax, const QString &sourceId )
|
||||||
{
|
{
|
||||||
QImage res( width, height, QImage::Format_ARGB32_Premultiplied );
|
QImage res( width, height, QImage::Format_ARGB32_Premultiplied );
|
||||||
res.fill( Qt::transparent );
|
res.fill( Qt::transparent );
|
||||||
@ -196,13 +224,13 @@ QImage QgsProfilePlotRenderer::renderToImage( int width, int height, double dist
|
|||||||
QgsRenderContext context = QgsRenderContext::fromQPainter( &p );
|
QgsRenderContext context = QgsRenderContext::fromQPainter( &p );
|
||||||
context.setFlag( Qgis::RenderContextFlag::Antialiasing, true );
|
context.setFlag( Qgis::RenderContextFlag::Antialiasing, true );
|
||||||
context.setPainterFlagsUsingContext( &p );
|
context.setPainterFlagsUsingContext( &p );
|
||||||
render( context, width, height, distanceMin, distanceMax, zMin, zMax );
|
render( context, width, height, distanceMin, distanceMax, zMin, zMax, sourceId );
|
||||||
p.end();
|
p.end();
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsProfilePlotRenderer::render( QgsRenderContext &context, double width, double height, double distanceMin, double distanceMax, double zMin, double zMax )
|
void QgsProfilePlotRenderer::render( QgsRenderContext &context, double width, double height, double distanceMin, double distanceMax, double zMin, double zMax, const QString &sourceId )
|
||||||
{
|
{
|
||||||
QPainter *painter = context.painter();
|
QPainter *painter = context.painter();
|
||||||
if ( !painter )
|
if ( !painter )
|
||||||
@ -221,7 +249,7 @@ void QgsProfilePlotRenderer::render( QgsRenderContext &context, double width, do
|
|||||||
|
|
||||||
for ( const ProfileJob &job : mJobs )
|
for ( const ProfileJob &job : mJobs )
|
||||||
{
|
{
|
||||||
if ( job.complete && job.results )
|
if ( job.complete && job.results && ( sourceId.isEmpty() || job.generator->sourceId() == sourceId ) )
|
||||||
job.results->renderResults( profileRenderContext );
|
job.results->renderResults( profileRenderContext );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -272,3 +300,4 @@ void QgsProfilePlotRenderer::generateProfileStatic( ProfileJob &job )
|
|||||||
job.results.reset( job.generator->takeResults() );
|
job.results.reset( job.generator->takeResults() );
|
||||||
job.complete = true;
|
job.complete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -70,6 +70,11 @@ class CORE_EXPORT QgsProfilePlotRenderer : public QObject
|
|||||||
|
|
||||||
~QgsProfilePlotRenderer() override;
|
~QgsProfilePlotRenderer() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the ordered list of source IDs for the sources used by the renderer.
|
||||||
|
*/
|
||||||
|
QStringList sourceIds() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start the generation job and immediately return.
|
* Start the generation job and immediately return.
|
||||||
* Does nothing if the generation is already in progress.
|
* Does nothing if the generation is already in progress.
|
||||||
@ -95,6 +100,13 @@ class CORE_EXPORT QgsProfilePlotRenderer : public QObject
|
|||||||
//! Returns TRUE if the generation job is currently running in background.
|
//! Returns TRUE if the generation job is currently running in background.
|
||||||
bool isActive() const;
|
bool isActive() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces the existing source with matching ID.
|
||||||
|
*
|
||||||
|
* The matching stored source will be deleted and replaced with \a source.
|
||||||
|
*/
|
||||||
|
void replaceSource( QgsAbstractProfileSource *source );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invalidates the profile results from the source with matching ID.
|
* Invalidates the profile results from the source with matching ID.
|
||||||
*
|
*
|
||||||
@ -122,13 +134,17 @@ class CORE_EXPORT QgsProfilePlotRenderer : public QObject
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders a portion of the profile to an image with the given \a width and \a height.
|
* Renders a portion of the profile to an image with the given \a width and \a height.
|
||||||
|
*
|
||||||
|
* If \a sourceId is empty then all sources will be rendered, otherwise only the matching source will be rendered.
|
||||||
*/
|
*/
|
||||||
QImage renderToImage( int width, int height, double distanceMin, double distanceMax, double zMin, double zMax );
|
QImage renderToImage( int width, int height, double distanceMin, double distanceMax, double zMin, double zMax, const QString &sourceId = QString() );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders a portion of the profile using the specified render \a context.
|
* Renders a portion of the profile using the specified render \a context.
|
||||||
|
*
|
||||||
|
* If \a sourceId is empty then all sources will be rendered, otherwise only the matching source will be rendered.
|
||||||
*/
|
*/
|
||||||
void render( QgsRenderContext &context, double width, double height, double distanceMin, double distanceMax, double zMin, double zMax );
|
void render( QgsRenderContext &context, double width, double height, double distanceMin, double distanceMax, double zMin, double zMax, const QString &sourceId = QString() );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Snap a \a point to the results.
|
* Snap a \a point to the results.
|
||||||
@ -154,6 +170,7 @@ class CORE_EXPORT QgsProfilePlotRenderer : public QObject
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void generateProfileStatic( ProfileJob &job );
|
static void generateProfileStatic( ProfileJob &job );
|
||||||
|
bool replaceSourceInternal( QgsAbstractProfileSource *source, bool clearPreviousResults );
|
||||||
|
|
||||||
std::vector< std::unique_ptr< QgsAbstractProfileGenerator > > mGenerators;
|
std::vector< std::unique_ptr< QgsAbstractProfileGenerator > > mGenerators;
|
||||||
QgsProfileRequest mRequest;
|
QgsProfileRequest mRequest;
|
||||||
|
|||||||
@ -135,6 +135,13 @@ QgsProfileSnapResult QgsMeshLayerProfileResults::snapPoint( const QgsProfilePoin
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsMeshLayerProfileResults::updateFromGenerator( const QgsAbstractProfileGenerator *generator )
|
||||||
|
{
|
||||||
|
const QgsMeshLayerProfileGenerator *mlGenerator = qgis::down_cast< const QgsMeshLayerProfileGenerator * >( generator );
|
||||||
|
|
||||||
|
lineSymbol.reset( mlGenerator->mLineSymbol->clone() );
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// QgsMeshLayerProfileGenerator
|
// QgsMeshLayerProfileGenerator
|
||||||
//
|
//
|
||||||
|
|||||||
@ -63,6 +63,7 @@ class CORE_EXPORT QgsMeshLayerProfileResults : public QgsAbstractProfileResults
|
|||||||
QVector< QgsGeometry > asGeometries() const override;
|
QVector< QgsGeometry > asGeometries() const override;
|
||||||
void renderResults( QgsProfileRenderContext &context ) override;
|
void renderResults( QgsProfileRenderContext &context ) override;
|
||||||
QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context ) override;
|
QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context ) override;
|
||||||
|
void updateFromGenerator( const QgsAbstractProfileGenerator *generator ) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -116,6 +117,8 @@ class CORE_EXPORT QgsMeshLayerProfileGenerator : public QgsAbstractProfileGenera
|
|||||||
|
|
||||||
std::unique_ptr< QgsMeshLayerProfileResults > mResults;
|
std::unique_ptr< QgsMeshLayerProfileResults > mResults;
|
||||||
|
|
||||||
|
friend class QgsMeshLayerProfileResults;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -138,6 +138,13 @@ void QgsRasterLayerProfileResults::renderResults( QgsProfileRenderContext &conte
|
|||||||
lineSymbol->stopRender( context.renderContext() );
|
lineSymbol->stopRender( context.renderContext() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsRasterLayerProfileResults::updateFromGenerator( const QgsAbstractProfileGenerator *generator )
|
||||||
|
{
|
||||||
|
const QgsRasterLayerProfileGenerator *rlGenerator = qgis::down_cast< const QgsRasterLayerProfileGenerator * >( generator );
|
||||||
|
|
||||||
|
lineSymbol.reset( rlGenerator->mLineSymbol->clone() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// QgsRasterLayerProfileGenerator
|
// QgsRasterLayerProfileGenerator
|
||||||
|
|||||||
@ -62,6 +62,7 @@ class CORE_EXPORT QgsRasterLayerProfileResults : public QgsAbstractProfileResult
|
|||||||
QVector< QgsGeometry > asGeometries() const override;
|
QVector< QgsGeometry > asGeometries() const override;
|
||||||
QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context ) override;
|
QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context ) override;
|
||||||
void renderResults( QgsProfileRenderContext &context ) override;
|
void renderResults( QgsProfileRenderContext &context ) override;
|
||||||
|
void updateFromGenerator( const QgsAbstractProfileGenerator *generator ) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -113,6 +114,8 @@ class CORE_EXPORT QgsRasterLayerProfileGenerator : public QgsAbstractProfileGene
|
|||||||
|
|
||||||
double mStepDistance = std::numeric_limits<double>::quiet_NaN();
|
double mStepDistance = std::numeric_limits<double>::quiet_NaN();
|
||||||
|
|
||||||
|
friend class QgsRasterLayerProfileResults;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QGSRASTERLAYERPROFILEGENERATOR_H
|
#endif // QGSRASTERLAYERPROFILEGENERATOR_H
|
||||||
|
|||||||
@ -398,6 +398,16 @@ void QgsVectorLayerProfileResults::renderResults( QgsProfileRenderContext &conte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsVectorLayerProfileResults::updateFromGenerator( const QgsAbstractProfileGenerator *generator )
|
||||||
|
{
|
||||||
|
const QgsVectorLayerProfileGenerator *vlGenerator = qgis::down_cast< const QgsVectorLayerProfileGenerator * >( generator );
|
||||||
|
|
||||||
|
respectLayerSymbology = vlGenerator->mRespectLayerSymbology;
|
||||||
|
profileLineSymbol.reset( vlGenerator->mProfileLineSymbol->clone() );
|
||||||
|
profileFillSymbol.reset( vlGenerator->mProfileFillSymbol->clone() );
|
||||||
|
profileMarkerSymbol.reset( vlGenerator->mProfileMarkerSymbol->clone() );
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// QgsVectorLayerProfileGenerator
|
// QgsVectorLayerProfileGenerator
|
||||||
//
|
//
|
||||||
|
|||||||
@ -85,6 +85,7 @@ class CORE_EXPORT QgsVectorLayerProfileResults : public QgsAbstractProfileResult
|
|||||||
QVector< QgsGeometry > asGeometries() const override;
|
QVector< QgsGeometry > asGeometries() const override;
|
||||||
QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context ) override;
|
QgsProfileSnapResult snapPoint( const QgsProfilePoint &point, const QgsProfileSnapContext &context ) override;
|
||||||
void renderResults( QgsProfileRenderContext &context ) override;
|
void renderResults( QgsProfileRenderContext &context ) override;
|
||||||
|
void updateFromGenerator( const QgsAbstractProfileGenerator *generator ) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -168,6 +169,8 @@ class CORE_EXPORT QgsVectorLayerProfileGenerator : public QgsAbstractProfileGene
|
|||||||
// NOT for use in the background thread!
|
// NOT for use in the background thread!
|
||||||
QPointer< QgsVectorLayer > mLayer;
|
QPointer< QgsVectorLayer > mLayer;
|
||||||
|
|
||||||
|
friend class QgsVectorLayerProfileResults;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QGSVECTORLAYERPROFILEGENERATOR_H
|
#endif // QGSVECTORLAYERPROFILEGENERATOR_H
|
||||||
|
|||||||
@ -64,6 +64,7 @@ class QgsElevationProfilePlotItem : public Qgs2DPlot, public QgsPlotCanvasItem
|
|||||||
setPos( mRect.topLeft() );
|
setPos( mRect.topLeft() );
|
||||||
|
|
||||||
mImage = QImage();
|
mImage = QImage();
|
||||||
|
mCachedImages.clear();
|
||||||
mPlotArea = QRectF();
|
mPlotArea = QRectF();
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
@ -71,10 +72,22 @@ class QgsElevationProfilePlotItem : public Qgs2DPlot, public QgsPlotCanvasItem
|
|||||||
void updatePlot()
|
void updatePlot()
|
||||||
{
|
{
|
||||||
mImage = QImage();
|
mImage = QImage();
|
||||||
|
mCachedImages.clear();
|
||||||
mPlotArea = QRectF();
|
mPlotArea = QRectF();
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool redrawResults( const QString &sourceId )
|
||||||
|
{
|
||||||
|
auto it = mCachedImages.find( sourceId );
|
||||||
|
if ( it == mCachedImages.end() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
mCachedImages.erase( it );
|
||||||
|
mImage = QImage();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
QRectF boundingRect() const override
|
QRectF boundingRect() const override
|
||||||
{
|
{
|
||||||
return mRect;
|
return mRect;
|
||||||
@ -92,7 +105,7 @@ class QgsElevationProfilePlotItem : public Qgs2DPlot, public QgsPlotCanvasItem
|
|||||||
return mPlotArea;
|
return mPlotArea;
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsProfilePoint canvasPointToPlotPoint( const QPointF &point )
|
QgsProfilePoint canvasPointToPlotPoint( QPointF point )
|
||||||
{
|
{
|
||||||
if ( !mPlotArea.contains( point.x(), point.y() ) )
|
if ( !mPlotArea.contains( point.x(), point.y() ) )
|
||||||
return QgsProfilePoint();
|
return QgsProfilePoint();
|
||||||
@ -119,8 +132,22 @@ class QgsElevationProfilePlotItem : public Qgs2DPlot, public QgsPlotCanvasItem
|
|||||||
if ( !mRenderer )
|
if ( !mRenderer )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const QImage plot = mRenderer->renderToImage( plotArea.width(), plotArea.height(), xMinimum(), xMaximum(), yMinimum(), yMaximum() );
|
const QStringList sourceIds = mRenderer->sourceIds();
|
||||||
rc.painter()->drawImage( plotArea.left(), plotArea.top(), plot );
|
for ( const QString &source : sourceIds )
|
||||||
|
{
|
||||||
|
QImage plot;
|
||||||
|
auto it = mCachedImages.constFind( source );
|
||||||
|
if ( it != mCachedImages.constEnd() )
|
||||||
|
{
|
||||||
|
plot = it.value();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plot = mRenderer->renderToImage( plotArea.width(), plotArea.height(), xMinimum(), xMaximum(), yMinimum(), yMaximum(), source );
|
||||||
|
mCachedImages.insert( source, plot );
|
||||||
|
}
|
||||||
|
rc.painter()->drawImage( plotArea.left(), plotArea.top(), plot );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void paint( QPainter *painter ) override
|
void paint( QPainter *painter ) override
|
||||||
@ -149,6 +176,9 @@ class QgsElevationProfilePlotItem : public Qgs2DPlot, public QgsPlotCanvasItem
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
QImage mImage;
|
QImage mImage;
|
||||||
|
|
||||||
|
QMap< QString, QImage > mCachedImages;
|
||||||
|
|
||||||
QRectF mRect;
|
QRectF mRect;
|
||||||
QRectF mPlotArea;
|
QRectF mPlotArea;
|
||||||
QgsProfilePlotRenderer *mRenderer = nullptr;
|
QgsProfilePlotRenderer *mRenderer = nullptr;
|
||||||
@ -290,6 +320,11 @@ QgsElevationProfileCanvas::QgsElevationProfileCanvas( QWidget *parent )
|
|||||||
mDeferredUpdateTimer->stop();
|
mDeferredUpdateTimer->stop();
|
||||||
connect( mDeferredUpdateTimer, &QTimer::timeout, this, &QgsElevationProfileCanvas::startDeferredUpdate );
|
connect( mDeferredUpdateTimer, &QTimer::timeout, this, &QgsElevationProfileCanvas::startDeferredUpdate );
|
||||||
|
|
||||||
|
mDeferredRedrawTimer = new QTimer( this );
|
||||||
|
mDeferredRedrawTimer->setSingleShot( true );
|
||||||
|
mDeferredRedrawTimer->stop();
|
||||||
|
connect( mDeferredRedrawTimer, &QTimer::timeout, this, &QgsElevationProfileCanvas::startDeferredRedraw );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsElevationProfileCanvas::~QgsElevationProfileCanvas()
|
QgsElevationProfileCanvas::~QgsElevationProfileCanvas()
|
||||||
@ -375,11 +410,13 @@ void QgsElevationProfileCanvas::setupLayerConnections( QgsMapLayer *layer, bool
|
|||||||
if ( isDisconnect )
|
if ( isDisconnect )
|
||||||
{
|
{
|
||||||
disconnect( layer->elevationProperties(), &QgsMapLayerElevationProperties::profileGenerationPropertyChanged, this, &QgsElevationProfileCanvas::onLayerProfileGenerationPropertyChanged );
|
disconnect( layer->elevationProperties(), &QgsMapLayerElevationProperties::profileGenerationPropertyChanged, this, &QgsElevationProfileCanvas::onLayerProfileGenerationPropertyChanged );
|
||||||
|
disconnect( layer->elevationProperties(), &QgsMapLayerElevationProperties::renderingPropertyChanged, this, &QgsElevationProfileCanvas::onLayerProfileRendererPropertyChanged );
|
||||||
disconnect( layer, &QgsMapLayer::dataChanged, this, &QgsElevationProfileCanvas::updateResultsForLayer );
|
disconnect( layer, &QgsMapLayer::dataChanged, this, &QgsElevationProfileCanvas::updateResultsForLayer );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
connect( layer->elevationProperties(), &QgsMapLayerElevationProperties::profileGenerationPropertyChanged, this, &QgsElevationProfileCanvas::onLayerProfileGenerationPropertyChanged );
|
connect( layer->elevationProperties(), &QgsMapLayerElevationProperties::profileGenerationPropertyChanged, this, &QgsElevationProfileCanvas::onLayerProfileGenerationPropertyChanged );
|
||||||
|
connect( layer->elevationProperties(), &QgsMapLayerElevationProperties::renderingPropertyChanged, this, &QgsElevationProfileCanvas::onLayerProfileRendererPropertyChanged );
|
||||||
connect( layer, &QgsMapLayer::dataChanged, this, &QgsElevationProfileCanvas::updateResultsForLayer );
|
connect( layer, &QgsMapLayer::dataChanged, this, &QgsElevationProfileCanvas::updateResultsForLayer );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,7 +449,6 @@ void QgsElevationProfileCanvas::setupLayerConnections( QgsMapLayer *layer, bool
|
|||||||
case QgsMapLayerType::PointCloudLayer:
|
case QgsMapLayerType::PointCloudLayer:
|
||||||
case QgsMapLayerType::GroupLayer:
|
case QgsMapLayerType::GroupLayer:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -622,6 +658,27 @@ void QgsElevationProfileCanvas::onLayerProfileGenerationPropertyChanged()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsElevationProfileCanvas::onLayerProfileRendererPropertyChanged()
|
||||||
|
{
|
||||||
|
// TODO -- handle nicely when existing job is in progress
|
||||||
|
if ( !mCurrentJob || mCurrentJob->isActive() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
QgsMapLayerElevationProperties *properties = qobject_cast< QgsMapLayerElevationProperties * >( sender() );
|
||||||
|
if ( !properties )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( properties->parent() ) )
|
||||||
|
{
|
||||||
|
if ( QgsAbstractProfileSource *source = dynamic_cast< QgsAbstractProfileSource * >( layer ) )
|
||||||
|
{
|
||||||
|
mCurrentJob->replaceSource( source );
|
||||||
|
}
|
||||||
|
if ( mPlotItem->redrawResults( layer->id() ) )
|
||||||
|
scheduleDeferredRedraw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QgsElevationProfileCanvas::updateResultsForLayer()
|
void QgsElevationProfileCanvas::updateResultsForLayer()
|
||||||
{
|
{
|
||||||
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( sender() ) )
|
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( sender() ) )
|
||||||
@ -643,6 +700,15 @@ void QgsElevationProfileCanvas::scheduleDeferredUpdate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsElevationProfileCanvas::scheduleDeferredRedraw()
|
||||||
|
{
|
||||||
|
if ( !mDeferredRedrawScheduled )
|
||||||
|
{
|
||||||
|
mDeferredRedrawTimer->start( 1 );
|
||||||
|
mDeferredRedrawScheduled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QgsElevationProfileCanvas::startDeferredUpdate()
|
void QgsElevationProfileCanvas::startDeferredUpdate()
|
||||||
{
|
{
|
||||||
if ( mCurrentJob && !mCurrentJob->isActive() )
|
if ( mCurrentJob && !mCurrentJob->isActive() )
|
||||||
@ -653,6 +719,12 @@ void QgsElevationProfileCanvas::startDeferredUpdate()
|
|||||||
mDeferredUpdateScheduled = false;
|
mDeferredUpdateScheduled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsElevationProfileCanvas::startDeferredRedraw()
|
||||||
|
{
|
||||||
|
mPlotItem->update();
|
||||||
|
mDeferredRedrawScheduled = false;
|
||||||
|
}
|
||||||
|
|
||||||
QgsProfilePoint QgsElevationProfileCanvas::canvasPointToPlotPoint( QPointF point ) const
|
QgsProfilePoint QgsElevationProfileCanvas::canvasPointToPlotPoint( QPointF point ) const
|
||||||
{
|
{
|
||||||
if ( !mPlotItem->plotArea().contains( point.x(), point.y() ) )
|
if ( !mPlotItem->plotArea().contains( point.x(), point.y() ) )
|
||||||
|
|||||||
@ -205,9 +205,12 @@ class GUI_EXPORT QgsElevationProfileCanvas : public QgsPlotCanvas
|
|||||||
|
|
||||||
void generationFinished();
|
void generationFinished();
|
||||||
void onLayerProfileGenerationPropertyChanged();
|
void onLayerProfileGenerationPropertyChanged();
|
||||||
|
void onLayerProfileRendererPropertyChanged();
|
||||||
void updateResultsForLayer();
|
void updateResultsForLayer();
|
||||||
void scheduleDeferredUpdate();
|
void scheduleDeferredUpdate();
|
||||||
|
void scheduleDeferredRedraw();
|
||||||
void startDeferredUpdate();
|
void startDeferredUpdate();
|
||||||
|
void startDeferredRedraw();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -236,6 +239,8 @@ class GUI_EXPORT QgsElevationProfileCanvas : public QgsPlotCanvas
|
|||||||
QgsProfilePlotRenderer *mCurrentJob = nullptr;
|
QgsProfilePlotRenderer *mCurrentJob = nullptr;
|
||||||
QTimer *mDeferredUpdateTimer = nullptr;
|
QTimer *mDeferredUpdateTimer = nullptr;
|
||||||
bool mDeferredUpdateScheduled = false;
|
bool mDeferredUpdateScheduled = false;
|
||||||
|
QTimer *mDeferredRedrawTimer = nullptr;
|
||||||
|
bool mDeferredRedrawScheduled = false;
|
||||||
|
|
||||||
std::unique_ptr< QgsCurve > mProfileCurve;
|
std::unique_ptr< QgsCurve > mProfileCurve;
|
||||||
double mTolerance = 0;
|
double mTolerance = 0;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user