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