QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsmesh3dsymbol.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmesh3dsymbol.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 "qgsmesh3dsymbol.h"
17#include "qgssymbollayerutils.h"
18#include "qgs3dutils.h"
20
22 : mMaterial( std::make_unique< QgsPhongMaterialSettings >() )
23{
24
25}
26
28
30{
31 std::unique_ptr< QgsMesh3DSymbol > result = std::make_unique< QgsMesh3DSymbol >();
32
33 result->mAltClamping = mAltClamping;
34 result->mHeight = mHeight;
35 result->mMaterial.reset( mMaterial->clone() );
36 result->mAddBackFaces = mAddBackFaces;
37 result->mEnabled = mEnabled;
38 result->mSmoothedTriangles = mSmoothedTriangles;
39 result->mWireframeEnabled = mWireframeEnabled;
40 result->mWireframeLineWidth = mWireframeLineWidth;
41 result->mWireframeLineColor = mWireframeLineColor;
42 result->mLevelOfDetailIndex = mLevelOfDetailIndex;
43 result->mVerticalScale = mVerticalScale;
44 result->mVerticalDatasetGroupIndex = mVerticalDatasetGroupIndex;
45 result->mIsVerticalMagnitudeRelative = mIsVerticalMagnitudeRelative;
46 result->mRenderingStyle = mRenderingStyle;
47 result->mColorRampShader = mColorRampShader;
48 result->mSingleColor = mSingleColor;
49 result->mArrowsEnabled = mArrowsEnabled;
50 result->mArrowsSpacing = mArrowsSpacing;
51 result->mArrowsFixedSize = mArrowsFixedSize;
52 result->mArrowsColor = mArrowsColor;
53 result->mMaximumTextureSize = mMaximumTextureSize;
54 copyBaseSettings( result.get() );
55 return result.release();
56}
57
58void QgsMesh3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
59{
60 QDomDocument doc = elem.ownerDocument();
61
62 //Simple symbol
63 QDomElement elemDataProperties = doc.createElement( QStringLiteral( "data" ) );
64 elemDataProperties.setAttribute( QStringLiteral( "alt-clamping" ), Qgs3DUtils::altClampingToString( mAltClamping ) );
65 elemDataProperties.setAttribute( QStringLiteral( "height" ), mHeight );
66 elemDataProperties.setAttribute( QStringLiteral( "add-back-faces" ), mAddBackFaces ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
67 elem.appendChild( elemDataProperties );
68
69 QDomElement elemMaterial = doc.createElement( QStringLiteral( "material" ) );
70 mMaterial->writeXml( elemMaterial, context );
71 elem.appendChild( elemMaterial );
72
73 //Advanced symbol
74 QDomElement elemAdvancedSettings = doc.createElement( QStringLiteral( "advanced-settings" ) );
75 elemAdvancedSettings.setAttribute( QStringLiteral( "renderer-3d-enabled" ), mEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
76 elemAdvancedSettings.setAttribute( QStringLiteral( "smoothed-triangle" ), mSmoothedTriangles ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
77 elemAdvancedSettings.setAttribute( QStringLiteral( "wireframe-enabled" ), mWireframeEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
78 elemAdvancedSettings.setAttribute( QStringLiteral( "wireframe-line-width" ), mWireframeLineWidth );
79 elemAdvancedSettings.setAttribute( QStringLiteral( "wireframe-line-color" ), QgsSymbolLayerUtils::encodeColor( mWireframeLineColor ) );
80 elemAdvancedSettings.setAttribute( QStringLiteral( "level-of-detail" ), mLevelOfDetailIndex );
81 elemAdvancedSettings.setAttribute( QStringLiteral( "vertical-scale" ), mVerticalScale );
82 elemAdvancedSettings.setAttribute( QStringLiteral( "vertical-group-index" ), mVerticalDatasetGroupIndex );
83 elemAdvancedSettings.setAttribute( QStringLiteral( "vertical-relative" ), mIsVerticalMagnitudeRelative ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
84 elemAdvancedSettings.setAttribute( QStringLiteral( "texture-type" ), mRenderingStyle );
85 elemAdvancedSettings.appendChild( mColorRampShader.writeXml( doc, context ) );
86 elemAdvancedSettings.setAttribute( QStringLiteral( "min-color-ramp-shader" ), mColorRampShader.minimumValue() );
87 elemAdvancedSettings.setAttribute( QStringLiteral( "max-color-ramp-shader" ), mColorRampShader.maximumValue() );
88 elemAdvancedSettings.setAttribute( QStringLiteral( "texture-single-color" ), QgsSymbolLayerUtils::encodeColor( mSingleColor ) );
89 elemAdvancedSettings.setAttribute( QStringLiteral( "arrows-enabled" ), mArrowsEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
90 elemAdvancedSettings.setAttribute( QStringLiteral( "arrows-spacing" ), mArrowsSpacing );
91 elemAdvancedSettings.setAttribute( QStringLiteral( "arrows-fixed-size" ), mArrowsFixedSize ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
92 elem.appendChild( elemAdvancedSettings );
93
94 QDomElement elemDDP = doc.createElement( QStringLiteral( "data-defined-properties" ) );
96 elem.appendChild( elemDDP );
97}
98
99void QgsMesh3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
100{
101 //Simple symbol
102 const QDomElement elemDataProperties = elem.firstChildElement( QStringLiteral( "data" ) );
103 mAltClamping = Qgs3DUtils::altClampingFromString( elemDataProperties.attribute( QStringLiteral( "alt-clamping" ) ) );
104 mHeight = elemDataProperties.attribute( QStringLiteral( "height" ) ).toFloat();
105 mAddBackFaces = elemDataProperties.attribute( QStringLiteral( "add-back-faces" ) ).toInt();
106
107 const QDomElement elemMaterial = elem.firstChildElement( QStringLiteral( "material" ) );
108 mMaterial->readXml( elemMaterial, context );
109
110 //Advanced symbol
111 const QDomElement elemAdvancedSettings = elem.firstChildElement( QStringLiteral( "advanced-settings" ) );
112 mEnabled = elemAdvancedSettings.attribute( QStringLiteral( "renderer-3d-enabled" ) ).toInt();
113 mSmoothedTriangles = elemAdvancedSettings.attribute( QStringLiteral( "smoothed-triangle" ) ).toInt();
114 mWireframeEnabled = elemAdvancedSettings.attribute( QStringLiteral( "wireframe-enabled" ) ).toInt();
115 mWireframeLineWidth = elemAdvancedSettings.attribute( QStringLiteral( "wireframe-line-width" ) ).toDouble();
116 mWireframeLineColor = QgsSymbolLayerUtils::decodeColor( elemAdvancedSettings.attribute( QStringLiteral( "wireframe-line-color" ) ) );
117 mLevelOfDetailIndex = elemAdvancedSettings.attribute( QStringLiteral( "level-of-detail" ) ).toInt();
118 mVerticalScale = elemAdvancedSettings.attribute( "vertical-scale" ).toDouble();
119 mVerticalDatasetGroupIndex = elemAdvancedSettings.attribute( "vertical-group-index" ).toInt();
120 mIsVerticalMagnitudeRelative = elemAdvancedSettings.attribute( "vertical-relative" ).toInt();
121 mRenderingStyle = static_cast<QgsMesh3DSymbol::RenderingStyle>( elemAdvancedSettings.attribute( QStringLiteral( "texture-type" ) ).toInt() );
122 mColorRampShader.readXml( elemAdvancedSettings.firstChildElement( "colorrampshader" ), context );
123 mColorRampShader.setMinimumValue( elemAdvancedSettings.attribute( QStringLiteral( "min-color-ramp-shader" ) ).toDouble() );
124 mColorRampShader.setMaximumValue( elemAdvancedSettings.attribute( QStringLiteral( "max-color-ramp-shader" ) ).toDouble() );
125 mSingleColor = QgsSymbolLayerUtils::decodeColor( elemAdvancedSettings.attribute( QStringLiteral( "texture-single-color" ) ) );
126 mArrowsEnabled = elemAdvancedSettings.attribute( QStringLiteral( "arrows-enabled" ) ).toInt();
127 if ( elemAdvancedSettings.hasAttribute( QStringLiteral( "arrows-spacing" ) ) )
128 mArrowsSpacing = elemAdvancedSettings.attribute( QStringLiteral( "arrows-spacing" ) ).toDouble();
129 mArrowsFixedSize = elemAdvancedSettings.attribute( QStringLiteral( "arrows-fixed-size" ) ).toInt();
130 const QDomElement elemDDP = elem.firstChildElement( QStringLiteral( "data-defined-properties" ) );
131 if ( !elemDDP.isNull() )
133}
134
136{
137 return mSmoothedTriangles;
138}
139
140void QgsMesh3DSymbol::setSmoothedTriangles( bool smoothTriangles )
141{
142 mSmoothedTriangles = smoothTriangles;
143}
144
146{
147 return mWireframeEnabled;
148}
149
150void QgsMesh3DSymbol::setWireframeEnabled( bool wireframeEnabled )
151{
152 mWireframeEnabled = wireframeEnabled;
153}
154
156{
157 return mWireframeLineWidth;
158}
159
160void QgsMesh3DSymbol::setWireframeLineWidth( double wireframeLineWidth )
161{
162 mWireframeLineWidth = wireframeLineWidth;
163}
164
166{
167 return mWireframeLineColor;
168}
169
170void QgsMesh3DSymbol::setWireframeLineColor( const QColor &wireframeLineColor )
171{
172 mWireframeLineColor = wireframeLineColor;
173}
174
176{
177 return mVerticalScale;
178}
179
180void QgsMesh3DSymbol::setVerticalScale( double verticalScale )
181{
182 mVerticalScale = verticalScale;
183}
184
186{
187 return mColorRampShader;
188}
189
191{
192 mColorRampShader = colorRampShader;
193}
194
196{
197 return mSingleColor;
198}
199
200void QgsMesh3DSymbol::setSingleMeshColor( const QColor &color )
201{
202 mSingleColor = color;
203}
204
206{
207 return mRenderingStyle;
208}
209
211{
212 mRenderingStyle = coloringType;
213}
214
216{
217 return mVerticalDatasetGroupIndex;
218}
219
220void QgsMesh3DSymbol::setVerticalDatasetGroupIndex( int verticalDatasetGroupIndex )
221{
222 mVerticalDatasetGroupIndex = verticalDatasetGroupIndex;
223}
224
226{
227 return mIsVerticalMagnitudeRelative;
228}
229
230void QgsMesh3DSymbol::setIsVerticalMagnitudeRelative( bool isVerticalScaleIsRelative )
231{
232 mIsVerticalMagnitudeRelative = isVerticalScaleIsRelative;
233}
234
236{
237 return mArrowsEnabled;
238}
239
240void QgsMesh3DSymbol::setArrowsEnabled( bool vectorEnabled )
241{
242 mArrowsEnabled = vectorEnabled;
243}
244
246{
247 return mArrowsSpacing;
248}
249
250void QgsMesh3DSymbol::setArrowsSpacing( double arrowsSpacing )
251{
252 mArrowsSpacing = arrowsSpacing;
253}
254
256{
257 return mMaximumTextureSize;
258}
259
260void QgsMesh3DSymbol::setMaximumTextureSize( int maximumTextureSize )
261{
262 mMaximumTextureSize = maximumTextureSize;
263}
264
266{
267 return mArrowsFixedSize;
268}
269
270void QgsMesh3DSymbol::setArrowsFixedSize( bool arrowsFixeSize )
271{
272 mArrowsFixedSize = arrowsFixeSize;
273}
274
276{
277 return mLevelOfDetailIndex;
278}
279
281{
282 mLevelOfDetailIndex = lod;
283}
284
286{
287 return mEnabled;
288}
289
290void QgsMesh3DSymbol::setEnabled( bool enabled )
291{
292 mEnabled = enabled;
293}
294
295
297{
298 return mMaterial.get();
299}
300
302{
303 if ( material == mMaterial.get() )
304 return;
305
306 mMaterial.reset( material );
307}
static Qgis::AltitudeClamping altClampingFromString(const QString &str)
Converts a string to a value from AltitudeClamping enum.
Definition: qgs3dutils.cpp:255
static QString altClampingToString(Qgis::AltitudeClamping altClamp)
Converts a value from AltitudeClamping enum to a string.
Definition: qgs3dutils.cpp:240
virtual void copyBaseSettings(QgsAbstract3DSymbol *destination) const
Copies base class settings from this object to a destination object.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the symbol layer property definitions.
QgsPropertyCollection mDataDefinedProperties
virtual bool readXml(const QDomElement &collectionElem, const QgsPropertiesDefinition &definitions)
Reads property collection state from an XML element.
virtual bool writeXml(QDomElement &collectionElem, const QgsPropertiesDefinition &definitions) const
Writes the current state of the property collection into an XML element.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context=QgsReadWriteContext()) const
Writes configuration to a new DOM element.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context=QgsReadWriteContext())
Reads configuration from the given DOM element.
double arrowsSpacing() const
Returns the arrow spacing.
bool wireframeEnabled() const
Returns if the mesh wireframe.
void setWireframeLineColor(const QColor &wireframeLineColor)
Sets wireframe line color.
bool isVerticalMagnitudeRelative() const
Returns if the vertical component of the mesh is relative to the mesh vertices Z value.
void setWireframeEnabled(bool wireframeEnabled)
Sets if the mesh wireframe.
bool smoothedTriangles() const
Returns if mesh triangle are smoothed.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
Writes symbol configuration to the given DOM element.
QgsAbstractMaterialSettings * material() const
Returns material used for shading of the symbol.
void setWireframeLineWidth(double wireframeLineWidth)
Sets wireframe line width.
QColor wireframeLineColor() const
Returns wireframe line color.
bool arrowsEnabled() const
Returns if arrows are enabled for 3D rendering.
void setIsVerticalMagnitudeRelative(bool isVerticalMagnitudeRelative)
Sets if the vertical component of the mesh is relative to the mesh vertices Z value.
void setLevelOfDetailIndex(int lod)
Returns the index of the level of detail of the mesh that is the position of the simplified mesh that...
void setArrowsSpacing(double arrowsSpacing)
Sets the arrow spacing.
double verticalScale() const
Returns mesh vertical scale.
void setVerticalDatasetGroupIndex(int verticalDatasetGroupIndex)
Sets the index of the dataset group that will be used to render the vertical component of the 3D mesh...
QgsMesh3DSymbol()
Constructor for QgsMesh3DSymbol.
void setArrowsFixedSize(bool arrowsFixedSize)
Sets if the arrow size is fixed.
int levelOfDetailIndex() const
Returns the index of the level of detail of the mesh that is the position of the simplified mesh that...
void setArrowsEnabled(bool arrowsEnabled)
Sets if arrows are enabled for 3D rendering.
void setVerticalScale(double verticalScale)
Sets mesh vertical scale.
QgsColorRampShader colorRampShader() const
Returns the color ramp shader used to render the color.
void setMaterial(QgsAbstractMaterialSettings *material SIP_TRANSFER)
Sets the material settings used for shading of the symbol.
QgsMesh3DSymbol::RenderingStyle renderingStyle() const
Returns the rendering style.
void setSmoothedTriangles(bool smoothTriangles)
Sets if the mesh triangles have to been smoothed.
void setColorRampShader(const QgsColorRampShader &colorRampShader)
Sets the color ramp shader used to render the color.
bool arrowsFixedSize() const
Returns if the arrow size is fixed.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads symbol configuration from the given DOM element.
void setSingleMeshColor(const QColor &singleMeshColor)
Sets the single color.
QColor singleMeshColor() const
Returns the single color.
int verticalDatasetGroupIndex() const
Returns the index of the dataset group that will be used to render the vertical component of the 3D m...
void setRenderingStyle(const QgsMesh3DSymbol::RenderingStyle &textureType)
Sets the rendering style.
~QgsMesh3DSymbol() override
void setMaximumTextureSize(int maximumTextureSize)
Sets the maximum texture size supported by the hardware Used to store the GL_MAX_TEXTURE_SIZE value t...
bool isEnabled() const
Returns if the 3d rendering is enabled.
double wireframeLineWidth() const
Returns wireframe line width.
void setEnabled(bool enabled)
Sets if the 3d rendering is enabled.
QgsMesh3DSymbol * clone() const override SIP_FACTORY
Returns a new instance of the symbol with the same settings.
RenderingStyle
How to render the color of the mesh.
int maximumTextureSize() const
Returns the maximum texture size supported by the hardware Used to store the GL_MAX_TEXTURE_SIZE valu...
double maximumValue() const
Returns the minimum value for the raster shader.
virtual void setMaximumValue(double value)
Sets the maximum value for the raster shader.
virtual void setMinimumValue(double value)
Sets the minimum value for the raster shader.
double minimumValue() const
Returns the maximum value for the raster shader.
The class is used as a container of context for various read/write operations on other objects.
static QColor decodeColor(const QString &str)
static QString encodeColor(const QColor &color)