35#include "qgsvirtualpointcloudprovider.h"
37#include "moc_qgspointcloudrendererpropertieswidget.cpp"
42 if ( !rendererAbstractMetadata )
45 if ( !rendererMetadata )
50 if ( !iconName.isEmpty() )
59void QgsPointCloudRendererPropertiesWidget::initRendererWidgetFunctions()
61 static bool sInitialized =
false;
65 initPointCloudRenderer( QStringLiteral(
"extent" ), QgsPointCloudExtentRendererWidget::create, QStringLiteral(
"styleicons/pointcloudextent.svg" ) );
66 initPointCloudRenderer( QStringLiteral(
"rgb" ), QgsPointCloudRgbRendererWidget::create, QStringLiteral(
"styleicons/multibandcolor.svg" ) );
67 initPointCloudRenderer( QStringLiteral(
"ramp" ), QgsPointCloudAttributeByRampRendererWidget::create, QStringLiteral(
"styleicons/singlebandpseudocolor.svg" ) );
68 initPointCloudRenderer( QStringLiteral(
"classified" ), QgsPointCloudClassifiedRendererWidget::create, QStringLiteral(
"styleicons/paletted.svg" ) );
80 layout()->setContentsMargins( 0, 0, 0, 0 );
83 initRendererWidgetFunctions();
87 for (
const QString &name : renderers )
90 cboRenderers->addItem( m->icon(), m->visibleName(), name );
93 cboRenderers->setCurrentIndex( -1 );
98 connect( cboRenderers,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::rendererChanged );
100 connect( mBlendModeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
105 connect( mPointSizeSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
113 mMaxErrorSpinBox->setClearValue( 0.3 );
115 mHorizontalTriangleThresholdSpinBox->setClearValue( 5.0 );
118 connect( mMaxErrorSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
121 connect( mPointStyleComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
122 connect( mDrawOrderComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
124 connect( mTriangulateGroupBox, &QGroupBox::toggled,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
125 connect( mHorizontalTriangleCheckBox, &QCheckBox::clicked,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
126 connect( mHorizontalTriangleThresholdSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
130 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
132 mLabelOptions->setDialogTitle( tr(
"Customize label text" ) );
133 mLabelOptions->setText( tr(
"Label format" ) );
134 connect( mLabels, &QCheckBox::stateChanged,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
135 connect( mLabelOptions, &
QgsFontButton::changed,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
138 if (
const QgsVirtualPointCloudProvider *vpcProvider =
dynamic_cast<QgsVirtualPointCloudProvider *
>( mLayer->dataProvider() ) )
140 if ( vpcProvider->overview() )
148 mZoomOutOptions->setEnabled(
false );
151 connect( mZoomOutOptions, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [
this](
int ) {
155 mLabels->setEnabled(
false );
156 mLabelOptions->setEnabled(
false );
160 mLabels->setEnabled(
true );
161 mLabelOptions->setEnabled(
true );
168 mVpcGroupBox->setVisible(
false );
180 mActiveWidget->setContext( context );
186 mLayer = qobject_cast<QgsPointCloudLayer *>( layer );
188 mBlockChangedSignal =
true;
189 mOpacityWidget->setOpacity( mLayer->opacity() );
191 mBlendModeComboBox->setBlendMode( mLayer->blendMode() );
193 if ( mLayer->renderer() )
196 const QString rendererName = mLayer->renderer()->type();
198 const int rendererIdx = cboRenderers->findData( rendererName );
199 if ( cboRenderers->currentIndex() != rendererIdx )
201 cboRenderers->setCurrentIndex( rendererIdx );
209 Q_ASSERT( rendererIdx != -1 &&
"there must be a renderer!" );
211 mPointSizeSpinBox->setValue( mLayer->renderer()->pointSize() );
212 mPointSizeUnitWidget->setUnit( mLayer->renderer()->pointSizeUnit() );
213 mPointSizeUnitWidget->setMapUnitScale( mLayer->renderer()->pointSizeMapUnitScale() );
215 mPointStyleComboBox->setCurrentIndex( mPointStyleComboBox->findData( QVariant::fromValue( mLayer->renderer()->pointSymbol() ) ) );
216 mDrawOrderComboBox->setCurrentIndex( mDrawOrderComboBox->findData( QVariant::fromValue( mLayer->renderer()->drawOrder2d() ) ) );
218 mMaxErrorSpinBox->setValue( mLayer->renderer()->maximumScreenError() );
219 mMaxErrorUnitWidget->setUnit( mLayer->renderer()->maximumScreenErrorUnit() );
221 mTriangulateGroupBox->setChecked( mLayer->renderer()->renderAsTriangles() );
222 mHorizontalTriangleCheckBox->setChecked( mLayer->renderer()->horizontalTriangleFilter() );
223 mHorizontalTriangleThresholdSpinBox->setValue( mLayer->renderer()->horizontalTriangleFilterThreshold() );
224 mHorizontalTriangleUnitWidget->setUnit( mLayer->renderer()->horizontalTriangleFilterUnit() );
226 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
228 mLabels->setChecked( mLayer->renderer()->showLabels() );
229 mLabelOptions->setTextFormat( mLayer->renderer()->labelTextFormat() );
230 mZoomOutOptions->setCurrentIndex( mZoomOutOptions->findData( QVariant::fromValue( mLayer->renderer()->zoomOutBehavior() ) ) );
231 switch ( mLayer->renderer()->zoomOutBehavior() )
234 mLabels->setEnabled(
false );
235 mLabelOptions->setEnabled(
false );
238 mLabels->setEnabled(
true );
239 mLabelOptions->setEnabled(
true );
244 mBlockChangedSignal =
false;
250 mActiveWidget->setDockMode(
dockMode );
256 mLayer->setOpacity( mOpacityWidget->opacity() );
257 mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
260 mLayer->setRenderer( mActiveWidget->renderer() );
261 else if ( !cboRenderers->currentData().toString().isEmpty() )
270 mLayer->renderer()->setPointSize( mPointSizeSpinBox->value() );
271 mLayer->renderer()->setPointSizeUnit( mPointSizeUnitWidget->unit() );
272 mLayer->renderer()->setPointSizeMapUnitScale( mPointSizeUnitWidget->getMapUnitScale() );
276 mLayer->renderer()->setMaximumScreenError( mMaxErrorSpinBox->value() );
277 mLayer->renderer()->setMaximumScreenErrorUnit( mMaxErrorUnitWidget->unit() );
280 mLayer->renderer()->setRenderAsTriangles( mTriangulateGroupBox->isChecked() );
281 mLayer->renderer()->setHorizontalTriangleFilter( mHorizontalTriangleCheckBox->isChecked() );
282 mLayer->renderer()->setHorizontalTriangleFilterThreshold( mHorizontalTriangleThresholdSpinBox->value() );
283 mLayer->renderer()->setHorizontalTriangleFilterUnit( mHorizontalTriangleUnitWidget->unit() );
285 mLayer->renderer()->setShowLabels( mLabels->isChecked() );
286 mLayer->renderer()->setLabelTextFormat( mLabelOptions->textFormat() );
290void QgsPointCloudRendererPropertiesWidget::rendererChanged()
292 if ( cboRenderers->currentIndex() == -1 )
294 QgsDebugError( QStringLiteral(
"No current item -- this should never happen!" ) );
298 const QString rendererName = cboRenderers->currentData().toString();
301 std::unique_ptr<QgsPointCloudRenderer> oldRenderer;
302 std::unique_ptr<QgsPointCloudRenderer> newRenderer;
304 newRenderer.reset( mActiveWidget->renderer() );
308 oldRenderer = std::move( newRenderer );
312 oldRenderer.reset( mLayer->renderer()->clone() );
318 stackedWidget->removeWidget( mActiveWidget );
320 delete mActiveWidget;
321 mActiveWidget =
nullptr;
324 QgsPointCloudRendererWidget *widget =
nullptr;
326 if ( rendererMetadata )
333 mActiveWidget = widget;
334 stackedWidget->addWidget( mActiveWidget );
335 stackedWidget->setCurrentWidget( mActiveWidget );
337 if ( mMapCanvas || mMessageBar )
339 QgsSymbolWidgetContext context;
342 mActiveWidget->setContext( context );
352 stackedWidget->setCurrentWidget( pageNoWidget );
357void QgsPointCloudRendererPropertiesWidget::emitWidgetChanged()
359 if ( !mBlockChangedSignal )
PointCloudSymbol
Rendering symbols for point cloud points.
@ Circle
Renders points as circles.
@ Square
Renders points as squares.
PointCloudDrawOrder
Pointcloud rendering order for 2d views.
@ BottomToTop
Draw points with larger Z values last.
@ Default
Draw points in the order they are stored.
@ TopToBottom
Draw points with larger Z values first.
PointCloudZoomOutRenderBehavior
Point cloud zoom out options.
@ RenderOverviewAndExtents
Render point cloud extents over overview point cloud.
@ RenderExtents
Render only point cloud extents when zoomed out.
@ RenderOverview
Render overview point cloud when zoomed out.
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes).
@ MetersInMapUnits
Meters value as Map units.
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.
Base class for all map layer types.
Represents a map layer supporting display of point clouds.
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 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.
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.
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QgsPointCloudRendererWidget *(* QgsPointCloudRendererWidgetFunc)(QgsPointCloudLayer *, QgsStyle *, QgsPointCloudRenderer *)