QGIS API Documentation  3.12.1-BucureČ™ti (121cc00ff0)
qgsmeshlayer3drenderer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmeshlayer3drenderer.cpp
3  --------------------------
4  Date : January 2019
5  Copyright : (C) 2019 by Peter Petrik
6  Email : zilolv at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgsmeshlayer3drenderer.h"
17 
18 #include "qgsmeshlayer3drenderer.h"
19 #include "qgsmesh3dsymbol.h"
20 #include "qgsmesh3dsymbol_p.h"
21 
22 #include "qgsmeshlayer.h"
23 #include "qgsxmlutils.h"
24 #include "qgsmesh3dentity_p.h"
25 
27  : Qgs3DRendererAbstractMetadata( QStringLiteral( "mesh" ) )
28 {
29 }
30 
32 {
34  r->readXml( elem, context );
35  return r;
36 }
37 
38 // ---------
39 
40 
42  : mSymbol( s )
43 {
44 }
45 
47 {
48  QgsMeshLayer3DRenderer *r = new QgsMeshLayer3DRenderer( mSymbol ? ( QgsMesh3DSymbol * )mSymbol->clone() : nullptr );
49  r->mLayerRef = mLayerRef;
50  return r;
51 }
52 
54 {
55  mLayerRef = QgsMapLayerRef( layer );
56 }
57 
59 {
60  return qobject_cast<QgsMeshLayer *>( mLayerRef.layer );
61 }
62 
64 {
65  mSymbol.reset( symbol );
66 }
67 
69 {
70  return mSymbol.get();
71 }
72 
73 Qt3DCore::QEntity *QgsMeshLayer3DRenderer::createEntity( const Qgs3DMapSettings &map ) const
74 {
75  QgsMeshLayer *vl = layer();
76 
77  if ( !vl )
78  return nullptr;
79 
80  Qt3DCore::QEntity *entity = nullptr;
81 
82  QgsCoordinateTransform coordTrans( vl->crs(), map.crs(), map.transformContext() );
83 
84  QgsRectangle extentInMap;
85 
86  try
87  {
88  extentInMap = coordTrans.transform( vl->extent() );
89  }
90  catch ( QgsCsException & )
91  {
92  extentInMap = vl->extent();
93  }
94 
95  QgsMesh3dEntity *meshEntity = new QgsMesh3dEntity( map, *vl->triangularMesh(), extentInMap, *static_cast<QgsMesh3DSymbol *>( mSymbol.get() ) );
96  meshEntity->build();
97  entity = meshEntity;
98 
99  return entity;
100 }
101 
102 void QgsMeshLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
103 {
104  QDomDocument doc = elem.ownerDocument();
105 
106  elem.setAttribute( QStringLiteral( "layer" ), mLayerRef.layerId );
107 
108  QDomElement elemSymbol = doc.createElement( QStringLiteral( "symbol" ) );
109  if ( mSymbol )
110  {
111  elemSymbol.setAttribute( QStringLiteral( "type" ), mSymbol->type() );
112  mSymbol->writeXml( elemSymbol, context );
113  }
114  elem.appendChild( elemSymbol );
115 }
116 
117 void QgsMeshLayer3DRenderer::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
118 {
119  mLayerRef = QgsMapLayerRef( elem.attribute( QStringLiteral( "layer" ) ) );
120 
121  QDomElement elemSymbol = elem.firstChildElement( QStringLiteral( "symbol" ) );
123  symbol->readXml( elemSymbol, context );
124  mSymbol.reset( symbol );
125 }
126 
128 {
129  mLayerRef.setLayer( project.mapLayer( mLayerRef.layerId ) );
130 }
The class is used as a container of context for various read/write operations on other objects...
Qt3DCore::QEntity * createEntity(const Qgs3DMapSettings &map) const override
Returns a 3D entity that will be used to show renderer&#39;s data in 3D scene.
A rectangle specified with double values.
Definition: qgsrectangle.h:41
3 3D symbol that draws mesh geometry as planar triangles.
_LayerRef< QgsMapLayer > QgsMapLayerRef
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used in the 3D scene.
Base class for all renderers that may to participate in 3D view.
void resolveReferences(const QgsProject &project) override
Resolves references to other objects - second phase of loading - after readXml()
3D renderer that renders all mesh triangles of a mesh layer.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
Writes renderer&#39;s properties to given XML element.
3 Definition of the world
QgsMeshLayer3DRenderer * clone() const override
Returns a cloned instance.
QgsMeshLayer * layer() const
Returns mesh layer associated with the renderer.
QgsRectangle extent() const override
Returns the extent of the layer.
QString layerId
Original layer ID.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
QPointer< TYPE > layer
Weak pointer to map layer.
const QgsMesh3DSymbol * symbol() const
Returns 3D symbol associated with the renderer.
void setSymbol(QgsMesh3DSymbol *symbol)
Sets 3D symbol associated with the renderer.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts, annotations, canvases, etc.
Definition: qgsproject.h:91
void setLayer(TYPE *l)
Sets the reference to point to a specified layer.
void setLayer(QgsMeshLayer *layer)
Sets vector layer associated with the renderer.
QgsAbstract3DRenderer * createRenderer(QDomElement &elem, const QgsReadWriteContext &context) override
Creates an instance of a 3D renderer based on a DOM element with renderer configuration.
Class for doing transforms between two map coordinate systems.
QgsMeshLayer3DRenderer(QgsMesh3DSymbol *s=nullptr)
Takes ownership of the symbol object.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Definition: qgsmeshlayer.h:91
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads renderer&#39;s properties from given XML element.
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:65
Base metadata class for 3D renderers.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads symbol configuration from the given DOM element.
QgsTriangularMesh * triangularMesh()
Returns triangular mesh (nullptr before rendering)
QgsCoordinateReferenceSystem crs
Definition: qgsmaplayer.h:86