LCOV - code coverage report
Current view: top level - core/processing/models - qgsprocessingmodelchildalgorithm.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 212 0.0 %
Date: 2021-03-26 12:19:53 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :                          qgsprocessingmodelchildalgorithm.cpp
       3                 :            :                          ------------------------------------
       4                 :            :     begin                : June 2017
       5                 :            :     copyright            : (C) 2017 by Nyall Dawson
       6                 :            :     email                : nyall dot dawson at gmail dot com
       7                 :            :  ***************************************************************************/
       8                 :            : 
       9                 :            : /***************************************************************************
      10                 :            :  *                                                                         *
      11                 :            :  *   This program is free software; you can redistribute it and/or modify  *
      12                 :            :  *   it under the terms of the GNU General Public License as published by  *
      13                 :            :  *   the Free Software Foundation; either version 2 of the License, or     *
      14                 :            :  *   (at your option) any later version.                                   *
      15                 :            :  *                                                                         *
      16                 :            :  ***************************************************************************/
      17                 :            : 
      18                 :            : #include "qgsprocessingmodelchildalgorithm.h"
      19                 :            : #include "qgsapplication.h"
      20                 :            : #include "qgsprocessingregistry.h"
      21                 :            : #include "qgsprocessingmodelalgorithm.h"
      22                 :            : 
      23                 :            : ///@cond NOT_STABLE
      24                 :            : 
      25                 :          0 : QgsProcessingModelChildAlgorithm::QgsProcessingModelChildAlgorithm( const QString &algorithmId )
      26                 :          0 : {
      27                 :          0 :   setAlgorithmId( algorithmId );
      28                 :          0 : }
      29                 :            : 
      30                 :          0 : QgsProcessingModelChildAlgorithm::QgsProcessingModelChildAlgorithm( const QgsProcessingModelChildAlgorithm &other )
      31                 :          0 :   : QgsProcessingModelComponent( other )
      32                 :          0 :   , mId( other.mId )
      33                 :          0 :   , mConfiguration( other.mConfiguration )
      34                 :          0 :   , mParams( other.mParams )
      35                 :          0 :   , mModelOutputs( other.mModelOutputs )
      36                 :          0 :   , mActive( other.mActive )
      37                 :          0 :   , mDependencies( other.mDependencies )
      38                 :          0 :   , mComment( other.mComment )
      39                 :          0 : {
      40                 :          0 :   setAlgorithmId( other.algorithmId() );
      41                 :          0 : }
      42                 :            : 
      43                 :          0 : QgsProcessingModelChildAlgorithm &QgsProcessingModelChildAlgorithm::operator=( const QgsProcessingModelChildAlgorithm &other )
      44                 :            : {
      45                 :          0 :   QgsProcessingModelComponent::operator =( other );
      46                 :          0 :   mId = other.mId;
      47                 :          0 :   mConfiguration = other.mConfiguration;
      48                 :          0 :   setAlgorithmId( other.algorithmId() );
      49                 :          0 :   mParams = other.mParams;
      50                 :          0 :   mModelOutputs = other.mModelOutputs;
      51                 :          0 :   mActive = other.mActive;
      52                 :          0 :   mDependencies = other.mDependencies;
      53                 :          0 :   mComment = other.mComment;
      54                 :          0 :   return *this;
      55                 :          0 : }
      56                 :            : 
      57                 :          0 : QgsProcessingModelChildAlgorithm *QgsProcessingModelChildAlgorithm::clone() const
      58                 :            : {
      59                 :          0 :   return new QgsProcessingModelChildAlgorithm( *this );
      60                 :          0 : }
      61                 :            : 
      62                 :          0 : void QgsProcessingModelChildAlgorithm::copyNonDefinitionPropertiesFromModel( QgsProcessingModelAlgorithm *model )
      63                 :            : {
      64                 :          0 :   const QgsProcessingModelChildAlgorithm existingChild = model->childAlgorithm( mId );
      65                 :          0 :   copyNonDefinitionProperties( existingChild );
      66                 :            : 
      67                 :          0 :   int i = 0;
      68                 :          0 :   for ( auto it = mModelOutputs.begin(); it != mModelOutputs.end(); ++it )
      69                 :            :   {
      70                 :          0 :     if ( !existingChild.modelOutputs().value( it.key() ).position().isNull() )
      71                 :            :     {
      72                 :          0 :       it.value().setPosition( existingChild.modelOutputs().value( it.key() ).position() );
      73                 :          0 :       it.value().setSize( existingChild.modelOutputs().value( it.key() ).size() );
      74                 :          0 :     }
      75                 :            :     else
      76                 :          0 :       it.value().setPosition( position() + QPointF( size().width(), ( i + 1.5 ) * size().height() ) );
      77                 :            : 
      78                 :          0 :     if ( QgsProcessingModelComment *comment = it.value().comment() )
      79                 :            :     {
      80                 :          0 :       if ( const QgsProcessingModelComment *existingComment = existingChild.modelOutputs().value( it.key() ).comment() )
      81                 :            :       {
      82                 :          0 :         comment->setDescription( existingComment->description() );
      83                 :          0 :         comment->setSize( existingComment->size() );
      84                 :          0 :         comment->setPosition( existingComment->position() );
      85                 :          0 :         comment->setColor( existingComment->color() );
      86                 :          0 :       }
      87                 :          0 :     }
      88                 :          0 :     i++;
      89                 :          0 :   }
      90                 :          0 : }
      91                 :            : 
      92                 :          0 : const QgsProcessingAlgorithm *QgsProcessingModelChildAlgorithm::algorithm() const
      93                 :            : {
      94                 :          0 :   return mAlgorithm.get();
      95                 :            : }
      96                 :            : 
      97                 :          0 : void QgsProcessingModelChildAlgorithm::setModelOutputs( const QMap<QString, QgsProcessingModelOutput> &modelOutputs )
      98                 :            : {
      99                 :          0 :   mModelOutputs = modelOutputs;
     100                 :            : 
     101                 :          0 :   QMap<QString, QgsProcessingModelOutput>::iterator outputIt = mModelOutputs.begin();
     102                 :          0 :   for ( ; outputIt != mModelOutputs.end(); ++outputIt )
     103                 :            :   {
     104                 :            :     // make sure values are consistent
     105                 :          0 :     outputIt->setName( outputIt.key() );
     106                 :          0 :     outputIt->setChildId( mId );
     107                 :          0 :   }
     108                 :          0 : }
     109                 :            : 
     110                 :          0 : bool QgsProcessingModelChildAlgorithm::removeModelOutput( const QString &name )
     111                 :            : {
     112                 :          0 :   mModelOutputs.remove( name );
     113                 :          0 :   return true;
     114                 :            : }
     115                 :            : 
     116                 :          0 : QVariant QgsProcessingModelChildAlgorithm::toVariant() const
     117                 :            : {
     118                 :          0 :   QVariantMap map;
     119                 :          0 :   map.insert( QStringLiteral( "id" ), mId );
     120                 :          0 :   map.insert( QStringLiteral( "alg_id" ), mAlgorithmId );
     121                 :          0 :   map.insert( QStringLiteral( "alg_config" ), mConfiguration );
     122                 :          0 :   map.insert( QStringLiteral( "active" ), mActive );
     123                 :            : 
     124                 :          0 :   QVariantList dependencies;
     125                 :          0 :   for ( const QgsProcessingModelChildDependency &dependency : mDependencies )
     126                 :            :   {
     127                 :          0 :     dependencies << dependency.toVariant();
     128                 :            :   }
     129                 :          0 :   map.insert( QStringLiteral( "dependencies" ), dependencies );
     130                 :            : 
     131                 :          0 :   saveCommonProperties( map );
     132                 :            : 
     133                 :          0 :   QVariantMap paramMap;
     134                 :          0 :   QMap< QString, QgsProcessingModelChildParameterSources >::const_iterator paramIt = mParams.constBegin();
     135                 :          0 :   for ( ; paramIt != mParams.constEnd(); ++paramIt )
     136                 :            :   {
     137                 :          0 :     QVariantList sources;
     138                 :          0 :     const auto constValue = paramIt.value();
     139                 :          0 :     for ( const QgsProcessingModelChildParameterSource &source : constValue )
     140                 :            :     {
     141                 :          0 :       sources << source.toVariant();
     142                 :            :     }
     143                 :          0 :     paramMap.insert( paramIt.key(), sources );
     144                 :          0 :   }
     145                 :          0 :   map.insert( QStringLiteral( "params" ), paramMap );
     146                 :            : 
     147                 :          0 :   QVariantMap outputMap;
     148                 :          0 :   QMap< QString, QgsProcessingModelOutput >::const_iterator outputIt = mModelOutputs.constBegin();
     149                 :          0 :   for ( ; outputIt != mModelOutputs.constEnd(); ++outputIt )
     150                 :            :   {
     151                 :          0 :     outputMap.insert( outputIt.key(), outputIt.value().toVariant() );
     152                 :          0 :   }
     153                 :          0 :   map.insert( QStringLiteral( "outputs" ), outputMap );
     154                 :            : 
     155                 :          0 :   return map;
     156                 :          0 : }
     157                 :            : 
     158                 :          0 : bool QgsProcessingModelChildAlgorithm::loadVariant( const QVariant &child )
     159                 :            : {
     160                 :          0 :   QVariantMap map = child.toMap();
     161                 :            : 
     162                 :          0 :   mId = map.value( QStringLiteral( "id" ) ).toString();
     163                 :          0 :   if ( mId.isEmpty() )
     164                 :          0 :     return false;
     165                 :            : 
     166                 :          0 :   mConfiguration = map.value( QStringLiteral( "alg_config" ) ).toMap();
     167                 :          0 :   setAlgorithmId( map.value( QStringLiteral( "alg_id" ) ).toString() );
     168                 :          0 :   if ( algorithmId().isEmpty() )
     169                 :          0 :     return false;
     170                 :          0 :   mActive = map.value( QStringLiteral( "active" ) ).toBool();
     171                 :            : 
     172                 :          0 :   mDependencies.clear();
     173                 :          0 :   if ( map.value( QStringLiteral( "dependencies" ) ).type() == QVariant::StringList )
     174                 :            :   {
     175                 :          0 :     const QStringList dependencies = map.value( QStringLiteral( "dependencies" ) ).toStringList();
     176                 :          0 :     for ( const QString &dependency : dependencies )
     177                 :            :     {
     178                 :          0 :       QgsProcessingModelChildDependency dep;
     179                 :          0 :       dep.childId = dependency;
     180                 :          0 :       mDependencies << dep;
     181                 :          0 :     }
     182                 :          0 :   }
     183                 :            :   else
     184                 :            :   {
     185                 :          0 :     const QVariantList dependencies = map.value( QStringLiteral( "dependencies" ) ).toList();
     186                 :          0 :     for ( const QVariant &dependency : dependencies )
     187                 :            :     {
     188                 :          0 :       QgsProcessingModelChildDependency dep;
     189                 :          0 :       dep.loadVariant( dependency.toMap() );
     190                 :          0 :       mDependencies << dep;
     191                 :          0 :     }
     192                 :          0 :   }
     193                 :            : 
     194                 :          0 :   restoreCommonProperties( map );
     195                 :            : 
     196                 :          0 :   mParams.clear();
     197                 :          0 :   QVariantMap paramMap = map.value( QStringLiteral( "params" ) ).toMap();
     198                 :          0 :   QVariantMap::const_iterator paramIt = paramMap.constBegin();
     199                 :          0 :   for ( ; paramIt != paramMap.constEnd(); ++paramIt )
     200                 :            :   {
     201                 :          0 :     QgsProcessingModelChildParameterSources sources;
     202                 :          0 :     const auto constToList = paramIt->toList();
     203                 :          0 :     for ( const QVariant &sourceVar : constToList )
     204                 :            :     {
     205                 :          0 :       QgsProcessingModelChildParameterSource param;
     206                 :          0 :       if ( !param.loadVariant( sourceVar.toMap() ) )
     207                 :          0 :         return false;
     208                 :          0 :       sources << param;
     209                 :          0 :     }
     210                 :          0 :     mParams.insert( paramIt.key(), sources );
     211                 :          0 :   }
     212                 :            : 
     213                 :          0 :   mModelOutputs.clear();
     214                 :          0 :   QVariantMap outputMap = map.value( QStringLiteral( "outputs" ) ).toMap();
     215                 :          0 :   QVariantMap::const_iterator outputIt = outputMap.constBegin();
     216                 :          0 :   for ( ; outputIt != outputMap.constEnd(); ++outputIt )
     217                 :            :   {
     218                 :          0 :     QgsProcessingModelOutput output;
     219                 :          0 :     if ( !output.loadVariant( outputIt.value().toMap() ) )
     220                 :          0 :       return false;
     221                 :            : 
     222                 :          0 :     mModelOutputs.insert( outputIt.key(), output );
     223                 :          0 :   }
     224                 :            : 
     225                 :          0 :   return true;
     226                 :          0 : }
     227                 :            : 
     228                 :          0 : QStringList QgsProcessingModelChildAlgorithm::asPythonCode( const QgsProcessing::PythonOutputType outputType, const QgsStringMap &extraParameters,
     229                 :            :     int currentIndent, int indentSize, const QMap<QString, QString> &friendlyChildNames, const QMap<QString, QString> &friendlyOutputNames ) const
     230                 :            : {
     231                 :          0 :   QStringList lines;
     232                 :          0 :   const QString baseIndent = QString( ' ' ).repeated( currentIndent );
     233                 :          0 :   const QString lineIndent = QString( ' ' ).repeated( indentSize );
     234                 :            : 
     235                 :          0 :   if ( !algorithm() )
     236                 :          0 :     return QStringList();
     237                 :            : 
     238                 :          0 :   if ( !description().isEmpty() )
     239                 :          0 :     lines << baseIndent + QStringLiteral( "# %1" ).arg( description() );
     240                 :          0 :   if ( !mComment.description().isEmpty() )
     241                 :          0 :     lines << baseIndent + QStringLiteral( "# %1" ).arg( mComment.description() );
     242                 :            : 
     243                 :          0 :   QStringList paramParts;
     244                 :          0 :   for ( auto paramIt = mParams.constBegin(); paramIt != mParams.constEnd(); ++paramIt )
     245                 :            :   {
     246                 :          0 :     QStringList sourceParts;
     247                 :          0 :     const QgsProcessingParameterDefinition *def = algorithm() ? algorithm()->parameterDefinition( paramIt.key() ) : nullptr;
     248                 :          0 :     const auto parts = paramIt.value();
     249                 :          0 :     for ( const QgsProcessingModelChildParameterSource &source : parts )
     250                 :            :     {
     251                 :          0 :       QString part = source.asPythonCode( outputType, def, friendlyChildNames );
     252                 :          0 :       if ( !part.isEmpty() )
     253                 :          0 :         sourceParts << part;
     254                 :          0 :     }
     255                 :          0 :     if ( sourceParts.count() == 1 )
     256                 :          0 :       paramParts << QStringLiteral( "'%1': %2" ).arg( paramIt.key(), sourceParts.at( 0 ) );
     257                 :            :     else
     258                 :          0 :       paramParts << QStringLiteral( "'%1': [%2]" ).arg( paramIt.key(), sourceParts.join( ',' ) );
     259                 :          0 :   }
     260                 :            : 
     261                 :          0 :   lines << baseIndent + QStringLiteral( "alg_params = {" );
     262                 :          0 :   lines.reserve( lines.size() + paramParts.size() );
     263                 :          0 :   for ( const QString &p : std::as_const( paramParts ) )
     264                 :            :   {
     265                 :          0 :     lines << baseIndent + lineIndent + p + ',';
     266                 :            :   }
     267                 :          0 :   for ( auto it = extraParameters.constBegin(); it != extraParameters.constEnd(); ++it )
     268                 :            :   {
     269                 :          0 :     lines << baseIndent + lineIndent + QStringLiteral( "%1: %2," ).arg( QgsProcessingUtils::stringToPythonLiteral( it.key() ), it.value() );
     270                 :          0 :   }
     271                 :          0 :   if ( lines.constLast().endsWith( ',' ) )
     272                 :            :   {
     273                 :          0 :     lines[ lines.count() - 1 ].truncate( lines.constLast().length() - 1 );
     274                 :          0 :   }
     275                 :          0 :   lines << baseIndent + QStringLiteral( "}" );
     276                 :            : 
     277                 :          0 :   lines << baseIndent + QStringLiteral( "outputs['%1'] = processing.run('%2', alg_params, context=context, feedback=feedback, is_child_algorithm=True)" ).arg( friendlyChildNames.value( mId, mId ), mAlgorithmId );
     278                 :            : 
     279                 :          0 :   for ( auto outputIt = mModelOutputs.constBegin(); outputIt != mModelOutputs.constEnd(); ++outputIt )
     280                 :            :   {
     281                 :          0 :     QString outputName = QStringLiteral( "%1:%2" ).arg( mId, outputIt.key() );
     282                 :          0 :     outputName = friendlyOutputNames.value( outputName, outputName );
     283                 :          0 :     lines << baseIndent + QStringLiteral( "results['%1'] = outputs['%2']['%3']" ).arg( outputName, friendlyChildNames.value( mId, mId ), outputIt.value().childOutputName() );
     284                 :          0 :   }
     285                 :            : 
     286                 :          0 :   return lines;
     287                 :          0 : }
     288                 :            : 
     289                 :          0 : QVariantMap QgsProcessingModelChildAlgorithm::configuration() const
     290                 :            : {
     291                 :          0 :   return mConfiguration;
     292                 :            : }
     293                 :          0 : 
     294                 :          0 : void QgsProcessingModelChildAlgorithm::setConfiguration( const QVariantMap &configuration )
     295                 :            : {
     296                 :          0 :   mConfiguration = configuration;
     297                 :          0 :   mAlgorithm.reset( QgsApplication::processingRegistry()->createAlgorithmById( mAlgorithmId, mConfiguration ) );
     298                 :          0 : }
     299                 :            : 
     300                 :          0 : void QgsProcessingModelChildAlgorithm::generateChildId( const QgsProcessingModelAlgorithm &model )
     301                 :            : {
     302                 :          0 :   int i = 1;
     303                 :          0 :   QString id;
     304                 :          0 :   while ( true )
     305                 :            :   {
     306                 :          0 :     id = QStringLiteral( "%1_%2" ).arg( mAlgorithmId ).arg( i );
     307                 :          0 :     if ( !model.childAlgorithms().contains( id ) )
     308                 :          0 :       break;
     309                 :          0 :     i++;
     310                 :            :   }
     311                 :          0 :   mId = id;
     312                 :          0 : }
     313                 :            : 
     314                 :          0 : bool QgsProcessingModelChildAlgorithm::setAlgorithmId( const QString &algorithmId )
     315                 :            : {
     316                 :          0 :   mAlgorithmId = algorithmId;
     317                 :          0 :   mAlgorithm.reset( QgsApplication::processingRegistry()->createAlgorithmById( mAlgorithmId, mConfiguration ) );
     318                 :          0 :   return static_cast< bool >( mAlgorithm.get() );
     319                 :            : }
     320                 :            : 
     321                 :          0 : bool QgsProcessingModelChildAlgorithm::reattach() const
     322                 :            : {
     323                 :          0 :   return const_cast< QgsProcessingModelChildAlgorithm * >( this )->setAlgorithmId( mAlgorithmId );
     324                 :            : }
     325                 :            : 
     326                 :            : ///@endcond

Generated by: LCOV version 1.14