diff --git a/python/3d/auto_generated/qgs3dmapscene.sip.in b/python/3d/auto_generated/qgs3dmapscene.sip.in index 838eeaa33c2..929202602c8 100644 --- a/python/3d/auto_generated/qgs3dmapscene.sip.in +++ b/python/3d/auto_generated/qgs3dmapscene.sip.in @@ -212,6 +212,12 @@ Disables OpenGL clipping. + QList clipPlaneEquations() const; +%Docstring +Returns list of clipping planes if clipping is enabled, otherwise an empty list. + +.. versionadded:: 3.44 +%End signals: void terrainEntityChanged(); diff --git a/python/PyQt6/3d/auto_generated/qgs3dmapscene.sip.in b/python/PyQt6/3d/auto_generated/qgs3dmapscene.sip.in index ebf019d9d48..5373b6c2c36 100644 --- a/python/PyQt6/3d/auto_generated/qgs3dmapscene.sip.in +++ b/python/PyQt6/3d/auto_generated/qgs3dmapscene.sip.in @@ -212,6 +212,12 @@ Disables OpenGL clipping. + QList clipPlaneEquations() const; +%Docstring +Returns list of clipping planes if clipping is enabled, otherwise an empty list. + +.. versionadded:: 3.44 +%End signals: void terrainEntityChanged(); diff --git a/src/3d/qgs3dmapscene.h b/src/3d/qgs3dmapscene.h index ff126f6525f..b25d3c0d1a2 100644 --- a/src/3d/qgs3dmapscene.h +++ b/src/3d/qgs3dmapscene.h @@ -297,6 +297,13 @@ class _3D_EXPORT Qgs3DMapScene : public QObject */ void removeSceneEntity( Qgs3DMapSceneEntity *entity ) SIP_SKIP; + /** + * Returns list of clipping planes if clipping is enabled, otherwise an empty list. + * + * \since QGIS 3.44 + */ + QList clipPlaneEquations() const { return mClipPlanesEquations; }; + #ifndef SIP_RUN //! Static function for returning open 3D map scenes static std::function()> sOpenScenesFunction; diff --git a/src/app/3d/qgs3dmapcanvaswidget.cpp b/src/app/3d/qgs3dmapcanvaswidget.cpp index a53b9c478c4..4ae6b66a91b 100644 --- a/src/app/3d/qgs3dmapcanvaswidget.cpp +++ b/src/app/3d/qgs3dmapcanvaswidget.cpp @@ -1180,6 +1180,15 @@ void Qgs3DMapCanvasWidget::setSceneExtent( const QgsRectangle &extent ) if ( !extent.isEmpty() ) mCanvas->mapSettings()->setExtent( extent ); + if ( !mapCanvas3D()->scene()->clipPlaneEquations().isEmpty() ) + { + if ( !mMapToolClippingPlanes->clippedPolygon().intersects( extent ) ) + { + disableClippingPlanes(); + mMessageBar->pushInfo( QString(), tr( "Cross-section has been disabled, because it's outside current extent" ) ); + } + } + if ( mMapToolPrevious ) mMainCanvas->setMapTool( mMapToolPrevious ); else diff --git a/src/app/3d/qgsmaptoolclippingplanes.cpp b/src/app/3d/qgsmaptoolclippingplanes.cpp index c5cd7d6b35a..49a6060fb93 100644 --- a/src/app/3d/qgsmaptoolclippingplanes.cpp +++ b/src/app/3d/qgsmaptoolclippingplanes.cpp @@ -186,3 +186,8 @@ void QgsMapToolClippingPlanes::clearHighLightedArea() const { mRubberBandPolygon->reset( Qgis::GeometryType::Polygon ); } + +QgsGeometry QgsMapToolClippingPlanes::clippedPolygon() const +{ + return mRubberBandPolygon->asGeometry(); +} diff --git a/src/app/3d/qgsmaptoolclippingplanes.h b/src/app/3d/qgsmaptoolclippingplanes.h index e510718180f..0fc8d61b20f 100644 --- a/src/app/3d/qgsmaptoolclippingplanes.h +++ b/src/app/3d/qgsmaptoolclippingplanes.h @@ -49,6 +49,8 @@ class QgsMapToolClippingPlanes : public QgsMapTool void clear() const; //! Removes the tool's rubber band from canvas, which highlights the cross-section. void clearHighLightedArea() const; + //! Returns the Geometry of clipped area + QgsGeometry clippedPolygon() const; private: void clearRubberBand() const;