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().contains( it.key() ) )
73 if ( !existingChild.modelOutputs().value( it.key() ).position().isNull() )
75 it.value().setPosition( existingChild.modelOutputs().value( it.key() ).position() );
76 it.value().setSize( existingChild.modelOutputs().value( it.key() ).size() );
79 it.value().setPosition( position() + QPointF( size().width(), ( i + 1.5 ) * size().height() ) );
81 if ( QgsProcessingModelComment *comment = it.value().comment() )
83 if (
const QgsProcessingModelComment *existingComment = existingChild.modelOutputs().value( it.key() ).comment() )
85 comment->setDescription( existingComment->description() );
86 comment->setSize( existingComment->size() );
87 comment->setPosition( existingComment->position() );
88 comment->setColor( existingComment->color() );
97 return mAlgorithm.get();
100 void QgsProcessingModelChildAlgorithm::setModelOutputs(
const QMap<QString, QgsProcessingModelOutput> &modelOutputs )
102 mModelOutputs = modelOutputs;
104 QMap<QString, QgsProcessingModelOutput>::iterator outputIt = mModelOutputs.begin();
105 for ( ; outputIt != mModelOutputs.end(); ++outputIt )
108 outputIt->setName( outputIt.key() );
109 outputIt->setChildId( mId );
113 bool QgsProcessingModelChildAlgorithm::removeModelOutput(
const QString &name )
115 mModelOutputs.remove( name );
119 QVariant QgsProcessingModelChildAlgorithm::toVariant()
const
122 map.insert( QStringLiteral(
"id" ), mId );
123 map.insert( QStringLiteral(
"alg_id" ), mAlgorithmId );
124 map.insert( QStringLiteral(
"alg_config" ), mConfiguration );
125 map.insert( QStringLiteral(
"active" ), mActive );
127 QVariantList dependencies;
128 for (
const QgsProcessingModelChildDependency &dependency : mDependencies )
130 dependencies << dependency.toVariant();
132 map.insert( QStringLiteral(
"dependencies" ), dependencies );
134 saveCommonProperties( map );
136 QVariantMap paramMap;
137 QMap< QString, QgsProcessingModelChildParameterSources >::const_iterator paramIt = mParams.constBegin();
138 for ( ; paramIt != mParams.constEnd(); ++paramIt )
140 QVariantList sources;
141 const auto constValue = paramIt.value();
142 for (
const QgsProcessingModelChildParameterSource &source : constValue )
144 sources << source.toVariant();
146 paramMap.insert( paramIt.key(), sources );
148 map.insert( QStringLiteral(
"params" ), paramMap );
150 QVariantMap outputMap;
151 QMap< QString, QgsProcessingModelOutput >::const_iterator outputIt = mModelOutputs.constBegin();
152 for ( ; outputIt != mModelOutputs.constEnd(); ++outputIt )
154 outputMap.insert( outputIt.key(), outputIt.value().toVariant() );
156 map.insert( QStringLiteral(
"outputs" ), outputMap );
161 bool QgsProcessingModelChildAlgorithm::loadVariant(
const QVariant &child )
163 QVariantMap map = child.toMap();
165 mId = map.value( QStringLiteral(
"id" ) ).toString();
169 mConfiguration = map.value( QStringLiteral(
"alg_config" ) ).toMap();
170 setAlgorithmId( map.value( QStringLiteral(
"alg_id" ) ).toString() );
171 if ( algorithmId().isEmpty() )
173 mActive = map.value( QStringLiteral(
"active" ) ).toBool();
175 mDependencies.clear();
176 if ( map.value( QStringLiteral(
"dependencies" ) ).type() == QVariant::StringList )
178 const QStringList dependencies = map.value( QStringLiteral(
"dependencies" ) ).toStringList();
179 for (
const QString &dependency : dependencies )
181 QgsProcessingModelChildDependency dep;
182 dep.childId = dependency;
183 mDependencies << dep;
188 const QVariantList dependencies = map.value( QStringLiteral(
"dependencies" ) ).toList();
189 for (
const QVariant &dependency : dependencies )
191 QgsProcessingModelChildDependency dep;
192 dep.loadVariant( dependency.toMap() );
193 mDependencies << dep;
197 restoreCommonProperties( map );
200 QVariantMap paramMap = map.value( QStringLiteral(
"params" ) ).toMap();
201 QVariantMap::const_iterator paramIt = paramMap.constBegin();
202 for ( ; paramIt != paramMap.constEnd(); ++paramIt )
204 QgsProcessingModelChildParameterSources sources;
205 const auto constToList = paramIt->toList();
206 for (
const QVariant &sourceVar : constToList )
208 QgsProcessingModelChildParameterSource param;
209 if ( !param.loadVariant( sourceVar.toMap() ) )
213 mParams.insert( paramIt.key(), sources );
216 mModelOutputs.clear();
217 QVariantMap outputMap = map.value( QStringLiteral(
"outputs" ) ).toMap();
218 QVariantMap::const_iterator outputIt = outputMap.constBegin();
219 for ( ; outputIt != outputMap.constEnd(); ++outputIt )
221 QgsProcessingModelOutput output;
222 if ( !output.loadVariant( outputIt.value().toMap() ) )
225 mModelOutputs.insert( outputIt.key(), output );
232 int currentIndent,
int indentSize,
const QMap<QString, QString> &friendlyChildNames,
const QMap<QString, QString> &friendlyOutputNames )
const
235 const QString baseIndent = QString(
' ' ).repeated( currentIndent );
236 const QString lineIndent = QString(
' ' ).repeated( indentSize );
239 return QStringList();
241 if ( !description().isEmpty() )
242 lines << baseIndent + QStringLiteral(
"# %1" ).arg( description() );
243 if ( !mComment.description().isEmpty() )
244 lines << baseIndent + QStringLiteral(
"# %1" ).arg( mComment.description() );
246 QStringList paramParts;
247 QStringList paramComments;
248 for (
auto paramIt = mParams.constBegin(); paramIt != mParams.constEnd(); ++paramIt )
250 QStringList sourceParts;
251 QStringList sourceComments;
253 const auto parts = paramIt.value();
254 sourceParts.reserve( parts.size() );
255 sourceComments.reserve( parts.size() );
256 for (
const QgsProcessingModelChildParameterSource &source : parts )
258 QString part = source.asPythonCode( outputType, def, friendlyChildNames );
259 if ( !part.isEmpty() )
262 sourceComments << source.asPythonComment( def );
265 if ( sourceParts.count() == 1 )
267 paramParts << QStringLiteral(
"'%1': %2" ).arg( paramIt.key(), sourceParts.at( 0 ) );
268 paramComments << sourceComments.at( 0 );
272 paramParts << QStringLiteral(
"'%1': [%2]" ).arg( paramIt.key(), sourceParts.join(
',' ) );
273 paramComments << QString();
277 lines << baseIndent + QStringLiteral(
"alg_params = {" );
278 lines.reserve( lines.size() + paramParts.size() );
280 for (
const QString &p : std::as_const( paramParts ) )
282 QString line = baseIndent + lineIndent + p +
',';
283 if ( !paramComments.value( i ).isEmpty() )
285 line += QStringLiteral(
" # %1" ).arg( paramComments.value( i ) );
290 for (
auto it = extraParameters.constBegin(); it != extraParameters.constEnd(); ++it )
294 if ( lines.constLast().endsWith(
',' ) )
296 lines[ lines.count() - 1 ].truncate( lines.constLast().length() - 1 );
298 lines << baseIndent + QStringLiteral(
"}" );
300 lines << baseIndent + QStringLiteral(
"outputs['%1'] = processing.run('%2', alg_params, context=context, feedback=feedback, is_child_algorithm=True)" ).arg( friendlyChildNames.value( mId, mId ), mAlgorithmId );
302 for (
auto outputIt = mModelOutputs.constBegin(); outputIt != mModelOutputs.constEnd(); ++outputIt )
304 QString outputName = QStringLiteral(
"%1:%2" ).arg( mId, outputIt.key() );
305 outputName = friendlyOutputNames.value( outputName, outputName );
306 lines << baseIndent + QStringLiteral(
"results['%1'] = outputs['%2']['%3']" ).arg( outputName, friendlyChildNames.value( mId, mId ), outputIt.value().childOutputName() );
312 QVariantMap QgsProcessingModelChildAlgorithm::configuration()
const
314 return mConfiguration;
317 void QgsProcessingModelChildAlgorithm::setConfiguration(
const QVariantMap &configuration )
319 mConfiguration = configuration;
323 void QgsProcessingModelChildAlgorithm::generateChildId(
const QgsProcessingModelAlgorithm &model )
329 id = QStringLiteral(
"%1_%2" ).arg( mAlgorithmId ).arg( i );
330 if ( !model.childAlgorithms().contains(
id ) )
337 bool QgsProcessingModelChildAlgorithm::setAlgorithmId(
const QString &algorithmId )
339 mAlgorithmId = algorithmId;
341 return static_cast< bool >( mAlgorithm.get() );
344 bool QgsProcessingModelChildAlgorithm::reattach()
const
346 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