25QgsProcessingModelChildAlgorithm::QgsProcessingModelChildAlgorithm( 
const QString &algorithmId )
 
   27  setAlgorithmId( algorithmId );
 
   30QgsProcessingModelChildAlgorithm::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() );
 
   43QgsProcessingModelChildAlgorithm &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;
 
   57QgsProcessingModelChildAlgorithm *QgsProcessingModelChildAlgorithm::clone()
 const 
   59  return new QgsProcessingModelChildAlgorithm( *
this );
 
   62void 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    const QMap<QString, QgsProcessingModelOutput> existingChildModelOutputs = existingChild.modelOutputs();
 
   71    auto existingOutputIt = existingChildModelOutputs.find( it.key() );
 
   72    if ( existingOutputIt == existingChildModelOutputs.end() )
 
   75    if ( !existingOutputIt->position().isNull() )
 
   77      it.value().setPosition( existingOutputIt->position() );
 
   78      it.value().setSize( existingOutputIt->size() );
 
   81      it.value().setPosition( position() + QPointF( size().width(), ( i + 1.5 ) * size().height() ) );
 
   83    if ( QgsProcessingModelComment *comment = it.value().comment() )
 
   85      if ( 
const QgsProcessingModelComment *existingComment = existingOutputIt->comment() )
 
   87        comment->setDescription( existingComment->description() );
 
   88        comment->setSize( existingComment->size() );
 
   89        comment->setPosition( existingComment->position() );
 
   90        comment->setColor( existingComment->color() );
 
   99  return mAlgorithm.get();
 
  102void QgsProcessingModelChildAlgorithm::setModelOutputs( 
const QMap<QString, QgsProcessingModelOutput> &modelOutputs )
 
  104  mModelOutputs = modelOutputs;
 
  106  QMap<QString, QgsProcessingModelOutput>::iterator outputIt = mModelOutputs.begin();
 
  107  for ( ; outputIt != mModelOutputs.end(); ++outputIt )
 
  110    outputIt->setName( outputIt.key() );
 
  111    outputIt->setChildId( mId );
 
  115bool QgsProcessingModelChildAlgorithm::removeModelOutput( 
const QString &name )
 
  117  mModelOutputs.remove( name );
 
  121QVariant QgsProcessingModelChildAlgorithm::toVariant()
 const 
  124  map.insert( QStringLiteral( 
"id" ), mId );
 
  125  map.insert( QStringLiteral( 
"alg_id" ), mAlgorithmId );
 
  126  map.insert( QStringLiteral( 
"alg_config" ), mConfiguration );
 
  127  map.insert( QStringLiteral( 
"active" ), mActive );
 
  129  QVariantList dependencies;
 
  130  for ( 
const QgsProcessingModelChildDependency &dependency : mDependencies )
 
  132    dependencies << dependency.toVariant();
 
  134  map.insert( QStringLiteral( 
"dependencies" ), dependencies );
 
  136  saveCommonProperties( map );
 
  138  QVariantMap paramMap;
 
  139  QMap< QString, QgsProcessingModelChildParameterSources >::const_iterator paramIt = mParams.constBegin();
 
  140  for ( ; paramIt != mParams.constEnd(); ++paramIt )
 
  142    QVariantList sources;
 
  143    const auto constValue = paramIt.value();
 
  144    for ( 
const QgsProcessingModelChildParameterSource &source : constValue )
 
  146      sources << source.toVariant();
 
  148    paramMap.insert( paramIt.key(), sources );
 
  150  map.insert( QStringLiteral( 
"params" ), paramMap );
 
  152  QVariantMap outputMap;
 
  153  QMap< QString, QgsProcessingModelOutput >::const_iterator outputIt = mModelOutputs.constBegin();
 
  154  for ( ; outputIt != mModelOutputs.constEnd(); ++outputIt )
 
  156    outputMap.insert( outputIt.key(), outputIt.value().toVariant() );
 
  158  map.insert( QStringLiteral( 
"outputs" ), outputMap );
 
  163bool QgsProcessingModelChildAlgorithm::loadVariant( 
const QVariant &child )
 
  165  QVariantMap map = child.toMap();
 
  167  mId = map.value( QStringLiteral( 
"id" ) ).toString();
 
  171  mConfiguration = map.value( QStringLiteral( 
"alg_config" ) ).toMap();
 
  172  setAlgorithmId( map.value( QStringLiteral( 
"alg_id" ) ).toString() );
 
  173  if ( algorithmId().isEmpty() )
 
  175  mActive = map.value( QStringLiteral( 
"active" ) ).toBool();
 
  177  mDependencies.clear();
 
  178  if ( map.value( QStringLiteral( 
"dependencies" ) ).userType() == QMetaType::Type::QStringList )
 
  180    const QStringList dependencies = map.value( QStringLiteral( 
"dependencies" ) ).toStringList();
 
  181    mDependencies.reserve( dependencies.size() );
 
  182    for ( 
const QString &dependency : dependencies )
 
  184      QgsProcessingModelChildDependency dep;
 
  185      dep.childId = dependency;
 
  186      mDependencies << dep;
 
  191    const QVariantList dependencies = map.value( QStringLiteral( 
"dependencies" ) ).toList();
 
  192    mDependencies.reserve( dependencies.size() );
 
  193    for ( 
const QVariant &dependency : dependencies )
 
  195      QgsProcessingModelChildDependency dep;
 
  196      dep.loadVariant( dependency.toMap() );
 
  197      mDependencies << dep;
 
  201  restoreCommonProperties( map );
 
  204  QVariantMap paramMap = map.value( QStringLiteral( 
"params" ) ).toMap();
 
  205  QVariantMap::const_iterator paramIt = paramMap.constBegin();
 
  206  for ( ; paramIt != paramMap.constEnd(); ++paramIt )
 
  208    QgsProcessingModelChildParameterSources sources;
 
  209    const auto constToList = paramIt->toList();
 
  210    sources.reserve( constToList.size() );
 
  211    for ( 
const QVariant &sourceVar : constToList )
 
  213      QgsProcessingModelChildParameterSource param;
 
  214      if ( !param.loadVariant( sourceVar.toMap() ) )
 
  218    mParams.insert( paramIt.key(), sources );
 
  221  mModelOutputs.clear();
 
  222  QVariantMap outputMap = map.value( QStringLiteral( 
"outputs" ) ).toMap();
 
  223  QVariantMap::const_iterator outputIt = outputMap.constBegin();
 
  224  for ( ; outputIt != outputMap.constEnd(); ++outputIt )
 
  226    QgsProcessingModelOutput output;
 
  227    if ( !output.loadVariant( outputIt.value().toMap() ) )
 
  230    mModelOutputs.insert( outputIt.key(), output );
 
  237    int currentIndent, 
int indentSize, 
const QMap<QString, QString> &friendlyChildNames, 
const QMap<QString, QString> &friendlyOutputNames )
 const 
  240  const QString baseIndent = QString( 
' ' ).repeated( currentIndent );
 
  241  const QString lineIndent = QString( 
' ' ).repeated( indentSize );
 
  244    return QStringList();
 
  246  if ( !description().isEmpty() )
 
  247    lines << baseIndent + QStringLiteral( 
"# %1" ).arg( description() );
 
  248  if ( !mComment.description().isEmpty() )
 
  250    const QStringList parts = mComment.description().split( QStringLiteral( 
"\n" ) );
 
  251    for ( 
const QString &part : parts )
 
  253      lines << baseIndent + QStringLiteral( 
"# %1" ).arg( part );
 
  257  QStringList paramParts;
 
  258  QStringList paramComments;
 
  259  for ( 
auto paramIt = mParams.constBegin(); paramIt != mParams.constEnd(); ++paramIt )
 
  261    QStringList sourceParts;
 
  262    QStringList sourceComments;
 
  264    const auto parts = paramIt.value();
 
  265    sourceParts.reserve( parts.size() );
 
  266    sourceComments.reserve( parts.size() );
 
  267    for ( 
const QgsProcessingModelChildParameterSource &source : parts )
 
  269      QString part = source.asPythonCode( outputType, def, friendlyChildNames );
 
  270      if ( !part.isEmpty() )
 
  273        sourceComments << source.asPythonComment( def );
 
  276    if ( sourceParts.count() == 1 )
 
  278      paramParts << QStringLiteral( 
"'%1': %2" ).arg( paramIt.key(), sourceParts.at( 0 ) );
 
  279      paramComments << sourceComments.at( 0 );
 
  283      paramParts << QStringLiteral( 
"'%1': [%2]" ).arg( paramIt.key(), sourceParts.join( 
',' ) );
 
  284      paramComments << QString();
 
  288  lines << baseIndent + QStringLiteral( 
"alg_params = {" );
 
  289  lines.reserve( lines.size() + paramParts.size() );
 
  291  for ( 
const QString &p : std::as_const( paramParts ) )
 
  293    QString line = baseIndent + lineIndent + p + 
',';
 
  294    if ( !paramComments.value( i ).isEmpty() )
 
  296      line += QStringLiteral( 
"  # %1" ).arg( paramComments.value( i ) );
 
  301  for ( 
auto it = extraParameters.constBegin(); it != extraParameters.constEnd(); ++it )
 
  305  if ( lines.constLast().endsWith( 
',' ) )
 
  307    lines[ lines.count() - 1 ].truncate( lines.constLast().length() - 1 );
 
  309  lines << baseIndent + QStringLiteral( 
"}" );
 
  311  lines << baseIndent + QStringLiteral( 
"outputs['%1'] = processing.run('%2', alg_params, context=context, feedback=feedback, is_child_algorithm=True)" ).arg( friendlyChildNames.value( mId, mId ), mAlgorithmId );
 
  313  for ( 
auto outputIt = mModelOutputs.constBegin(); outputIt != mModelOutputs.constEnd(); ++outputIt )
 
  315    QString outputName = QStringLiteral( 
"%1:%2" ).arg( mId, outputIt.key() );
 
  316    outputName = friendlyOutputNames.value( outputName, outputName );
 
  317    lines << baseIndent + QStringLiteral( 
"results['%1'] = outputs['%2']['%3']" ).arg( outputName, friendlyChildNames.value( mId, mId ), outputIt.value().childOutputName() );
 
  323QVariantMap QgsProcessingModelChildAlgorithm::configuration()
 const 
  325  return mConfiguration;
 
  328void QgsProcessingModelChildAlgorithm::setConfiguration( 
const QVariantMap &configuration )
 
  330  mConfiguration = configuration;
 
  334void QgsProcessingModelChildAlgorithm::generateChildId( 
const QgsProcessingModelAlgorithm &model )
 
  340    id = QStringLiteral( 
"%1_%2" ).arg( mAlgorithmId ).arg( i );
 
  341    if ( !model.childAlgorithms().contains( 
id ) )
 
  348bool QgsProcessingModelChildAlgorithm::setAlgorithmId( 
const QString &algorithmId )
 
  350  mAlgorithmId = algorithmId;
 
  352  return static_cast< bool >( mAlgorithm.get() );
 
  355bool QgsProcessingModelChildAlgorithm::reattach()
 const 
  357  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