mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-17 00:09:36 -04:00
Split QgsPointCloud3DSymbol into different classes
This commit is contained in:
parent
ae749de439
commit
3979b47ed1
@ -35,27 +35,18 @@ class QgsPointCloud3DSymbol : QgsAbstract3DSymbol
|
||||
ColorRamp,
|
||||
};
|
||||
|
||||
enum RenderingParameter
|
||||
{
|
||||
Height,
|
||||
ClassID
|
||||
};
|
||||
|
||||
QgsPointCloud3DSymbol();
|
||||
QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style );
|
||||
%Docstring
|
||||
Constructor for QgsPointCloud3DSymbol
|
||||
%End
|
||||
~QgsPointCloud3DSymbol();
|
||||
|
||||
virtual QString type() const;
|
||||
virtual QgsAbstract3DSymbol *clone() const /Factory/;
|
||||
|
||||
|
||||
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;
|
||||
|
||||
|
||||
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
|
||||
|
||||
virtual QString type() const;
|
||||
|
||||
bool isEnabled() const;
|
||||
%Docstring
|
||||
@ -71,6 +62,43 @@ Sets whether rendering for this symbol is enabled
|
||||
.. seealso:: :py:func:`isEnabled`
|
||||
%End
|
||||
|
||||
QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const;
|
||||
%Docstring
|
||||
Returns the rendering style
|
||||
|
||||
.. seealso:: :py:func:`setRenderingStyle`
|
||||
%End
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
class QgsSingleColorPointCloud3DSymbol : QgsPointCloud3DSymbol
|
||||
{
|
||||
%Docstring
|
||||
3D symbol that draws point cloud geometries as 3D objects.using one color
|
||||
|
||||
.. warning::
|
||||
|
||||
This is not considered stable API, and may change in future QGIS releases. It is
|
||||
exposed to the Python bindings as a tech preview only.
|
||||
|
||||
.. versionadded:: 3.18
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgspointcloud3dsymbol.h"
|
||||
%End
|
||||
public:
|
||||
QgsSingleColorPointCloud3DSymbol();
|
||||
|
||||
virtual QgsAbstract3DSymbol *clone() const /Factory/;
|
||||
|
||||
|
||||
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;
|
||||
|
||||
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
|
||||
|
||||
|
||||
float pointSize() const;
|
||||
%Docstring
|
||||
Returns the point size of the point cloud
|
||||
@ -83,34 +111,6 @@ Returns the point size of the point cloud
|
||||
Sets the point size
|
||||
|
||||
.. seealso:: :py:func:`pointSize`
|
||||
%End
|
||||
|
||||
QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const;
|
||||
%Docstring
|
||||
Returns the rendering style
|
||||
|
||||
.. seealso:: :py:func:`setRenderingStyle`
|
||||
%End
|
||||
|
||||
void setRenderingStyle( QgsPointCloud3DSymbol::RenderingStyle style );
|
||||
%Docstring
|
||||
Sets the rendering style
|
||||
|
||||
.. seealso:: :py:func:`renderingStyle`
|
||||
%End
|
||||
|
||||
QgsPointCloud3DSymbol::RenderingParameter renderingParameter() const;
|
||||
%Docstring
|
||||
Returns the parameter used to select the color of the point cloud when using color ramp coloring
|
||||
|
||||
.. seealso:: :py:func:`setRenderingParameter`
|
||||
%End
|
||||
|
||||
void setRenderingParameter( QgsPointCloud3DSymbol::RenderingParameter parameter );
|
||||
%Docstring
|
||||
Sets the parameter used to select the color of the point cloud when using color ramp coloring
|
||||
|
||||
.. seealso:: :py:func:`renderingParameter`
|
||||
%End
|
||||
|
||||
QColor singleColor() const;
|
||||
@ -125,6 +125,70 @@ Returns the color used by the renderer when using SingleColor rendering mode
|
||||
Sets the color used by the renderer when using SingleColor rendering mode
|
||||
|
||||
.. seealso:: :py:func:`singleColor`
|
||||
%End
|
||||
|
||||
};
|
||||
|
||||
class QgsColorRampPointCloud3DSymbol : QgsPointCloud3DSymbol
|
||||
{
|
||||
%Docstring
|
||||
3D symbol that draws point cloud geometries as 3D objects.using color ramp shader
|
||||
|
||||
.. warning::
|
||||
|
||||
This is not considered stable API, and may change in future QGIS releases. It is
|
||||
exposed to the Python bindings as a tech preview only.
|
||||
|
||||
.. versionadded:: 3.18
|
||||
%End
|
||||
|
||||
%TypeHeaderCode
|
||||
#include "qgspointcloud3dsymbol.h"
|
||||
%End
|
||||
public:
|
||||
|
||||
enum RenderingParameter
|
||||
{
|
||||
Height,
|
||||
ClassID
|
||||
};
|
||||
|
||||
QgsColorRampPointCloud3DSymbol();
|
||||
|
||||
virtual QgsAbstract3DSymbol *clone() const /Factory/;
|
||||
|
||||
|
||||
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;
|
||||
|
||||
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
|
||||
|
||||
|
||||
float pointSize() const;
|
||||
%Docstring
|
||||
Returns the point size of the point cloud
|
||||
|
||||
.. seealso:: :py:func:`setPointSize`
|
||||
%End
|
||||
|
||||
void setPointSize( float size );
|
||||
%Docstring
|
||||
Sets the point size
|
||||
|
||||
.. seealso:: :py:func:`pointSize`
|
||||
%End
|
||||
|
||||
QgsColorRampPointCloud3DSymbol::RenderingParameter renderingParameter() const;
|
||||
%Docstring
|
||||
Returns the parameter used to select the color of the point cloud when using color ramp coloring
|
||||
|
||||
.. seealso:: :py:func:`setRenderingParameter`
|
||||
%End
|
||||
|
||||
void setRenderingParameter( QgsColorRampPointCloud3DSymbol::RenderingParameter parameter );
|
||||
%Docstring
|
||||
Sets the parameter used to select the color of the point cloud when using color ramp coloring
|
||||
|
||||
.. seealso:: :py:func:`renderingParameter`
|
||||
%End
|
||||
|
||||
QgsColorRampShader colorRampShader() const;
|
||||
@ -134,7 +198,7 @@ Returns the color ramp shader used to render the color
|
||||
|
||||
void setColorRampShader( const QgsColorRampShader &colorRampShader );
|
||||
%Docstring
|
||||
Sets the color ramp shader used to render the color
|
||||
Sets the color ramp shader used to render the point cloud
|
||||
%End
|
||||
|
||||
double colorRampShaderMin() const;
|
||||
@ -155,7 +219,7 @@ Returns the maximum value used when classifying colors in the color ramp shader
|
||||
%Docstring
|
||||
Sets the minimum and maximum values used when classifying colors in the color ramp shader
|
||||
|
||||
.. seealso:: :py:func:`setColorRampShaderMinMax`
|
||||
.. seealso:: :py:func:`colorRampShaderMin`
|
||||
%End
|
||||
|
||||
};
|
||||
|
@ -110,8 +110,17 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe
|
||||
mLayerRef = QgsMapLayerRef( elem.attribute( QStringLiteral( "layer" ) ) );
|
||||
|
||||
QDomElement elemSymbol = elem.firstChildElement( QStringLiteral( "symbol" ) );
|
||||
if ( !mSymbol )
|
||||
mSymbol = qgis::make_unique< QgsPointCloud3DSymbol >();
|
||||
int renderingStyleInt = elemSymbol.attribute( QStringLiteral( "rendering-style" ), QStringLiteral( "0" ) ).toInt();
|
||||
QgsPointCloud3DSymbol::RenderingStyle renderingStyle = static_cast<QgsPointCloud3DSymbol::RenderingStyle>( renderingStyleInt );
|
||||
switch ( renderingStyle )
|
||||
{
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
|
||||
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol );
|
||||
break;
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
|
||||
mSymbol.reset( new QgsColorRampPointCloud3DSymbol );
|
||||
break;
|
||||
}
|
||||
mSymbol->readXml( elemSymbol, context );
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,7 @@ void QgsPointCloud3DGeometry::makeVertexBuffer( const QgsPointCloud3DSymbolHandl
|
||||
|
||||
QgsPointCloud3DSymbolHandler::QgsPointCloud3DSymbolHandler( QgsPointCloud3DSymbol *symbol )
|
||||
{
|
||||
mSymbol.reset( symbol );
|
||||
mSymbol.reset( symbol ) ;
|
||||
}
|
||||
|
||||
bool QgsPointCloud3DSymbolHandler::prepare( const Qgs3DRenderContext &context )
|
||||
@ -170,7 +170,16 @@ void QgsPointCloud3DSymbolHandler::makeEntity( Qt3DCore::QEntity *parent, const
|
||||
Qt3DCore::QTransform *tr = new Qt3DCore::QTransform;
|
||||
|
||||
// Material
|
||||
Qt3DRender::QMaterial *mat = constructMaterial();
|
||||
Qt3DRender::QMaterial *mat = nullptr;
|
||||
switch ( mSymbol->renderingStyle() )
|
||||
{
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
|
||||
mat = constructMaterial( dynamic_cast<QgsSingleColorPointCloud3DSymbol *>( mSymbol.get() ) );
|
||||
break;
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
|
||||
mat = constructMaterial( dynamic_cast<QgsColorRampPointCloud3DSymbol *>( mSymbol.get() ) );
|
||||
break;
|
||||
}
|
||||
|
||||
Qt3DRender::QShaderProgram *shaderProgram = new Qt3DRender::QShaderProgram( mat );
|
||||
shaderProgram->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral( "qrc:/shaders/pointcloud.vert" ) ) ) );
|
||||
@ -181,7 +190,15 @@ void QgsPointCloud3DSymbolHandler::makeEntity( Qt3DCore::QEntity *parent, const
|
||||
|
||||
Qt3DRender::QPointSize *pointSize = new Qt3DRender::QPointSize( renderPass );
|
||||
pointSize->setSizeMode( Qt3DRender::QPointSize::Programmable ); // supported since OpenGL 3.2
|
||||
pointSize->setValue( mSymbol->pointSize() );
|
||||
switch ( mSymbol->renderingStyle() )
|
||||
{
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
|
||||
pointSize->setValue( dynamic_cast<QgsSingleColorPointCloud3DSymbol *>( mSymbol.get() )->pointSize() );
|
||||
break;
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
|
||||
pointSize->setValue( dynamic_cast<QgsColorRampPointCloud3DSymbol *>( mSymbol.get() )->pointSize() );
|
||||
break;
|
||||
}
|
||||
renderPass->addRenderState( pointSize );
|
||||
|
||||
// without this filter the default forward renderer would not render this
|
||||
@ -211,40 +228,48 @@ void QgsPointCloud3DSymbolHandler::makeEntity( Qt3DCore::QEntity *parent, const
|
||||
// cppcheck-suppress memleak
|
||||
}
|
||||
|
||||
|
||||
Qt3DRender::QMaterial *QgsPointCloud3DSymbolHandler::constructMaterial()
|
||||
Qt3DRender::QMaterial *QgsPointCloud3DSymbolHandler::constructMaterial( QgsSingleColorPointCloud3DSymbol *symbol )
|
||||
{
|
||||
Qt3DRender::QMaterial *mat = new Qt3DRender::QMaterial;
|
||||
Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mSymbol->pointSize() ) );
|
||||
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", symbol->renderingStyle() );
|
||||
mat->addParameter( renderingStyle );
|
||||
Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( symbol->pointSize() ) );
|
||||
mat->addParameter( pointSizeParameter );
|
||||
QColor singleColor = mSymbol->singleColor();
|
||||
QColor singleColor = symbol->singleColor();
|
||||
Qt3DRender::QParameter *singleColorParameter = new Qt3DRender::QParameter( "u_singleColor", QVector3D( singleColor.redF(), singleColor.greenF(), singleColor.blueF() ) );
|
||||
mat->addParameter( singleColorParameter );
|
||||
Qt3DRender::QParameter *textureTypeParameter = new Qt3DRender::QParameter( "u_textureType", static_cast<int>( mSymbol->renderingStyle() ) );
|
||||
return mat;
|
||||
}
|
||||
|
||||
Qt3DRender::QMaterial *QgsPointCloud3DSymbolHandler::constructMaterial( QgsColorRampPointCloud3DSymbol *symbol )
|
||||
{
|
||||
Qt3DRender::QMaterial *mat = new Qt3DRender::QMaterial;
|
||||
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", symbol->renderingStyle() );
|
||||
mat->addParameter( renderingStyle );
|
||||
Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( symbol->pointSize() ) );
|
||||
mat->addParameter( pointSizeParameter );
|
||||
Qt3DRender::QParameter *textureTypeParameter = new Qt3DRender::QParameter( "u_textureType", static_cast<int>( symbol->renderingStyle() ) );
|
||||
mat->addParameter( textureTypeParameter );
|
||||
Qt3DRender::QParameter *renderingParameter = new Qt3DRender::QParameter( "u_renderingParameter", mSymbol->renderingParameter() );
|
||||
Qt3DRender::QParameter *renderingParameter = new Qt3DRender::QParameter( "u_renderingParameter", symbol->renderingParameter() );
|
||||
mat->addParameter( renderingParameter );
|
||||
if ( mSymbol->renderingStyle() == QgsPointCloud3DSymbol::ColorRamp )
|
||||
QgsColorRampShader colorRampShader = symbol->colorRampShader();
|
||||
// Create the texture to pass the color ramp
|
||||
Qt3DRender::QTexture1D *colorRampTexture = nullptr;
|
||||
if ( colorRampShader.colorRampItemList().count() > 0 )
|
||||
{
|
||||
QgsColorRampShader colorRampShader = mSymbol->colorRampShader();
|
||||
// Create the texture to pass the color ramp
|
||||
Qt3DRender::QTexture1D *colorRampTexture = nullptr;
|
||||
if ( colorRampShader.colorRampItemList().count() > 0 )
|
||||
{
|
||||
colorRampTexture = new Qt3DRender::QTexture1D( mat );
|
||||
colorRampTexture->addTextureImage( new QgsColorRampTexture( colorRampShader, 1 ) );
|
||||
colorRampTexture->setMinificationFilter( Qt3DRender::QTexture1D::Linear );
|
||||
colorRampTexture->setMagnificationFilter( Qt3DRender::QTexture1D::Linear );
|
||||
}
|
||||
// Parameters
|
||||
Qt3DRender::QParameter *colorRampTextureParameter = new Qt3DRender::QParameter( "u_colorRampTexture", colorRampTexture );
|
||||
mat->addParameter( colorRampTextureParameter );
|
||||
Qt3DRender::QParameter *colorRampCountParameter = new Qt3DRender::QParameter( "u_colorRampCount", colorRampShader.colorRampItemList().count() );
|
||||
mat->addParameter( colorRampCountParameter );
|
||||
int colorRampType = colorRampShader.colorRampType();
|
||||
Qt3DRender::QParameter *colorRampTypeParameter = new Qt3DRender::QParameter( "u_colorRampType", colorRampType );
|
||||
mat->addParameter( colorRampTypeParameter );
|
||||
colorRampTexture = new Qt3DRender::QTexture1D( mat );
|
||||
colorRampTexture->addTextureImage( new QgsColorRampTexture( colorRampShader, 1 ) );
|
||||
colorRampTexture->setMinificationFilter( Qt3DRender::QTexture1D::Linear );
|
||||
colorRampTexture->setMagnificationFilter( Qt3DRender::QTexture1D::Linear );
|
||||
}
|
||||
// Parameters
|
||||
Qt3DRender::QParameter *colorRampTextureParameter = new Qt3DRender::QParameter( "u_colorRampTexture", colorRampTexture );
|
||||
mat->addParameter( colorRampTextureParameter );
|
||||
Qt3DRender::QParameter *colorRampCountParameter = new Qt3DRender::QParameter( "u_colorRampCount", colorRampShader.colorRampItemList().count() );
|
||||
mat->addParameter( colorRampCountParameter );
|
||||
int colorRampType = colorRampShader.colorRampType();
|
||||
Qt3DRender::QParameter *colorRampTypeParameter = new Qt3DRender::QParameter( "u_colorRampType", colorRampType );
|
||||
mat->addParameter( colorRampTypeParameter );
|
||||
return mat;
|
||||
}
|
||||
|
||||
|
@ -78,7 +78,8 @@ class QgsPointCloud3DSymbolHandler // : public QgsFeature3DHandler
|
||||
//static Qt3DCore::QTransform *transform( QVector3D position, const QgsPoint3DSymbol *symbol );
|
||||
|
||||
private:
|
||||
Qt3DRender::QMaterial *constructMaterial();
|
||||
Qt3DRender::QMaterial *constructMaterial( QgsSingleColorPointCloud3DSymbol *symbol );
|
||||
Qt3DRender::QMaterial *constructMaterial( QgsColorRampPointCloud3DSymbol *symbol );
|
||||
|
||||
void makeEntity( Qt3DCore::QEntity *parent, const Qgs3DRenderContext &context, PointData &out, bool selected );
|
||||
|
||||
|
@ -15,31 +15,42 @@
|
||||
|
||||
#include "qgspointcloud3dsymbol.h"
|
||||
|
||||
// QgsPointCloud3DSymbol
|
||||
|
||||
QgsPointCloud3DSymbol::QgsPointCloud3DSymbol()
|
||||
QgsPointCloud3DSymbol::QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style )
|
||||
: QgsAbstract3DSymbol()
|
||||
, mRenderingStyle( style )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QgsPointCloud3DSymbol::~QgsPointCloud3DSymbol() { }
|
||||
|
||||
QgsAbstract3DSymbol *QgsPointCloud3DSymbol::clone() const
|
||||
void QgsPointCloud3DSymbol::setIsEnabled( bool enabled )
|
||||
{
|
||||
QgsPointCloud3DSymbol *result = new QgsPointCloud3DSymbol;
|
||||
mEnabled = enabled;
|
||||
}
|
||||
|
||||
// QgsSingleColorPointCloud3DSymbol
|
||||
|
||||
QgsSingleColorPointCloud3DSymbol::QgsSingleColorPointCloud3DSymbol()
|
||||
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::SingleColor )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QgsAbstract3DSymbol *QgsSingleColorPointCloud3DSymbol::clone() const
|
||||
{
|
||||
QgsSingleColorPointCloud3DSymbol *result = new QgsSingleColorPointCloud3DSymbol;
|
||||
result->mEnabled = mEnabled;
|
||||
result->mPointSize = mPointSize;
|
||||
result->mRenderingStyle = mRenderingStyle;
|
||||
result->mRenderingParameter = mRenderingParameter;
|
||||
result->mSingleColor = mSingleColor;
|
||||
result->mColorRampShader = mColorRampShader;
|
||||
result->mColorRampShaderMin = mColorRampShaderMin;
|
||||
result->mColorRampShaderMax = mColorRampShaderMax;
|
||||
copyBaseSettings( result );
|
||||
return result;
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
|
||||
void QgsSingleColorPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
|
||||
{
|
||||
Q_UNUSED( context )
|
||||
|
||||
@ -49,15 +60,9 @@ void QgsPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteConte
|
||||
elem.setAttribute( QStringLiteral( "single-color-red" ), mSingleColor.redF() );
|
||||
elem.setAttribute( QStringLiteral( "single-color-green" ), mSingleColor.greenF() );
|
||||
elem.setAttribute( QStringLiteral( "single-color-blue" ), mSingleColor.blueF() );
|
||||
elem.setAttribute( QStringLiteral( "rendering-parameter" ), mRenderingParameter );
|
||||
elem.setAttribute( QStringLiteral( "color-ramp-shader-min" ), mColorRampShaderMin );
|
||||
elem.setAttribute( QStringLiteral( "color-ramp-shader-max" ), mColorRampShaderMax );
|
||||
QDomDocument doc = elem.ownerDocument();
|
||||
QDomElement elemColorRampShader = mColorRampShader.writeXml( doc );
|
||||
elem.appendChild( elemColorRampShader );
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
|
||||
void QgsSingleColorPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
|
||||
{
|
||||
Q_UNUSED( context )
|
||||
|
||||
@ -67,58 +72,94 @@ void QgsPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWrite
|
||||
mSingleColor.setRedF( elem.attribute( "single-color-red", QStringLiteral( "0.0" ) ).toFloat() );
|
||||
mSingleColor.setGreenF( elem.attribute( "single-color-green", QStringLiteral( "0.0" ) ).toFloat() );
|
||||
mSingleColor.setBlueF( elem.attribute( "single-color-blue", QStringLiteral( "1.0" ) ).toFloat() );
|
||||
mRenderingParameter = static_cast< QgsPointCloud3DSymbol::RenderingParameter >( elem.attribute( "rendering-parameter", QStringLiteral( "0" ) ).toInt() );
|
||||
}
|
||||
|
||||
void QgsSingleColorPointCloud3DSymbol::setPointSize( float size )
|
||||
{
|
||||
mPointSize = size;
|
||||
}
|
||||
|
||||
void QgsSingleColorPointCloud3DSymbol::setSingleColor( QColor color )
|
||||
{
|
||||
mSingleColor = color;
|
||||
}
|
||||
|
||||
// QgsColorRampPointCloud3DSymbol
|
||||
|
||||
QgsColorRampPointCloud3DSymbol::QgsColorRampPointCloud3DSymbol()
|
||||
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::ColorRamp )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QgsAbstract3DSymbol *QgsColorRampPointCloud3DSymbol::clone() const
|
||||
{
|
||||
QgsColorRampPointCloud3DSymbol *result = new QgsColorRampPointCloud3DSymbol;
|
||||
result->mEnabled = mEnabled;
|
||||
result->mPointSize = mPointSize;
|
||||
result->mRenderingStyle = mRenderingStyle;
|
||||
result->mRenderingParameter = mRenderingParameter;
|
||||
result->mColorRampShader = mColorRampShader;
|
||||
result->mColorRampShaderMin = mColorRampShaderMin;
|
||||
result->mColorRampShaderMax = mColorRampShaderMax;
|
||||
copyBaseSettings( result );
|
||||
return result;
|
||||
}
|
||||
|
||||
void QgsColorRampPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
|
||||
{
|
||||
Q_UNUSED( context )
|
||||
|
||||
elem.setAttribute( QStringLiteral( "enabled" ), mEnabled );
|
||||
elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
|
||||
elem.setAttribute( QStringLiteral( "rendering-style" ), mRenderingStyle );
|
||||
elem.setAttribute( QStringLiteral( "rendering-parameter" ), mRenderingParameter );
|
||||
elem.setAttribute( QStringLiteral( "color-ramp-shader-min" ), mColorRampShaderMin );
|
||||
elem.setAttribute( QStringLiteral( "color-ramp-shader-max" ), mColorRampShaderMax );
|
||||
QDomDocument doc = elem.ownerDocument();
|
||||
QDomElement elemColorRampShader = mColorRampShader.writeXml( doc );
|
||||
elem.appendChild( elemColorRampShader );
|
||||
}
|
||||
|
||||
void QgsColorRampPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
|
||||
{
|
||||
Q_UNUSED( context )
|
||||
|
||||
mEnabled = elem.attribute( "enabled", QStringLiteral( "0" ) ).toInt();
|
||||
mPointSize = elem.attribute( "point-size", QStringLiteral( "2.0" ) ).toFloat();
|
||||
mRenderingStyle = static_cast< QgsPointCloud3DSymbol::RenderingStyle >( elem.attribute( "rendering-style", QStringLiteral( "0" ) ).toInt() );
|
||||
mRenderingParameter = static_cast< QgsColorRampPointCloud3DSymbol::RenderingParameter >( elem.attribute( "rendering-parameter", QStringLiteral( "0" ) ).toInt() );
|
||||
mColorRampShaderMin = elem.attribute( QStringLiteral( "color-ramp-shader-min" ), QStringLiteral( "0.0" ) ).toDouble();
|
||||
mColorRampShaderMax = elem.attribute( QStringLiteral( "color-ramp-shader-max" ), QStringLiteral( "1.0" ) ).toDouble();
|
||||
mColorRampShader.readXml( elem );
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::setIsEnabled( bool enabled )
|
||||
{
|
||||
mEnabled = enabled;
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::setRenderingStyle( QgsPointCloud3DSymbol::RenderingStyle style )
|
||||
{
|
||||
mRenderingStyle = style;
|
||||
}
|
||||
|
||||
QgsPointCloud3DSymbol::RenderingStyle QgsPointCloud3DSymbol::renderingStyle() const
|
||||
{
|
||||
return mRenderingStyle;
|
||||
}
|
||||
|
||||
QgsPointCloud3DSymbol::RenderingParameter QgsPointCloud3DSymbol::renderingParameter() const
|
||||
QgsColorRampPointCloud3DSymbol::RenderingParameter QgsColorRampPointCloud3DSymbol::renderingParameter() const
|
||||
{
|
||||
return mRenderingParameter;
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::setRenderingParameter( QgsPointCloud3DSymbol::RenderingParameter parameter )
|
||||
void QgsColorRampPointCloud3DSymbol::setRenderingParameter( QgsColorRampPointCloud3DSymbol::RenderingParameter parameter )
|
||||
{
|
||||
mRenderingParameter = parameter;
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::setPointSize( float size )
|
||||
void QgsColorRampPointCloud3DSymbol::setPointSize( float size )
|
||||
{
|
||||
mPointSize = size;
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::setSingleColor( QColor color )
|
||||
{
|
||||
mSingleColor = color;
|
||||
}
|
||||
|
||||
QgsColorRampShader QgsPointCloud3DSymbol::colorRampShader() const
|
||||
QgsColorRampShader QgsColorRampPointCloud3DSymbol::colorRampShader() const
|
||||
{
|
||||
return mColorRampShader;
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::setColorRampShader( const QgsColorRampShader &colorRampShader )
|
||||
void QgsColorRampPointCloud3DSymbol::setColorRampShader( const QgsColorRampShader &colorRampShader )
|
||||
{
|
||||
mColorRampShader = colorRampShader;
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbol::setColorRampShaderMinMax( double min, double max )
|
||||
void QgsColorRampPointCloud3DSymbol::setColorRampShaderMinMax( double min, double max )
|
||||
{
|
||||
mColorRampShaderMin = min;
|
||||
mColorRampShaderMax = max;
|
||||
|
@ -35,7 +35,7 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
|
||||
public:
|
||||
|
||||
/**
|
||||
* How to render the color of the point cloud
|
||||
* How to render the point cloud
|
||||
*/
|
||||
enum RenderingStyle
|
||||
{
|
||||
@ -45,26 +45,17 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
|
||||
ColorRamp,
|
||||
};
|
||||
|
||||
/**
|
||||
* The value used to select colors from the color ramp
|
||||
*/
|
||||
enum RenderingParameter
|
||||
{
|
||||
Height = 0,
|
||||
ClassID
|
||||
};
|
||||
|
||||
//! Constructor for QgsPointCloud3DSymbol
|
||||
QgsPointCloud3DSymbol();
|
||||
QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style );
|
||||
//! Destructor for QgsPointCloud3DSymbol
|
||||
~QgsPointCloud3DSymbol() override;
|
||||
|
||||
QgsAbstract3DSymbol *clone() const override SIP_FACTORY { Q_ASSERT( false ); return nullptr; }
|
||||
|
||||
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override { Q_UNUSED( context ); Q_ASSERT( false ); }
|
||||
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override { Q_UNUSED( context ); Q_ASSERT( false ); }
|
||||
|
||||
QString type() const override { return "pointcloud"; }
|
||||
QgsAbstract3DSymbol *clone() const override SIP_FACTORY;
|
||||
|
||||
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
|
||||
|
||||
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
|
||||
|
||||
/**
|
||||
* Returns whether rendering for this symbol is enabled
|
||||
@ -78,6 +69,36 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
|
||||
*/
|
||||
void setIsEnabled( bool enabled );
|
||||
|
||||
/**
|
||||
* Returns the rendering style
|
||||
* \see setRenderingStyle( QgsPointCloud3DSymbol::RenderingStyle style )
|
||||
*/
|
||||
QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const { return mRenderingStyle; }
|
||||
|
||||
protected:
|
||||
bool mEnabled = true;
|
||||
QgsPointCloud3DSymbol::RenderingStyle mRenderingStyle = QgsPointCloud3DSymbol::ColorRamp;
|
||||
};
|
||||
|
||||
/**
|
||||
* \ingroup 3d
|
||||
* 3D symbol that draws point cloud geometries as 3D objects.using one color
|
||||
*
|
||||
* \warning This is not considered stable API, and may change in future QGIS releases. It is
|
||||
* exposed to the Python bindings as a tech preview only.
|
||||
*
|
||||
* \since QGIS 3.18
|
||||
*/
|
||||
class _3D_EXPORT QgsSingleColorPointCloud3DSymbol : public QgsPointCloud3DSymbol
|
||||
{
|
||||
public:
|
||||
QgsSingleColorPointCloud3DSymbol();
|
||||
|
||||
QgsAbstract3DSymbol *clone() const override SIP_FACTORY;
|
||||
|
||||
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
|
||||
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
|
||||
|
||||
/**
|
||||
* Returns the point size of the point cloud
|
||||
* \see setPointSize( float size )
|
||||
@ -90,30 +111,6 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
|
||||
*/
|
||||
void setPointSize( float size );
|
||||
|
||||
/**
|
||||
* Returns the rendering style
|
||||
* \see setRenderingStyle( QgsPointCloud3DSymbol::RenderingStyle style )
|
||||
*/
|
||||
QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const;
|
||||
|
||||
/**
|
||||
* Sets the rendering style
|
||||
* \see renderingStyle()
|
||||
*/
|
||||
void setRenderingStyle( QgsPointCloud3DSymbol::RenderingStyle style );
|
||||
|
||||
/**
|
||||
* Returns the parameter used to select the color of the point cloud when using color ramp coloring
|
||||
* \see setRenderingParameter( QgsPointCloud3DSymbol::RenderingParameter parameter )
|
||||
*/
|
||||
QgsPointCloud3DSymbol::RenderingParameter renderingParameter() const;
|
||||
|
||||
/**
|
||||
* Sets the parameter used to select the color of the point cloud when using color ramp coloring
|
||||
* \see renderingParameter()
|
||||
*/
|
||||
void setRenderingParameter( QgsPointCloud3DSymbol::RenderingParameter parameter );
|
||||
|
||||
/**
|
||||
* Returns the color used by the renderer when using SingleColor rendering mode
|
||||
* \see setSingleColor( QColor color )
|
||||
@ -126,44 +123,98 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
|
||||
*/
|
||||
void setSingleColor( QColor color );
|
||||
|
||||
private:
|
||||
float mPointSize = 2.0f;
|
||||
QColor mSingleColor = Qt::blue;
|
||||
};
|
||||
|
||||
/**
|
||||
* \ingroup 3d
|
||||
* 3D symbol that draws point cloud geometries as 3D objects.using color ramp shader
|
||||
*
|
||||
* \warning This is not considered stable API, and may change in future QGIS releases. It is
|
||||
* exposed to the Python bindings as a tech preview only.
|
||||
*
|
||||
* \since QGIS 3.18
|
||||
*/
|
||||
class _3D_EXPORT QgsColorRampPointCloud3DSymbol : public QgsPointCloud3DSymbol
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* The value used to select colors from the color ramp
|
||||
*/
|
||||
enum RenderingParameter
|
||||
{
|
||||
Height = 0,
|
||||
ClassID
|
||||
};
|
||||
|
||||
QgsColorRampPointCloud3DSymbol();
|
||||
|
||||
QgsAbstract3DSymbol *clone() const override SIP_FACTORY;
|
||||
|
||||
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
|
||||
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
|
||||
|
||||
/**
|
||||
* Returns the point size of the point cloud
|
||||
* \see setPointSize( float size )
|
||||
*/
|
||||
float pointSize() const { return mPointSize; }
|
||||
|
||||
/**
|
||||
* Sets the point size
|
||||
* \see pointSize()
|
||||
*/
|
||||
void setPointSize( float size );
|
||||
|
||||
/**
|
||||
* Returns the parameter used to select the color of the point cloud when using color ramp coloring
|
||||
* \see setRenderingParameter( QgsPointCloud3DSymbol::RenderingParameter parameter )
|
||||
*/
|
||||
QgsColorRampPointCloud3DSymbol::RenderingParameter renderingParameter() const;
|
||||
|
||||
/**
|
||||
* Sets the parameter used to select the color of the point cloud when using color ramp coloring
|
||||
* \see renderingParameter()
|
||||
*/
|
||||
void setRenderingParameter( QgsColorRampPointCloud3DSymbol::RenderingParameter parameter );
|
||||
|
||||
/**
|
||||
* Returns the color ramp shader used to render the color
|
||||
*/
|
||||
QgsColorRampShader colorRampShader() const;
|
||||
|
||||
/**
|
||||
* Sets the color ramp shader used to render the color
|
||||
* Sets the color ramp shader used to render the point cloud
|
||||
*/
|
||||
void setColorRampShader( const QgsColorRampShader &colorRampShader );
|
||||
|
||||
/**
|
||||
* Returns the minimum value used when classifying colors in the color ramp shader
|
||||
* \see setColorRampShaderMinMax( double min, double max );
|
||||
* \see setColorRampShaderMinMax( double min, double max )
|
||||
*/
|
||||
double colorRampShaderMin() const { return mColorRampShaderMin; }
|
||||
|
||||
/**
|
||||
* Returns the maximum value used when classifying colors in the color ramp shader
|
||||
* \see setColorRampShaderMinMax( double min, double max );
|
||||
* \see setColorRampShaderMinMax( double min, double max )
|
||||
*/
|
||||
double colorRampShaderMax() const { return mColorRampShaderMax; }
|
||||
|
||||
/**
|
||||
* Sets the minimum and maximum values used when classifying colors in the color ramp shader
|
||||
* \see setColorRampShaderMinMax( double min, double max );
|
||||
* \see colorRampShaderMin() colorRampShaderMax()
|
||||
*/
|
||||
void setColorRampShaderMinMax( double min, double max );
|
||||
|
||||
private:
|
||||
bool mEnabled = true;
|
||||
float mPointSize = 2.0f;
|
||||
|
||||
QgsPointCloud3DSymbol::RenderingStyle mRenderingStyle = QgsPointCloud3DSymbol::ColorRamp;
|
||||
QgsPointCloud3DSymbol::RenderingParameter mRenderingParameter = QgsPointCloud3DSymbol::RenderingParameter::ClassID;
|
||||
QgsColorRampPointCloud3DSymbol::RenderingParameter mRenderingParameter = QgsColorRampPointCloud3DSymbol::RenderingParameter::Height;
|
||||
QgsColorRampShader mColorRampShader;
|
||||
double mColorRampShaderMin = 0.0;
|
||||
double mColorRampShaderMax = 1.0;
|
||||
QColor mSingleColor = Qt::blue;
|
||||
};
|
||||
|
||||
#endif // QGSPOINTCLOUD3DSYMBOL_H
|
||||
|
@ -37,27 +37,59 @@ QgsPointCloud3DSymbolWidget::QgsPointCloud3DSymbolWidget( QgsPointCloud3DSymbol
|
||||
|
||||
void QgsPointCloud3DSymbolWidget::setSymbol( QgsPointCloud3DSymbol *symbol )
|
||||
{
|
||||
mPointSizeSpinBox->setValue( symbol->pointSize() );
|
||||
mRenderingStyleComboBox->setCurrentIndex( symbol->renderingStyle() );
|
||||
mRenderingParameterComboBox->setCurrentIndex( symbol->renderingParameter() );
|
||||
mSingleColorBtn->setColor( symbol->singleColor() );
|
||||
QgsColorRampShader shader = symbol->colorRampShader();
|
||||
setColorRampMinMax( symbol->colorRampShaderMin(), symbol->colorRampShaderMax() );
|
||||
mColorRampShaderWidget->setFromShader( symbol->colorRampShader() );
|
||||
switch ( symbol->renderingStyle() )
|
||||
{
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
|
||||
{
|
||||
QgsSingleColorPointCloud3DSymbol *symb = static_cast<QgsSingleColorPointCloud3DSymbol *>( symbol );
|
||||
mPointSizeSpinBox->setValue( symb->pointSize() );
|
||||
mSingleColorBtn->setColor( symb->singleColor() );
|
||||
break;
|
||||
}
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
|
||||
{
|
||||
QgsColorRampPointCloud3DSymbol *symb = static_cast<QgsColorRampPointCloud3DSymbol *>( symbol );
|
||||
mPointSizeSpinBox->setValue( symb->pointSize() );
|
||||
mRenderingParameterComboBox->setCurrentIndex( symb->renderingParameter() );
|
||||
QgsColorRampShader shader = symb->colorRampShader();
|
||||
setColorRampMinMax( symb->colorRampShaderMin(), symb->colorRampShaderMax() );
|
||||
mColorRampShaderWidget->setFromShader( symb->colorRampShader() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onRenderingStyleChanged( symbol->renderingStyle() );
|
||||
}
|
||||
|
||||
QgsPointCloud3DSymbol *QgsPointCloud3DSymbolWidget::symbol() const
|
||||
{
|
||||
QgsPointCloud3DSymbol *symb = new QgsPointCloud3DSymbol;
|
||||
symb->setPointSize( mPointSizeSpinBox->value() );
|
||||
symb->setRenderingStyle( static_cast< QgsPointCloud3DSymbol::RenderingStyle >( mRenderingStyleComboBox->currentIndex() ) );
|
||||
symb->setRenderingParameter( static_cast< QgsPointCloud3DSymbol::RenderingParameter >( mRenderingParameterComboBox->currentIndex() ) );
|
||||
symb->setSingleColor( mSingleColorBtn->color() );
|
||||
symb->setColorRampShader( mColorRampShaderWidget->shader() );
|
||||
symb->setColorRampShaderMinMax( mColorRampShaderMinEdit->value(), mColorRampShaderMaxEdit->value() );
|
||||
return symb;
|
||||
|
||||
QgsPointCloud3DSymbol *ret_symb = nullptr;
|
||||
QgsPointCloud3DSymbol::RenderingStyle renderingStyle = static_cast< QgsPointCloud3DSymbol::RenderingStyle >( mRenderingStyleComboBox->currentIndex() );
|
||||
|
||||
switch ( renderingStyle )
|
||||
{
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
|
||||
{
|
||||
QgsSingleColorPointCloud3DSymbol *symb = new QgsSingleColorPointCloud3DSymbol;
|
||||
symb->setPointSize( mPointSizeSpinBox->value() );
|
||||
symb->setSingleColor( mSingleColorBtn->color() );
|
||||
ret_symb = symb;
|
||||
break;
|
||||
}
|
||||
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
|
||||
{
|
||||
QgsColorRampPointCloud3DSymbol *symb = new QgsColorRampPointCloud3DSymbol;
|
||||
symb->setRenderingParameter( static_cast< QgsColorRampPointCloud3DSymbol::RenderingParameter >( mRenderingParameterComboBox->currentIndex() ) );
|
||||
symb->setPointSize( mPointSizeSpinBox->value() );
|
||||
symb->setColorRampShader( mColorRampShaderWidget->shader() );
|
||||
symb->setColorRampShaderMinMax( mColorRampShaderMinEdit->value(), mColorRampShaderMaxEdit->value() );
|
||||
ret_symb = symb;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret_symb;
|
||||
}
|
||||
|
||||
void QgsPointCloud3DSymbolWidget::setColorRampMinMax( double min, double max )
|
||||
|
Loading…
x
Reference in New Issue
Block a user