From d8996ae33b8f324048c8d46fabae064dbdf7f4c2 Mon Sep 17 00:00:00 2001 From: uclaros Date: Tue, 16 Jan 2024 20:36:41 +0200 Subject: [PATCH] Add 3D map canvas handling methods to QgisInterface --- python/3d/3d_auto.sip | 2 +- python/PyQt6/3d/3d_auto.sip | 2 +- .../gui/auto_generated/qgisinterface.sip.in | 30 ++++++++++++++++ .../gui/auto_generated/qgisinterface.sip.in | 30 ++++++++++++++++ src/app/qgisapp.cpp | 34 +++++++++++++++---- src/app/qgisapp.h | 15 ++++++++ src/app/qgisappinterface.cpp | 15 ++++++++ src/app/qgisappinterface.h | 3 ++ src/gui/qgisinterface.h | 27 +++++++++++++++ 9 files changed, 149 insertions(+), 9 deletions(-) diff --git a/python/3d/3d_auto.sip b/python/3d/3d_auto.sip index 465a9b57088..732bcc0587c 100644 --- a/python/3d/3d_auto.sip +++ b/python/3d/3d_auto.sip @@ -1,11 +1,11 @@ // Include auto-generated SIP files %Include auto_generated/processing/qgs3dalgorithms.sip %Include auto_generated/qgs3d.sip -%Include auto_generated/qgs3dmapcanvas.sip %Include auto_generated/qgs3dmapscene.sip %Include auto_generated/qgs3dmapsettings.sip %Include auto_generated/qgs3dmaptool.sip %Include auto_generated/qgs3dtypes.sip +%Include auto_generated/qgs3dmapcanvas.sip %Include auto_generated/qgsabstractvectorlayer3drenderer.sip %Include auto_generated/qgscameracontroller.sip %Include auto_generated/qgscamerapose.sip diff --git a/python/PyQt6/3d/3d_auto.sip b/python/PyQt6/3d/3d_auto.sip index 465a9b57088..732bcc0587c 100644 --- a/python/PyQt6/3d/3d_auto.sip +++ b/python/PyQt6/3d/3d_auto.sip @@ -1,11 +1,11 @@ // Include auto-generated SIP files %Include auto_generated/processing/qgs3dalgorithms.sip %Include auto_generated/qgs3d.sip -%Include auto_generated/qgs3dmapcanvas.sip %Include auto_generated/qgs3dmapscene.sip %Include auto_generated/qgs3dmapsettings.sip %Include auto_generated/qgs3dmaptool.sip %Include auto_generated/qgs3dtypes.sip +%Include auto_generated/qgs3dmapcanvas.sip %Include auto_generated/qgsabstractvectorlayer3drenderer.sip %Include auto_generated/qgscameracontroller.sip %Include auto_generated/qgscamerapose.sip diff --git a/python/PyQt6/gui/auto_generated/qgisinterface.sip.in b/python/PyQt6/gui/auto_generated/qgisinterface.sip.in index 8bbca1b2543..6bdf340b13b 100644 --- a/python/PyQt6/gui/auto_generated/qgisinterface.sip.in +++ b/python/PyQt6/gui/auto_generated/qgisinterface.sip.in @@ -10,6 +10,11 @@ +class Qgs3DMapCanvas /External/; + +%ModuleHeaderCode +class Qgs3DMapCanvas; +%End class QgisInterface : QObject @@ -95,6 +100,31 @@ Closes the additional map canvas with matching ``name``. .. seealso:: :py:func:`createNewMapCanvas` .. versionadded:: 3.0 +%End + + virtual QList< Qgs3DMapCanvas * > mapCanvases3D() = 0; +%Docstring +Returns a list of all 3D map canvases open in the app. + +.. versionadded:: 3.36 +%End + + virtual Qgs3DMapCanvas *createNewMapCanvas3D( const QString &name ) = 0; +%Docstring +Create a new 3D map canvas with the specified unique ``name``. + +.. seealso:: :py:func:`closeMapCanvas3D` + +.. versionadded:: 3.36 +%End + + virtual void closeMapCanvas3D( const QString &name ) = 0; +%Docstring +Closes the additional map canvas with matching ``name``. + +.. seealso:: :py:func:`createNewMapCanvas3D` + +.. versionadded:: 3.36 %End virtual QSize iconSize( bool dockedToolbar = false ) const = 0; diff --git a/python/gui/auto_generated/qgisinterface.sip.in b/python/gui/auto_generated/qgisinterface.sip.in index 8bbca1b2543..6bdf340b13b 100644 --- a/python/gui/auto_generated/qgisinterface.sip.in +++ b/python/gui/auto_generated/qgisinterface.sip.in @@ -10,6 +10,11 @@ +class Qgs3DMapCanvas /External/; + +%ModuleHeaderCode +class Qgs3DMapCanvas; +%End class QgisInterface : QObject @@ -95,6 +100,31 @@ Closes the additional map canvas with matching ``name``. .. seealso:: :py:func:`createNewMapCanvas` .. versionadded:: 3.0 +%End + + virtual QList< Qgs3DMapCanvas * > mapCanvases3D() = 0; +%Docstring +Returns a list of all 3D map canvases open in the app. + +.. versionadded:: 3.36 +%End + + virtual Qgs3DMapCanvas *createNewMapCanvas3D( const QString &name ) = 0; +%Docstring +Create a new 3D map canvas with the specified unique ``name``. + +.. seealso:: :py:func:`closeMapCanvas3D` + +.. versionadded:: 3.36 +%End + + virtual void closeMapCanvas3D( const QString &name ) = 0; +%Docstring +Closes the additional map canvas with matching ``name``. + +.. seealso:: :py:func:`createNewMapCanvas3D` + +.. versionadded:: 3.36 %End virtual QSize iconSize( bool dockedToolbar = false ) const = 0; diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 3215dc9654a..1ea5c9b71b9 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -9211,6 +9211,16 @@ void QgisApp::setupLayoutManagerConnections() } ); } +QList QgisApp::mapCanvases3D() +{ + QList canvases; +#ifdef HAVE_3D + for ( Qgs3DMapCanvasWidget *w : std::as_const( mOpen3DMapViews ) ) + canvases.append( w->mapCanvas3D() ); +#endif + return canvases; +} + Qgs3DMapCanvasWidget *QgisApp::open3DMapView( const QString &viewName ) { #ifdef HAVE_3D @@ -13394,6 +13404,11 @@ QgsElevationProfileWidget *QgisApp::createNewElevationProfile() } void QgisApp::new3DMapCanvas() +{ + createNewMapCanvas3D( QString() ); +} + +Qgs3DMapCanvas *QgisApp::createNewMapCanvas3D( const QString &name ) { #ifdef HAVE_3D // initialize from project @@ -13404,18 +13419,18 @@ void QgisApp::new3DMapCanvas() if ( fullExtent.isEmpty() || !fullExtent.isFinite() ) { QMessageBox::warning( this, tr( "New 3D Map View" ), tr( "Project extent is not valid. Please add or activate a layer to render." ) ); - return; + return nullptr; } int i = 1; const QList< QString > usedCanvasNames = QgsProject::instance()->viewsManager()->get3DViewsNames(); - QString name = tr( "3D Map %1" ).arg( i ); - while ( usedCanvasNames.contains( name ) ) + QString uniqueName = name.isEmpty() ? tr( "3D Map %1" ).arg( i ) : name; + while ( usedCanvasNames.contains( uniqueName ) ) { - name = tr( "3D Map %1" ).arg( ++i ); + uniqueName = tr( "3D Map %1" ).arg( ++i ); } - Qgs3DMapCanvasWidget *canvasWidget = createNew3DMapCanvasDock( name, false ); + Qgs3DMapCanvasWidget *canvasWidget = createNew3DMapCanvasDock( uniqueName, false ); if ( canvasWidget ) { QgsProject *prj = QgsProject::instance(); @@ -13484,10 +13499,15 @@ void QgisApp::new3DMapCanvas() write3DMapViewSettings( canvasWidget, doc, elem3DMap ); - QgsProject::instance()->viewsManager()->register3DViewSettings( name, elem3DMap ); - QgsProject::instance()->viewsManager()->set3DViewInitiallyVisible( name, true ); + QgsProject::instance()->viewsManager()->register3DViewSettings( uniqueName, elem3DMap ); + QgsProject::instance()->viewsManager()->set3DViewInitiallyVisible( uniqueName, true ); + + return canvasWidget->mapCanvas3D(); } +#else + Q_UNUSED( name ); #endif + return nullptr; } void QgisApp::setExtent( const QgsRectangle &rect ) diff --git a/src/app/qgisapp.h b/src/app/qgisapp.h index 67736a2fee4..50d51cf66c4 100644 --- a/src/app/qgisapp.h +++ b/src/app/qgisapp.h @@ -160,6 +160,7 @@ class QgsAppGpsConnection; class QgsGpsToolBar; class QgsAppGpsSettingsMenu; class Qgs3DMapScene; +class Qgs3DMapCanvas; #include #include @@ -432,6 +433,20 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow */ QgsLayoutDesignerDialog *openLayoutDesignerDialog( QgsMasterLayoutInterface *layout ); + /** + * Returns a list of all 3D map canvases open in the app. + * + * \since QGIS 3.36 + */ + QList< Qgs3DMapCanvas * > mapCanvases3D(); + + /** + * Create a new 3D map canvas with the specified unique \a name. + * + * \since QGIS 3.36 + */ + Qgs3DMapCanvas *createNewMapCanvas3D( const QString &name ); + /** * Opens a 3D view canvas for a 3D map view called \a name. * If the 3D view named \a name was not already created in the project, nullptr will be returned diff --git a/src/app/qgisappinterface.cpp b/src/app/qgisappinterface.cpp index 0d1c2457095..2e9a1d4d925 100644 --- a/src/app/qgisappinterface.cpp +++ b/src/app/qgisappinterface.cpp @@ -391,6 +391,21 @@ void QgisAppInterface::closeMapCanvas( const QString &name ) qgis->closeMapCanvas( name ); } +QList< Qgs3DMapCanvas * > QgisAppInterface::mapCanvases3D() +{ + return qgis->mapCanvases3D(); +} + +Qgs3DMapCanvas *QgisAppInterface::createNewMapCanvas3D( const QString &name ) +{ + return qgis->createNewMapCanvas3D( name ); +} + +void QgisAppInterface::closeMapCanvas3D( const QString &name ) +{ + qgis->close3DMapView( name ); +} + QSize QgisAppInterface::iconSize( bool dockedToolbar ) const { return qgis->iconSize( dockedToolbar ); diff --git a/src/app/qgisappinterface.h b/src/app/qgisappinterface.h index bb8b39ea87a..d1494ed9fbc 100644 --- a/src/app/qgisappinterface.h +++ b/src/app/qgisappinterface.h @@ -107,6 +107,9 @@ class APP_EXPORT QgisAppInterface : public QgisInterface QList< QgsMapCanvas * > mapCanvases() override; QgsMapCanvas *createNewMapCanvas( const QString &name ) override; void closeMapCanvas( const QString &name ) override; + QList< Qgs3DMapCanvas * > mapCanvases3D() override; + Qgs3DMapCanvas *createNewMapCanvas3D( const QString &name ) override; + void closeMapCanvas3D( const QString &name ) override; QSize iconSize( bool dockedToolbar = false ) const override; QgsLayerTreeMapCanvasBridge *layerTreeCanvasBridge() override; QWidget *mainWindow() override; diff --git a/src/gui/qgisinterface.h b/src/gui/qgisinterface.h index db6bec853ec..e31289589ce 100644 --- a/src/gui/qgisinterface.h +++ b/src/gui/qgisinterface.h @@ -72,6 +72,13 @@ class QgsApplicationExitBlockerInterface; class QgsAbstractMapToolHandler; class QgsUserProfileManager; class QgsDataSourceManagerDialog; +class Qgs3DMapCanvas SIP_EXTERNAL; + +#ifdef SIP_RUN +% ModuleHeaderCode +class Qgs3DMapCanvas; +% End +#endif /** * \ingroup gui @@ -149,6 +156,26 @@ class GUI_EXPORT QgisInterface : public QObject */ virtual void closeMapCanvas( const QString &name ) = 0; + /** + * Returns a list of all 3D map canvases open in the app. + * \since QGIS 3.36 + */ + virtual QList< Qgs3DMapCanvas * > mapCanvases3D() = 0; + + /** + * Create a new 3D map canvas with the specified unique \a name. + * \see closeMapCanvas3D() + * \since QGIS 3.36 + */ + virtual Qgs3DMapCanvas *createNewMapCanvas3D( const QString &name ) = 0; + + /** + * Closes the additional map canvas with matching \a name. + * \see createNewMapCanvas3D() + * \since QGIS 3.36 + */ + virtual void closeMapCanvas3D( const QString &name ) = 0; + /** * Returns the toolbar icon size. If \a dockedToolbar is TRUE, the icon size * for toolbars contained within docks is returned.