diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index d85ab01316d3..631f8ed7c6a5 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -70,6 +70,7 @@ IF(WITH_APIDOC) ${CMAKE_SOURCE_DIR}/src/core/layout ${CMAKE_SOURCE_DIR}/src/core/locator ${CMAKE_SOURCE_DIR}/src/core/metadata + ${CMAKE_SOURCE_DIR}/src/core/mesh ${CMAKE_SOURCE_DIR}/src/core/pal ${CMAKE_SOURCE_DIR}/src/core/processing ${CMAKE_SOURCE_DIR}/src/core/providers diff --git a/python/core/mesh/qgsmeshlayer.sip.in b/python/core/mesh/qgsmeshlayer.sip.in index 1a97dae00c4c..b7ace1c386ae 100644 --- a/python/core/mesh/qgsmeshlayer.sip.in +++ b/python/core/mesh/qgsmeshlayer.sip.in @@ -10,6 +10,7 @@ + class QgsMeshLayer : QgsMapLayer { %Docstring diff --git a/src/core/mesh/qgsmeshlayer.cpp b/src/core/mesh/qgsmeshlayer.cpp index 5267a61fe3c7..bbd382ac08de 100644 --- a/src/core/mesh/qgsmeshlayer.cpp +++ b/src/core/mesh/qgsmeshlayer.cpp @@ -38,7 +38,7 @@ QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath, QgsSymbolLayerList l1; l1 << new QgsSimpleFillSymbolLayer( Qt::white, Qt::NoBrush, Qt::black, Qt::SolidLine, 1.0 ); - mNativeMeshSymbol = new QgsFillSymbol( l1 ); + mNativeMeshSymbol.reset( new QgsFillSymbol( l1 ) ); toggleTriangularMeshRendering( false ); @@ -49,16 +49,8 @@ QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath, QgsMeshLayer::~QgsMeshLayer() { - clearMeshes(); - if ( mDataProvider ) delete mDataProvider; - - if ( mNativeMeshSymbol ) - delete mNativeMeshSymbol; - - if ( mTriangularMeshSymbol ) - delete mTriangularMeshSymbol; } QgsMeshDataProvider *QgsMeshLayer::dataProvider() @@ -95,31 +87,41 @@ QString QgsMeshLayer::providerType() const return mProviderKey; } -QgsMesh *QgsMeshLayer::nativeMesh() SIP_SKIP {return mNativeMesh;} +QgsMesh *QgsMeshLayer::nativeMesh() SIP_SKIP +{ + return mNativeMesh.get(); +} -QgsTriangularMesh *QgsMeshLayer::triangularMesh() SIP_SKIP {return mTriangularMesh;} -QgsSymbol *QgsMeshLayer::nativeMeshSymbol() {return mNativeMeshSymbol;} +QgsTriangularMesh *QgsMeshLayer::triangularMesh() SIP_SKIP +{ + return mTriangularMesh.get(); +} -QgsSymbol *QgsMeshLayer::triangularMeshSymbol() {return mTriangularMeshSymbol;} +QgsSymbol *QgsMeshLayer::nativeMeshSymbol() +{ + return mNativeMeshSymbol.get(); +} + +QgsSymbol *QgsMeshLayer::triangularMeshSymbol() +{ + return mTriangularMeshSymbol.get(); +} void QgsMeshLayer::toggleTriangularMeshRendering( bool toggle ) { if ( toggle && mTriangularMeshSymbol ) return; - if ( mTriangularMeshSymbol ) - delete mTriangularMeshSymbol; - if ( toggle ) { QgsSymbolLayerList l2; l2 << new QgsSimpleFillSymbolLayer( Qt::white, Qt::NoBrush, Qt::red, Qt::SolidLine, 0.26 ); - mTriangularMeshSymbol = new QgsFillSymbol( l2 ); + mTriangularMeshSymbol.reset( new QgsFillSymbol( l2 ) ); } else { - mTriangularMeshSymbol = nullptr; + mTriangularMeshSymbol.reset(); } triggerRepaint(); } @@ -128,7 +130,7 @@ void QgsMeshLayer::fillNativeMesh() { Q_ASSERT( !mNativeMesh ); - mNativeMesh = new QgsMesh(); + mNativeMesh.reset( new QgsMesh() ); if ( !( dataProvider() && dataProvider()->isValid() ) ) return; @@ -150,13 +152,14 @@ QgsMapLayerRenderer *QgsMeshLayer::createMapRenderer( QgsRenderContext &renderer { if ( !mNativeMesh ) { + // lazy loading of mesh data fillNativeMesh(); } if ( !mTriangularMesh ) - mTriangularMesh = new QgsTriangularMesh(); + mTriangularMesh.reset( new QgsTriangularMesh() ); - triangularMesh()->update( mNativeMesh, &rendererContext ); + mTriangularMesh->update( mNativeMesh.get(), &rendererContext ); return new QgsMeshLayerRenderer( this, rendererContext ); } @@ -177,26 +180,13 @@ bool QgsMeshLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &e return true; } -void QgsMeshLayer::clearMeshes() -{ - if ( mTriangularMesh ) - delete mTriangularMesh; - - if ( mNativeMesh ) - delete mNativeMesh; - -} - bool QgsMeshLayer::setDataProvider( QString const &provider ) { - clearMeshes(); + Q_ASSERT( !mDataProvider ); //called from ctor mProviderKey = provider; QString dataSource = mDataSource; - if ( mDataProvider ) - delete mDataProvider; - mDataProvider = qobject_cast( QgsProviderRegistry::instance()->createProvider( provider, dataSource ) ); if ( !mDataProvider ) { diff --git a/src/core/mesh/qgsmeshlayer.h b/src/core/mesh/qgsmeshlayer.h index 92b8f7ec1716..b185010e8643 100644 --- a/src/core/mesh/qgsmeshlayer.h +++ b/src/core/mesh/qgsmeshlayer.h @@ -18,6 +18,8 @@ #ifndef QGSMESHLAYER_H #define QGSMESHLAYER_H +#include + #include "qgis_core.h" #include "qgsmaplayer.h" #include "qgsrendercontext.h" @@ -152,28 +154,26 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer #endif private: - //! Clear native and triangular mesh - void clearMeshes(); void fillNativeMesh(); private: - //! Pointer to native mesh structure, used as cache for rendering - QgsMesh *mNativeMesh = nullptr; - - //! Pointer to derived mesh structure - QgsTriangularMesh *mTriangularMesh = nullptr; - //! Pointer to data provider derived from the abastract base class QgsMeshDataProvider QgsMeshDataProvider *mDataProvider = nullptr; //! Data provider key QString mProviderKey; + //! Pointer to native mesh structure, used as cache for rendering + std::unique_ptr mNativeMesh; + + //! Pointer to derived mesh structure + std::unique_ptr mTriangularMesh; + //! rendering native mesh - QgsSymbol *mNativeMeshSymbol = nullptr; + std::unique_ptr mNativeMeshSymbol; //! rendering triangular mesh - QgsSymbol *mTriangularMeshSymbol = nullptr; + std::unique_ptr mTriangularMeshSymbol; }; #endif //QGSMESHLAYER_H diff --git a/src/core/mesh/qgsmeshlayerrenderer.cpp b/src/core/mesh/qgsmeshlayerrenderer.cpp index f7ee892afac2..eec161a7fb55 100644 --- a/src/core/mesh/qgsmeshlayerrenderer.cpp +++ b/src/core/mesh/qgsmeshlayerrenderer.cpp @@ -40,27 +40,15 @@ QgsMeshLayerRenderer::QgsMeshLayerRenderer( QgsMeshLayer *layer, QgsRenderContex // make copies for symbols if ( layer->nativeMeshSymbol() ) { - mNativeMeshSymbol = layer->nativeMeshSymbol()->clone(); + mNativeMeshSymbol.reset( layer->nativeMeshSymbol()->clone() ); } if ( layer->triangularMeshSymbol() ) { - mTriangularMeshSymbol = layer->triangularMeshSymbol()->clone(); + mTriangularMeshSymbol.reset( layer->triangularMeshSymbol()->clone() ); } } - -QgsMeshLayerRenderer::~QgsMeshLayerRenderer() -{ - if ( mNativeMeshSymbol ) - delete mNativeMeshSymbol; - - if ( mTriangularMeshSymbol ) - delete mTriangularMeshSymbol; -} - - - bool QgsMeshLayerRenderer::render() { renderMesh( mNativeMeshSymbol, mNativeMesh.faces ); // native mesh @@ -69,7 +57,7 @@ bool QgsMeshLayerRenderer::render() return true; } -void QgsMeshLayerRenderer::renderMesh( QgsSymbol *symbol, const QVector &faces ) +void QgsMeshLayerRenderer::renderMesh( const std::unique_ptr &symbol, const QVector &faces ) { if ( !symbol ) return; diff --git a/src/core/mesh/qgsmeshlayerrenderer.h b/src/core/mesh/qgsmeshlayerrenderer.h index eb10d7e6da1c..7771759eb89a 100644 --- a/src/core/mesh/qgsmeshlayerrenderer.h +++ b/src/core/mesh/qgsmeshlayerrenderer.h @@ -23,6 +23,8 @@ class QgsSymbol; #define SIP_NO_FILE +#include + #include "qgis.h" #include "qgsmaplayerrenderer.h" @@ -42,11 +44,11 @@ class QgsMeshLayerRenderer : public QgsMapLayerRenderer //! Ctor QgsMeshLayerRenderer( QgsMeshLayer *layer, QgsRenderContext &context ); - ~QgsMeshLayerRenderer() override; + ~QgsMeshLayerRenderer() override = default; bool render() override; private: - void renderMesh( QgsSymbol *symbol, const QVector &faces ); + void renderMesh( const std::unique_ptr &symbol, const QVector &faces ); protected: @@ -57,15 +59,13 @@ class QgsMeshLayerRenderer : public QgsMapLayerRenderer QgsTriangularMesh mTriangularMesh; // copy from mesh layer - QgsSymbol *mNativeMeshSymbol = nullptr; + std::unique_ptr mNativeMeshSymbol = nullptr; // copy from mesh layer - QgsSymbol *mTriangularMeshSymbol = nullptr; + std::unique_ptr mTriangularMeshSymbol = nullptr; // rendering context QgsRenderContext &mContext; - - }; diff --git a/src/core/mesh/qgstriangularmesh.cpp b/src/core/mesh/qgstriangularmesh.cpp index ce6fc4dfa595..d490156e646b 100644 --- a/src/core/mesh/qgstriangularmesh.cpp +++ b/src/core/mesh/qgstriangularmesh.cpp @@ -19,14 +19,6 @@ #include "qgsrendercontext.h" #include "qgscoordinatetransform.h" -QgsTriangularMesh::QgsTriangularMesh( ) -{ -} - -QgsTriangularMesh::~QgsTriangularMesh() -{ -} - void QgsTriangularMesh::update( QgsMesh *nativeMesh, QgsRenderContext *context ) { Q_ASSERT( nativeMesh ); @@ -41,7 +33,7 @@ void QgsTriangularMesh::update( QgsMesh *nativeMesh, QgsRenderContext *context ) mTriangularMesh.vertices.resize( nativeMesh->vertices.size() ); for ( int i = 0; i < nativeMesh->vertices.size(); ++i ) { - QgsMeshVertex vertex = nativeMesh->vertices[i]; + const QgsMeshVertex &vertex = nativeMesh->vertices.at( i ); if ( transform.isValid() ) { QgsPointXY mapPoint = transform.transform( QgsPointXY( vertex.x(), vertex.y() ) ); @@ -59,7 +51,7 @@ void QgsTriangularMesh::update( QgsMesh *nativeMesh, QgsRenderContext *context ) // CREATE TRIANGULAR MESH for ( int i = 0; i < nativeMesh->faces.size(); ++i ) { - QgsMeshFace face = nativeMesh->faces[i] ; + const QgsMeshFace &face = nativeMesh->faces.at( i ) ; if ( face.size() == 3 ) { // triangle diff --git a/src/core/mesh/qgstriangularmesh.h b/src/core/mesh/qgstriangularmesh.h index 5c5b39ebd097..26ee2f27218a 100644 --- a/src/core/mesh/qgstriangularmesh.h +++ b/src/core/mesh/qgstriangularmesh.h @@ -45,9 +45,9 @@ class CORE_EXPORT QgsTriangularMesh { public: //! Ctor - QgsTriangularMesh(); + QgsTriangularMesh() = default; //! Dtor - ~QgsTriangularMesh(); + ~QgsTriangularMesh() = default; /** * Construct triangular mesh from layer's native mesh and context