Skip to content

Commit

Permalink
Start on registry for 2d point cloud renderers
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Nov 12, 2020
1 parent 551cbe1 commit a6d61c0
Show file tree
Hide file tree
Showing 11 changed files with 644 additions and 5 deletions.
@@ -0,0 +1,165 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/core/pointcloud/qgspointcloudrendererregistry.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/



class QgsPointCloudRendererAbstractMetadata
{
%Docstring
Stores metadata about one point cloud renderer class.

.. note::

It's necessary to implement :py:func:`~createRenderer` function.
In C++ you can use QgsPointCloudRendererMetadata convenience class.

.. versionadded:: 3.18
%End

%TypeHeaderCode
#include "qgspointcloudrendererregistry.h"
%End
public:

QgsPointCloudRendererAbstractMetadata( const QString &name, const QString &visibleName, const QIcon &icon = QIcon() );
%Docstring
Constructor for QgsPointCloudRendererAbstractMetadata, with the specified ``name``.

The ``visibleName`` argument gives a translated, user friendly string identifying the renderer type.

The ``icon`` argument can be used to specify an icon representing the renderer.
%End
virtual ~QgsPointCloudRendererAbstractMetadata();

QString name() const;
%Docstring
Returns the unique name of the renderer. This value is not translated.

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

QString visibleName() const;
%Docstring
Returns a friendly display name of the renderer. This value is translated.

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

QIcon icon() const;
%Docstring
Returns an icon representing the renderer.

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

void setIcon( const QIcon &icon );
%Docstring
Sets an ``icon`` representing the renderer.

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

virtual QgsPointCloudRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) = 0 /Factory/;
%Docstring
Returns new instance of the renderer given the DOM element. Returns ``None`` on error.
Pure virtual function: must be implemented in derived classes.
%End


protected:
};


class QgsPointCloudRendererMetadata : QgsPointCloudRendererAbstractMetadata
{
%Docstring
Convenience metadata class that uses static functions to create point cloud renderer and its widget.

.. versionadded:: 3.18
%End

%TypeHeaderCode
#include "qgspointcloudrendererregistry.h"
%End
public:


virtual QgsPointCloudRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) /Factory/;




protected:

private:
QgsPointCloudRendererMetadata();
};


class QgsPointCloudRendererRegistry
{
%Docstring
Registry of 2D renderers for point clouds.

QgsPointCloudRendererRegistry is not usually directly created, but rather accessed through
:py:func:`QgsApplication.pointCloudRendererRegistry()`.

.. versionadded:: 3.18
%End

%TypeHeaderCode
#include "qgspointcloudrendererregistry.h"
%End
public:

QgsPointCloudRendererRegistry();
~QgsPointCloudRendererRegistry();


bool addRenderer( QgsPointCloudRendererAbstractMetadata *metadata /Transfer/ );
%Docstring
Adds a renderer to the registry. Takes ownership of the metadata object.

:param metadata: renderer metadata

:return: ``True`` if renderer was added successfully, or ``False`` if renderer could not
be added (e.g., a renderer with a duplicate name already exists)
%End

bool removeRenderer( const QString &rendererName );
%Docstring
Removes a renderer from registry.

:param rendererName: name of renderer to remove from registry

:return: ``True`` if renderer was successfully removed, or ``False`` if matching
renderer could not be found
%End

QgsPointCloudRendererAbstractMetadata *rendererMetadata( const QString &rendererName );
%Docstring
Returns the metadata for a specified renderer. Returns ``None`` if a matching
renderer was not found in the registry.
%End

QStringList renderersList() const;
%Docstring
Returns a list of available renderers.
%End

private:
QgsPointCloudRendererRegistry( const QgsPointCloudRendererRegistry &rh );
};

/************************************************************************
* This file has been generated automatically from *
* *
* src/core/pointcloud/qgspointcloudrendererregistry.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
7 changes: 7 additions & 0 deletions python/core/auto_generated/qgsapplication.sip.in
Expand Up @@ -674,6 +674,13 @@ Returns the application's renderer registry, used for managing vector layer rend
%End


static QgsPointCloudRendererRegistry *pointCloudRendererRegistry() /KeepReference/;
%Docstring
Returns the application's point cloud renderer registry, used for managing point cloud layer 2D renderers.

.. versionadded:: 3.18
%End

static QgsDataItemProviderRegistry *dataItemProviderRegistry() /KeepReference/;
%Docstring
Returns the application's data item provider registry, which keeps a list of data item
Expand Down
1 change: 1 addition & 0 deletions python/core/core_auto.sip
Expand Up @@ -449,6 +449,7 @@
%Include auto_generated/pointcloud/qgspointcloudlayer.sip
%Include auto_generated/pointcloud/qgspointclouddataprovider.sip
%Include auto_generated/pointcloud/qgspointcloudrenderer.sip
%Include auto_generated/pointcloud/qgspointcloudrendererregistry.sip
%Include auto_generated/metadata/qgsabstractmetadatabase.sip
%Include auto_generated/metadata/qgslayermetadata.sip
%Include auto_generated/metadata/qgslayermetadataformatter.sip
Expand Down
2 changes: 2 additions & 0 deletions src/core/CMakeLists.txt
Expand Up @@ -639,6 +639,7 @@ set(QGIS_CORE_SRCS
pointcloud/qgspointcloudindex.cpp
pointcloud/qgspointclouddataprovider.cpp
pointcloud/qgspointcloudrenderer.cpp
pointcloud/qgspointcloudrendererregistry.cpp

labeling/qgslabelfeature.cpp
labeling/qgslabelingengine.cpp
Expand Down Expand Up @@ -1325,6 +1326,7 @@ set(QGIS_CORE_HDRS
pointcloud/qgspointcloudindex.h
pointcloud/qgspointclouddataprovider.h
pointcloud/qgspointcloudrenderer.h
pointcloud/qgspointcloudrendererregistry.h

metadata/qgsabstractmetadatabase.h
metadata/qgslayermetadata.h
Expand Down
9 changes: 4 additions & 5 deletions src/core/pointcloud/qgspointcloudrenderer.cpp
Expand Up @@ -16,6 +16,8 @@
***************************************************************************/

#include "qgspointcloudrenderer.h"
#include "qgspointcloudrendererregistry.h"
#include "qgsapplication.h"

QgsPointCloudRenderContext::QgsPointCloudRenderContext( QgsRenderContext &context, const QgsVector3D &scale, const QgsVector3D &offset )
: mRenderContext( context )
Expand Down Expand Up @@ -46,17 +48,14 @@ QgsPointCloudRenderer *QgsPointCloudRenderer::load( QDomElement &element, const
return nullptr;

// load renderer
QString rendererType = element.attribute( QStringLiteral( "type" ) );
const QString rendererType = element.attribute( QStringLiteral( "type" ) );

#if 0
QgsRendererAbstractMetadata *m = QgsApplication::rendererRegistry()->rendererMetadata( rendererType );
QgsPointCloudRendererAbstractMetadata *m = QgsApplication::pointCloudRendererRegistry()->rendererMetadata( rendererType );
if ( !m )
return nullptr;

std::unique_ptr< QgsPointCloudRenderer > r( m->createRenderer( element, context ) );
return r.release();
#endif
return QgsDummyPointCloudRenderer::create( element, context );
}

QSet<QString> QgsPointCloudRenderer::usedAttributes( const QgsPointCloudRenderContext & ) const
Expand Down
72 changes: 72 additions & 0 deletions src/core/pointcloud/qgspointcloudrendererregistry.cpp
@@ -0,0 +1,72 @@
/***************************************************************************
qgspointcloudrendererregistry.cpp
---------------------
begin : November 2020
copyright : (C) 2020 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgspointcloudrendererregistry.h"
#include "qgspointcloudrenderer.h"

// default renderers

#include "qgspointcloudlayer.h"

QgsPointCloudRendererRegistry::QgsPointCloudRendererRegistry()
{
// add default renderers
addRenderer( new QgsPointCloudRendererMetadata( QStringLiteral( "dummy" ),
QObject::tr( "Dummy" ),
QgsDummyPointCloudRenderer::create ) );
}

QgsPointCloudRendererRegistry::~QgsPointCloudRendererRegistry()
{
qDeleteAll( mRenderers );
}

bool QgsPointCloudRendererRegistry::addRenderer( QgsPointCloudRendererAbstractMetadata *metadata )
{
if ( !metadata || mRenderers.contains( metadata->name() ) )
return false;

mRenderers[metadata->name()] = metadata;
mRenderersOrder << metadata->name();
return true;
}

bool QgsPointCloudRendererRegistry::removeRenderer( const QString &rendererName )
{
if ( !mRenderers.contains( rendererName ) )
return false;

delete mRenderers[rendererName];
mRenderers.remove( rendererName );
mRenderersOrder.removeAll( rendererName );
return true;
}

QgsPointCloudRendererAbstractMetadata *QgsPointCloudRendererRegistry::rendererMetadata( const QString &rendererName )
{
return mRenderers.value( rendererName );
}

QStringList QgsPointCloudRendererRegistry::renderersList() const
{
QStringList renderers;
for ( const QString &renderer : mRenderersOrder )
{
QgsPointCloudRendererAbstractMetadata *r = mRenderers.value( renderer );
if ( r )
renderers << renderer;
}
return renderers;
}

0 comments on commit a6d61c0

Please sign in to comment.