Skip to content

Commit 6df6681

Browse files
committed
Read/write 3D renderers of map layers to project files
1 parent 04b00aa commit 6df6681

15 files changed

+131
-38
lines changed

python/core/qgsmaplayer.sip

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,12 @@ Invoked by QgsProject.read().
453453
:rtype: bool
454454
%End
455455

456+
virtual void resolveReferences( QgsProject *project );
457+
%Docstring
458+
Resolve references to other layers (kept as layer IDs after reading XML) into layer objects.
459+
.. versionadded:: 3.0
460+
%End
461+
456462
QStringList customPropertyKeys() const;
457463
%Docstring
458464
Returns list of all keys within custom properties. Properties are stored in a map and saved in project file.
@@ -1091,7 +1097,6 @@ Set whether layer is valid or not - should be used in constructor.
10911097
:rtype: bool
10921098
%End
10931099

1094-
10951100
void readCustomProperties( const QDomNode &layerNode, const QString &keyStartsWith = QString() );
10961101
%Docstring
10971102
Read custom properties from project file.

python/core/qgsvectorlayer.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ Return the provider type for this layer
711711
:rtype: bool
712712
%End
713713

714-
void resolveReferences( QgsProject *project );
714+
virtual void resolveReferences( QgsProject *project );
715715
%Docstring
716716
Resolve references to other layers (kept as layer IDs after reading XML) into layer objects.
717717
.. versionadded:: 3.0

src/3d/abstract3dsymbol.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ Abstract3DSymbol *Polygon3DSymbol::clone() const
1616
return new Polygon3DSymbol( *this );
1717
}
1818

19-
void Polygon3DSymbol::writeXml( QDomElement &elem ) const
19+
void Polygon3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
2020
{
21+
Q_UNUSED( context );
22+
2123
QDomDocument doc = elem.ownerDocument();
2224

2325
QDomElement elemDataProperties = doc.createElement( "data" );
@@ -32,8 +34,10 @@ void Polygon3DSymbol::writeXml( QDomElement &elem ) const
3234
elem.appendChild( elemMaterial );
3335
}
3436

35-
void Polygon3DSymbol::readXml( const QDomElement &elem )
37+
void Polygon3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
3638
{
39+
Q_UNUSED( context );
40+
3741
QDomElement elemDataProperties = elem.firstChildElement( "data" );
3842
altClamping = Utils::altClampingFromString( elemDataProperties.attribute( "alt-clamping" ) );
3943
altBinding = Utils::altBindingFromString( elemDataProperties.attribute( "alt-binding" ) );
@@ -56,8 +60,10 @@ Abstract3DSymbol *Point3DSymbol::clone() const
5660
return new Point3DSymbol( *this );
5761
}
5862

59-
void Point3DSymbol::writeXml( QDomElement &elem ) const
63+
void Point3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
6064
{
65+
Q_UNUSED( context );
66+
6167
QDomDocument doc = elem.ownerDocument();
6268

6369
QDomElement elemMaterial = doc.createElement( "material" );
@@ -73,8 +79,10 @@ void Point3DSymbol::writeXml( QDomElement &elem ) const
7379
elem.appendChild( elemTransform );
7480
}
7581

76-
void Point3DSymbol::readXml( const QDomElement &elem )
82+
void Point3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
7783
{
84+
Q_UNUSED( context );
85+
7886
QDomElement elemMaterial = elem.firstChildElement( "material" );
7987
material.readXml( elemMaterial );
8088

@@ -103,8 +111,10 @@ Abstract3DSymbol *Line3DSymbol::clone() const
103111
return new Line3DSymbol( *this );
104112
}
105113

106-
void Line3DSymbol::writeXml( QDomElement &elem ) const
114+
void Line3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
107115
{
116+
Q_UNUSED( context );
117+
108118
QDomDocument doc = elem.ownerDocument();
109119

110120
QDomElement elemDataProperties = doc.createElement( "data" );
@@ -120,8 +130,10 @@ void Line3DSymbol::writeXml( QDomElement &elem ) const
120130
elem.appendChild( elemMaterial );
121131
}
122132

123-
void Line3DSymbol::readXml( const QDomElement &elem )
133+
void Line3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
124134
{
135+
Q_UNUSED( context );
136+
125137
QDomElement elemDataProperties = elem.firstChildElement( "data" );
126138
altClamping = Utils::altClampingFromString( elemDataProperties.attribute( "alt-clamping" ) );
127139
altBinding = Utils::altBindingFromString( elemDataProperties.attribute( "alt-binding" ) );

src/3d/abstract3dsymbol.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ class _3D_EXPORT Abstract3DSymbol
1616
virtual QString type() const = 0;
1717
virtual Abstract3DSymbol *clone() const = 0;
1818

19-
virtual void writeXml( QDomElement &elem ) const = 0;
20-
virtual void readXml( const QDomElement &elem ) = 0;
19+
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const = 0;
20+
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) = 0;
2121
};
2222

2323

@@ -30,8 +30,8 @@ class _3D_EXPORT Polygon3DSymbol : public Abstract3DSymbol
3030
QString type() const override { return "polygon"; }
3131
Abstract3DSymbol *clone() const override;
3232

33-
void writeXml( QDomElement &elem ) const override;
34-
void readXml( const QDomElement &elem ) override;
33+
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
34+
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
3535

3636
AltitudeClamping altClamping; //! how to handle altitude of vector features
3737
AltitudeBinding altBinding; //! how to handle clamping of vertices of individual features
@@ -51,8 +51,8 @@ class _3D_EXPORT Point3DSymbol : public Abstract3DSymbol
5151
QString type() const override { return "point"; }
5252
Abstract3DSymbol *clone() const override;
5353

54-
void writeXml( QDomElement &elem ) const override;
55-
void readXml( const QDomElement &elem ) override;
54+
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
55+
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
5656

5757
PhongMaterialSettings material; //!< Defines appearance of objects
5858
QVariantMap shapeProperties; //!< What kind of shape to use and what
@@ -69,8 +69,8 @@ class _3D_EXPORT Line3DSymbol : public Abstract3DSymbol
6969
QString type() const override { return "line"; }
7070
Abstract3DSymbol *clone() const override;
7171

72-
void writeXml( QDomElement &elem ) const override;
73-
void readXml( const QDomElement &elem ) override;
72+
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
73+
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
7474

7575
AltitudeClamping altClamping; //! how to handle altitude of vector features
7676
AltitudeBinding altBinding; //! how to handle clamping of vertices of individual features

src/3d/map3d.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ Map3D::~Map3D()
5757

5858
void Map3D::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
5959
{
60-
Q_UNUSED( context );
61-
6260
QDomElement elemOrigin = elem.firstChildElement( "origin" );
6361
originX = elemOrigin.attribute( "x" ).toDouble();
6462
originY = elemOrigin.attribute( "y" ).toDouble();
@@ -117,7 +115,7 @@ void Map3D::readXml( const QDomElement &elem, const QgsReadWriteContext &context
117115

118116
if ( renderer )
119117
{
120-
renderer->readXml( elemRenderer );
118+
renderer->readXml( elemRenderer, context );
121119
renderers.append( renderer );
122120
}
123121
elemRenderer = elemRenderer.nextSiblingElement( "renderer" );
@@ -135,7 +133,6 @@ void Map3D::readXml( const QDomElement &elem, const QgsReadWriteContext &context
135133

136134
QDomElement Map3D::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
137135
{
138-
Q_UNUSED( context );
139136
QDomElement elem = doc.createElement( "qgis3d" );
140137

141138
QDomElement elemOrigin = doc.createElement( "origin" );
@@ -171,7 +168,7 @@ QDomElement Map3D::writeXml( QDomDocument &doc, const QgsReadWriteContext &conte
171168
{
172169
QDomElement elemRenderer = doc.createElement( "renderer" );
173170
elemRenderer.setAttribute( "type", renderer->type() );
174-
renderer->writeXml( elemRenderer );
171+
renderer->writeXml( elemRenderer, context );
175172
elemRenderers.appendChild( elemRenderer );
176173
}
177174
elem.appendChild( elemRenderers );

src/3d/vectorlayer3drenderer.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,22 @@
99
#include "qgsxmlutils.h"
1010

1111

12+
VectorLayer3DRendererMetadata::VectorLayer3DRendererMetadata()
13+
: Qgs3DRendererAbstractMetadata( "vector" )
14+
{
15+
}
16+
17+
QgsAbstract3DRenderer *VectorLayer3DRendererMetadata::createRenderer( QDomElement &elem, const QgsReadWriteContext &context )
18+
{
19+
VectorLayer3DRenderer *r = new VectorLayer3DRenderer;
20+
r->readXml( elem, context );
21+
return r;
22+
}
23+
24+
25+
// ---------
26+
27+
1228
VectorLayer3DRenderer::VectorLayer3DRenderer( Abstract3DSymbol *s )
1329
: mSymbol( s )
1430
{
@@ -62,7 +78,7 @@ Qt3DCore::QEntity *VectorLayer3DRenderer::createEntity( const Map3D &map ) const
6278
return nullptr;
6379
}
6480

65-
void VectorLayer3DRenderer::writeXml( QDomElement &elem ) const
81+
void VectorLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
6682
{
6783
QDomDocument doc = elem.ownerDocument();
6884

@@ -72,12 +88,12 @@ void VectorLayer3DRenderer::writeXml( QDomElement &elem ) const
7288
if ( mSymbol )
7389
{
7490
elemSymbol.setAttribute( "type", mSymbol->type() );
75-
mSymbol->writeXml( elemSymbol );
91+
mSymbol->writeXml( elemSymbol, context );
7692
}
7793
elem.appendChild( elemSymbol );
7894
}
7995

80-
void VectorLayer3DRenderer::readXml( const QDomElement &elem )
96+
void VectorLayer3DRenderer::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
8197
{
8298
layerRef = QgsMapLayerRef( elem.attribute( "layer" ) );
8399

@@ -92,7 +108,7 @@ void VectorLayer3DRenderer::readXml( const QDomElement &elem )
92108
symbol = new Line3DSymbol;
93109

94110
if ( symbol )
95-
symbol->readXml( elemSymbol );
111+
symbol->readXml( elemSymbol, context );
96112
mSymbol.reset( symbol );
97113
}
98114

src/3d/vectorlayer3drenderer.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "qgis_3d.h"
55

6+
#include "qgs3drendererregistry.h"
67
#include "qgsabstract3drenderer.h"
78

89
#include "phongmaterialsettings.h"
@@ -16,6 +17,17 @@ class QgsVectorLayer;
1617

1718
class Abstract3DSymbol;
1819

20+
21+
//! Metadata for vector layer 3D renderer to allow creation of its instances from XML
22+
class _3D_EXPORT VectorLayer3DRendererMetadata : public Qgs3DRendererAbstractMetadata
23+
{
24+
public:
25+
VectorLayer3DRendererMetadata();
26+
27+
virtual QgsAbstract3DRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) override;
28+
};
29+
30+
1931
/** 3D renderer that renders all features of a vector layer with the same 3D symbol.
2032
* The appearance is completely defined by the symbol.
2133
*/
@@ -37,8 +49,8 @@ class _3D_EXPORT VectorLayer3DRenderer : public QgsAbstract3DRenderer
3749
VectorLayer3DRenderer *clone() const override;
3850
Qt3DCore::QEntity *createEntity( const Map3D &map ) const override;
3951

40-
void writeXml( QDomElement &elem ) const override;
41-
void readXml( const QDomElement &elem ) override;
52+
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
53+
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
4254
void resolveReferences( const QgsProject &project ) override;
4355

4456
private:

src/app/qgisapp.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,15 @@
8080
#include "qgsziputils.h"
8181
#include "qgsbrowsermodel.h"
8282

83+
#ifdef HAVE_3D
84+
#include "qgsabstract3drenderer.h"
85+
#include "qgs3dmapcanvasdockwidget.h"
86+
#include "qgs3drendererregistry.h"
87+
#include "map3d.h"
88+
#include "flatterraingenerator.h"
89+
#include "vectorlayer3drenderer.h"
90+
#endif
91+
8392
#include <QNetworkReply>
8493
#include <QNetworkProxy>
8594
#include <QAuthenticator>
@@ -800,6 +809,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh
800809
functionProfile( &QgisApp::updateRecentProjectPaths, this, QStringLiteral( "Update recent project paths" ) );
801810
functionProfile( &QgisApp::updateProjectFromTemplates, this, QStringLiteral( "Update project from templates" ) );
802811
functionProfile( &QgisApp::legendLayerSelectionChanged, this, QStringLiteral( "Legend layer selection changed" ) );
812+
functionProfile( &QgisApp::init3D, this, QStringLiteral( "Initialize 3D support" ) );
803813

804814
QgsApplication::annotationRegistry()->addAnnotationType( QgsAnnotationMetadata( QStringLiteral( "FormAnnotationItem" ), &QgsFormAnnotation::create ) );
805815
connect( QgsProject::instance()->annotationManager(), &QgsAnnotationManager::annotationAdded, this, &QgisApp::annotationCreated );
@@ -9879,13 +9889,19 @@ void QgisApp::newMapCanvas()
98799889
}
98809890
}
98819891

9882-
#include "qgsabstract3drenderer.h"
9883-
#include "qgs3dmapcanvasdockwidget.h"
9884-
#include "map3d.h"
9885-
#include "flatterraingenerator.h"
9892+
void QgisApp::init3D()
9893+
{
9894+
#ifdef HAVE_3D
9895+
// register 3D renderers
9896+
QgsApplication::instance()->renderer3DRegistry()->addRenderer( new VectorLayer3DRendererMetadata );
9897+
#else
9898+
mActionNew3DMapCanvas->setVisible( false );
9899+
#endif
9900+
}
98869901

98879902
void QgisApp::new3DMapCanvas()
98889903
{
9904+
#ifdef HAVE_3D
98899905
// initialize from project
98909906
QgsProject *prj = QgsProject::instance();
98919907
QgsRectangle fullExtent = mMapCanvas->fullExtent();
@@ -9910,6 +9926,7 @@ void QgisApp::new3DMapCanvas()
99109926
map3DWidget->setMap( map );
99119927
map3DWidget->setMainCanvas( mMapCanvas );
99129928
addDockWidget( Qt::BottomDockWidgetArea, map3DWidget );
9929+
#endif
99139930
}
99149931

99159932
void QgisApp::setExtent( const QgsRectangle &rect )

src/app/qgisapp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1700,6 +1700,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
17001700
void createCanvasTools();
17011701
void createMapTips();
17021702
void createDecorations();
1703+
void init3D();
17031704

17041705
/**
17051706
* Refresh the user profile menu.

src/core/3d/qgsabstract3drenderer.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
class QDomElement;
99
class QgsProject;
10+
class QgsReadWriteContext;
1011
class Map3D;
1112

1213
namespace Qt3DCore
@@ -25,8 +26,8 @@ class CORE_EXPORT QgsAbstract3DRenderer //: public QObject
2526
virtual QgsAbstract3DRenderer *clone() const = 0;
2627
virtual Qt3DCore::QEntity *createEntity( const Map3D &map ) const = 0;
2728

28-
virtual void writeXml( QDomElement &elem ) const = 0;
29-
virtual void readXml( const QDomElement &elem ) = 0;
29+
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const = 0;
30+
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) = 0;
3031
virtual void resolveReferences( const QgsProject &project );
3132
};
3233

0 commit comments

Comments
 (0)