QGIS API Documentation 4.1.0-Master (d6fb7a379fb)
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 connect( mPointSizeUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
117
118 mDrawOrderComboBox->addItem( tr( "Default" ), QVariant::fromValue( Qgis::PointCloudDrawOrder::Default ) );
119 mDrawOrderComboBox->addItem( tr( "Bottom to Top" ), QVariant::fromValue( Qgis::PointCloudDrawOrder::BottomToTop ) );
120 mDrawOrderComboBox->addItem( tr( "Top to Bottom" ), QVariant::fromValue( Qgis::PointCloudDrawOrder::TopToBottom ) );
121
122 connect( mDirectionalLightWidget, &QgsDirectionalLightWidget::directionChanged, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
123
124 mEdlDistanceSpinBox->setClearValue( 0.5 );
125 mEdlStrengthSpinBox->setClearValue( 1000 );
126 connect( mEdlStrengthSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
127 connect( mEdlDistanceSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
128 connect( mEdlDistanceUnit, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
129
130 mHillshadingZFactorSpinBox->setClearValue( 1.0 );
131 connect( mHillshadingZFactorSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
132 connect( mHillshadingMultidirCheckBox, &QCheckBox::toggled, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
133
134 mMaxErrorUnitWidget->setUnits(
136 );
137 mMaxErrorSpinBox->setClearValue( 0.3 );
138
139 mHorizontalTriangleThresholdSpinBox->setClearValue( 5.0 );
140 mHorizontalTriangleUnitWidget->setUnits(
142 );
143
144 connect( mMaxErrorSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
145 connect( mMaxErrorUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
146
147 connect( mPointStyleComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
148 connect( mDrawOrderComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
149
150 connect( mEyeDomeLightingGroupBox, &QGroupBox::toggled, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
151 connect( mHillshadeGroupBox, &QGroupBox::toggled, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
152
153 connect( mTriangulateGroupBox, &QGroupBox::toggled, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
154 connect( mHorizontalTriangleCheckBox, &QCheckBox::clicked, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
155 connect( mHorizontalTriangleThresholdSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
156 connect( mHorizontalTriangleUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
157
158 connect( mColorExpressionWidget, qOverload<const QString &>( &QgsFieldExpressionWidget::fieldChanged ), this, &QgsPointCloudRendererPropertiesWidget::updateDataDefinedProperty );
159 // show virtual point cloud options only when vpc layer is selected
160 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
161 {
162 mLabelOptions->setDialogTitle( tr( "Customize label text" ) );
163 mLabelOptions->setText( tr( "Label format" ) );
164 connect( mLabels, &QCheckBox::stateChanged, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
165 connect( mLabelOptions, &QgsFontButton::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
166 mZoomOutOptions->addItem( tr( "Show Extents Only" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderExtents ) );
167
168 if ( const QgsVirtualPointCloudProvider *vpcProvider = dynamic_cast<QgsVirtualPointCloudProvider *>( mLayer->dataProvider() ) )
169 {
170 if ( !vpcProvider->overviews().isEmpty() )
171 {
172 mZoomOutOptions->addItem( tr( "Show Overview Only" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderOverview ) );
173 mZoomOutOptions->addItem( tr( "Show Extents Over Overview" ), QVariant::fromValue( Qgis::PointCloudZoomOutRenderBehavior::RenderOverviewAndExtents ) );
174 }
175
176 for ( auto it = mOverviewSwitchingScaleMap.constBegin(); it != mOverviewSwitchingScaleMap.constEnd(); ++it )
177 {
178 mOverviewSwitchingScale->addItem( it.value(), it.key() );
179 }
180 setOverviewSwitchingScale( 1.0 );
181 }
182 else
183 {
184 mZoomOutOptions->setEnabled( false );
185 mOverviewSwitchingScale->setEnabled( false );
186 }
187
188 connect( mOverviewSwitchingScale, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
189
190 connect( mZoomOutOptions, qOverload<int>( &QComboBox::currentIndexChanged ), this, [this]( int ) {
191 switch ( mZoomOutOptions->currentData().value<Qgis::PointCloudZoomOutRenderBehavior>() )
192 {
194 mLabels->setEnabled( false );
195 mLabelOptions->setEnabled( false );
196 break;
199 mLabels->setEnabled( true );
200 mLabelOptions->setEnabled( true );
201 }
202 emitWidgetChanged();
203 } );
204 }
205 else
206 {
207 mVpcGroupBox->setVisible( false );
208 }
209
210 syncToLayer( layer );
211}
212
214{
215 mContext = context;
216 mMapCanvas = context.mapCanvas();
217 mMessageBar = context.messageBar();
218 if ( mActiveWidget )
219 {
220 mActiveWidget->setContext( context );
221 }
222}
223
225{
226 mLayer = qobject_cast<QgsPointCloudLayer *>( layer );
227
228 mBlockChangedSignal = true;
229 mOpacityWidget->setOpacity( mLayer->opacity() );
230 mBlendModeComboBox->setShowClippingModes( QgsProjectUtils::layerIsContainedInGroupLayer( QgsProject::instance(), mLayer ) );
231 mBlendModeComboBox->setBlendMode( mLayer->blendMode() );
232
233 if ( mLayer->renderer() )
234 {
235 // set current renderer from layer
236 const QString rendererName = mLayer->renderer()->type();
237
238 const int rendererIdx = cboRenderers->findData( rendererName );
239 if ( cboRenderers->currentIndex() != rendererIdx )
240 {
241 cboRenderers->setCurrentIndex( rendererIdx );
242 }
243 else
244 {
245 rendererChanged();
246 }
247
248 // no renderer found... this mustn't happen
249 Q_ASSERT( rendererIdx != -1 && "there must be a renderer!" );
250
251 mPointSizeSpinBox->setValue( mLayer->renderer()->pointSize() );
252 mPointSizeUnitWidget->setUnit( mLayer->renderer()->pointSizeUnit() );
253 mPointSizeUnitWidget->setMapUnitScale( mLayer->renderer()->pointSizeMapUnitScale() );
254
255 mPointStyleComboBox->setCurrentIndex( mPointStyleComboBox->findData( QVariant::fromValue( mLayer->renderer()->pointSymbol() ) ) );
256 mDrawOrderComboBox->setCurrentIndex( mDrawOrderComboBox->findData( QVariant::fromValue( mLayer->renderer()->drawOrder2d() ) ) );
257
258 mMaxErrorSpinBox->setValue( mLayer->renderer()->maximumScreenError() );
259 mMaxErrorUnitWidget->setUnit( mLayer->renderer()->maximumScreenErrorUnit() );
260 setOverviewSwitchingScale( mLayer->renderer()->overviewSwitchingScale() );
261
262 mTriangulateGroupBox->setChecked( mLayer->renderer()->renderAsTriangles() );
263 mHorizontalTriangleCheckBox->setChecked( mLayer->renderer()->horizontalTriangleFilter() );
264 mHorizontalTriangleThresholdSpinBox->setValue( mLayer->renderer()->horizontalTriangleFilterThreshold() );
265 mHorizontalTriangleUnitWidget->setUnit( mLayer->renderer()->horizontalTriangleFilterUnit() );
266
267 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
268 {
269 mLabels->setChecked( mLayer->renderer()->showLabels() );
270 mLabelOptions->setTextFormat( mLayer->renderer()->labelTextFormat() );
271 mZoomOutOptions->setCurrentIndex( mZoomOutOptions->findData( QVariant::fromValue( mLayer->renderer()->zoomOutBehavior() ) ) );
272 switch ( mLayer->renderer()->zoomOutBehavior() )
273 {
275 mLabels->setEnabled( false );
276 mLabelOptions->setEnabled( false );
277 break;
278 default:
279 mLabels->setEnabled( true );
280 mLabelOptions->setEnabled( true );
281 }
282 }
283
284 QgsElevationShadingRenderer shadingRenderer = mLayer->renderer()->elevationShadingRenderer();
285
286 mEyeDomeLightingGroupBox->setChecked( shadingRenderer.isActiveEyeDomeLighting() );
287 mHillshadeGroupBox->setChecked( shadingRenderer.isActiveHillshading() );
288
289 mEdlStrengthSpinBox->setValue( shadingRenderer.eyeDomeLightingStrength() );
290 mEdlDistanceSpinBox->setValue( shadingRenderer.eyeDomeLightingDistance() );
291 mEdlDistanceUnit->setUnits(
293 );
294 mEdlDistanceUnit->setUnit( shadingRenderer.eyeDomeLightingDistanceUnit() );
295 mHillshadingMultidirCheckBox->setChecked( shadingRenderer.isHillshadingMultidirectional() );
296 mHillshadingZFactorSpinBox->setValue( shadingRenderer.hillshadingZFactor() );
297
298 mDirectionalLightWidget->setAltitude( shadingRenderer.lightAltitude() );
299 mDirectionalLightWidget->setAzimuth( shadingRenderer.lightAzimuth() );
300 mDirectionalLightWidget->setEnableAzimuth( !mHillshadingMultidirCheckBox->isChecked() );
301 }
302
303 mColorExpressionWidget->setLayer( layer );
304 mColorExpressionWidget->registerExpressionContextGenerator( this );
305
306 mDataDefinedProperties = mLayer->renderer()->dataDefinedProperties();
307 const QgsProperty colorProperty = mDataDefinedProperties.property( QgsPointCloudRenderer::Property::Color );
308 mColorExpressionWidget->setExpression( colorProperty.expressionString() );
309
310 mBlockChangedSignal = false;
311}
312
314{
315 if ( mActiveWidget )
316 mActiveWidget->setDockMode( dockMode );
318}
319
321{
322 mLayer->setOpacity( mOpacityWidget->opacity() );
323 mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
324
325 if ( mActiveWidget )
326 mLayer->setRenderer( mActiveWidget->renderer() );
327 else if ( !cboRenderers->currentData().toString().isEmpty() )
328 {
329 QDomElement elem;
330 if ( QgsPointCloudRendererAbstractMetadata *metadata = QgsApplication::pointCloudRendererRegistry()->rendererMetadata( cboRenderers->currentData().toString() ) )
331 {
332 mLayer->setRenderer( metadata->createRenderer( elem, QgsReadWriteContext() ) );
333 }
334 }
335
336 mLayer->renderer()->setPointSize( mPointSizeSpinBox->value() );
337 mLayer->renderer()->setPointSizeUnit( mPointSizeUnitWidget->unit() );
338 mLayer->renderer()->setPointSizeMapUnitScale( mPointSizeUnitWidget->getMapUnitScale() );
339
340 mLayer->renderer()->setPointSymbol( mPointStyleComboBox->currentData().value<Qgis::PointCloudSymbol>() );
341
342 mLayer->renderer()->setMaximumScreenError( mMaxErrorSpinBox->value() );
343 mLayer->renderer()->setMaximumScreenErrorUnit( mMaxErrorUnitWidget->unit() );
344 mLayer->renderer()->setDrawOrder2d( mDrawOrderComboBox->currentData().value<Qgis::PointCloudDrawOrder>() );
345
346 mLayer->renderer()->setRenderAsTriangles( mTriangulateGroupBox->isChecked() );
347 mLayer->renderer()->setHorizontalTriangleFilter( mHorizontalTriangleCheckBox->isChecked() );
348 mLayer->renderer()->setHorizontalTriangleFilterThreshold( mHorizontalTriangleThresholdSpinBox->value() );
349 mLayer->renderer()->setHorizontalTriangleFilterUnit( mHorizontalTriangleUnitWidget->unit() );
350
351 mLayer->renderer()->setShowLabels( mLabels->isChecked() );
352 mLayer->renderer()->setLabelTextFormat( mLabelOptions->textFormat() );
353 mLayer->renderer()->setZoomOutBehavior( mZoomOutOptions->currentData().value<Qgis::PointCloudZoomOutRenderBehavior>() );
354
355 mLayer->renderer()->setOverviewSwitchingScale( overviewSwitchingScale() );
356
357 QgsElevationShadingRenderer shadingRenderer;
358
359 shadingRenderer.setActiveEyeDomeLighting( mEyeDomeLightingGroupBox->isChecked() );
360 shadingRenderer.setActiveHillshading( mHillshadeGroupBox->isChecked() );
361 shadingRenderer.setActive( mEyeDomeLightingGroupBox->isChecked() || mHillshadeGroupBox->isChecked() );
362 shadingRenderer.setEyeDomeLightingStrength( mEdlStrengthSpinBox->value() );
363 shadingRenderer.setEyeDomeLightingDistance( mEdlDistanceSpinBox->value() );
364 shadingRenderer.setEyeDomeLightingDistanceUnit( mEdlDistanceUnit->unit() );
365 shadingRenderer.setHillshadingMultidirectional( mHillshadingMultidirCheckBox->isChecked() );
366 shadingRenderer.setHillshadingZFactor( mHillshadingZFactorSpinBox->value() );
367
368 shadingRenderer.setLightAltitude( mDirectionalLightWidget->altitude() );
369 shadingRenderer.setLightAzimuth( mDirectionalLightWidget->azimuth() );
370
371 mLayer->renderer()->setElevationShadingRenderer( shadingRenderer );
372 mLayer->renderer()->setDataDefinedProperties( mDataDefinedProperties );
373}
374
375void QgsPointCloudRendererPropertiesWidget::rendererChanged()
376{
377 if ( cboRenderers->currentIndex() == -1 )
378 {
379 QgsDebugError( u"No current item -- this should never happen!"_s );
380 return;
381 }
382
383 const QString rendererName = cboRenderers->currentData().toString();
384
385 //Retrieve the previous renderer: from the old active widget if possible, otherwise from the layer
386 std::unique_ptr<QgsPointCloudRenderer> oldRenderer;
387 std::unique_ptr<QgsPointCloudRenderer> newRenderer;
388 if ( mActiveWidget )
389 newRenderer.reset( mActiveWidget->renderer() );
390
391 if ( newRenderer )
392 {
393 oldRenderer = std::move( newRenderer );
394 }
395 else
396 {
397 oldRenderer.reset( mLayer->renderer()->clone() );
398 }
399
400 // get rid of old active widget (if any)
401 if ( mActiveWidget )
402 {
403 stackedWidget->removeWidget( mActiveWidget );
404
405 delete mActiveWidget;
406 mActiveWidget = nullptr;
407 }
408
409 QgsPointCloudRendererWidget *widget = nullptr;
410 QgsPointCloudRendererAbstractMetadata *rendererMetadata = QgsApplication::pointCloudRendererRegistry()->rendererMetadata( rendererName );
411 if ( rendererMetadata )
412 widget = rendererMetadata->createRendererWidget( mLayer, mStyle, oldRenderer.get() );
413 oldRenderer.reset();
414
415 if ( widget )
416 {
417 // instantiate the widget and set as active
418 mActiveWidget = widget;
419 stackedWidget->addWidget( mActiveWidget );
420 stackedWidget->setCurrentWidget( mActiveWidget );
421
422 if ( mMapCanvas || mMessageBar )
423 {
424 QgsSymbolWidgetContext context;
425 context.setMapCanvas( mMapCanvas );
426 context.setMessageBar( mMessageBar );
427 mActiveWidget->setContext( mContext );
428 }
429
432 widget->setDockMode( dockMode() );
433 }
434 else
435 {
436 // set default "no edit widget available" page
437 stackedWidget->setCurrentWidget( pageNoWidget );
438 }
439 emitWidgetChanged();
440}
441
442void QgsPointCloudRendererPropertiesWidget::emitWidgetChanged()
443{
444 if ( !mBlockChangedSignal )
445 emit widgetChanged();
446}
447
448void QgsPointCloudRendererPropertiesWidget::updateDataDefinedProperty()
449{
450 const QString expression = mColorExpressionWidget->expression();
451 if ( !expression.isEmpty() )
452 mDataDefinedProperties.setProperty( QgsPointCloudRenderer::Property::Color, QgsProperty::fromExpression( expression ) );
453 else
454 mDataDefinedProperties.setProperty( QgsPointCloudRenderer::Property::Color, QgsProperty() );
455 emitWidgetChanged();
456}
457
458
459void QgsPointCloudRendererPropertiesWidget::setOverviewSwitchingScale( double scale )
460{
461 mOverviewSwitchingScale->setCurrentIndex( mOverviewSwitchingScale->findData( scale ) );
462}
463
464double QgsPointCloudRendererPropertiesWidget::overviewSwitchingScale() const
465{
466 return mOverviewSwitchingScaleMap.key( mOverviewSwitchingScale->currentText() );
467}
468
470{
471 if ( auto *lExpressionContext = mContext.expressionContext() )
472 return *lExpressionContext;
473
474 QgsExpressionContext context( mContext.globalProjectAtlasMapLayerScopes( mLayer ) );
475
476 auto pointCloudScope = std::make_unique<QgsExpressionContextScope>( tr( "Point Cloud" ) );
477 context.appendScope( pointCloudScope.release() );
478
479 for ( const QgsExpressionContextScope &scope : mContext.additionalExpressionContextScopes() )
480 context.appendScope( new QgsExpressionContextScope( scope ) );
481
483
484 return context;
485}
PointCloudSymbol
Rendering symbols for point cloud points.
Definition qgis.h:4558
@ Circle
Renders points as circles.
Definition qgis.h:4560
@ Square
Renders points as squares.
Definition qgis.h:4559
PointCloudDrawOrder
Pointcloud rendering order for 2d views.
Definition qgis.h:4570
@ BottomToTop
Draw points with larger Z values last.
Definition qgis.h:4572
@ Default
Draw points in the order they are stored.
Definition qgis.h:4571
@ TopToBottom
Draw points with larger Z values first.
Definition qgis.h:4573
PointCloudZoomOutRenderBehavior
Point cloud zoom out options.
Definition qgis.h:6655
@ RenderOverviewAndExtents
Render point cloud extents over overview point cloud.
Definition qgis.h:6658
@ RenderExtents
Render only point cloud extents when zoomed out.
Definition qgis.h:6656
@ RenderOverview
Render overview point cloud when zoomed out.
Definition qgis.h:6657
@ Millimeters
Millimeters.
Definition qgis.h:5553
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5557
@ MapUnits
Map units.
Definition qgis.h:5554
@ Pixels
Pixels.
Definition qgis.h:5555
@ Inches
Inches.
Definition qgis.h:5558
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5560
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.
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 widgetChanged()
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:63
#define QgsDebugError(str)
Definition qgslogger.h:59
QgsPointCloudRendererWidget *(* QgsPointCloudRendererWidgetFunc)(QgsPointCloudLayer *, QgsStyle *, QgsPointCloudRenderer *)