26QgsProcessingModelChildAlgorithm::QgsProcessingModelChildAlgorithm(
const QString &algorithmId )
28 setAlgorithmId( algorithmId );
31QgsProcessingModelChildAlgorithm::QgsProcessingModelChildAlgorithm(
const QgsProcessingModelChildAlgorithm &other )
32 : QgsProcessingModelComponent( other )
34 , mConfiguration( other.mConfiguration )
35 , mParams( other.mParams )
36 , mModelOutputs( other.mModelOutputs )
37 , mActive( other.mActive )
38 , mDependencies( other.mDependencies )
39 , mComment( other.mComment )
41 setAlgorithmId( other.algorithmId() );
44QgsProcessingModelChildAlgorithm &QgsProcessingModelChildAlgorithm::operator=(
const QgsProcessingModelChildAlgorithm &other )
49 QgsProcessingModelComponent::operator =( other );
51 mConfiguration = other.mConfiguration;
52 setAlgorithmId( other.algorithmId() );
53 mParams = other.mParams;
54 mModelOutputs = other.mModelOutputs;
55 mActive = other.mActive;
56 mDependencies = other.mDependencies;
57 mComment = other.mComment;
61QgsProcessingModelChildAlgorithm *QgsProcessingModelChildAlgorithm::clone()
const
63 return new QgsProcessingModelChildAlgorithm( *
this );
66void QgsProcessingModelChildAlgorithm::copyNonDefinitionPropertiesFromModel( QgsProcessingModelAlgorithm *model )
68 const QgsProcessingModelChildAlgorithm existingChild = model->childAlgorithm( mId );
69 copyNonDefinitionProperties( existingChild );
72 for (
auto it = mModelOutputs.begin(); it != mModelOutputs.end(); ++it )
74 const QMap<QString, QgsProcessingModelOutput> existingChildModelOutputs = existingChild.modelOutputs();
75 auto existingOutputIt = existingChildModelOutputs.find( it.key() );
76 if ( existingOutputIt == existingChildModelOutputs.end() )
79 if ( !existingOutputIt->position().isNull() )
81 it.value().setPosition( existingOutputIt->position() );
82 it.value().setSize( existingOutputIt->size() );
85 it.value().setPosition( position() + QPointF( size().width(), ( i + 1.5 ) * size().height() ) );
87 if ( QgsProcessingModelComment *comment = it.value().comment() )
89 if (
const QgsProcessingModelComment *existingComment = existingOutputIt->comment() )
91 comment->setDescription( existingComment->description() );
92 comment->setSize( existingComment->size() );
93 comment->setPosition( existingComment->position() );
94 comment->setColor( existingComment->color() );
103 return mAlgorithm.get();
106void QgsProcessingModelChildAlgorithm::setModelOutputs(
const QMap<QString, QgsProcessingModelOutput> &modelOutputs )
108 mModelOutputs = modelOutputs;
110 QMap<QString, QgsProcessingModelOutput>::iterator outputIt = mModelOutputs.begin();
111 for ( ; outputIt != mModelOutputs.end(); ++outputIt )
114 outputIt->setName( outputIt.key() );
115 outputIt->setChildId( mId );
119bool QgsProcessingModelChildAlgorithm::removeModelOutput(
const QString &name )
121 mModelOutputs.remove( name );
125QVariant QgsProcessingModelChildAlgorithm::toVariant()
const
128 map.insert( QStringLiteral(
"id" ), mId );
129 map.insert( QStringLiteral(
"alg_id" ), mAlgorithmId );
130 map.insert( QStringLiteral(
"alg_config" ), mConfiguration );
131 map.insert( QStringLiteral(
"active" ), mActive );
133 QVariantList dependencies;
134 for (
const QgsProcessingModelChildDependency &dependency : mDependencies )
136 dependencies << dependency.toVariant();
138 map.insert( QStringLiteral(
"dependencies" ), dependencies );
140 saveCommonProperties( map );
142 QVariantMap paramMap;
143 QMap< QString, QgsProcessingModelChildParameterSources >::const_iterator paramIt = mParams.constBegin();
144 for ( ; paramIt != mParams.constEnd(); ++paramIt )
146 QVariantList sources;
147 const auto constValue = paramIt.value();
148 for (
const QgsProcessingModelChildParameterSource &source : constValue )
150 sources << source.toVariant();
152 paramMap.insert( paramIt.key(), sources );
154 map.insert( QStringLiteral(
"params" ), paramMap );
156 QVariantMap outputMap;
157 QMap< QString, QgsProcessingModelOutput >::const_iterator outputIt = mModelOutputs.constBegin();
158 for ( ; outputIt != mModelOutputs.constEnd(); ++outputIt )
160 outputMap.insert( outputIt.key(), outputIt.value().toVariant() );
162 map.insert( QStringLiteral(
"outputs" ), outputMap );
167bool QgsProcessingModelChildAlgorithm::loadVariant(
const QVariant &child )
169 QVariantMap map = child.toMap();
171 mId = map.value( QStringLiteral(
"id" ) ).toString();
175 mConfiguration = map.value( QStringLiteral(
"alg_config" ) ).toMap();
176 setAlgorithmId( map.value( QStringLiteral(
"alg_id" ) ).toString() );
177 if ( algorithmId().isEmpty() )
179 mActive = map.value( QStringLiteral(
"active" ) ).toBool();
181 mDependencies.clear();
182 if ( map.value( QStringLiteral(
"dependencies" ) ).userType() == QMetaType::Type::QStringList )
184 const QStringList dependencies = map.value( QStringLiteral(
"dependencies" ) ).toStringList();
185 mDependencies.reserve( dependencies.size() );
186 for (
const QString &dependency : dependencies )
188 QgsProcessingModelChildDependency dep;
189 dep.childId = dependency;
190 mDependencies << dep;
195 const QVariantList dependencies = map.value( QStringLiteral(
"dependencies" ) ).toList();
196 mDependencies.reserve( dependencies.size() );
197 for (
const QVariant &dependency : dependencies )
199 QgsProcessingModelChildDependency dep;
200 dep.loadVariant( dependency.toMap() );
201 mDependencies << dep;
205 restoreCommonProperties( map );
208 QVariantMap paramMap = map.value( QStringLiteral(
"params" ) ).toMap();
209 QVariantMap::const_iterator paramIt = paramMap.constBegin();
210 for ( ; paramIt != paramMap.constEnd(); ++paramIt )
212 QgsProcessingModelChildParameterSources sources;
213 const auto constToList = paramIt->toList();
214 sources.reserve( constToList.size() );
215 for (
const QVariant &sourceVar : constToList )
217 QgsProcessingModelChildParameterSource param;
218 if ( !param.loadVariant( sourceVar.toMap() ) )
222 mParams.insert( paramIt.key(), sources );
225 mModelOutputs.clear();
226 QVariantMap outputMap = map.value( QStringLiteral(
"outputs" ) ).toMap();
227 QVariantMap::const_iterator outputIt = outputMap.constBegin();
228 for ( ; outputIt != outputMap.constEnd(); ++outputIt )
230 QgsProcessingModelOutput output;
231 if ( !output.loadVariant( outputIt.value().toMap() ) )
234 mModelOutputs.insert( outputIt.key(), output );
241 int currentIndent,
int indentSize,
const QMap<QString, QString> &friendlyChildNames,
const QMap<QString, QString> &friendlyOutputNames )
const
244 const QString baseIndent = QString(
' ' ).repeated( currentIndent );
245 const QString lineIndent = QString(
' ' ).repeated( indentSize );
248 return QStringList();
250 if ( !description().isEmpty() )
251 lines << baseIndent + QStringLiteral(
"# %1" ).arg( description() );
252 if ( !mComment.description().isEmpty() )
254 const QStringList parts = mComment.description().split( QStringLiteral(
"\n" ) );
255 for (
const QString &part : parts )
257 lines << baseIndent + QStringLiteral(
"# %1" ).arg( part );
261 QStringList paramParts;
262 QStringList paramComments;
263 for (
auto paramIt = mParams.constBegin(); paramIt != mParams.constEnd(); ++paramIt )
265 QStringList sourceParts;
266 QStringList sourceComments;
268 const auto parts = paramIt.value();
269 sourceParts.reserve( parts.size() );
270 sourceComments.reserve( parts.size() );
271 for (
const QgsProcessingModelChildParameterSource &source : parts )
273 QString part = source.asPythonCode( outputType, def, friendlyChildNames );
274 if ( !part.isEmpty() )
277 sourceComments << source.asPythonComment( def );
280 if ( sourceParts.count() == 1 )
282 paramParts << QStringLiteral(
"'%1': %2" ).arg( paramIt.key(), sourceParts.at( 0 ) );
283 paramComments << sourceComments.at( 0 );
287 paramParts << QStringLiteral(
"'%1': [%2]" ).arg( paramIt.key(), sourceParts.join(
',' ) );
288 paramComments << QString();
292 lines << baseIndent + QStringLiteral(
"alg_params = {" );
293 lines.reserve( lines.size() + paramParts.size() );
295 for (
const QString &p : std::as_const( paramParts ) )
297 QString line = baseIndent + lineIndent + p +
',';
298 if ( !paramComments.value( i ).isEmpty() )
300 line += QStringLiteral(
" # %1" ).arg( paramComments.value( i ) );
305 for (
auto it = extraParameters.constBegin(); it != extraParameters.constEnd(); ++it )
309 if ( lines.constLast().endsWith(
',' ) )
311 lines[ lines.count() - 1 ].truncate( lines.constLast().length() - 1 );
313 lines << baseIndent + QStringLiteral(
"}" );
315 lines << baseIndent + QStringLiteral(
"outputs['%1'] = processing.run('%2', alg_params, context=context, feedback=feedback, is_child_algorithm=True)" ).arg( friendlyChildNames.value( mId, mId ), mAlgorithmId );
317 for (
auto outputIt = mModelOutputs.constBegin(); outputIt != mModelOutputs.constEnd(); ++outputIt )
319 QString outputName = QStringLiteral(
"%1:%2" ).arg( mId, outputIt.key() );
320 outputName = friendlyOutputNames.value( outputName, outputName );
321 lines << baseIndent + QStringLiteral(
"results['%1'] = outputs['%2']['%3']" ).arg( outputName, friendlyChildNames.value( mId, mId ), outputIt.value().childOutputName() );
327QVariantMap QgsProcessingModelChildAlgorithm::configuration()
const
329 return mConfiguration;
332void QgsProcessingModelChildAlgorithm::setConfiguration(
const QVariantMap &configuration )
334 mConfiguration = configuration;
338void QgsProcessingModelChildAlgorithm::generateChildId(
const QgsProcessingModelAlgorithm &model )
344 id = QStringLiteral(
"%1_%2" ).arg( mAlgorithmId ).arg( i );
345 if ( !model.childAlgorithms().contains(
id ) )
352bool QgsProcessingModelChildAlgorithm::setAlgorithmId(
const QString &algorithmId )
354 mAlgorithmId = algorithmId;
356 return static_cast< bool >( mAlgorithm.get() );
359bool QgsProcessingModelChildAlgorithm::reattach()
const
361 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