25 QgsProcessingModelChildAlgorithm::QgsProcessingModelChildAlgorithm(
const QString &algorithmId )
27 setAlgorithmId( algorithmId );
30 QgsProcessingModelChildAlgorithm::QgsProcessingModelChildAlgorithm(
const QgsProcessingModelChildAlgorithm &other )
31 : QgsProcessingModelComponent( other )
33 , mConfiguration( other.mConfiguration )
34 , mParams( other.mParams )
35 , mModelOutputs( other.mModelOutputs )
36 , mActive( other.mActive )
37 , mDependencies( other.mDependencies )
38 , mComment( other.mComment )
40 setAlgorithmId( other.algorithmId() );
43 QgsProcessingModelChildAlgorithm &QgsProcessingModelChildAlgorithm::operator=(
const QgsProcessingModelChildAlgorithm &other )
45 QgsProcessingModelComponent::operator =( other );
47 mConfiguration = other.mConfiguration;
48 setAlgorithmId( other.algorithmId() );
49 mParams = other.mParams;
50 mModelOutputs = other.mModelOutputs;
51 mActive = other.mActive;
52 mDependencies = other.mDependencies;
53 mComment = other.mComment;
57 QgsProcessingModelChildAlgorithm *QgsProcessingModelChildAlgorithm::clone()
const
59 return new QgsProcessingModelChildAlgorithm( *
this );
62 void QgsProcessingModelChildAlgorithm::copyNonDefinitionPropertiesFromModel( QgsProcessingModelAlgorithm *model )
64 const QgsProcessingModelChildAlgorithm existingChild = model->childAlgorithm( mId );
65 copyNonDefinitionProperties( existingChild );
68 for (
auto it = mModelOutputs.begin(); it != mModelOutputs.end(); ++it )
70 if ( !existingChild.modelOutputs().value( it.key() ).position().isNull() )
72 it.value().setPosition( existingChild.modelOutputs().value( it.key() ).position() );
73 it.value().setSize( existingChild.modelOutputs().value( it.key() ).size() );
76 it.value().setPosition( position() + QPointF( size().width(), ( i + 1.5 ) * size().height() ) );
78 if ( QgsProcessingModelComment *comment = it.value().comment() )
80 if (
const QgsProcessingModelComment *existingComment = existingChild.modelOutputs().value( it.key() ).comment() )
82 comment->setDescription( existingComment->description() );
83 comment->setSize( existingComment->size() );
84 comment->setPosition( existingComment->position() );
85 comment->setColor( existingComment->color() );
94 return mAlgorithm.get();
97 void QgsProcessingModelChildAlgorithm::setModelOutputs(
const QMap<QString, QgsProcessingModelOutput> &modelOutputs )
99 mModelOutputs = modelOutputs;
101 QMap<QString, QgsProcessingModelOutput>::iterator outputIt = mModelOutputs.begin();
102 for ( ; outputIt != mModelOutputs.end(); ++outputIt )
105 outputIt->setName( outputIt.key() );
106 outputIt->setChildId( mId );
110 bool QgsProcessingModelChildAlgorithm::removeModelOutput(
const QString &name )
112 mModelOutputs.remove( name );
116 QVariant QgsProcessingModelChildAlgorithm::toVariant()
const
119 map.insert( QStringLiteral(
"id" ), mId );
120 map.insert( QStringLiteral(
"alg_id" ), mAlgorithmId );
121 map.insert( QStringLiteral(
"alg_config" ), mConfiguration );
122 map.insert( QStringLiteral(
"active" ), mActive );
124 QVariantList dependencies;
125 for (
const QgsProcessingModelChildDependency &dependency : mDependencies )
127 dependencies << dependency.toVariant();
129 map.insert( QStringLiteral(
"dependencies" ), dependencies );
131 saveCommonProperties( map );
133 QVariantMap paramMap;
134 QMap< QString, QgsProcessingModelChildParameterSources >::const_iterator paramIt = mParams.constBegin();
135 for ( ; paramIt != mParams.constEnd(); ++paramIt )
137 QVariantList sources;
138 const auto constValue = paramIt.value();
139 for (
const QgsProcessingModelChildParameterSource &source : constValue )
141 sources << source.toVariant();
143 paramMap.insert( paramIt.key(), sources );
145 map.insert( QStringLiteral(
"params" ), paramMap );
147 QVariantMap outputMap;
148 QMap< QString, QgsProcessingModelOutput >::const_iterator outputIt = mModelOutputs.constBegin();
149 for ( ; outputIt != mModelOutputs.constEnd(); ++outputIt )
151 outputMap.insert( outputIt.key(), outputIt.value().toVariant() );
153 map.insert( QStringLiteral(
"outputs" ), outputMap );
158 bool QgsProcessingModelChildAlgorithm::loadVariant(
const QVariant &child )
160 QVariantMap map = child.toMap();
162 mId = map.value( QStringLiteral(
"id" ) ).toString();
166 mConfiguration = map.value( QStringLiteral(
"alg_config" ) ).toMap();
167 setAlgorithmId( map.value( QStringLiteral(
"alg_id" ) ).toString() );
168 if ( algorithmId().isEmpty() )
170 mActive = map.value( QStringLiteral(
"active" ) ).toBool();
172 mDependencies.clear();
173 if ( map.value( QStringLiteral(
"dependencies" ) ).type() == QVariant::StringList )
175 const QStringList dependencies = map.value( QStringLiteral(
"dependencies" ) ).toStringList();
176 for (
const QString &dependency : dependencies )
178 QgsProcessingModelChildDependency dep;
179 dep.childId = dependency;
180 mDependencies << dep;
185 const QVariantList dependencies = map.value( QStringLiteral(
"dependencies" ) ).toList();
186 for (
const QVariant &dependency : dependencies )
188 QgsProcessingModelChildDependency dep;
189 dep.loadVariant( dependency.toMap() );
190 mDependencies << dep;
194 restoreCommonProperties( map );
197 QVariantMap paramMap = map.value( QStringLiteral(
"params" ) ).toMap();
198 QVariantMap::const_iterator paramIt = paramMap.constBegin();
199 for ( ; paramIt != paramMap.constEnd(); ++paramIt )
201 QgsProcessingModelChildParameterSources sources;
202 const auto constToList = paramIt->toList();
203 for (
const QVariant &sourceVar : constToList )
205 QgsProcessingModelChildParameterSource param;
206 if ( !param.loadVariant( sourceVar.toMap() ) )
210 mParams.insert( paramIt.key(), sources );
213 mModelOutputs.clear();
214 QVariantMap outputMap = map.value( QStringLiteral(
"outputs" ) ).toMap();
215 QVariantMap::const_iterator outputIt = outputMap.constBegin();
216 for ( ; outputIt != outputMap.constEnd(); ++outputIt )
218 QgsProcessingModelOutput output;
219 if ( !output.loadVariant( outputIt.value().toMap() ) )
222 mModelOutputs.insert( outputIt.key(), output );
229 int currentIndent,
int indentSize,
const QMap<QString, QString> &friendlyChildNames,
const QMap<QString, QString> &friendlyOutputNames )
const
232 const QString baseIndent = QString(
' ' ).repeated( currentIndent );
233 const QString lineIndent = QString(
' ' ).repeated( indentSize );
236 return QStringList();
238 if ( !description().isEmpty() )
239 lines << baseIndent + QStringLiteral(
"# %1" ).arg( description() );
240 if ( !mComment.description().isEmpty() )
241 lines << baseIndent + QStringLiteral(
"# %1" ).arg( mComment.description() );
243 QStringList paramParts;
244 QStringList paramComments;
245 for (
auto paramIt = mParams.constBegin(); paramIt != mParams.constEnd(); ++paramIt )
247 QStringList sourceParts;
248 QStringList sourceComments;
250 const auto parts = paramIt.value();
251 sourceParts.reserve( parts.size() );
252 sourceComments.reserve( parts.size() );
253 for (
const QgsProcessingModelChildParameterSource &source : parts )
255 QString part = source.asPythonCode( outputType, def, friendlyChildNames );
256 if ( !part.isEmpty() )
259 sourceComments << source.asPythonComment( def );
262 if ( sourceParts.count() == 1 )
264 paramParts << QStringLiteral(
"'%1': %2" ).arg( paramIt.key(), sourceParts.at( 0 ) );
265 paramComments << sourceComments.at( 0 );
269 paramParts << QStringLiteral(
"'%1': [%2]" ).arg( paramIt.key(), sourceParts.join(
',' ) );
270 paramComments << QString();
274 lines << baseIndent + QStringLiteral(
"alg_params = {" );
275 lines.reserve( lines.size() + paramParts.size() );
277 for (
const QString &p : std::as_const( paramParts ) )
279 QString line = baseIndent + lineIndent + p +
',';
280 if ( !paramComments.value( i ).isEmpty() )
282 line += QStringLiteral(
" # %1" ).arg( paramComments.value( i ) );
287 for (
auto it = extraParameters.constBegin(); it != extraParameters.constEnd(); ++it )
291 if ( lines.constLast().endsWith(
',' ) )
293 lines[ lines.count() - 1 ].truncate( lines.constLast().length() - 1 );
295 lines << baseIndent + QStringLiteral(
"}" );
297 lines << baseIndent + QStringLiteral(
"outputs['%1'] = processing.run('%2', alg_params, context=context, feedback=feedback, is_child_algorithm=True)" ).arg( friendlyChildNames.value( mId, mId ), mAlgorithmId );
299 for (
auto outputIt = mModelOutputs.constBegin(); outputIt != mModelOutputs.constEnd(); ++outputIt )
301 QString outputName = QStringLiteral(
"%1:%2" ).arg( mId, outputIt.key() );
302 outputName = friendlyOutputNames.value( outputName, outputName );
303 lines << baseIndent + QStringLiteral(
"results['%1'] = outputs['%2']['%3']" ).arg( outputName, friendlyChildNames.value( mId, mId ), outputIt.value().childOutputName() );
309 QVariantMap QgsProcessingModelChildAlgorithm::configuration()
const
311 return mConfiguration;
314 void QgsProcessingModelChildAlgorithm::setConfiguration(
const QVariantMap &configuration )
316 mConfiguration = configuration;
320 void QgsProcessingModelChildAlgorithm::generateChildId(
const QgsProcessingModelAlgorithm &model )
326 id = QStringLiteral(
"%1_%2" ).arg( mAlgorithmId ).arg( i );
327 if ( !model.childAlgorithms().contains(
id ) )
334 bool QgsProcessingModelChildAlgorithm::setAlgorithmId(
const QString &algorithmId )
336 mAlgorithmId = algorithmId;
338 return static_cast< bool >( mAlgorithm.get() );
341 bool QgsProcessingModelChildAlgorithm::reattach()
const
343 return const_cast< QgsProcessingModelChildAlgorithm *
>( this )->setAlgorithmId( mAlgorithmId );
static QgsProcessingRegistry * processingRegistry()
Returns the application's processing registry, used for managing processing providers,...
Abstract base class for processing algorithms.
const QgsProcessingParameterDefinition * parameterDefinition(const QString &name) const
Returns a matching parameter by name.
Base class for the definition of processing parameters.
static QString stringToPythonLiteral(const QString &string)
Converts a string to a Python string literal.
PythonOutputType
Available Python output types.
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
QMap< QString, QString > QgsStringMap