Skip to content

Commit

Permalink
[FEATURE] Static particle traces for rendering mesh vector dataset (#…
Browse files Browse the repository at this point in the history
…33165)

* [FEATURE] Static particle traces for rendering mesh vector dataset

This PR permits to display directly in QGIS static particle traces for vector datasets in mesh layer without any plugin.
The user can choose in the mesh layer properties window :
- the color
- the size of the traces (line width)
- the count of particles
- the maximum length of the particle's tail
  • Loading branch information
vcloarec authored and PeterPetrik committed Dec 3, 2019
1 parent ea5b423 commit 7f415ca
Show file tree
Hide file tree
Showing 11 changed files with 516 additions and 99 deletions.
77 changes: 74 additions & 3 deletions python/core/auto_generated/mesh/qgsmeshrenderersettings.sip.in
Expand Up @@ -320,6 +320,62 @@ Reads configuration from the given DOM element
Writes configuration to a new DOM element
%End

};

class QgsMeshRendererVectorTracesSettings
{
%Docstring

Represents a trace renderer settings for vector datasets displayed by particle traces

.. note::

The API is considered EXPERIMENTAL and can be changed without a notice

.. versionadded:: 3.12
%End

%TypeHeaderCode
#include "qgsmeshrenderersettings.h"
%End
public:

double maximumTailLength() const;
%Docstring
Returns the maximum tail length
%End
void setMaximumTailLength( double maximumTailLength );
%Docstring
Sets the maximums tail length
%End
int particlesCount() const;
%Docstring
Returns particles count
%End
void setParticlesCount( int value );
%Docstring
Sets particles count
%End
QgsUnitTypes::RenderUnit maximumTailLengthUnit() const;
%Docstring
Returns the maximum tail length unit
%End
void setMaximumTailLengthUnit( const QgsUnitTypes::RenderUnit &maximumTailLengthUnit );
%Docstring
Sets the maximum tail length unit
%End

void readXml( const QDomElement &elem );
%Docstring
Reads configuration from the given DOM element
%End
QDomElement writeXml( QDomDocument &doc ) const;
%Docstring
Writes configuration to a new DOM element
%End



};

class QgsMeshRendererVectorSettings
Expand All @@ -345,7 +401,9 @@ Represents a streamline renderer settings for vector datasets
//! Displaying vector dataset with arrows
Arrows,
//! Displaying vector dataset with streamlines
Streamlines
Streamlines,
//! Displaying vector dataset with streamlines
Traces
};


Expand Down Expand Up @@ -452,18 +510,31 @@ Sets settings for vector rendered with arrows

QgsMeshRendererVectorStreamlineSettings streamLinesSettings() const;
%Docstring
Returns settings for vector rednered with streamlines
Returns settings for vector rendered with streamlines

.. versionadded:: 3.12
%End

void setStreamLinesSettings( const QgsMeshRendererVectorStreamlineSettings &streamLinesSettings );
%Docstring
Sets settings for vector rednered with streamlines
Sets settings for vector rendered with streamlines

.. versionadded:: 3.12
%End

QgsMeshRendererVectorTracesSettings tracesSettings() const;
%Docstring
Returns settings for vector rendered with traces

.. versionadded:: 3.12
%End

void setTracesSettings( const QgsMeshRendererVectorTracesSettings &tracesSettings );
%Docstring
Sets settings for vector rendered with traces

.. versionadded:: 3.12
%End

QDomElement writeXml( QDomDocument &doc ) const;
%Docstring
Expand Down
12 changes: 6 additions & 6 deletions python/core/auto_generated/mesh/qgsmeshtracerenderer.sip.in
Expand Up @@ -15,7 +15,7 @@



class QgsMeshVectorTraceRenderer
class QgsMeshVectorTraceAnimationGenerator
{
%Docstring

Expand All @@ -29,17 +29,17 @@ A wrapper for QgsMeshParticuleTracesField used to render the particles. Availabl
%End
public:

QgsMeshVectorTraceRenderer( QgsMeshLayer *layer, const QgsRenderContext &rendererContext );
QgsMeshVectorTraceAnimationGenerator( QgsMeshLayer *layer, const QgsRenderContext &rendererContext );
%Docstring
Constructor to use with Python binding
%End

QgsMeshVectorTraceRenderer( const QgsMeshVectorTraceRenderer &other );
QgsMeshVectorTraceAnimationGenerator( const QgsMeshVectorTraceAnimationGenerator &other );
%Docstring
Copy constructor
%End

~QgsMeshVectorTraceRenderer();
~QgsMeshVectorTraceAnimationGenerator();

void seedRandomParticles( int count );
%Docstring
Expand All @@ -48,7 +48,7 @@ seeds particles in the vector fields

QImage imageRendered();
%Docstring
Moves all the particles using frame per second (fps) to calculate the displacement
Moves all the particles using frame per second (fps) to calculate the displacement and return the rendered frame
%End

void setFPS( int FPS );
Expand All @@ -73,7 +73,7 @@ Sets colors of particle

void setParticlesSize( double width );
%Docstring
Sets particle size
Sets particle size in px
%End

void setTailFactor( double fct );
Expand Down
39 changes: 36 additions & 3 deletions src/app/mesh/qgsmeshrenderervectorsettingswidget.cpp
Expand Up @@ -21,7 +21,6 @@

QgsMeshRendererVectorSettingsWidget::QgsMeshRendererVectorSettingsWidget( QWidget *parent )
: QWidget( parent )

{
setupUi( this );

Expand Down Expand Up @@ -69,6 +68,21 @@ QgsMeshRendererVectorSettingsWidget::QgsMeshRendererVectorSettingsWidget( QWidge

connect( mStreamlinesDensitySpinBox, qgis::overload<double>::of( &QgsDoubleSpinBox::valueChanged ),
this, &QgsMeshRendererVectorSettingsWidget::widgetChanged );

connect( mTracesMaxLengthSpinBox, qgis::overload<double>::of( &QgsDoubleSpinBox::valueChanged ),
this, &QgsMeshRendererVectorSettingsWidget::widgetChanged );

connect( mTracesParticlesCountSpinBox, qgis::overload<int>::of( &QgsSpinBox::valueChanged ),
this, &QgsMeshRendererVectorSettingsWidget::widgetChanged );

mTracesTailLengthMapUnitWidget->setUnits( QgsUnitTypes::RenderUnitList()
<< QgsUnitTypes::RenderMillimeters
<< QgsUnitTypes::RenderMetersInMapUnits
<< QgsUnitTypes::RenderPixels
<< QgsUnitTypes::RenderPoints );

connect( mTracesTailLengthMapUnitWidget, &QgsUnitSelectionWidget::changed,
this, &QgsMeshRendererVectorSettingsWidget::widgetChanged );
}

void QgsMeshRendererVectorSettingsWidget::setLayer( QgsMeshLayer *layer )
Expand Down Expand Up @@ -136,6 +150,13 @@ QgsMeshRendererVectorSettings QgsMeshRendererVectorSettingsWidget::settings() co

settings.setStreamLinesSettings( streamlineSettings );

//Traces setting
QgsMeshRendererVectorTracesSettings tracesSettings;
tracesSettings.setMaximumTailLength( mTracesMaxLengthSpinBox->value() );
tracesSettings.setMaximumTailLengthUnit( mTracesTailLengthMapUnitWidget->unit() );
tracesSettings.setParticlesCount( mTracesParticlesCountSpinBox->value() );
settings.setTracesSettings( tracesSettings );

return settings;
}

Expand Down Expand Up @@ -187,21 +208,33 @@ void QgsMeshRendererVectorSettingsWidget::syncToLayer( )
mShaftLengthLineEdit->setText( QString::number( arrowSettings.fixedShaftLength() ) );

//Streamlines settings
const QgsMeshRendererVectorStreamlineSettings streamlinesSettings = settings.streamLinesSettings();;
const QgsMeshRendererVectorStreamlineSettings streamlinesSettings = settings.streamLinesSettings();

mStreamlinesSeedingMethodComboBox->setCurrentIndex( streamlinesSettings.seedingMethod() );
mStreamlinesDensitySpinBox->setValue( streamlinesSettings.seedingDensity() * 100 );

//Traces settings
const QgsMeshRendererVectorTracesSettings tracesSettings = settings.tracesSettings();

mTracesMaxLengthSpinBox->setValue( tracesSettings.maximumTailLength() );
mTracesTailLengthMapUnitWidget->setUnit( tracesSettings.maximumTailLengthUnit() );
mTracesParticlesCountSpinBox->setValue( tracesSettings.particlesCount() );

}

void QgsMeshRendererVectorSettingsWidget::onSymbologyChanged( int currentIndex )
{
mStreamlineWidget->setVisible( currentIndex == QgsMeshRendererVectorSettings::Streamlines );
mArrowWidget->setVisible( currentIndex == QgsMeshRendererVectorSettings::Arrows );
mTracesGroupBox->setVisible( currentIndex == QgsMeshRendererVectorSettings::Traces );

mDisplayVectorsOnGridGroupBox->setVisible( currentIndex != QgsMeshRendererVectorSettings::Traces );
mFilterByMagGroupBox->setVisible( currentIndex != QgsMeshRendererVectorSettings::Traces );

mDisplayVectorsOnGridGroupBox->setEnabled(
currentIndex == QgsMeshRendererVectorSettings::Arrows ||
( currentIndex == QgsMeshRendererVectorSettings::Streamlines &&
mStreamlinesSeedingMethodComboBox->currentIndex() == QgsMeshRendererVectorStreamlineSettings::MeshGridded ) );
mStreamlinesSeedingMethodComboBox->currentIndex() == QgsMeshRendererVectorStreamlineSettings::MeshGridded ) ) ;
}

void QgsMeshRendererVectorSettingsWidget::onStreamLineSeedingMethodChanged( int currentIndex )
Expand Down
63 changes: 63 additions & 0 deletions src/core/mesh/qgsmeshrenderersettings.cpp
Expand Up @@ -510,6 +510,7 @@ QDomElement QgsMeshRendererVectorSettings::writeXml( QDomDocument &doc ) const

elem.appendChild( mArrowsSettings.writeXml( doc ) );
elem.appendChild( mStreamLinesSettings.writeXml( doc ) );
elem.appendChild( mTracesSettings.writeXml( doc ) );

return elem;
}
Expand All @@ -535,4 +536,66 @@ void QgsMeshRendererVectorSettings::readXml( const QDomElement &elem )
QDomElement elemStreamLine = elem.firstChildElement( QStringLiteral( "vector-streamline-settings" ) );
if ( ! elemStreamLine.isNull() )
mStreamLinesSettings.readXml( elemStreamLine );

QDomElement elemTraces = elem.firstChildElement( QStringLiteral( "vector-traces-settings" ) );
if ( ! elemTraces.isNull() )
mTracesSettings.readXml( elemTraces );
}

QgsMeshRendererVectorTracesSettings QgsMeshRendererVectorSettings::tracesSettings() const
{
return mTracesSettings;
}

void QgsMeshRendererVectorSettings::setTracesSettings( const QgsMeshRendererVectorTracesSettings &tracesSettings )
{
mTracesSettings = tracesSettings;
}

void QgsMeshRendererVectorTracesSettings::readXml( const QDomElement &elem )
{
mMaximumTailLength = elem.attribute( QStringLiteral( "maximum-tail-length" ) ).toInt();
mMaximumTailLengthUnit = static_cast<QgsUnitTypes::RenderUnit>(
elem.attribute( QStringLiteral( "maximum-tail-length-unit" ) ).toInt() );
mParticlesCount = elem.attribute( QStringLiteral( "particles-count" ) ).toInt();
}

QDomElement QgsMeshRendererVectorTracesSettings::writeXml( QDomDocument &doc ) const
{
QDomElement elem = doc.createElement( QStringLiteral( "vector-traces-settings" ) );
elem.setAttribute( QStringLiteral( "maximum-tail-length" ), mMaximumTailLength );
elem.setAttribute( QStringLiteral( "maximum-tail-length-unit" ), mMaximumTailLengthUnit );
elem.setAttribute( QStringLiteral( "particles-count" ), mParticlesCount );

return elem;
}

QgsUnitTypes::RenderUnit QgsMeshRendererVectorTracesSettings::maximumTailLengthUnit() const
{
return mMaximumTailLengthUnit;
}

void QgsMeshRendererVectorTracesSettings::setMaximumTailLengthUnit( const QgsUnitTypes::RenderUnit &maximumTailLengthUnit )
{
mMaximumTailLengthUnit = maximumTailLengthUnit;
}

double QgsMeshRendererVectorTracesSettings::maximumTailLength() const
{
return mMaximumTailLength;
}

void QgsMeshRendererVectorTracesSettings::setMaximumTailLength( double maximumTailLength )
{
mMaximumTailLength = maximumTailLength;
}

int QgsMeshRendererVectorTracesSettings::particlesCount() const
{
return mParticlesCount;
}

void QgsMeshRendererVectorTracesSettings::setParticlesCount( int value )
{
mParticlesCount = value;
}

0 comments on commit 7f415ca

Please sign in to comment.