-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adds a new QGIS processing provider for 3d algorithms, available only when QGIS is built WITH_3D Currently includes only a single algorithm for tesselating geometries, which exposes the functionality of QgsTesselator to processing. Like the native c++ algorithm provider, algorithms in the 3d provider are transparently merged with the other QGIS providers (i.e. they aren't separated into their own group)
- Loading branch information
1 parent
8c211f2
commit c0e732b
Showing
8 changed files
with
329 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
/*************************************************************************** | ||
qgs3dalgorithms.cpp | ||
--------------------- | ||
begin : November 2017 | ||
copyright : (C) 2017 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 "qgs3dalgorithms.h" | ||
#include "qgsalgorithmtesselate.h" | ||
#include "qgsapplication.h" | ||
|
||
///@cond PRIVATE | ||
|
||
Qgs3DAlgorithms::Qgs3DAlgorithms( QObject *parent ) | ||
: QgsProcessingProvider( parent ) | ||
{} | ||
|
||
QIcon Qgs3DAlgorithms::icon() const | ||
{ | ||
return QgsApplication::getThemeIcon( QStringLiteral( "/providerQgis.svg" ) ); | ||
} | ||
|
||
QString Qgs3DAlgorithms::svgIconPath() const | ||
{ | ||
return QgsApplication::iconPath( QStringLiteral( "providerQgis.svg" ) ); | ||
} | ||
|
||
QString Qgs3DAlgorithms::id() const | ||
{ | ||
return QStringLiteral( "3d" ); | ||
} | ||
|
||
QString Qgs3DAlgorithms::name() const | ||
{ | ||
return tr( "QGIS (3D)" ); | ||
} | ||
|
||
bool Qgs3DAlgorithms::supportsNonFileBasedOutput() const | ||
{ | ||
return true; | ||
} | ||
|
||
void Qgs3DAlgorithms::loadAlgorithms() | ||
{ | ||
addAlgorithm( new QgsTesselateAlgorithm() ); | ||
} | ||
|
||
|
||
///@endcond | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/*************************************************************************** | ||
qgs3dalgorithms.h | ||
--------------------- | ||
begin : November 2017 | ||
copyright : (C) 2017 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. * | ||
* * | ||
***************************************************************************/ | ||
|
||
#ifndef QGS3DALGORITHMS_H | ||
#define QGS3DALGORITHMS_H | ||
|
||
#include "qgis_3d.h" | ||
#include "qgis.h" | ||
#include "processing/qgsprocessingprovider.h" | ||
|
||
/** | ||
* \ingroup analysis | ||
* \class Qgs3DAlgorithms | ||
* \since QGIS 3.0 | ||
* \brief QGIS 3D processing algorithm provider. | ||
*/ | ||
class _3D_EXPORT Qgs3DAlgorithms: public QgsProcessingProvider | ||
{ | ||
Q_OBJECT | ||
|
||
public: | ||
|
||
/** | ||
* Constructor for Qgs3DAlgorithms. | ||
*/ | ||
Qgs3DAlgorithms( QObject *parent = nullptr ); | ||
|
||
QIcon icon() const override; | ||
QString svgIconPath() const override; | ||
QString id() const override; | ||
QString name() const override; | ||
bool supportsNonFileBasedOutput() const override; | ||
|
||
protected: | ||
|
||
void loadAlgorithms() override; | ||
|
||
}; | ||
|
||
#endif // QGS3DALGORITHMS_H | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
/*************************************************************************** | ||
qgsalgorithmtesselate.cpp | ||
--------------------- | ||
begin : November 2017 | ||
copyright : (C) 2017 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 "qgsalgorithmtesselate.h" | ||
#include "qgstessellator.h" | ||
#include "qgsmultipolygon.h" | ||
#include "qgstriangle.h" | ||
///@cond PRIVATE | ||
|
||
QString QgsTesselateAlgorithm::name() const | ||
{ | ||
return QStringLiteral( "tesselate" ); | ||
} | ||
|
||
QString QgsTesselateAlgorithm::displayName() const | ||
{ | ||
return QObject::tr( "Tesselate geometry" ); | ||
} | ||
|
||
QStringList QgsTesselateAlgorithm::tags() const | ||
{ | ||
return QObject::tr( "3d,triangle" ).split( ',' ); | ||
} | ||
|
||
QString QgsTesselateAlgorithm::group() const | ||
{ | ||
return QObject::tr( "Vector geometry" ); | ||
} | ||
|
||
QString QgsTesselateAlgorithm::outputName() const | ||
{ | ||
return QObject::tr( "Tesselated" ); | ||
} | ||
|
||
QgsProcessing::SourceType QgsTesselateAlgorithm::outputLayerType() const | ||
{ | ||
return QgsProcessing::TypeVectorPolygon; | ||
} | ||
|
||
QgsWkbTypes::Type QgsTesselateAlgorithm::outputWkbType( QgsWkbTypes::Type inputWkbType ) const | ||
{ | ||
Q_UNUSED( inputWkbType ); | ||
return QgsWkbTypes::MultiPolygonZ; | ||
} | ||
|
||
QString QgsTesselateAlgorithm::shortHelpString() const | ||
{ | ||
return QObject::tr( "This algorithm tesselates a polygon geometry layer, dividing the geometries into triangular components." ) | ||
+ QStringLiteral( "\n\n" ) | ||
+ QObject::tr( "The output layer consists of multipolygon geometries for each input feature, with each multipolygon consisting of multiple triangle component polygons." ); | ||
} | ||
|
||
QList<int> QgsTesselateAlgorithm::inputLayerTypes() const | ||
{ | ||
return QList<int>() << QgsProcessing::TypeVectorPolygon; | ||
} | ||
|
||
QgsTesselateAlgorithm *QgsTesselateAlgorithm::createInstance() const | ||
{ | ||
return new QgsTesselateAlgorithm(); | ||
} | ||
|
||
QgsPoint getPointFromData( QVector< float >::const_iterator &it ) | ||
{ | ||
// tesselator geometry is x, z, -y | ||
double x = *it; | ||
++it; | ||
double z = *it; | ||
++it; | ||
double y = -( *it ); | ||
++it; | ||
return QgsPoint( x, y, z ); | ||
} | ||
|
||
void tesselatePolygon( const QgsPolygon *polygon, QgsMultiPolygon *destination ) | ||
{ | ||
QgsTessellator t( 0, 0, false ); | ||
t.addPolygon( *polygon, 0 ); | ||
|
||
QVector<float> data = t.data(); | ||
for ( auto it = data.constBegin(); it != data.constEnd(); ) | ||
{ | ||
QgsPoint p1 = getPointFromData( it ); | ||
QgsPoint p2 = getPointFromData( it ); | ||
QgsPoint p3 = getPointFromData( it ); | ||
destination->addGeometry( new QgsTriangle( p1, p2, p3 ) ); | ||
} | ||
} | ||
|
||
QgsFeature QgsTesselateAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingFeedback * ) | ||
{ | ||
QgsFeature f = feature; | ||
if ( f.hasGeometry() ) | ||
{ | ||
if ( QgsWkbTypes::geometryType( f.geometry().wkbType() ) != QgsWkbTypes::PolygonGeometry ) | ||
f.clearGeometry(); | ||
else | ||
{ | ||
std::unique_ptr< QgsMultiPolygon > mp = qgis::make_unique< QgsMultiPolygon >(); | ||
if ( f.geometry().isMultipart() ) | ||
{ | ||
const QgsMultiSurface *ms = qgsgeometry_cast< const QgsMultiSurface * >( f.geometry().constGet() ); | ||
for ( int i = 0; i < ms->numGeometries(); ++i ) | ||
{ | ||
std::unique_ptr< QgsPolygon > p( qgsgeometry_cast< QgsPolygon * >( ms->geometryN( i )->segmentize() ) ); | ||
tesselatePolygon( p.get(), mp.get() ); | ||
} | ||
} | ||
else | ||
{ | ||
std::unique_ptr< QgsPolygon > p( qgsgeometry_cast< QgsPolygon * >( f.geometry().constGet()->segmentize() ) ); | ||
tesselatePolygon( p.get(), mp.get() ); | ||
} | ||
f.setGeometry( QgsGeometry( std::move( mp ) ) ); | ||
} | ||
} | ||
return f; | ||
} | ||
|
||
///@endcond | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/*************************************************************************** | ||
qgsalgorithmtesselate.h | ||
--------------------- | ||
begin : November 2017 | ||
copyright : (C) 2017 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. * | ||
* * | ||
***************************************************************************/ | ||
|
||
#ifndef QGSALGORITHMTESSELATE_H | ||
#define QGSALGORITHMTESSELATE_H | ||
|
||
#define SIP_NO_FILE | ||
|
||
#include "qgis.h" | ||
#include "processing/qgsprocessingalgorithm.h" | ||
|
||
///@cond PRIVATE | ||
|
||
/** | ||
* Native tesselate algorithm. | ||
*/ | ||
class QgsTesselateAlgorithm : public QgsProcessingFeatureBasedAlgorithm | ||
{ | ||
|
||
public: | ||
|
||
QgsTesselateAlgorithm() = default; | ||
QString name() const override; | ||
QString displayName() const override; | ||
virtual QStringList tags() const override; | ||
QString group() const override; | ||
QString shortHelpString() const override; | ||
QList<int> inputLayerTypes() const override; | ||
QgsTesselateAlgorithm *createInstance() const override SIP_FACTORY; | ||
|
||
protected: | ||
QString outputName() const override; | ||
QgsProcessing::SourceType outputLayerType() const override; | ||
QgsWkbTypes::Type outputWkbType( QgsWkbTypes::Type inputWkbType ) const override; | ||
|
||
QgsFeature processFeature( const QgsFeature &feature, QgsProcessingFeedback *feedback ) override; | ||
|
||
}; | ||
|
||
|
||
///@endcond PRIVATE | ||
|
||
#endif // QGSALGORITHMTESSELATE_H | ||
|
||
|
Oops, something went wrong.