Skip to content

Commit

Permalink
implementation of point budget in 2D
Browse files Browse the repository at this point in the history
  • Loading branch information
NEDJIMAbelgacem authored and wonder-sk committed Feb 10, 2021
1 parent ac3da2e commit eb1ff08
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 27 deletions.
14 changes: 14 additions & 0 deletions python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in
Expand Up @@ -383,6 +383,20 @@ Units are set via :py:func:`~QgsPointCloudRenderer.setMaximumScreenErrorUnit`.
.. seealso:: :py:func:`maximumScreenError`

.. seealso:: :py:func:`setMaximumScreenErrorUnit`
%End

int pointBudget() const;
%Docstring
Returns the maximum number of points rendered

.. seealso:: :py:func:`setPointBudget`
%End

void setPointBudget( int budget );
%Docstring
Sets the maximum number of points rendered

.. seealso:: :py:func:`pointBudget`
%End

QgsUnitTypes::RenderUnit maximumScreenErrorUnit() const;
Expand Down
1 change: 0 additions & 1 deletion src/3d/symbols/qgspointcloud3dsymbol_p.cpp
Expand Up @@ -170,7 +170,6 @@ QgsPointCloud3DSymbolHandler::QgsPointCloud3DSymbolHandler()
void QgsPointCloud3DSymbolHandler::makeEntity( Qt3DCore::QEntity *parent, const QgsPointCloud3DRenderContext &context, QgsPointCloud3DSymbolHandler::PointData &out, bool selected )
{
Q_UNUSED( selected )
Q_UNUSED( context )

if ( out.positions.empty() )
return;
Expand Down
12 changes: 11 additions & 1 deletion src/core/pointcloud/qgspointcloudlayerrenderer.cpp
Expand Up @@ -168,7 +168,12 @@ bool QgsPointCloudLayerRenderer::render()
return false;
}
double rootErrorPixels = rootErrorInMapCoordinates / mapUnitsPerPixel; // in pixels
const QVector<IndexedPointCloudNode> nodes = traverseTree( pc, context.renderContext(), pc->root(), maximumError, rootErrorPixels );
QVector<IndexedPointCloudNode> nodes = traverseTree( pc, context.renderContext(), pc->root(), maximumError, rootErrorPixels );

std::sort( nodes.begin(), nodes.end(), []( IndexedPointCloudNode & n1, IndexedPointCloudNode & n2 )
{
return n1.d() < n2.d();
} );

QgsPointCloudRequest request;
request.setAttributes( mAttributes );
Expand All @@ -184,6 +189,11 @@ bool QgsPointCloudLayerRenderer::render()
canceled = true;
break;
}
if ( context.pointsRendered() > mRenderer->pointBudget() )
{
QgsDebugMsgLevel( "point budget exceeded", 2 );
break;
}
std::unique_ptr<QgsPointCloudBlock> block( pc->nodeData( n, request ) );

if ( !block )
Expand Down
13 changes: 13 additions & 0 deletions src/core/pointcloud/qgspointcloudrenderer.cpp
Expand Up @@ -141,6 +141,16 @@ void QgsPointCloudRenderer::setMaximumScreenErrorUnit( QgsUnitTypes::RenderUnit
mMaximumScreenErrorUnit = unit;
}

int QgsPointCloudRenderer::pointBudget() const
{
return mPointBudget;
}

void QgsPointCloudRenderer::setPointBudget( int budget )
{
mPointBudget = budget;
}

QList<QgsLayerTreeModelLegendNode *> QgsPointCloudRenderer::createLegendNodes( QgsLayerTreeLayer * )
{
return QList<QgsLayerTreeModelLegendNode *>();
Expand All @@ -156,6 +166,7 @@ void QgsPointCloudRenderer::copyCommonProperties( QgsPointCloudRenderer *destina
destination->setPointSize( mPointSize );
destination->setPointSizeUnit( mPointSizeUnit );
destination->setPointSizeMapUnitScale( mPointSizeMapUnitScale );
destination->setPointBudget( mPointBudget );
destination->setMaximumScreenError( mMaximumScreenError );
destination->setMaximumScreenErrorUnit( mMaximumScreenErrorUnit );
destination->setPointSymbol( mPointSymbol );
Expand All @@ -166,6 +177,7 @@ void QgsPointCloudRenderer::restoreCommonProperties( const QDomElement &element,
mPointSize = element.attribute( QStringLiteral( "pointSize" ), QStringLiteral( "1" ) ).toDouble();
mPointSizeUnit = QgsUnitTypes::decodeRenderUnit( element.attribute( QStringLiteral( "pointSizeUnit" ), QStringLiteral( "MM" ) ) );
mPointSizeMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( element.attribute( QStringLiteral( "pointSizeMapUnitScale" ), QString() ) );
mPointBudget = element.attribute( QStringLiteral( "pointBudget" ), QStringLiteral( "10000000" ) ).toInt();

mMaximumScreenError = element.attribute( QStringLiteral( "maximumScreenError" ), QStringLiteral( "0.3" ) ).toDouble();
mMaximumScreenErrorUnit = QgsUnitTypes::decodeRenderUnit( element.attribute( QStringLiteral( "maximumScreenErrorUnit" ), QStringLiteral( "MM" ) ) );
Expand All @@ -177,6 +189,7 @@ void QgsPointCloudRenderer::saveCommonProperties( QDomElement &element, const Qg
element.setAttribute( QStringLiteral( "pointSize" ), qgsDoubleToString( mPointSize ) );
element.setAttribute( QStringLiteral( "pointSizeUnit" ), QgsUnitTypes::encodeUnit( mPointSizeUnit ) );
element.setAttribute( QStringLiteral( "pointSizeMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( mPointSizeMapUnitScale ) );
element.setAttribute( QStringLiteral( "pointBudget" ), QString::number( mPointBudget ) );

element.setAttribute( QStringLiteral( "maximumScreenError" ), qgsDoubleToString( mMaximumScreenError ) );
element.setAttribute( QStringLiteral( "maximumScreenErrorUnit" ), QgsUnitTypes::encodeUnit( mMaximumScreenErrorUnit ) );
Expand Down
13 changes: 13 additions & 0 deletions src/core/pointcloud/qgspointcloudrenderer.h
Expand Up @@ -453,6 +453,18 @@ class CORE_EXPORT QgsPointCloudRenderer
*/
void setMaximumScreenError( double error );

/**
* Returns the maximum number of points rendered
* \see setPointBudget()
*/
int pointBudget() const;

/**
* Sets the maximum number of points rendered
* \see pointBudget()
*/
void setPointBudget( int budget );

/**
* Returns the unit for the maximum screen error allowed when rendering the point cloud.
*
Expand Down Expand Up @@ -568,6 +580,7 @@ class CORE_EXPORT QgsPointCloudRenderer
double mPointSize = 1;
QgsUnitTypes::RenderUnit mPointSizeUnit = QgsUnitTypes::RenderMillimeters;
QgsMapUnitScale mPointSizeMapUnitScale;
int mPointBudget = 10000000;

PointSymbol mPointSymbol = Square;
int mPainterPenWidth = 1;
Expand Down
3 changes: 3 additions & 0 deletions src/gui/pointcloud/qgspointcloudrendererpropertieswidget.cpp
Expand Up @@ -98,6 +98,7 @@ QgsPointCloudRendererPropertiesWidget::QgsPointCloudRendererPropertiesWidget( Qg

connect( mPointSizeSpinBox, qgis::overload<double>::of( &QgsDoubleSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
connect( mPointSizeUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );
connect( mPointBudgetSpinBox, qgis::overload<int>::of( &QgsSpinBox::valueChanged ), this, &QgsPointCloudRendererPropertiesWidget::emitWidgetChanged );

mMaxErrorUnitWidget->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMetersInMapUnits << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels
<< QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches );
Expand Down Expand Up @@ -143,6 +144,7 @@ void QgsPointCloudRendererPropertiesWidget::syncToLayer( QgsMapLayer *layer )
mPointSizeSpinBox->setValue( mLayer->renderer()->pointSize() );
mPointSizeUnitWidget->setUnit( mLayer->renderer()->pointSizeUnit() );
mPointSizeUnitWidget->setMapUnitScale( mLayer->renderer()->pointSizeMapUnitScale() );
mPointBudgetSpinBox->setValue( mLayer->renderer()->pointBudget() );

mPointStyleComboBox->setCurrentIndex( mPointStyleComboBox->findData( mLayer->renderer()->pointSymbol() ) );

Expand Down Expand Up @@ -176,6 +178,7 @@ void QgsPointCloudRendererPropertiesWidget::apply()
mLayer->renderer()->setPointSize( mPointSizeSpinBox->value() );
mLayer->renderer()->setPointSizeUnit( mPointSizeUnitWidget->unit() );
mLayer->renderer()->setPointSizeMapUnitScale( mPointSizeUnitWidget->getMapUnitScale() );
mLayer->renderer()->setPointBudget( mPointBudgetSpinBox->value() );

mLayer->renderer()->setPointSymbol( static_cast< QgsPointCloudRenderer::PointSymbol >( mPointStyleComboBox->currentData().toInt() ) );

Expand Down
64 changes: 39 additions & 25 deletions src/ui/pointcloud/qgspointcloudrendererpropsdialogbase.ui
Expand Up @@ -169,17 +169,37 @@
<property name="rightMargin">
<number>3</number>
</property>
<item row="1" column="0">
<widget class="QLabel" name="lblTransparency">
<item row="3" column="0">
<widget class="QLabel" name="lblBlend">
<property name="text">
<string>Opacity</string>
<string>Blending mode</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QgsUnitSelectionWidget" name="mMaxErrorUnitWidget">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
<item row="2" column="1" colspan="3">
<widget class="QgsOpacityWidget" name="mOpacityWidget" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lblBlend">
<widget class="QLabel" name="lblTransparency">
<property name="text">
<string>Blending mode</string>
<string>Opacity</string>
</property>
</widget>
</item>
Expand All @@ -203,33 +223,27 @@
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QgsUnitSelectionWidget" name="mMaxErrorUnitWidget">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
<item row="3" column="1" colspan="3">
<widget class="QgsBlendModeComboBox" name="mBlendModeComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>4</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QgsOpacityWidget" name="mOpacityWidget" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
<widget class="QSpinBox" name="mPointBudgetSpinBox">
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="2" column="1" colspan="3">
<widget class="QgsBlendModeComboBox" name="mBlendModeComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>4</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<item row="1" column="0">
<widget class="QLabel" name="labelPointBudget">
<property name="text">
<string>Point budget</string>
</property>
</widget>
</item>
Expand Down

0 comments on commit eb1ff08

Please sign in to comment.