diff --git a/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in b/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in index afe4829ffe1..74eb0b6c354 100644 --- a/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in +++ b/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in @@ -78,6 +78,20 @@ Sets the maximum screen ``error`` allowed when rendering the point cloud. Larger values result in a faster render with less points rendered. .. seealso:: :py:func:`maximumScreenError` +%End + + bool showBoundingBoxes() const; +%Docstring +Returns whether bounding boxes will be visible when rendering the point cloud. + +.. seealso:: :py:func:`setShowBoundingBoxes` +%End + + void setShowBoundingBoxes( bool showBoundingBoxes ); +%Docstring +Sets whether bounding boxes will be visible when rendering the point cloud. + +.. seealso:: :py:func:`showBoundingBoxes` %End private: diff --git a/src/3d/qgspointcloudlayer3drenderer.cpp b/src/3d/qgspointcloudlayer3drenderer.cpp index d2fe4f446ab..5909af9f600 100644 --- a/src/3d/qgspointcloudlayer3drenderer.cpp +++ b/src/3d/qgspointcloudlayer3drenderer.cpp @@ -112,7 +112,7 @@ Qt3DCore::QEntity *QgsPointCloudLayer3DRenderer::createEntity( const Qgs3DMapSet if ( !mSymbol ) return nullptr; - return new QgsPointCloudLayerChunkedEntity( pcl->dataProvider()->index(), map, dynamic_cast( mSymbol->clone() ), maximumScreenError() ); + return new QgsPointCloudLayerChunkedEntity( pcl->dataProvider()->index(), map, dynamic_cast( mSymbol->clone() ), maximumScreenError(), showBoundingBoxes() ); } void QgsPointCloudLayer3DRenderer::setSymbol( QgsPointCloud3DSymbol *symbol ) @@ -128,6 +128,7 @@ void QgsPointCloudLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWri elem.setAttribute( QStringLiteral( "layer" ), mLayerRef.layerId ); elem.setAttribute( QStringLiteral( "max-screen-error" ), maximumScreenError() ); + elem.setAttribute( QStringLiteral( "show-bounding-boxes" ), showBoundingBoxes() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); QDomElement elemSymbol = doc.createElement( QStringLiteral( "symbol" ) ); if ( mSymbol ) @@ -146,6 +147,7 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe const QString symbolType = elemSymbol.attribute( QStringLiteral( "type" ) ); mMaximumScreenError = elem.attribute( QStringLiteral( "max-screen-error" ), QStringLiteral( "1.0" ) ).toDouble(); + mShowBoundingBoxes = elem.attribute( QStringLiteral( "show-bounding-boxes" ), "0" ).toInt(); if ( symbolType == QLatin1String( "single-color" ) ) mSymbol.reset( new QgsSingleColorPointCloud3DSymbol ); @@ -176,3 +178,14 @@ void QgsPointCloudLayer3DRenderer::setMaximumScreenError( double error ) { mMaximumScreenError = error; } + +bool QgsPointCloudLayer3DRenderer::showBoundingBoxes() const +{ + return mShowBoundingBoxes; +} + +void QgsPointCloudLayer3DRenderer::setShowBoundingBoxes( bool showBoundingBoxes ) +{ + mShowBoundingBoxes = showBoundingBoxes; +} + diff --git a/src/3d/qgspointcloudlayer3drenderer.h b/src/3d/qgspointcloudlayer3drenderer.h index 61c156940ed..20ea99c4ec4 100644 --- a/src/3d/qgspointcloudlayer3drenderer.h +++ b/src/3d/qgspointcloudlayer3drenderer.h @@ -208,10 +208,25 @@ class _3D_EXPORT QgsPointCloudLayer3DRenderer : public QgsAbstract3DRenderer */ void setMaximumScreenError( double error ); + /** + * Returns whether bounding boxes will be visible when rendering the point cloud. + * + * \see setShowBoundingBoxes() + */ + bool showBoundingBoxes() const; + + /** + * Sets whether bounding boxes will be visible when rendering the point cloud. + * + * \see showBoundingBoxes() + */ + void setShowBoundingBoxes( bool showBoundingBoxes ); + private: QgsMapLayerRef mLayerRef; //!< Layer used to extract mesh data from std::unique_ptr< QgsPointCloud3DSymbol > mSymbol; double mMaximumScreenError = 1.0; + bool mShowBoundingBoxes = true; private: #ifdef SIP_RUN diff --git a/src/3d/qgspointcloudlayerchunkloader_p.cpp b/src/3d/qgspointcloudlayerchunkloader_p.cpp index 7afac8a825d..a15a550b456 100644 --- a/src/3d/qgspointcloudlayerchunkloader_p.cpp +++ b/src/3d/qgspointcloudlayerchunkloader_p.cpp @@ -196,12 +196,12 @@ QgsAABB nodeBoundsToAABB( QgsPointCloudDataBounds nodeBounds, QgsVector3D offset } -QgsPointCloudLayerChunkedEntity::QgsPointCloudLayerChunkedEntity( QgsPointCloudIndex *pc, const Qgs3DMapSettings &map, QgsPointCloud3DSymbol *symbol, float maxScreenError ) +QgsPointCloudLayerChunkedEntity::QgsPointCloudLayerChunkedEntity( QgsPointCloudIndex *pc, const Qgs3DMapSettings &map, QgsPointCloud3DSymbol *symbol, float maxScreenError, bool showBoundingBoxes ) : QgsChunkedEntity( maxScreenError, new QgsPointCloudLayerChunkLoaderFactory( map, pc, symbol ), true ) { setUsingAdditiveStrategy( true ); - setShowBoundingBoxes( false ); + setShowBoundingBoxes( showBoundingBoxes ); } QgsPointCloudLayerChunkedEntity::~QgsPointCloudLayerChunkedEntity() diff --git a/src/3d/qgspointcloudlayerchunkloader_p.h b/src/3d/qgspointcloudlayerchunkloader_p.h index 1228e9ecab4..ae335b05c28 100644 --- a/src/3d/qgspointcloudlayerchunkloader_p.h +++ b/src/3d/qgspointcloudlayerchunkloader_p.h @@ -115,7 +115,7 @@ class QgsPointCloudLayerChunkedEntity : public QgsChunkedEntity { Q_OBJECT public: - explicit QgsPointCloudLayerChunkedEntity( QgsPointCloudIndex *pc, const Qgs3DMapSettings &map, QgsPointCloud3DSymbol *symbol, float maxScreenError ); + explicit QgsPointCloudLayerChunkedEntity( QgsPointCloudIndex *pc, const Qgs3DMapSettings &map, QgsPointCloud3DSymbol *symbol, float maxScreenError, bool showBoundingBoxes ); ~QgsPointCloudLayerChunkedEntity(); }; diff --git a/src/app/3d/qgspointcloud3dsymbolwidget.cpp b/src/app/3d/qgspointcloud3dsymbolwidget.cpp index 027fb369668..9a5e8d99c6d 100644 --- a/src/app/3d/qgspointcloud3dsymbolwidget.cpp +++ b/src/app/3d/qgspointcloud3dsymbolwidget.cpp @@ -100,6 +100,7 @@ QgsPointCloud3DSymbolWidget::QgsPointCloud3DSymbolWidget( QgsPointCloudLayer *la connect( mColorRampShaderMaxEdit, qgis::overload::of( &QDoubleSpinBox::valueChanged ), this, &QgsPointCloud3DSymbolWidget::minMaxChanged ); connect( mMaxScreenErrorSpinBox, qgis::overload::of( &QDoubleSpinBox::valueChanged ), this, &QgsPointCloud3DSymbolWidget::maximumScreenErrorChanged ); + connect( mShowBoundingBoxesCheckBox, &QCheckBox::stateChanged, this, &QgsPointCloud3DSymbolWidget::showBoundingBoxesChanged ); rampAttributeChanged(); @@ -571,3 +572,22 @@ void QgsPointCloud3DSymbolWidget::maximumScreenErrorChanged( double maxScreenErr mMaximumScreenError = maxScreenError; emitChangedSignal(); } + +void QgsPointCloud3DSymbolWidget::showBoundingBoxesChanged( int checkBoxState ) +{ + Q_UNUSED( checkBoxState ); + bool showBoundingBoxes = mShowBoundingBoxesCheckBox->isChecked(); + if ( showBoundingBoxes == mShowBoundingBoxes ) + return; + mShowBoundingBoxes = showBoundingBoxes; + emitChangedSignal(); +} + +void QgsPointCloud3DSymbolWidget::setShowBoundingBoxes( bool showBoundingBoxes ) +{ + if ( showBoundingBoxes == mShowBoundingBoxes ) + return; + mShowBoundingBoxesCheckBox->setChecked( showBoundingBoxes ); + mShowBoundingBoxes = showBoundingBoxes; + emitChangedSignal(); +} diff --git a/src/app/3d/qgspointcloud3dsymbolwidget.h b/src/app/3d/qgspointcloud3dsymbolwidget.h index e2d819474cf..d12e7c52b3c 100644 --- a/src/app/3d/qgspointcloud3dsymbolwidget.h +++ b/src/app/3d/qgspointcloud3dsymbolwidget.h @@ -36,6 +36,8 @@ class QgsPointCloud3DSymbolWidget : public QWidget, private Ui::QgsPointCloud3DS void setMaximumScreenError( double maxScreenError ); double maximumScreenError() const { return mMaximumScreenError; } + void setShowBoundingBoxes( bool showBoundingBoxes ); + double showBoundingBoxes() const { return mShowBoundingBoxes; } private slots: void reloadColorRampShaderMinMax(); @@ -55,6 +57,7 @@ class QgsPointCloud3DSymbolWidget : public QWidget, private Ui::QgsPointCloud3DS void greenAttributeChanged(); void blueAttributeChanged(); void maximumScreenErrorChanged( double maxScreenError ); + void showBoundingBoxesChanged( int state ); signals: void changed(); @@ -70,6 +73,7 @@ class QgsPointCloud3DSymbolWidget : public QWidget, private Ui::QgsPointCloud3DS bool mBlockMinMaxChanged = false; double mMaximumScreenError = 1.0f; + bool mShowBoundingBoxes = false; double mProviderMin = std::numeric_limits< double >::quiet_NaN(); double mProviderMax = std::numeric_limits< double >::quiet_NaN(); diff --git a/src/app/3d/qgspointcloudlayer3drendererwidget.cpp b/src/app/3d/qgspointcloudlayer3drendererwidget.cpp index b5b8c69f96b..e80095f3b71 100644 --- a/src/app/3d/qgspointcloudlayer3drendererwidget.cpp +++ b/src/app/3d/qgspointcloudlayer3drendererwidget.cpp @@ -44,6 +44,7 @@ void QgsPointCloudLayer3DRendererWidget::setRenderer( const QgsPointCloudLayer3D { mWidgetPointCloudSymbol->setSymbol( const_cast( renderer->symbol() ) ); mWidgetPointCloudSymbol->setMaximumScreenError( renderer->maximumScreenError() ); + mWidgetPointCloudSymbol->setShowBoundingBoxes( renderer->showBoundingBoxes() ); } } @@ -54,6 +55,7 @@ QgsPointCloudLayer3DRenderer *QgsPointCloudLayer3DRendererWidget::renderer() renderer->setSymbol( sym ); renderer->setLayer( qobject_cast( mLayer ) ); renderer->setMaximumScreenError( mWidgetPointCloudSymbol->maximumScreenError() ); + renderer->setShowBoundingBoxes( mWidgetPointCloudSymbol->showBoundingBoxes() ); return renderer; } diff --git a/src/ui/3d/qgspointcloud3dsymbolwidget.ui b/src/ui/3d/qgspointcloud3dsymbolwidget.ui index 1a7fa6fccbc..9a71fb0bc54 100644 --- a/src/ui/3d/qgspointcloud3dsymbolwidget.ui +++ b/src/ui/3d/qgspointcloud3dsymbolwidget.ui @@ -41,13 +41,6 @@ 3 - - - - Point size - - - @@ -58,6 +51,13 @@ + + + + Point size + + + @@ -75,6 +75,13 @@ + + + + Show point cloud bounding boxes + + + @@ -461,16 +468,16 @@ enhancement - - QgsPointCloudAttributeComboBox - QComboBox -
qgspointcloudattributecombobox.h
-
QgsDoubleSpinBox QDoubleSpinBox
qgsdoublespinbox.h
+ + QgsPointCloudAttributeComboBox + QComboBox +
qgspointcloudattributecombobox.h
+
QgsColorRampShaderWidget QWidget