QGIS API Documentation 4.3.0-Master (35968c35f7e)
Loading...
Searching...
No Matches
qgspointcloudrendererpropertieswidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgspointcloudrendererpropertieswidget.cpp
3 ---------------------
4 begin : November 2020
5 copyright : (C) 2020 by Nyall Dawson
6 email : nyall dot dawson 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 ***************************************************************************/
16
17#include "qgis.h"
18#include "qgsapplication.h"
22#include "qgsfontbutton.h"
23#include "qgslogger.h"
28#include "qgspointcloudlayer.h"
33#include "qgsproject.h"
34#include "qgsprojectutils.h"
35#include "qgsproperty.h"
36#include "qgsstyle.h"
38#include "qgstextformatwidget.h"
39#include "qgsvirtualpointcloudprovider.h"
40
41#include <QString>
42
43#include "moc_qgspointcloudrendererpropertieswidget.cpp"
44
45using namespace Qt::StringLiterals;
46
47static bool initPointCloudRenderer( const QString &name, QgsPointCloudRendererWidgetFunc f, const QString &iconName = QString() )
48{
50 if ( !rendererAbstractMetadata )
51 return false;
52 QgsPointCloudRendererMetadata *rendererMetadata = dynamic_cast<QgsPointCloudRendererMetadata *>( rendererAbstractMetadata );
53 if ( !rendererMetadata )
54 return false;
55
56 rendererMetadata->setWidgetFunction( f );
57
58 if ( !iconName.isEmpty() )
59 {
60 rendererMetadata->setIcon( QgsApplication::getThemeIcon( iconName ) );
61 }
62
63 QgsDebugMsgLevel( "Set for " + name, 2 );
64 return true;
65}
66
67void QgsPointCloudRendererPropertiesWidget::initRendererWidgetFunctions()
68{
69 static bool sInitialized = false;
70 if ( sInitialized )
71 return;
72
73 initPointCloudRenderer( u"extent"_s, QgsPointCloudExtentRendererWidget::create, u"styleicons/pointcloudextent.svg"_s );
74 initPointCloudRenderer( u"rgb"_s, QgsPointCloudRgbRendererWidget::create, u"styleicons/multibandcolor.svg"_s );
75 initPointCloudRenderer( u"ramp"_s, QgsPointCloudAttributeByRampRendererWidget::create, u"styleicons/singlebandpseudocolor.svg"_s );
76 initPointCloudRenderer( u"classified"_s, QgsPointCloudClassifiedRendererWidget::create, u"styleicons/paletted.svg"_s );
77
78 sInitialized = true;
79}
80
82 : QgsMapLayerConfigWidget( layer, nullptr, parent )
83 , mLayer( layer )
84 , mStyle( style )
85{
86 setupUi( this );
87
88 layout()->setContentsMargins( 0, 0, 0, 0 );
89
90 // initialize registry's widget functions
91 initRendererWidgetFunctions();
92
94 const QStringList renderers = reg->renderersList();
95 for ( const QString &name : renderers )
96 {
98 cboRenderers->addItem( m->icon(), m->visibleName(), name );
99 }
100
101 cboRenderers->setCurrentIndex( -1 ); // set no current renderer
102
103 mPointStyleComboBox->addItem( tr( "Square" ), QVariant::fromValue( Qgis::PointCloudSymbol::Square ) );
104 mPointStyleComboBox->addItem( tr( "Circle" ), QVariant::fromValue( Qgis::PointCloudSymbol::Circle ) );
105
106 connect( cboRenderers, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::rendererChanged );
107
108 connect( mBlendModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
109 connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
110
111 mPointSizeUnitWidget->setUnits(
113 );
114
115 connect( mPointSizeSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
116 mPointSizeSpinBox->setClearValue( 1.0 );
117
118 connect( mPointSizeUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
119
120 mDrawOrderComboBox->addItem( tr( "Default" ), QVariant::fromValue( Qgis::PointCloudDrawOrder::Default ) );
121 mDrawOrderComboBox->addItem( tr( "Bottom to Top" ), QVariant::fromValue( Qgis::PointCloudDrawOrder::BottomToTop ) );
122 mDrawOrderComboBox->addItem( tr( "Top to Bottom" ), QVariant::fromValue( Qgis::PointCloudDrawOrder::TopToBottom ) );
123
124 connect( mDirectionalLightWidget, &QgsDirectionalLightWidget::directionChanged, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
125
126 mEdlDistanceSpinBox->setClearValue( 0.5 );
127 mEdlStrengthSpinBox->setClearValue( 1000 );
128 connect( mEdlStrengthSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
129 connect( mEdlDistanceSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
130 connect( mEdlDistanceUnit, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
131
132 mHillshadingZFactorSpinBox->setClearValue( 1.0 );
133 connect( mHillshadingZFactorSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
134 connect( mHillshadingMultidirCheckBox, &QCheckBox::toggled, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
135
136 mMaxErrorUnitWidget->setUnits(
138 );
139 mMaxErrorSpinBox->setClearValue( 0.3 );
140
141 mHorizontalTriangleThresholdSpinBox->setClearValue( 5.0 );
142 mHorizontalTriangleUnitWidget->setUnits(
144 );
145
146 connect( mMaxErrorSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
147 connect( mMaxErrorUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
148
149 connect( mPointStyleComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
150 connect( mDrawOrderComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
151
152 connect( mEyeDomeLightingGroupBox, &QGroupBox::toggled, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
153 connect( mHillshadeGroupBox, &QGroupBox::toggled, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
154
155 connect( mTriangulateGroupBox, &QGroupBox::toggled, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
156 connect( mHorizontalTriangleCheckBox, &QCheckBox::clicked, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
157 connect( mHorizontalTriangleThresholdSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
158 connect( mHorizontalTriangleUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
159
160 connect( mColorExpressionWidget, qOverload<const QString &>( &QgsFieldExpressionWidget::fieldChanged ), this, &QgsPointCloudRendererPropertiesWidget::updateDataDefinedProperty );
161 // show virtual point cloud options only when vpc layer is selected
162 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
163 {
164 mLabelOptions->setDialogTitle( tr( "Customize label text" ) );
165 mLabelOptions->setText( tr( "Label format" ) );
166 connect( mLabels, &QCheckBox::stateChanged, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
167 connect( mLabelOptions, &QgsFontButton::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
168 mZoomOutOptions->addItem( tr( "Show Extents Only" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderExtents ) );
169
170 if ( const QgsVirtualPointCloudProvider *vpcProvider = dynamic_cast<QgsVirtualPointCloudProvider *>( mLayer->dataProvider() ) )
171 {
172 if ( !vpcProvider->overviews().isEmpty() )
173 {
174 mZoomOutOptions->addItem( tr( "Show Overview Only" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderOverview ) );
175 mZoomOutOptions->addItem( tr( "Show Extents Over Overview" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderOverviewAndExtents ) );
176 }
177
178 for ( auto it = mOverviewSwitchingScaleMap.constBegin(); it != mOverviewSwitchingScaleMap.constEnd(); ++it )
179 {
180 mOverviewSwitchingScale->addItem( it.value(), it.key() );
181 }
182 setOverviewSwitchingScale( 1.0 );
183 }
184 else
185 {
186 mZoomOutOptions->setEnabled( false );
187 mOverviewSwitchingScale->setEnabled( false );
188 }
189
190 connect( mOverviewSwitchingScale, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
191
192 connect( mZoomOutOptions, qOverload<int>( &QComboBox::currentIndexChanged ), this, [this]( int ) {
193 switch ( mZoomOutOptions->currentData().value<Qgis::PointCloudZoomOutRenderBehavior>() )
194 {
196 mLabels->setEnabled( false );
197 mLabelOptions->setEnabled( false );
198 break;
201 mLabels->setEnabled( true );
202 mLabelOptions->setEnabled( true );
203 }
204 emitWidgetChanged();
205 } );
206 }
207 else
208 {
209 mVpcGroupBox->setVisible( false );
210 }
211
213}
214
216{
217 mContext = context;
218 mMapCanvas = context.mapCanvas();
219 mMessageBar = context.messageBar();
220 if ( mActiveWidget )
221 {
222 mActiveWidget->setContext( context );
223 }
224}
225
227{
228 mLayer = qobject_cast<QgsPointCloudLayer *>( layer );
229
230 mBlockChangedSignal = true;
231 mOpacityWidget->setOpacity( mLayer->opacity() );
232 mBlendModeComboBox->setShowClippingModes( QgsProjectUtils::layerIsContainedInGroupLayer( QgsProject::instance(), mLayer ) );
233 mBlendModeComboBox->setBlendMode( mLayer->blendMode() );
234
235 if ( mLayer->renderer() )
236 {
237 // set current renderer from layer
238 const QString rendererName = mLayer->renderer()->type();
239
240 const int rendererIdx = cboRenderers->findData( rendererName );
241 if ( cboRenderers->currentIndex() != rendererIdx )
242 {
243 cboRenderers->setCurrentIndex( rendererIdx );
244 }
245 else
246 {
247 rendererChanged();
248 }
249
250 // no renderer found... this mustn't happen
251 Q_ASSERT( rendererIdx != -1 && "there must be a renderer!" );
252
253 mPointSizeSpinBox->setValue( mLayer->renderer()->pointSize() );
254 mPointSizeUnitWidget->setUnit( mLayer->renderer()->pointSizeUnit() );
255 mPointSizeUnitWidget->setMapUnitScale( mLayer->renderer()->pointSizeMapUnitScale() );
256
257 mPointStyleComboBox->setCurrentIndex( mPointStyleComboBox->findData( QVariant::fromValue( mLayer->renderer()->pointSymbol() ) ) );
258 mDrawOrderComboBox->setCurrentIndex( mDrawOrderComboBox->findData( QVariant::fromValue( mLayer->renderer()->drawOrder2d() ) ) );
259
260 mMaxErrorSpinBox->setValue( mLayer->renderer()->maximumScreenError() );
261 mMaxErrorUnitWidget->setUnit( mLayer->renderer()->maximumScreenErrorUnit() );
262 setOverviewSwitchingScale( mLayer->renderer()->overviewSwitchingScale() );
263
264 mTriangulateGroupBox->setChecked( mLayer->renderer()->renderAsTriangles() );
265 mHorizontalTriangleCheckBox->setChecked( mLayer->renderer()->horizontalTriangleFilter() );
266 mHorizontalTriangleThresholdSpinBox->setValue( mLayer->renderer()->horizontalTriangleFilterThreshold() );
267 mHorizontalTriangleUnitWidget->setUnit( mLayer->renderer()->horizontalTriangleFilterUnit() );
268
269 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
270 {
271 mLabels->setChecked( mLayer->renderer()->showLabels() );
272 mLabelOptions->setTextFormat( mLayer->renderer()->labelTextFormat() );
273 mZoomOutOptions->setCurrentIndex( mZoomOutOptions->findData( QVariant::fromValue( mLayer->renderer()->zoomOutBehavior() ) ) );
274 switch ( mLayer->renderer()->zoomOutBehavior() )
275 {
277 mLabels->setEnabled( false );
278 mLabelOptions->setEnabled( false );
279 break;
280 default:
281 mLabels->setEnabled( true );
282 mLabelOptions->setEnabled( true );
283 }
284 }
285
286 QgsElevationShadingRenderer shadingRenderer = mLayer->renderer()->elevationShadingRenderer();
287
288 mEyeDomeLightingGroupBox->setChecked( shadingRenderer.isActiveEyeDomeLighting() );
289 mHillshadeGroupBox->setChecked( shadingRenderer.isActiveHillshading() );
290
291 mEdlStrengthSpinBox->setValue( shadingRenderer.eyeDomeLightingStrength() );
292 mEdlDistanceSpinBox->setValue( shadingRenderer.eyeDomeLightingDistance() );
293 mEdlDistanceUnit->setUnits(
295 );
296 mEdlDistanceUnit->setUnit( shadingRenderer.eyeDomeLightingDistanceUnit() );
297 mHillshadingMultidirCheckBox->setChecked( shadingRenderer.isHillshadingMultidirectional() );
298 mHillshadingZFactorSpinBox->setValue( shadingRenderer.hillshadingZFactor() );
299
300 mDirectionalLightWidget->setAltitude( shadingRenderer.lightAltitude() );
301 mDirectionalLightWidget->setAzimuth( shadingRenderer.lightAzimuth() );
302 mDirectionalLightWidget->setEnableAzimuth( !mHillshadingMultidirCheckBox->isChecked() );
303 }
304
305 mColorExpressionWidget->setLayer( layer );
306 mColorExpressionWidget->registerExpressionContextGenerator( this );
307
308 mDataDefinedProperties = mLayer->renderer()->dataDefinedProperties();
309 const QgsProperty colorProperty = mDataDefinedProperties.property( QgsPointCloudRenderer::Property::Color );
310 mColorExpressionWidget->setExpression( colorProperty.expressionString() );
311
312 mBlockChangedSignal = false;
313}
314
316{
317 if ( mActiveWidget )
318 mActiveWidget->setDockMode( dockMode );
320}
321
323{
324 mLayer->setOpacity( mOpacityWidget->opacity() );
325 mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
326
327 if ( mActiveWidget )
328 mLayer->setRenderer( mActiveWidget->renderer() );
329 else if ( !cboRenderers->currentData().toString().isEmpty() )
330 {
331 QDomElement elem;
332 if ( QgsPointCloudRendererAbstractMetadata *metadata = QgsApplication::pointCloudRendererRegistry()->rendererMetadata( cboRenderers->currentData().toString() ) )
333 {
334 mLayer->setRenderer( metadata->createRenderer( elem, QgsReadWriteContext() ) );
335 }
336 }
337
338 mLayer->renderer()->setPointSize( mPointSizeSpinBox->value() );
339 mLayer->renderer()->setPointSizeUnit( mPointSizeUnitWidget->unit() );
340 mLayer->renderer()->setPointSizeMapUnitScale( mPointSizeUnitWidget->getMapUnitScale() );
341
342 mLayer->renderer()->setPointSymbol( mPointStyleComboBox->currentData().value<Qgis::PointCloudSymbol>() );
343
344 mLayer->renderer()->setMaximumScreenError( mMaxErrorSpinBox->value() );
345 mLayer->renderer()->setMaximumScreenErrorUnit( mMaxErrorUnitWidget->unit() );
346 mLayer->renderer()->setDrawOrder2d( mDrawOrderComboBox->currentData().value<Qgis::PointCloudDrawOrder>() );
347
348 mLayer->renderer()->setRenderAsTriangles( mTriangulateGroupBox->isChecked() );
349 mLayer->renderer()->setHorizontalTriangleFilter( mHorizontalTriangleCheckBox->isChecked() );
350 mLayer->renderer()->setHorizontalTriangleFilterThreshold( mHorizontalTriangleThresholdSpinBox->value() );
351 mLayer->renderer()->setHorizontalTriangleFilterUnit( mHorizontalTriangleUnitWidget->unit() );
352
353 mLayer->renderer()->setShowLabels( mLabels->isChecked() );
354 mLayer->renderer()->setLabelTextFormat( mLabelOptions->textFormat() );
355 mLayer->renderer()->setZoomOutBehavior( mZoomOutOptions->currentData().value<Qgis::PointCloudZoomOutRenderBehavior>() );
356
357 mLayer->renderer()->setOverviewSwitchingScale( overviewSwitchingScale() );
358
359 QgsElevationShadingRenderer shadingRenderer;
360
361 shadingRenderer.setActiveEyeDomeLighting( mEyeDomeLightingGroupBox->isChecked() );
362 shadingRenderer.setActiveHillshading( mHillshadeGroupBox->isChecked() );
363 shadingRenderer.setActive( mEyeDomeLightingGroupBox->isChecked() || mHillshadeGroupBox->isChecked() );
364 shadingRenderer.setEyeDomeLightingStrength( mEdlStrengthSpinBox->value() );
365 shadingRenderer.setEyeDomeLightingDistance( mEdlDistanceSpinBox->value() );
366 shadingRenderer.setEyeDomeLightingDistanceUnit( mEdlDistanceUnit->unit() );
367 shadingRenderer.setHillshadingMultidirectional( mHillshadingMultidirCheckBox->isChecked() );
368 shadingRenderer.setHillshadingZFactor( mHillshadingZFactorSpinBox->value() );
369
370 shadingRenderer.setLightAltitude( mDirectionalLightWidget->altitude() );
371 shadingRenderer.setLightAzimuth( mDirectionalLightWidget->azimuth() );
372
373 mLayer->renderer()->setElevationShadingRenderer( shadingRenderer );
374 mLayer->renderer()->setDataDefinedProperties( mDataDefinedProperties );
375}
376
377void QgsPointCloudRendererPropertiesWidget::rendererChanged()
378{
379 if ( cboRenderers->currentIndex() == -1 )
380 {
381 QgsDebugError( u"No current item -- this should never happen!"_s );
382 return;
383 }
384
385 const QString rendererName = cboRenderers->currentData().toString();
386
387 //Retrieve the previous renderer: from the old active widget if possible, otherwise from the layer
388 std::unique_ptr<QgsPointCloudRenderer> oldRenderer;
389 std::unique_ptr<QgsPointCloudRenderer> newRenderer;
390 if ( mActiveWidget )
391 newRenderer.reset( mActiveWidget->renderer() );
392
393 if ( newRenderer )
394 {
395 oldRenderer = std::move( newRenderer );
396 }
397 else
398 {
399 oldRenderer.reset( mLayer->renderer()->clone() );
400 }
401
402 // get rid of old active widget (if any)
403 if ( mActiveWidget )
404 {
405 stackedWidget->removeWidget( mActiveWidget );
406
407 delete mActiveWidget;
408 mActiveWidget = nullptr;
409 }
410
411 QgsPointCloudRendererWidget *widget = nullptr;
412 QgsPointCloudRendererAbstractMetadata *rendererMetadata = QgsApplication::pointCloudRendererRegistry()->rendererMetadata( rendererName );
413 if ( rendererMetadata )
414 widget = rendererMetadata->createRendererWidget( mLayer, mStyle, oldRenderer.get() );
415 oldRenderer.reset();
416
417 if ( widget )
418 {
419 // instantiate the widget and set as active
420 mActiveWidget = widget;
421 stackedWidget->addWidget( mActiveWidget );
422 stackedWidget->setCurrentWidget( mActiveWidget );
423
424 if ( mMapCanvas || mMessageBar )
425 {
426 QgsSymbolWidgetContext context;
427 context.setMapCanvas( mMapCanvas );
428 context.setMessageBar( mMessageBar );
429 mActiveWidget->setContext( mContext );
430 }
431
434 widget->setDockMode( dockMode() );
435 }
436 else
437 {
438 // set default "no edit widget available" page
439 stackedWidget->setCurrentWidget( pageNoWidget );
440 }
441 emitWidgetChanged();
442}
443
444void QgsPointCloudRendererPropertiesWidget::emitWidgetChanged()
445{
446 if ( !mBlockChangedSignal )
447 emit changed();
448}
449
450void QgsPointCloudRendererPropertiesWidget::updateDataDefinedProperty()
451{
452 const QString expression = mColorExpressionWidget->expression();
453 if ( !expression.isEmpty() )
454 mDataDefinedProperties.setProperty( QgsPointCloudRenderer::Property::Color, QgsProperty::fromExpression( expression ) );
455 else
456 mDataDefinedProperties.setProperty( QgsPointCloudRenderer::Property::Color, QgsProperty() );
457 emitWidgetChanged();
458}
459
460
461void QgsPointCloudRendererPropertiesWidget::setOverviewSwitchingScale( double scale )
462{
463 mOverviewSwitchingScale->setCurrentIndex( mOverviewSwitchingScale->findData( scale ) );
464}
465
466double QgsPointCloudRendererPropertiesWidget::overviewSwitchingScale() const
467{
468 return mOverviewSwitchingScaleMap.key( mOverviewSwitchingScale->currentText() );
469}
470
472{
473 if ( auto *lExpressionContext = mContext.expressionContext() )
474 return *lExpressionContext;
475
476 QgsExpressionContext context( mContext.globalProjectAtlasMapLayerScopes( mLayer ) );
477
478 auto pointCloudScope = std::make_unique<QgsExpressionContextScope>( tr( "Point Cloud" ) );
479 context.appendScope( pointCloudScope.release() );
480
481 for ( const QgsExpressionContextScope &scope : mContext.additionalExpressionContextScopes() )
482 context.appendScope( new QgsExpressionContextScope( scope ) );
483
485
486 return context;
487}
PointCloudSymbol
Rendering symbols for point cloud points.
Definition qgis.h:4715
@ Circle
Renders points as circles.
Definition qgis.h:4717
@ Square
Renders points as squares.
Definition qgis.h:4716
PointCloudDrawOrder
Pointcloud rendering order for 2d views.
Definition qgis.h:4727
@ BottomToTop
Draw points with larger Z values last.
Definition qgis.h:4729
@ Default
Draw points in the order they are stored.
Definition qgis.h:4728
@ TopToBottom
Draw points with larger Z values first.
Definition qgis.h:4730
PointCloudZoomOutRenderBehavior
Point cloud zoom out options.
Definition qgis.h:6982
@ RenderOverviewAndExtents
Render point cloud extents over overview point cloud.
Definition qgis.h:6985
@ RenderExtents
Render only point cloud extents when zoomed out.
Definition qgis.h:6983
@ RenderOverview
Render overview point cloud when zoomed out.
Definition qgis.h:6984
@ Millimeters
Millimeters.
Definition qgis.h:5759
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5763
@ MapUnits
Map units.
Definition qgis.h:5760
@ Pixels
Pixels.
Definition qgis.h:5761
@ Inches
Inches.
Definition qgis.h:5764
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5766
static QgsPointCloudRendererRegistry * pointCloudRendererRegistry()
Returns the application's point cloud renderer registry, used for managing point cloud layer 2D rende...
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
void directionChanged()
Emitted when the direction is changed.
Renders elevation shading on an image with different methods (eye dome lighting, hillshading,...
bool isActiveHillshading() const
Returns whether the hillshading is active.
void setActive(bool active)
Sets whether this shading renderer is active.
double hillshadingZFactor() const
Returns the z factor used by the hill shading method.
double eyeDomeLightingStrength() const
Returns the strength of the eye dome lighting method.
void setLightAzimuth(double lightAzimuth)
Sets the azimuth of the light (degree) that can be used by some methods (e.g.
double lightAltitude() const
Returns the altitude of the light (degree) that can be used by some methods (e.g.
void setHillshadingMultidirectional(bool multiDirectional)
Sets whether the hill shading method is multidirectional.
double eyeDomeLightingDistance() const
Returns the distance of the eye dome lighting method, that is the distance where the effect is apply ...
void setLightAltitude(double lightAltitude)
Sets the altitude of the light (degree) that can be used by some methods (e.g.
void setEyeDomeLightingStrength(double strength)
Sets the strength of the eye dome lighting method.
void setEyeDomeLightingDistanceUnit(Qgis::RenderUnit unit)
Sets the unit of the distance of the eye dome lighting method set by setEyeDomeLightingDistance().
void setActiveHillshading(bool active)
Sets active the hillshading.
bool isHillshadingMultidirectional() const
Returns whether the hill shading method is multidirectional.
void setHillshadingZFactor(double zFactor)
Sets the z factor used by the hill shading method.
bool isActiveEyeDomeLighting() const
Returns whether eye-dome lighting shading method is active.
void setEyeDomeLightingDistance(double distance)
Sets the distance of the eye dome lighting method, that is the distance where the effect is apply fro...
void setActiveEyeDomeLighting(bool active)
Sets active the eye-dome lighting shading method.
double lightAzimuth() const
Returns the azimuth of the light (degree) that can be used by some methods (e.g.
Qgis::RenderUnit eyeDomeLightingDistanceUnit() const
Returns the unit of the distance of the eye dome lighting method returned by eyeDomeLightingDistance(...
Single scope for storing variables and functions for use within a QgsExpressionContext.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user.
static const QString EXPR_ORIGINAL_VALUE
Inbuilt variable name for value original value variable.
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
void changed()
Emitted when the widget's text format settings are changed.
QgsMapLayerConfigWidget(QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent=nullptr)
A panel widget that can be shown in the map style dock.
QgsMapLayer * layer()
Returns the layer the widget is associated with.
Base class for all map layer types.
Definition qgsmaplayer.h:83
void opacityChanged(double opacity)
Emitted when the opacity is changed in the widget, where opacity ranges from 0.0 (transparent) to 1....
void showPanel(QgsPanelWidget *panel)
Emit when you require a panel to be show in the interface.
void openPanel(QgsPanelWidget *panel)
Open a panel or dialog depending on dock mode setting If dock mode is true this method will emit the ...
bool dockMode() const
Returns the dock mode state.
void changed()
Emitted when the widget state changes.
virtual void setDockMode(bool dockMode)
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
Represents a map layer supporting display of point clouds.
Stores metadata about one point cloud renderer class.
void setIcon(const QIcon &icon)
Sets an icon representing the renderer.
virtual QgsPointCloudRendererWidget * createRendererWidget(QgsPointCloudLayer *layer, QgsStyle *style, QgsPointCloudRenderer *oldRenderer)
Returns new instance of settings widget for the renderer.
Convenience metadata class that uses static functions to create point cloud renderer and its widget.
void setWidgetFunction(QgsPointCloudRendererWidgetFunc f)
void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the widget is shown, e.g., the associated map canvas and expression context...
QgsPointCloudRendererPropertiesWidget(QgsPointCloudLayer *layer, QgsStyle *style, QWidget *parent=nullptr)
Constructor for QgsPointCloudRendererPropertiesWidget, associated with the specified layer and style ...
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void syncToLayer(QgsMapLayer *layer) final
Reset to original (vector layer) values.
void setDockMode(bool dockMode) final
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
Registry of 2D renderers for point clouds.
QgsPointCloudRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
QStringList renderersList() const
Returns a list of available renderers.
static bool layerIsContainedInGroupLayer(QgsProject *project, QgsMapLayer *layer)
Returns true if the specified layer is a child layer from any QgsGroupLayer in the given project.
static QgsProject * instance()
Returns the QgsProject singleton instance.
A store for object properties.
QString expressionString() const
Returns the expression used for the property value.
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
A container for the context for various read/write operations on objects.
A database of saved style entities, including symbols, color ramps, text formats and others.
Definition qgsstyle.h:91
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the widget.
void setMessageBar(QgsMessageBar *bar)
Sets the message bar associated with the widget.
QgsMapCanvas * mapCanvas() const
Returns the map canvas associated with the widget.
QgsMessageBar * messageBar() const
Returns the message bar associated with the widget.
void changed()
Emitted when the selected unit is changed, or the definition of the map unit scale is changed.
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:80
#define QgsDebugError(str)
Definition qgslogger.h:71
QgsPointCloudRendererWidget *(* QgsPointCloudRendererWidgetFunc)(QgsPointCloudLayer *, QgsStyle *, QgsPointCloudRenderer *)