35#include "qgsvirtualpointcloudprovider.h"
39#include "moc_qgspointcloudrendererpropertieswidget.cpp"
41using namespace Qt::StringLiterals;
46 if ( !rendererAbstractMetadata )
49 if ( !rendererMetadata )
54 if ( !iconName.isEmpty() )
63void QgsPointCloudRendererPropertiesWidget::initRendererWidgetFunctions()
65 static bool sInitialized =
false;
69 initPointCloudRenderer( u
"extent"_s, QgsPointCloudExtentRendererWidget::create, u
"styleicons/pointcloudextent.svg"_s );
70 initPointCloudRenderer( u
"rgb"_s, QgsPointCloudRgbRendererWidget::create, u
"styleicons/multibandcolor.svg"_s );
71 initPointCloudRenderer( u
"ramp"_s, QgsPointCloudAttributeByRampRendererWidget::create, u
"styleicons/singlebandpseudocolor.svg"_s );
72 initPointCloudRenderer( u
"classified"_s, QgsPointCloudClassifiedRendererWidget::create, u
"styleicons/paletted.svg"_s );
84 layout()->setContentsMargins( 0, 0, 0, 0 );
87 initRendererWidgetFunctions();
91 for (
const QString &name : renderers )
94 cboRenderers->addItem( m->icon(), m->visibleName(), name );
97 cboRenderers->setCurrentIndex( -1 );
102 connect( cboRenderers,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::rendererChanged );
104 connect( mBlendModeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
107 mPointSizeUnitWidget->setUnits(
111 connect( mPointSizeSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
118 mMaxErrorUnitWidget->setUnits(
121 mMaxErrorSpinBox->setClearValue( 0.3 );
123 mHorizontalTriangleThresholdSpinBox->setClearValue( 5.0 );
124 mHorizontalTriangleUnitWidget->setUnits(
128 connect( mMaxErrorSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
131 connect( mPointStyleComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
132 connect( mDrawOrderComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
134 connect( mTriangulateGroupBox, &QGroupBox::toggled,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
135 connect( mHorizontalTriangleCheckBox, &QCheckBox::clicked,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
136 connect( mHorizontalTriangleThresholdSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
140 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
142 mLabelOptions->setDialogTitle( tr(
"Customize label text" ) );
143 mLabelOptions->setText( tr(
"Label format" ) );
144 connect( mLabels, &QCheckBox::stateChanged,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
145 connect( mLabelOptions, &
QgsFontButton::changed,
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
148 if (
const QgsVirtualPointCloudProvider *vpcProvider =
dynamic_cast<QgsVirtualPointCloudProvider *
>( mLayer->dataProvider() ) )
150 if ( vpcProvider->overview() )
156 for (
auto it = mOverviewSwitchingScaleMap.constBegin(); it != mOverviewSwitchingScaleMap.constEnd(); ++it )
158 mOverviewSwitchingScale->addItem( it.value(), it.key() );
160 setOverviewSwitchingScale( 1.0 );
164 mZoomOutOptions->setEnabled(
false );
165 mOverviewSwitchingScale->setEnabled(
false );
168 connect( mOverviewSwitchingScale,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
170 connect( mZoomOutOptions, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [
this](
int ) {
174 mLabels->setEnabled(
false );
175 mLabelOptions->setEnabled(
false );
179 mLabels->setEnabled(
true );
180 mLabelOptions->setEnabled(
true );
187 mVpcGroupBox->setVisible(
false );
199 mActiveWidget->setContext( context );
205 mLayer = qobject_cast<QgsPointCloudLayer *>( layer );
207 mBlockChangedSignal =
true;
208 mOpacityWidget->setOpacity( mLayer->opacity() );
210 mBlendModeComboBox->setBlendMode( mLayer->blendMode() );
212 if ( mLayer->renderer() )
215 const QString rendererName = mLayer->renderer()->type();
217 const int rendererIdx = cboRenderers->findData( rendererName );
218 if ( cboRenderers->currentIndex() != rendererIdx )
220 cboRenderers->setCurrentIndex( rendererIdx );
228 Q_ASSERT( rendererIdx != -1 &&
"there must be a renderer!" );
230 mPointSizeSpinBox->setValue( mLayer->renderer()->pointSize() );
231 mPointSizeUnitWidget->setUnit( mLayer->renderer()->pointSizeUnit() );
232 mPointSizeUnitWidget->setMapUnitScale( mLayer->renderer()->pointSizeMapUnitScale() );
234 mPointStyleComboBox->setCurrentIndex( mPointStyleComboBox->findData( QVariant::fromValue( mLayer->renderer()->pointSymbol() ) ) );
235 mDrawOrderComboBox->setCurrentIndex( mDrawOrderComboBox->findData( QVariant::fromValue( mLayer->renderer()->drawOrder2d() ) ) );
237 mMaxErrorSpinBox->setValue( mLayer->renderer()->maximumScreenError() );
238 mMaxErrorUnitWidget->setUnit( mLayer->renderer()->maximumScreenErrorUnit() );
239 setOverviewSwitchingScale( mLayer->renderer()->overviewSwitchingScale() );
241 mTriangulateGroupBox->setChecked( mLayer->renderer()->renderAsTriangles() );
242 mHorizontalTriangleCheckBox->setChecked( mLayer->renderer()->horizontalTriangleFilter() );
243 mHorizontalTriangleThresholdSpinBox->setValue( mLayer->renderer()->horizontalTriangleFilterThreshold() );
244 mHorizontalTriangleUnitWidget->setUnit( mLayer->renderer()->horizontalTriangleFilterUnit() );
246 if ( !mLayer->dataProvider()->subIndexes().isEmpty() )
248 mLabels->setChecked( mLayer->renderer()->showLabels() );
249 mLabelOptions->setTextFormat( mLayer->renderer()->labelTextFormat() );
250 mZoomOutOptions->setCurrentIndex( mZoomOutOptions->findData( QVariant::fromValue( mLayer->renderer()->zoomOutBehavior() ) ) );
251 switch ( mLayer->renderer()->zoomOutBehavior() )
254 mLabels->setEnabled(
false );
255 mLabelOptions->setEnabled(
false );
258 mLabels->setEnabled(
true );
259 mLabelOptions->setEnabled(
true );
264 mBlockChangedSignal =
false;
270 mActiveWidget->setDockMode(
dockMode );
276 mLayer->setOpacity( mOpacityWidget->opacity() );
277 mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
280 mLayer->setRenderer( mActiveWidget->renderer() );
281 else if ( !cboRenderers->currentData().toString().isEmpty() )
290 mLayer->renderer()->setPointSize( mPointSizeSpinBox->value() );
291 mLayer->renderer()->setPointSizeUnit( mPointSizeUnitWidget->unit() );
292 mLayer->renderer()->setPointSizeMapUnitScale( mPointSizeUnitWidget->getMapUnitScale() );
296 mLayer->renderer()->setMaximumScreenError( mMaxErrorSpinBox->value() );
297 mLayer->renderer()->setMaximumScreenErrorUnit( mMaxErrorUnitWidget->unit() );
300 mLayer->renderer()->setRenderAsTriangles( mTriangulateGroupBox->isChecked() );
301 mLayer->renderer()->setHorizontalTriangleFilter( mHorizontalTriangleCheckBox->isChecked() );
302 mLayer->renderer()->setHorizontalTriangleFilterThreshold( mHorizontalTriangleThresholdSpinBox->value() );
303 mLayer->renderer()->setHorizontalTriangleFilterUnit( mHorizontalTriangleUnitWidget->unit() );
305 mLayer->renderer()->setShowLabels( mLabels->isChecked() );
306 mLayer->renderer()->setLabelTextFormat( mLabelOptions->textFormat() );
309 mLayer->renderer()->setOverviewSwitchingScale( overviewSwitchingScale() );
312void QgsPointCloudRendererPropertiesWidget::rendererChanged()
314 if ( cboRenderers->currentIndex() == -1 )
316 QgsDebugError( u
"No current item -- this should never happen!"_s );
320 const QString rendererName = cboRenderers->currentData().toString();
323 std::unique_ptr<QgsPointCloudRenderer> oldRenderer;
324 std::unique_ptr<QgsPointCloudRenderer> newRenderer;
326 newRenderer.reset( mActiveWidget->renderer() );
330 oldRenderer = std::move( newRenderer );
334 oldRenderer.reset( mLayer->renderer()->clone() );
340 stackedWidget->removeWidget( mActiveWidget );
342 delete mActiveWidget;
343 mActiveWidget =
nullptr;
346 QgsPointCloudRendererWidget *widget =
nullptr;
348 if ( rendererMetadata )
355 mActiveWidget = widget;
356 stackedWidget->addWidget( mActiveWidget );
357 stackedWidget->setCurrentWidget( mActiveWidget );
359 if ( mMapCanvas || mMessageBar )
361 QgsSymbolWidgetContext context;
364 mActiveWidget->setContext( context );
374 stackedWidget->setCurrentWidget( pageNoWidget );
379void QgsPointCloudRendererPropertiesWidget::emitWidgetChanged()
381 if ( !mBlockChangedSignal )
385void QgsPointCloudRendererPropertiesWidget::setOverviewSwitchingScale(
double scale )
387 mOverviewSwitchingScale->setCurrentIndex( mOverviewSwitchingScale->findData( scale ) );
390double QgsPointCloudRendererPropertiesWidget::overviewSwitchingScale()
const
392 return mOverviewSwitchingScaleMap.key( mOverviewSwitchingScale->currentText() );
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 *)