QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsprocessingfeedback.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprocessingfeedback.cpp
3 -------------------------
4 begin : June 2017
5 copyright : (C) 2017 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19#include "qgsgeos.h"
21#include "qgsmessagelog.h"
22#include <ogr_api.h>
23#include <gdal_version.h>
24#include <proj.h>
25
26#ifdef HAVE_PDAL_QGIS
27#include <pdal/pdal.hpp>
28#endif
29
31 : mLogFeedback( logFeedback )
32{
33
34}
35
37{
38}
39
40void QgsProcessingFeedback::log( const QString &htmlMessage, const QString &textMessage )
41{
42 constexpr int MESSAGE_COUNT_LIMIT = 10000;
43 // Avoid logging too many messages, which might blow memory.
44 if ( mMessageLoggedCount == MESSAGE_COUNT_LIMIT )
45 return;
46 ++mMessageLoggedCount;
47 if ( mMessageLoggedCount == MESSAGE_COUNT_LIMIT )
48 {
49 mHtmlLog.append( QStringLiteral( "<span style=\"color:red\">%1</span><br/>" ).arg( tr( "Message log truncated" ) ) );
50 mTextLog.append( tr( "Message log truncated" ) + '\n' );
51 }
52 else
53 {
54 mHtmlLog.append( htmlMessage );
55 mTextLog.append( textMessage );
56 }
57}
58
59
60void QgsProcessingFeedback::reportError( const QString &error, bool )
61{
62 if ( mLogFeedback )
63 QgsMessageLog::logMessage( error, tr( "Processing" ), Qgis::MessageLevel::Critical );
64
65 log( QStringLiteral( "<span style=\"color:red\">%1</span><br/>" ).arg( error.toHtmlEscaped() ).replace( '\n', QLatin1String( "<br>" ) ),
66 error + '\n' );
67}
68
69void QgsProcessingFeedback::pushWarning( const QString &warning )
70{
71 if ( mLogFeedback )
72 QgsMessageLog::logMessage( warning, tr( "Processing" ), Qgis::MessageLevel::Warning );
73
74 log( QStringLiteral( "<span style=\"color:#b85a20;\">%1</span><br/>" ).arg( warning.toHtmlEscaped() ).replace( '\n', QLatin1String( "<br>" ) ) + QStringLiteral( "<br/>" ),
75 warning + '\n' );
76}
77
78void QgsProcessingFeedback::pushInfo( const QString &info )
79{
80 if ( mLogFeedback )
81 QgsMessageLog::logMessage( info, tr( "Processing" ), Qgis::MessageLevel::Info );
82
83 mHtmlLog.append( info.toHtmlEscaped().replace( '\n', QLatin1String( "<br>" ) ) + QStringLiteral( "<br/>" ) );
84 mTextLog.append( info + '\n' );
85}
86
87void QgsProcessingFeedback::pushFormattedMessage( const QString &html, const QString &text )
88{
89 if ( mLogFeedback )
90 QgsMessageLog::logMessage( text, tr( "Processing" ), Qgis::MessageLevel::Info );
91
92 mHtmlLog.append( html + QStringLiteral( "<br/>" ) );
93 mTextLog.append( text + '\n' );
94}
95
96void QgsProcessingFeedback::pushCommandInfo( const QString &info )
97{
98 if ( mLogFeedback )
99 QgsMessageLog::logMessage( info, tr( "Processing" ), Qgis::MessageLevel::Info );
100
101 log( QStringLiteral( "<code>%1</code><br/>" ).arg( info.toHtmlEscaped().replace( '\n', QLatin1String( "<br>" ) ) ),
102 info + '\n' );
103}
104
105void QgsProcessingFeedback::pushDebugInfo( const QString &info )
106{
107 if ( mLogFeedback )
108 QgsMessageLog::logMessage( info, tr( "Processing" ), Qgis::MessageLevel::Info );
109
110 log( QStringLiteral( "<span style=\"color:#777\">%1</span><br/>" ).arg( info.toHtmlEscaped().replace( '\n', QLatin1String( "<br>" ) ) ),
111 info + '\n' );
112}
113
114void QgsProcessingFeedback::pushConsoleInfo( const QString &info )
115{
116 if ( mLogFeedback )
117 QgsMessageLog::logMessage( info, tr( "Processing" ), Qgis::MessageLevel::Info );
118
119 log( QStringLiteral( "<code style=\"color:#777\">%1</code><br/>" ).arg( info.toHtmlEscaped().replace( '\n', QLatin1String( "<br>" ) ) ),
120 info + '\n' );
121}
122
124{
125 pushDebugInfo( tr( "QGIS version: %1" ).arg( Qgis::version() ) );
126 if ( QString( Qgis::devVersion() ) != QLatin1String( "exported" ) )
127 {
128 pushDebugInfo( tr( "QGIS code revision: %1" ).arg( Qgis::devVersion() ) );
129 }
130 pushDebugInfo( tr( "Qt version: %1" ).arg( qVersion() ) );
131 pushDebugInfo( tr( "Python version: %1" ).arg( PYTHON_VERSION ) );
132 pushDebugInfo( tr( "GDAL version: %1" ).arg( GDALVersionInfo( "RELEASE_NAME" ) ) );
133 pushDebugInfo( tr( "GEOS version: %1" ).arg( GEOSversion() ) );
134
135 const PJ_INFO info = proj_info();
136 pushDebugInfo( tr( "PROJ version: %1" ).arg( info.release ) );
137
138#ifdef HAVE_PDAL_QGIS
139#if PDAL_VERSION_MAJOR_INT > 1 || (PDAL_VERSION_MAJOR_INT == 1 && PDAL_VERSION_MINOR_INT >= 7)
140 pushDebugInfo( tr( "PDAL version: %1" ).arg( QString::fromStdString( pdal::Config::fullVersionString() ) ) );
141#else
142 pushDebugInfo( tr( "PDAL version: %1" ).arg( QString::fromStdString( pdal::GetFullVersionString() ) ) );
143#endif
144#endif
145
146 if ( provider && !provider->versionInfo().isEmpty() )
147 {
148 pushDebugInfo( tr( "%1 version: %2" ).arg( provider->name(), provider->versionInfo() ) );
149 }
150}
151
153{
154 if ( results.empty() )
155 return;
156
157 pushInfo( tr( "Results:" ) );
158
159 const QList< const QgsProcessingOutputDefinition * > outputs = algorithm->outputDefinitions();
160 for ( const QgsProcessingOutputDefinition *output : outputs )
161 {
162 const QString outputName = output->name();
163 if ( outputName == QLatin1String( "CHILD_RESULTS" ) || outputName == QLatin1String( "CHILD_INPUTS" ) )
164 continue;
165
166 if ( !results.contains( outputName ) )
167 continue;
168
169 bool ok = false;
170 const QString textValue = output->valueAsString( results.value( output->name() ), context, ok );
171 const QString formattedValue = output->valueAsFormattedString( results.value( output->name() ), context, ok );
172 if ( ok )
173 {
174 pushFormattedMessage( QStringLiteral( "<code>&nbsp;&nbsp;%1: %2</code>" ).arg( output->name(), formattedValue ),
175 QStringLiteral( " %1: %2" ).arg( output->name(), textValue ) );
176 }
177 }
178}
179
181{
182 return mHtmlLog;
183}
184
186{
187 return mTextLog;
188}
189
190
192 : mChildSteps( childAlgorithmCount )
193 , mFeedback( feedback )
194{
195 connect( mFeedback, &QgsFeedback::canceled, this, &QgsFeedback::cancel, Qt::DirectConnection );
196 connect( this, &QgsFeedback::progressChanged, this, &QgsProcessingMultiStepFeedback::updateOverallProgress );
197}
198
200{
201 mCurrentStep = step;
202 mFeedback->setProgress( 100.0 * static_cast< double >( mCurrentStep ) / mChildSteps );
203}
204
206{
207 mFeedback->setProgressText( text );
208}
209
210void QgsProcessingMultiStepFeedback::reportError( const QString &error, bool fatalError )
211{
212 mFeedback->reportError( error, fatalError );
213}
214
216{
217 mFeedback->pushWarning( warning );
218}
219
221{
222 mFeedback->pushInfo( info );
223}
224
226{
227 mFeedback->pushCommandInfo( info );
228}
229
231{
232 mFeedback->pushDebugInfo( info );
233}
234
236{
237 mFeedback->pushConsoleInfo( info );
238}
239
240void QgsProcessingMultiStepFeedback::pushFormattedMessage( const QString &html, const QString &text )
241{
242 mFeedback->pushFormattedMessage( html, text );
243}
244
246{
247 return mFeedback->htmlLog();
248}
249
251{
252 return mFeedback->textLog();
253}
254
255void QgsProcessingMultiStepFeedback::updateOverallProgress( double progress )
256{
257 const double baseProgress = 100.0 * static_cast< double >( mCurrentStep ) / mChildSteps;
258 const double currentAlgorithmProgress = progress / mChildSteps;
259 mFeedback->setProgress( baseProgress + currentAlgorithmProgress );
260}
261
static QString version()
Version string.
Definition: qgis.cpp:258
static QString devVersion()
The development version.
Definition: qgis.cpp:275
void progressChanged(double progress)
Emitted when the feedback object reports a progress change.
void canceled()
Internal routines can connect to this signal if they use event loop.
void cancel()
Tells the internal routines that the current operation should be canceled. This should be run by the ...
Definition: qgsfeedback.h:105
void setProgress(double progress)
Sets the current progress for the feedback object.
Definition: qgsfeedback.h:61
double progress() const
Returns the current progress reported by the feedback object.
Definition: qgsfeedback.h:77
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Abstract base class for processing algorithms.
QgsProcessingOutputDefinitions outputDefinitions() const
Returns an ordered list of output definitions utilized by the algorithm.
Contains information about the context in which a processing algorithm is executed.
Base class for providing feedback from a processing algorithm.
virtual void pushCommandInfo(const QString &info)
Pushes an informational message containing a command from the algorithm.
virtual void pushInfo(const QString &info)
Pushes a general informational message from the algorithm.
virtual void pushWarning(const QString &warning)
Pushes a warning informational message from the algorithm.
void pushVersionInfo(const QgsProcessingProvider *provider=nullptr)
Pushes a summary of the QGIS (and underlying library) version information to the log.
virtual QString textLog() const
Returns the plain text contents of the log, which contains all messages pushed to the feedback object...
QgsProcessingFeedback(bool logFeedback=true)
Constructor for QgsProcessingFeedback.
void pushFormattedResults(const QgsProcessingAlgorithm *algorithm, QgsProcessingContext &context, const QVariantMap &results)
Pushes a summary of the execution results to the log.
virtual QString htmlLog() const
Returns the HTML formatted contents of the log, which contains all messages pushed to the feedback ob...
virtual void pushDebugInfo(const QString &info)
Pushes an informational message containing debugging helpers from the algorithm.
virtual void pushFormattedMessage(const QString &html, const QString &text)
Pushes a pre-formatted message from the algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
virtual void pushConsoleInfo(const QString &info)
Pushes a console feedback message from the algorithm.
virtual void setProgressText(const QString &text)
Sets a progress report text string.
QgsProcessingMultiStepFeedback(int steps, QgsProcessingFeedback *feedback)
Constructor for QgsProcessingMultiStepFeedback, for a process with the specified number of steps.
void pushDebugInfo(const QString &info) override
Pushes an informational message containing debugging helpers from the algorithm.
void pushFormattedMessage(const QString &html, const QString &text) override
Pushes a pre-formatted message from the algorithm.
void pushConsoleInfo(const QString &info) override
Pushes a console feedback message from the algorithm.
void pushInfo(const QString &info) override
Pushes a general informational message from the algorithm.
void pushWarning(const QString &warning) override
Pushes a warning informational message from the algorithm.
void setProgressText(const QString &text) override
Sets a progress report text string.
void setCurrentStep(int step)
Sets the step which is being executed.
void reportError(const QString &error, bool fatalError=false) override
Reports that the algorithm encountered an error while executing.
QString textLog() const override
Returns the plain text contents of the log, which contains all messages pushed to the feedback object...
void pushCommandInfo(const QString &info) override
Pushes an informational message containing a command from the algorithm.
QString htmlLog() const override
Returns the HTML formatted contents of the log, which contains all messages pushed to the feedback ob...
Base class for the definition of processing outputs.
Abstract base class for processing providers.
virtual QString versionInfo() const
Returns a version information string for the provider, or an empty string if this is not applicable (...
virtual QString name() const =0
Returns the provider name, which is used to describe the provider within the GUI.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into allowing algorithms to be written in pure substantial changes are required in order to port existing x Processing algorithms for QGIS x The most significant changes are outlined not GeoAlgorithm For algorithms which operate on features one by consider subclassing the QgsProcessingFeatureBasedAlgorithm class This class allows much of the boilerplate code for looping over features from a vector layer to be bypassed and instead requires implementation of a processFeature method Ensure that your algorithm(or algorithm 's parent class) implements the new pure virtual createInstance(self) call