QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
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
17
18#include "qgs3dmapsettings.h"
19#include "qgs3drendercontext.h"
20#include "qgsmesh3dentity_p.h"
21#include "qgsmesh3dsymbol.h"
22#include "qgsmeshlayer.h"
23#include "qgsxmlutils.h"
24
29
31{
33 r->readXml( elem, context );
34 return r;
35}
36
37// ---------
38
39
44
46{
47 QgsMeshLayer3DRenderer *r = new QgsMeshLayer3DRenderer( mSymbol ? ( QgsMesh3DSymbol * ) mSymbol->clone() : nullptr );
48 r->mLayerRef = mLayerRef;
49 return r;
50}
51
56
58{
59 return qobject_cast<QgsMeshLayer *>( mLayerRef.layer );
60}
61
63{
64 mSymbol.reset( symbol );
65}
66
68{
69 return mSymbol.get();
70}
71
73{
74 QgsMeshLayer *meshLayer = layer();
75
76 if ( !meshLayer || !meshLayer->dataProvider() )
77 return nullptr;
78
79 if ( meshLayer->dataProvider()->contains( QgsMesh::ElementType::Edge ) || !mSymbol->isEnabled() )
80 {
81 // 3D not implemented for 1D meshes
82 return nullptr;
83 }
84
85 if ( mSymbol->verticalDatasetGroupIndex() < 0 )
86 return nullptr;
87
88 Qt3DCore::QEntity *entity = nullptr;
89
90 const QgsCoordinateTransform coordTrans( meshLayer->crs(), map->crs(), map->transformContext() );
91 meshLayer->updateTriangularMesh( coordTrans );
92 const QgsTriangularMesh triangularMesh = *meshLayer->triangularMeshByLodIndex( mSymbol->levelOfDetailIndex() );
93 QgsMeshDataset3DEntity *meshEntity = new QgsMeshDataset3DEntity( Qgs3DRenderContext::fromMapSettings( map ), triangularMesh, meshLayer, mSymbol.get() );
94 meshEntity->build();
95 entity = meshEntity;
96
97 return entity;
98}
99
100void QgsMeshLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
101{
102 QDomDocument doc = elem.ownerDocument();
103
104 elem.setAttribute( QStringLiteral( "layer" ), mLayerRef.layerId );
105
106 QDomElement elemSymbol = doc.createElement( QStringLiteral( "symbol" ) );
107 if ( mSymbol )
108 {
109 elemSymbol.setAttribute( QStringLiteral( "type" ), mSymbol->type() );
110 mSymbol->writeXml( elemSymbol, context );
111 }
112 elem.appendChild( elemSymbol );
113}
114
115void QgsMeshLayer3DRenderer::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
116{
117 mLayerRef = QgsMapLayerRef( elem.attribute( QStringLiteral( "layer" ) ) );
118
119 const QDomElement elemSymbol = elem.firstChildElement( QStringLiteral( "symbol" ) );
121 symbol->readXml( elemSymbol, context );
122 mSymbol.reset( symbol );
123}
124
126{
127 mLayerRef.setLayer( project.mapLayer( mLayerRef.layerId ) );
128}
Definition of the world.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used in the 3D scene.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
static Qgs3DRenderContext fromMapSettings(const Qgs3DMapSettings *mapSettings)
Creates an initialized Qgs3DRenderContext instance from given Qgs3DMapSettings.
Qgs3DRendererAbstractMetadata(const QString &type)
Constructor of the base class.
Base class for all renderers that participate in 3D views.
Handles coordinate transforms between two coordinate systems.
QgsCoordinateReferenceSystem crs
Definition qgsmaplayer.h:87
3D symbol that draws mesh geometry as planar triangles.
bool contains(const QgsMesh::ElementType &type) const
Returns whether the mesh contains at mesh elements of given type.
QgsAbstract3DRenderer * createRenderer(QDomElement &elem, const QgsReadWriteContext &context) override
Creates an instance of a 3D renderer based on a DOM element with renderer configuration.
3D renderer that renders all mesh triangles of a mesh layer.
Qt3DCore::QEntity * createEntity(Qgs3DMapSettings *map) const override
Returns a 3D entity that will be used to show renderer's data in 3D scene.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads renderer's properties from given XML element.
void setSymbol(QgsMesh3DSymbol *symbol)
Sets 3D symbol associated with the renderer.
const QgsMesh3DSymbol * symbol() const
Returns 3D symbol associated with the renderer.
QgsMeshLayer3DRenderer(QgsMesh3DSymbol *s=nullptr)
Takes ownership of the symbol object.
void setLayer(QgsMeshLayer *layer)
Sets vector layer associated with the renderer.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
Writes renderer's properties to given XML element.
void resolveReferences(const QgsProject &project) override
Resolves references to other objects - second phase of loading - after readXml().
QgsMeshLayer * layer() const
Returns mesh layer associated with the renderer.
QgsMeshLayer3DRenderer * clone() const override
Returns a cloned instance.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
void updateTriangularMesh(const QgsCoordinateTransform &transform=QgsCoordinateTransform())
Gets native mesh and updates (creates if it doesn't exist) the base triangular mesh.
QgsTriangularMesh * triangularMeshByLodIndex(int lodIndex) const
Returns triangular corresponding to the index of level of details.
QgsMeshDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:109
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
A container for the context for various read/write operations on objects.
A triangular/derived mesh with vertices in map coordinates.
_LayerRef< QgsMapLayer > QgsMapLayerRef