Skip to content

Commit

Permalink
Add method to convert QgsProcessingContext settings to equivalent
Browse files Browse the repository at this point in the history
qgis_process arguments
  • Loading branch information
nyalldawson committed Dec 16, 2021
1 parent ee3257b commit 4e71e45
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 0 deletions.
5 changes: 5 additions & 0 deletions python/core/auto_additions/qgsprocessingcontext.py
@@ -0,0 +1,5 @@
# The following has been generated automatically from src/core/processing/qgsprocessingcontext.h
# monkey patching scoped based enum
QgsProcessingContext.ProcessArgumentFlag.IncludeProjectPath.__doc__ = "Include the associated project path argument"
QgsProcessingContext.ProcessArgumentFlag.__doc__ = 'Flags controlling the results given by :py:func:`~QgsProcessingContext.asQgisProcessArguments`.\n\n.. versionadded:: 3.24\n\n' + '* ``IncludeProjectPath``: ' + QgsProcessingContext.ProcessArgumentFlag.IncludeProjectPath.__doc__
# --
16 changes: 16 additions & 0 deletions python/core/auto_generated/processing/qgsprocessingcontext.sip.in
Expand Up @@ -585,6 +585,20 @@ Sets the logging ``level`` for algorithms to use when pushing feedback messages
.. seealso:: :py:func:`logLevel`

.. versionadded:: 3.20
%End

enum class ProcessArgumentFlag
{
IncludeProjectPath,
};
typedef QFlags<QgsProcessingContext::ProcessArgumentFlag> ProcessArgumentFlags;


QStringList asQgisProcessArguments( QgsProcessingContext::ProcessArgumentFlags flags = QgsProcessingContext::ProcessArgumentFlags() ) const;
%Docstring
Returns list of the equivalent qgis_process arguments representing the settings from the context.

.. versionadded:: 3.24
%End

private:
Expand All @@ -593,6 +607,8 @@ Sets the logging ``level`` for algorithms to use when pushing feedback messages

QFlags<QgsProcessingContext::Flag> operator|(QgsProcessingContext::Flag f1, QFlags<QgsProcessingContext::Flag> f2);

QFlags<QgsProcessingContext::ProcessArgumentFlag> operator|(QgsProcessingContext::ProcessArgumentFlag f1, QFlags<QgsProcessingContext::ProcessArgumentFlag> f2);



class QgsProcessingLayerPostProcessorInterface
Expand Down
18 changes: 18 additions & 0 deletions src/core/processing/qgsprocessingcontext.cpp
Expand Up @@ -139,6 +139,24 @@ void QgsProcessingContext::setLogLevel( LogLevel level )
mLogLevel = level;
}

QStringList QgsProcessingContext::asQgisProcessArguments( QgsProcessingContext::ProcessArgumentFlags flags ) const
{
QStringList res;
if ( mDistanceUnit != QgsUnitTypes::DistanceUnknownUnit )
res << QStringLiteral( "--distance_units=%1" ).arg( QgsUnitTypes::encodeUnit( mDistanceUnit ) );
if ( mAreaUnit != QgsUnitTypes::AreaUnknownUnit )
res << QStringLiteral( "--area_units=%1" ).arg( QgsUnitTypes::encodeUnit( mAreaUnit ) );
if ( !mEllipsoid.isEmpty() )
res << QStringLiteral( "--ellipsoid=%1" ).arg( mEllipsoid );

if ( mProject && flags & ProcessArgumentFlag::IncludeProjectPath )
{
res << QStringLiteral( "--project_path=%1" ).arg( mProject->fileName() );
}

return res;
}

QgsDateTimeRange QgsProcessingContext::currentTimeRange() const
{
return mCurrentTimeRange;
Expand Down
19 changes: 19 additions & 0 deletions src/core/processing/qgsprocessingcontext.h
Expand Up @@ -657,6 +657,24 @@ class CORE_EXPORT QgsProcessingContext
*/
void setLogLevel( LogLevel level );

/**
* Flags controlling the results given by asQgisProcessArguments().
*
* \since QGIS 3.24
*/
enum class ProcessArgumentFlag : int
{
IncludeProjectPath = 1 << 0, //!< Include the associated project path argument
};
Q_DECLARE_FLAGS( ProcessArgumentFlags, ProcessArgumentFlag )

/**
* Returns list of the equivalent qgis_process arguments representing the settings from the context.
*
* \since QGIS 3.24
*/
QStringList asQgisProcessArguments( QgsProcessingContext::ProcessArgumentFlags flags = QgsProcessingContext::ProcessArgumentFlags() ) const;

private:

QgsProcessingContext::Flags mFlags = QgsProcessingContext::Flags();
Expand Down Expand Up @@ -694,6 +712,7 @@ class CORE_EXPORT QgsProcessingContext
};

Q_DECLARE_OPERATORS_FOR_FLAGS( QgsProcessingContext::Flags )
Q_DECLARE_OPERATORS_FOR_FLAGS( QgsProcessingContext::ProcessArgumentFlags )


/**
Expand Down
31 changes: 31 additions & 0 deletions tests/src/analysis/testqgsprocessing.cpp
Expand Up @@ -608,6 +608,7 @@ class TestQgsProcessing: public QObject
void encodeDecodeUriProvider();
void normalizeLayerSource();
void context();
void contextToProcessArguments();
void feedback();
void mapLayers();
void mapLayerFromStore();
Expand Down Expand Up @@ -1261,6 +1262,36 @@ void TestQgsProcessing::context()
QVERIFY( !context2.temporaryLayerStore()->mapLayer( id ) );
}

void TestQgsProcessing::contextToProcessArguments()
{
// test converting QgsProcessingContext settings to qgis_process arguments
QgsProcessingContext context;

QCOMPARE( context.asQgisProcessArguments(), QStringList() );
context.setDistanceUnit( QgsUnitTypes::DistanceKilometers );
QCOMPARE( context.asQgisProcessArguments(), QStringList( {QStringLiteral( "--distance_units=km" )} ) );

context.setAreaUnit( QgsUnitTypes::AreaHectares );
QCOMPARE( context.asQgisProcessArguments(), QStringList( {QStringLiteral( "--distance_units=km" ), QStringLiteral( "--area_units=ha" )} ) );

context.setEllipsoid( QStringLiteral( "EPSG:7019" ) );
QCOMPARE( context.asQgisProcessArguments(), QStringList( {QStringLiteral( "--distance_units=km" ), QStringLiteral( "--area_units=ha" ), QStringLiteral( "--ellipsoid=EPSG:7019" )} ) );

QgsProject p;
QgsProcessingContext context2;
QVERIFY( p.read( TEST_DATA_DIR + QStringLiteral( "/projects/custom_crs.qgs" ) ) );
context2.setProject( &p );

// by default we don't include the project path argument
QCOMPARE( context2.asQgisProcessArguments(), QStringList( {QStringLiteral( "--distance_units=meters" ), QStringLiteral( "--area_units=m2" ), QStringLiteral( "--ellipsoid=NONE" )} ) );

QCOMPARE( context2.asQgisProcessArguments( QgsProcessingContext::ProcessArgumentFlag::IncludeProjectPath ), QStringList(
{
QStringLiteral( "--distance_units=meters" ), QStringLiteral( "--area_units=m2" ), QStringLiteral( "--ellipsoid=NONE" ),
QStringLiteral( "--project_path=%1" ).arg( TEST_DATA_DIR + QStringLiteral( "/projects/custom_crs.qgs" ) )
} ) );
}

void TestQgsProcessing::feedback()
{
QgsProcessingFeedback f;
Expand Down

0 comments on commit 4e71e45

Please sign in to comment.