diff --git a/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in b/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in index 67dd8b1c9ad1..ba150cf01f8e 100644 --- a/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in +++ b/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in @@ -119,6 +119,20 @@ Sets the renderer behavior when zoomed out Returns the renderer behavior when zoomed out .. versionadded:: 3.42 +%End + + void setOverviewSwitchingScale( double scale ); +%Docstring +Sets the overview switching scale + +.. versionadded:: 4.0 +%End + + double overviewSwitchingScale() const; +%Docstring +Returns the overview switching scale + +.. versionadded:: 4.0 %End private: diff --git a/python/PyQt6/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in b/python/PyQt6/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in index 67dd8b1c9ad1..ba150cf01f8e 100644 --- a/python/PyQt6/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in +++ b/python/PyQt6/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in @@ -119,6 +119,20 @@ Sets the renderer behavior when zoomed out Returns the renderer behavior when zoomed out .. versionadded:: 3.42 +%End + + void setOverviewSwitchingScale( double scale ); +%Docstring +Sets the overview switching scale + +.. versionadded:: 4.0 +%End + + double overviewSwitchingScale() const; +%Docstring +Returns the overview switching scale + +.. versionadded:: 4.0 %End private: diff --git a/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in b/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in index 572fb5667e47..6fd5f72f66bd 100644 --- a/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in +++ b/python/PyQt6/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in @@ -623,6 +623,20 @@ Sets the renderer behavior when zoomed out Returns the renderer behavior when zoomed out .. versionadded:: 3.42 +%End + + void setOverviewSwitchingScale( const double value ); +%Docstring +Sets the overview switching scale + +.. versionadded:: 4.0 +%End + + double overviewSwitchingScale() const; +%Docstring +Returns the overview switching scale + +.. versionadded:: 4.0 %End protected: diff --git a/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in b/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in index 572fb5667e47..6fd5f72f66bd 100644 --- a/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in +++ b/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in @@ -623,6 +623,20 @@ Sets the renderer behavior when zoomed out Returns the renderer behavior when zoomed out .. versionadded:: 3.42 +%End + + void setOverviewSwitchingScale( const double value ); +%Docstring +Sets the overview switching scale + +.. versionadded:: 4.0 +%End + + double overviewSwitchingScale() const; +%Docstring +Returns the overview switching scale + +.. versionadded:: 4.0 %End protected: diff --git a/src/3d/qgspointcloudlayer3drenderer.cpp b/src/3d/qgspointcloudlayer3drenderer.cpp index 340edf77245e..9a38eb465de1 100644 --- a/src/3d/qgspointcloudlayer3drenderer.cpp +++ b/src/3d/qgspointcloudlayer3drenderer.cpp @@ -147,6 +147,7 @@ QgsPointCloudLayer3DRenderer *QgsPointCloudLayer3DRenderer::clone() const r->setMaximumScreenError( mMaximumScreenError ); r->setShowBoundingBoxes( mShowBoundingBoxes ); r->setZoomOutBehavior( mZoomOutBehavior ); + r->setOverviewSwitchingScale( mOverviewSwitchingScale ); return r; } @@ -188,6 +189,7 @@ void QgsPointCloudLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWri elem.setAttribute( u"show-bounding-boxes"_s, showBoundingBoxes() ? u"1"_s : u"0"_s ); elem.setAttribute( u"point-budget"_s, mPointBudget ); elem.setAttribute( u"zoom-out-behavior"_s, qgsEnumValueToKey( mZoomOutBehavior ) ); + elem.setAttribute( u"overview-switching-scale"_s, mOverviewSwitchingScale ); QDomElement elemSymbol = doc.createElement( u"symbol"_s ); if ( mSymbol ) @@ -209,6 +211,7 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe mMaximumScreenError = elem.attribute( u"max-screen-error"_s, u"3.0"_s ).toDouble(); mPointBudget = elem.attribute( u"point-budget"_s, u"5000000"_s ).toInt(); mZoomOutBehavior = qgsEnumKeyToValue( elem.attribute( u"zoom-out-behavior"_s ), Qgis::PointCloudZoomOutRenderBehavior::RenderExtents ); + mOverviewSwitchingScale = elem.attribute( u"overview-switching-scale"_s, u"1.0"_s ).toDouble(); if ( symbolType == "single-color"_L1 ) mSymbol = std::make_unique(); diff --git a/src/3d/qgspointcloudlayer3drenderer.h b/src/3d/qgspointcloudlayer3drenderer.h index 71193b0c436b..b07f3021f01b 100644 --- a/src/3d/qgspointcloudlayer3drenderer.h +++ b/src/3d/qgspointcloudlayer3drenderer.h @@ -315,6 +315,18 @@ class _3D_EXPORT QgsPointCloudLayer3DRenderer : public QgsAbstractPointCloud3DRe */ Qgis::PointCloudZoomOutRenderBehavior zoomOutBehavior() const { return mZoomOutBehavior; } + /** + * Sets the overview switching scale + * \since QGIS 4.0 + */ + void setOverviewSwitchingScale( double scale ) { mOverviewSwitchingScale = scale; } + + /** + * Returns the overview switching scale + * \since QGIS 4.0 + */ + double overviewSwitchingScale() const { return mOverviewSwitchingScale; } + private: QgsMapLayerRef mLayerRef; //!< Layer used to extract mesh data from std::unique_ptr mSymbol; @@ -322,6 +334,7 @@ class _3D_EXPORT QgsPointCloudLayer3DRenderer : public QgsAbstractPointCloud3DRe bool mShowBoundingBoxes = false; int mPointBudget = 5000000; Qgis::PointCloudZoomOutRenderBehavior mZoomOutBehavior = Qgis::PointCloudZoomOutRenderBehavior::RenderExtents; + double mOverviewSwitchingScale = 1.0; private: #ifdef SIP_RUN diff --git a/src/3d/qgsvirtualpointcloudentity_p.cpp b/src/3d/qgsvirtualpointcloudentity_p.cpp index 57cd5fb0cfaf..a56dbb304873 100644 --- a/src/3d/qgsvirtualpointcloudentity_p.cpp +++ b/src/3d/qgsvirtualpointcloudentity_p.cpp @@ -139,6 +139,11 @@ void QgsVirtualPointCloudEntity::handleSceneUpdate( const SceneContext &sceneCon { QgsVector3D cameraPosMapCoords = QgsVector3D( sceneContext.cameraPos ) + mapSettings()->origin(); const QVector subIndexes = provider()->subIndexes(); + + const QgsPointCloudLayer3DRenderer *rendererBehavior = dynamic_cast( mLayer->renderer3D() ); + const double overviewSwitchingScale = rendererBehavior ? rendererBehavior->overviewSwitchingScale() : 1; + qsizetype subIndexesRendered = 0; + for ( int i = 0; i < subIndexes.size(); ++i ) { // If the chunked entity needs an update, do it even if it's occluded, @@ -162,6 +167,18 @@ void QgsVirtualPointCloudEntity::handleSceneUpdate( const SceneContext &sceneCon const float sse = Qgs3DUtils::screenSpaceError( epsilon, distance, sceneContext.screenSizePx, sceneContext.cameraFov ); constexpr float THRESHOLD = .2; + QgsBox3D scaledBox = box3D; + scaledBox.scale( overviewSwitchingScale ); + const bool zoomedOut = !scaledBox.contains( cameraPosMapCoords.x(), cameraPosMapCoords.y(), cameraPosMapCoords.z() ); + + if ( zoomedOut ) + { + setRenderSubIndexAsBbox( i, true ); + continue; + } + + subIndexesRendered += 1; + // always display as bbox for the initial temporary camera pos (0, 0, 0) // then once the camera changes we display as bbox depending on screen space error const bool displayAsBbox = sceneContext.cameraPos.isNull() || sse < THRESHOLD; @@ -174,9 +191,13 @@ void QgsVirtualPointCloudEntity::handleSceneUpdate( const SceneContext &sceneCon } updateBboxEntity(); - const QgsPointCloudLayer3DRenderer *rendererBehavior = dynamic_cast( mLayer->renderer3D() ); if ( provider()->overview() && rendererBehavior && ( rendererBehavior->zoomOutBehavior() == Qgis::PointCloudZoomOutRenderBehavior::RenderOverview || rendererBehavior->zoomOutBehavior() == Qgis::PointCloudZoomOutRenderBehavior::RenderOverviewAndExtents ) ) { + // no need to render the overview if all sub indexes are shown + if ( subIndexesRendered == mChunkedEntitiesMap.size() ) + mOverviewEntity->setEnabled( false ); + else + mOverviewEntity->setEnabled( true ); mOverviewEntity->handleSceneUpdate( sceneContext ); } } diff --git a/src/app/3d/qgspointcloud3dsymbolwidget.cpp b/src/app/3d/qgspointcloud3dsymbolwidget.cpp index 29775c7bd705..2ecbe3e838bc 100644 --- a/src/app/3d/qgspointcloud3dsymbolwidget.cpp +++ b/src/app/3d/qgspointcloud3dsymbolwidget.cpp @@ -152,14 +152,22 @@ QgsPointCloud3DSymbolWidget::QgsPointCloud3DSymbolWidget( QgsPointCloudLayer *la { mZoomOutOptions->addItem( tr( "Show Overview Only" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderOverview ) ); mZoomOutOptions->addItem( tr( "Show Extents Over Overview" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderOverviewAndExtents ) ); + + for ( auto it = mOverviewSwitchingScaleMap.constBegin(); it != mOverviewSwitchingScaleMap.constEnd(); ++it ) + { + mOverviewSwitchingScale->addItem( it.value(), it.key() ); + } + setOverviewSwitchingScale( 1.0 ); } } else { mZoomOutOptions->setEnabled( false ); + mOverviewSwitchingScale->setEnabled( false ); } connect( mZoomOutOptions, qOverload( &QComboBox::currentIndexChanged ), this, &QgsPointCloud3DSymbolWidget::emitChangedSignal ); + connect( mOverviewSwitchingScale, qOverload( &QComboBox::currentIndexChanged ), this, &QgsPointCloud3DSymbolWidget::emitChangedSignal ); } else { @@ -700,6 +708,16 @@ Qgis::PointCloudZoomOutRenderBehavior QgsPointCloud3DSymbolWidget::zoomOutBehavi return mZoomOutOptions->currentData().value(); } +void QgsPointCloud3DSymbolWidget::setOverviewSwitchingScale( double scale ) +{ + mOverviewSwitchingScale->setCurrentIndex( mOverviewSwitchingScale->findData( scale ) ); +} + +double QgsPointCloud3DSymbolWidget::overviewSwitchingScale() const +{ + return mOverviewSwitchingScaleMap.key( mOverviewSwitchingScale->currentText() ); +} + void QgsPointCloud3DSymbolWidget::connectChildPanels( QgsPanelWidget *parent ) { parent->connectChildPanel( mClassifiedRendererWidget ); diff --git a/src/app/3d/qgspointcloud3dsymbolwidget.h b/src/app/3d/qgspointcloud3dsymbolwidget.h index 653551368575..95b323bab2ad 100644 --- a/src/app/3d/qgspointcloud3dsymbolwidget.h +++ b/src/app/3d/qgspointcloud3dsymbolwidget.h @@ -49,6 +49,9 @@ class QgsPointCloud3DSymbolWidget : public QWidget, private Ui::QgsPointCloud3DS void setZoomOutBehavior( Qgis::PointCloudZoomOutRenderBehavior zoomOutBehavior ); Qgis::PointCloudZoomOutRenderBehavior zoomOutBehavior() const; + void setOverviewSwitchingScale( double scale ); + double overviewSwitchingScale() const; + void connectChildPanels( QgsPanelWidget *parent ); private slots: @@ -77,6 +80,13 @@ class QgsPointCloud3DSymbolWidget : public QWidget, private Ui::QgsPointCloud3DS void setColorRampMinMax( double min, double max ); private: + const QMap mOverviewSwitchingScaleMap { + { 5.0, "Much earlier" }, + { 2.0, "Earlier" }, + { 1.0, "Normal" }, + { 0.5, "Later" } + }; + int mBlockChangedSignals = 0; int mDisableMinMaxWidgetRefresh = 0; QgsPointCloudClassifiedRendererWidget *mClassifiedRendererWidget = nullptr; diff --git a/src/app/3d/qgspointcloudlayer3drendererwidget.cpp b/src/app/3d/qgspointcloudlayer3drendererwidget.cpp index 77f576173a2f..d262e5bfeef5 100644 --- a/src/app/3d/qgspointcloudlayer3drendererwidget.cpp +++ b/src/app/3d/qgspointcloudlayer3drendererwidget.cpp @@ -65,6 +65,7 @@ QgsPointCloudLayer3DRenderer *QgsPointCloudLayer3DRendererWidget::renderer() renderer->setMaximumScreenError( mWidgetPointCloudSymbol->maximumScreenError() ); renderer->setShowBoundingBoxes( mWidgetPointCloudSymbol->showBoundingBoxes() ); renderer->setZoomOutBehavior( mWidgetPointCloudSymbol->zoomOutBehavior() ); + renderer->setOverviewSwitchingScale( mWidgetPointCloudSymbol->overviewSwitchingScale() ); return renderer; } diff --git a/src/core/pointcloud/qgspointcloudlayer.cpp b/src/core/pointcloud/qgspointcloudlayer.cpp index 42b0f1e9d392..a0773c4061b2 100644 --- a/src/core/pointcloud/qgspointcloudlayer.cpp +++ b/src/core/pointcloud/qgspointcloudlayer.cpp @@ -987,9 +987,13 @@ void QgsPointCloudLayer::loadIndexesForRenderContext( QgsRenderContext &renderer if ( subIndex.at( i ).index() ) continue; + const double overviewSwitchingScale = mRenderer ? mRenderer->overviewSwitchingScale() : 1.0; + const double widthThreshold = vpcProvider->averageSubIndexWidth() * overviewSwitchingScale; + const double heightThreshold = vpcProvider->averageSubIndexHeight() * overviewSwitchingScale; + if ( subIndex.at( i ).extent().intersects( renderExtent ) && - ( renderExtent.width() < vpcProvider->averageSubIndexWidth() || - renderExtent.height() < vpcProvider->averageSubIndexHeight() ) ) + ( renderExtent.width() < widthThreshold || + renderExtent.height() < heightThreshold ) ) { mDataProvider->loadSubIndex( i ); } diff --git a/src/core/pointcloud/qgspointcloudlayerrenderer.cpp b/src/core/pointcloud/qgspointcloudlayerrenderer.cpp index e0bdbe65f0e4..bd867fc02639 100644 --- a/src/core/pointcloud/qgspointcloudlayerrenderer.cpp +++ b/src/core/pointcloud/qgspointcloudlayerrenderer.cpp @@ -216,8 +216,9 @@ bool QgsPointCloudLayerRenderer::render() visibleIndexes.append( si ); } } - const bool zoomedOut = renderExtent.width() > mAverageSubIndexWidth || - renderExtent.height() > mAverageSubIndexHeight; + const double overviewSwitchingScale = mRenderer->overviewSwitchingScale(); + const bool zoomedOut = renderExtent.width() > mAverageSubIndexWidth * overviewSwitchingScale || + renderExtent.height() > mAverageSubIndexHeight * overviewSwitchingScale; // if the overview of virtual point cloud exists, and we are zoomed out, we render just overview if ( mOverviewIndex && mOverviewIndex->isValid() && zoomedOut && mRenderer->zoomOutBehavior() == Qgis::PointCloudZoomOutRenderBehavior::RenderOverview ) diff --git a/src/core/pointcloud/qgspointcloudrenderer.cpp b/src/core/pointcloud/qgspointcloudrenderer.cpp index b87146d2ed6f..f0d9a116ba27 100644 --- a/src/core/pointcloud/qgspointcloudrenderer.cpp +++ b/src/core/pointcloud/qgspointcloudrenderer.cpp @@ -153,6 +153,11 @@ void QgsPointCloudRenderer::setMaximumScreenError( double error ) mMaximumScreenError = error; } +void QgsPointCloudRenderer::setOverviewSwitchingScale( double scale ) +{ + mOverviewSwitchingScale = scale; +} + Qgis::RenderUnit QgsPointCloudRenderer::maximumScreenErrorUnit() const { return mMaximumScreenErrorUnit; @@ -221,6 +226,7 @@ void QgsPointCloudRenderer::copyCommonProperties( QgsPointCloudRenderer *destina destination->setShowLabels( mShowLabels ); destination->setLabelTextFormat( mLabelTextFormat ); destination->setZoomOutBehavior( mZoomOutBehavior ); + destination->setOverviewSwitchingScale( mOverviewSwitchingScale ); } void QgsPointCloudRenderer::restoreCommonProperties( const QDomElement &element, const QgsReadWriteContext &context ) @@ -246,6 +252,7 @@ void QgsPointCloudRenderer::restoreCommonProperties( const QDomElement &element, mLabelTextFormat.readXml( element.firstChildElement( u"text-style"_s ), context ); } mZoomOutBehavior = qgsEnumKeyToValue( element.attribute( u"zoomOutBehavior"_s ), Qgis::PointCloudZoomOutRenderBehavior::RenderExtents ); + mOverviewSwitchingScale = element.attribute( u"overviewSwitchingScale"_s, u"1.0"_s ).toDouble(); } void QgsPointCloudRenderer::saveCommonProperties( QDomElement &element, const QgsReadWriteContext &context ) const @@ -272,7 +279,10 @@ void QgsPointCloudRenderer::saveCommonProperties( QDomElement &element, const Qg element.appendChild( mLabelTextFormat.writeXml( doc, context ) ); } if ( mZoomOutBehavior != Qgis::PointCloudZoomOutRenderBehavior::RenderExtents ) + { element.setAttribute( u"zoomOutBehavior"_s, qgsEnumValueToKey( mZoomOutBehavior ) ); + element.setAttribute( u"overviewSwitchingScale"_s, qgsDoubleToString( mOverviewSwitchingScale ) ); + } } Qgis::PointCloudSymbol QgsPointCloudRenderer::pointSymbol() const diff --git a/src/core/pointcloud/qgspointcloudrenderer.h b/src/core/pointcloud/qgspointcloudrenderer.h index dbbc8daf8d1f..8985a97364ce 100644 --- a/src/core/pointcloud/qgspointcloudrenderer.h +++ b/src/core/pointcloud/qgspointcloudrenderer.h @@ -712,6 +712,18 @@ class CORE_EXPORT QgsPointCloudRenderer */ Qgis::PointCloudZoomOutRenderBehavior zoomOutBehavior() const { return mZoomOutBehavior; } + /** + * Sets the overview switching scale + * \since QGIS 4.0 + */ + void setOverviewSwitchingScale( const double value ); + + /** + * Returns the overview switching scale + * \since QGIS 4.0 + */ + double overviewSwitchingScale() const { return mOverviewSwitchingScale; } + protected: /** @@ -855,6 +867,7 @@ class CORE_EXPORT QgsPointCloudRenderer QgsTextFormat mLabelTextFormat; Qgis::PointCloudZoomOutRenderBehavior mZoomOutBehavior = Qgis::PointCloudZoomOutRenderBehavior::RenderExtents; + double mOverviewSwitchingScale = 1.0; }; #endif // QGSPOINTCLOUDRENDERER_H diff --git a/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp b/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp index 1468d38b939d..7f1c2ffa2888 100644 --- a/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp +++ b/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp @@ -141,13 +141,22 @@ QgsPointCloudRendererPropertiesWidget::QgsPointCloudRendererPropertiesWidget( Qg { mZoomOutOptions->addItem( tr( "Show Overview Only" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderOverview ) ); mZoomOutOptions->addItem( tr( "Show Extents Over Overview" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderOverviewAndExtents ) ); + + for ( auto it = mOverviewSwitchingScaleMap.constBegin(); it != mOverviewSwitchingScaleMap.constEnd(); ++it ) + { + mOverviewSwitchingScale->addItem( it.value(), it.key() ); + } + setOverviewSwitchingScale( 1.0 ); } } else { mZoomOutOptions->setEnabled( false ); + mOverviewSwitchingScale->setEnabled( false ); } + connect( mOverviewSwitchingScale, static_cast( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged ); + connect( mZoomOutOptions, qOverload( &QComboBox::currentIndexChanged ), this, [this]( int ) { switch ( mZoomOutOptions->currentData().value() ) { @@ -217,6 +226,7 @@ void QgsPointCloudRendererPropertiesWidget::syncToLayer( QgsMapLayer *layer ) mMaxErrorSpinBox->setValue( mLayer->renderer()->maximumScreenError() ); mMaxErrorUnitWidget->setUnit( mLayer->renderer()->maximumScreenErrorUnit() ); + setOverviewSwitchingScale( mLayer->renderer()->overviewSwitchingScale() ); mTriangulateGroupBox->setChecked( mLayer->renderer()->renderAsTriangles() ); mHorizontalTriangleCheckBox->setChecked( mLayer->renderer()->horizontalTriangleFilter() ); @@ -285,6 +295,8 @@ void QgsPointCloudRendererPropertiesWidget::apply() mLayer->renderer()->setShowLabels( mLabels->isChecked() ); mLayer->renderer()->setLabelTextFormat( mLabelOptions->textFormat() ); mLayer->renderer()->setZoomOutBehavior( mZoomOutOptions->currentData().value() ); + + mLayer->renderer()->setOverviewSwitchingScale( overviewSwitchingScale() ); } void QgsPointCloudRendererPropertiesWidget::rendererChanged() @@ -359,3 +371,13 @@ void QgsPointCloudRendererPropertiesWidget::emitWidgetChanged() if ( !mBlockChangedSignal ) emit widgetChanged(); } + +void QgsPointCloudRendererPropertiesWidget::setOverviewSwitchingScale( double scale ) +{ + mOverviewSwitchingScale->setCurrentIndex( mOverviewSwitchingScale->findData( scale ) ); +} + +double QgsPointCloudRendererPropertiesWidget::overviewSwitchingScale() const +{ + return mOverviewSwitchingScaleMap.key( mOverviewSwitchingScale->currentText() ); +} diff --git a/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.h b/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.h index 1451adbedbec..22d417c21c30 100644 --- a/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.h +++ b/src/gui/pointcloud/qgspointcloudrendererpropertieswidget.h @@ -64,7 +64,16 @@ class GUI_EXPORT QgsPointCloudRendererPropertiesWidget : public QgsMapLayerConfi void emitWidgetChanged(); private: + const QMap mOverviewSwitchingScaleMap { + { 5.0, "Much earlier" }, + { 2.0, "Earlier" }, + { 1.0, "Normal" }, + { 0.5, "Later" } + }; + static void initRendererWidgetFunctions(); + void setOverviewSwitchingScale( double scale ); + double overviewSwitchingScale() const; QgsPointCloudLayer *mLayer = nullptr; QgsStyle *mStyle = nullptr; diff --git a/src/ui/3d/qgspointcloud3dsymbolwidget.ui b/src/ui/3d/qgspointcloud3dsymbolwidget.ui index fe8b069dcf70..7fdef1122a27 100644 --- a/src/ui/3d/qgspointcloud3dsymbolwidget.ui +++ b/src/ui/3d/qgspointcloud3dsymbolwidget.ui @@ -194,8 +194,12 @@ false - - + + + + Overview switching scale + + @@ -204,6 +208,12 @@ + + + + + + @@ -233,7 +243,7 @@ See 2D Symbology settings - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -263,7 +273,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -417,7 +427,7 @@ enhancement Min - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -433,7 +443,7 @@ enhancement Max - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -459,7 +469,7 @@ enhancement Min - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -475,7 +485,7 @@ enhancement Max - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -494,7 +504,7 @@ enhancement Min - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -510,7 +520,7 @@ enhancement Max - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -543,7 +553,7 @@ enhancement Blue band - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -573,7 +583,7 @@ enhancement Green band - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter @@ -589,7 +599,7 @@ enhancement - Qt::Vertical + Qt::Orientation::Vertical @@ -628,17 +638,17 @@ enhancement + + QgsDoubleSpinBox + QDoubleSpinBox +
qgsdoublespinbox.h
+
QgsCollapsibleGroupBox QGroupBox
qgscollapsiblegroupbox.h
1
- - QgsDoubleSpinBox - QDoubleSpinBox -
qgsdoublespinbox.h
-
QgsColorButton QToolButton diff --git a/src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui b/src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui index 6fd5eca3f68c..2505c96c9f82 100644 --- a/src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui +++ b/src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui @@ -108,7 +108,7 @@
- Qt::StrongFocus + Qt::FocusPolicy::StrongFocus
@@ -181,10 +181,17 @@ false + + + + Show tile labels + + + - Qt::Horizontal + Qt::Orientation::Horizontal @@ -194,6 +201,13 @@ + + + + When zoomed out + + + @@ -204,19 +218,15 @@ - - + + - When zoomed out + Overview switching scale - - - - Show tile labels - - + + @@ -262,7 +272,7 @@ - Qt::StrongFocus + Qt::FocusPolicy::StrongFocus @@ -279,7 +289,7 @@ - Qt::StrongFocus + Qt::FocusPolicy::StrongFocus diff --git a/tests/src/3d/testqgspointcloud3drendering.cpp b/tests/src/3d/testqgspointcloud3drendering.cpp index 8b843c41ea09..bb0c81b6f7dc 100644 --- a/tests/src/3d/testqgspointcloud3drendering.cpp +++ b/tests/src/3d/testqgspointcloud3drendering.cpp @@ -603,6 +603,7 @@ void TestQgsPointCloud3DRendering::testPointCloud3DOverview() QgsPointCloudLayer3DRenderer *renderer = new QgsPointCloudLayer3DRenderer(); renderer->setSymbol( symbol ); renderer->setZoomOutBehavior( Qgis::PointCloudZoomOutRenderBehavior::RenderOverview ); + renderer->setOverviewSwitchingScale( 16.0 ); mVpcLayer->setRenderer3D( renderer ); scene->cameraController()->resetView( 120 );