Add 3D map canvas handling methods to QgisInterface

This commit is contained in:
uclaros 2024-01-16 20:36:41 +02:00 committed by Martin Dobias
parent 2f98809d2c
commit d8996ae33b
9 changed files with 149 additions and 9 deletions

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -9211,6 +9211,16 @@ void QgisApp::setupLayoutManagerConnections()
} );
}
QList<Qgs3DMapCanvas *> QgisApp::mapCanvases3D()
{
QList<Qgs3DMapCanvas *> 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 )

View File

@ -160,6 +160,7 @@ class QgsAppGpsConnection;
class QgsGpsToolBar;
class QgsAppGpsSettingsMenu;
class Qgs3DMapScene;
class Qgs3DMapCanvas;
#include <QMainWindow>
#include <QToolBar>
@ -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

View File

@ -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 );

View File

@ -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;

View File

@ -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.