QVariantMap QgsProcessingModelAlgorithm::parametersForChildAlgorithm( const ChildAlgorithm &child, const QVariantMap &modelParameters, const QMap< QString, QVariantMap > &results ) const { QVariantMap childParams; Q_FOREACH ( const QgsProcessingParameterDefinition *def, child.algorithm()->parameterDefinitions() ) { if ( def->flags() & QgsProcessingParameterDefinition::FlagHidden ) continue; if ( !def->isDestination() ) { if ( !child.parameterSources().contains( def->name() ) ) continue; // use default value ChildParameterSource paramSource = child.parameterSources().value( def->name() ); switch ( paramSource.source() ) { case ChildParameterSource::StaticValue: childParams.insert( def->name(), paramSource.staticValue() ); break; case ChildParameterSource::ModelParameter: childParams.insert( def->name(), modelParameters.value( paramSource.parameterName() ) ); break; case ChildParameterSource::ChildOutput: { QVariantMap linkedChildResults = results.value( paramSource.outputChildId() ); childParams.insert( def->name(), linkedChildResults.value( paramSource.outputName() ) ); break; } } } else { const QgsProcessingDestinationParameter *destParam = static_cast< const QgsProcessingDestinationParameter * >( def ); // is destination linked to one of the final outputs from this model? bool isFinalOutput = false; QMap<QString, QgsProcessingModelAlgorithm::ModelOutput> outputs = child.modelOutputs(); QMap<QString, QgsProcessingModelAlgorithm::ModelOutput>::const_iterator outputIt = outputs.constBegin(); for ( ; outputIt != outputs.constEnd(); ++outputIt ) { if ( outputIt->childOutputName() == destParam->name() ) { QString paramName = child.childId() + ':' + outputIt.key(); if ( modelParameters.contains( paramName ) ) childParams.insert( destParam->name(), modelParameters.value( paramName ) ); isFinalOutput = true; break; } } if ( !isFinalOutput ) { // output is temporary // check whether it's optional, and if so - is it required? bool required = true; if ( destParam->flags() & QgsProcessingParameterDefinition::FlagOptional ) { required = childOutputIsRequired( child.childId(), destParam->name() ); } // not optional, or required elsewhere in model if ( required ) childParams.insert( destParam->name(), destParam->generateTemporaryDestination() ); } } } return childParams; }
QVariantMap QgsProcessingModelAlgorithm::parametersForChildAlgorithm( const QgsProcessingModelChildAlgorithm &child, const QVariantMap &modelParameters, const QVariantMap &results, const QgsExpressionContext &expressionContext ) const { QVariantMap childParams; Q_FOREACH ( const QgsProcessingParameterDefinition *def, child.algorithm()->parameterDefinitions() ) { if ( def->flags() & QgsProcessingParameterDefinition::FlagHidden ) continue; if ( !def->isDestination() ) { if ( !child.parameterSources().contains( def->name() ) ) continue; // use default value QgsProcessingModelChildParameterSources paramSources = child.parameterSources().value( def->name() ); QVariantList paramParts; Q_FOREACH ( const QgsProcessingModelChildParameterSource &source, paramSources ) { switch ( source.source() ) { case QgsProcessingModelChildParameterSource::StaticValue: paramParts << source.staticValue(); break; case QgsProcessingModelChildParameterSource::ModelParameter: paramParts << modelParameters.value( source.parameterName() ); break; case QgsProcessingModelChildParameterSource::ChildOutput: { QVariantMap linkedChildResults = results.value( source.outputChildId() ).toMap(); paramParts << linkedChildResults.value( source.outputName() ); break; } case QgsProcessingModelChildParameterSource::Expression: { QgsExpression exp( source.expression() ); paramParts << exp.evaluate( &expressionContext ); break; } } } if ( paramParts.count() == 1 ) childParams.insert( def->name(), paramParts.at( 0 ) ); else childParams.insert( def->name(), paramParts ); } else { const QgsProcessingDestinationParameter *destParam = static_cast< const QgsProcessingDestinationParameter * >( def ); // is destination linked to one of the final outputs from this model? bool isFinalOutput = false; QMap<QString, QgsProcessingModelOutput> outputs = child.modelOutputs(); QMap<QString, QgsProcessingModelOutput>::const_iterator outputIt = outputs.constBegin(); for ( ; outputIt != outputs.constEnd(); ++outputIt ) { if ( outputIt->childOutputName() == destParam->name() ) { QString paramName = child.childId() + ':' + outputIt.key(); if ( modelParameters.contains( paramName ) ) { QVariant value = modelParameters.value( paramName ); if ( value.canConvert<QgsProcessingOutputLayerDefinition>() ) { // make sure layout output name is correctly set QgsProcessingOutputLayerDefinition fromVar = qvariant_cast<QgsProcessingOutputLayerDefinition>( value ); fromVar.destinationName = outputIt.key(); value = QVariant::fromValue( fromVar ); } childParams.insert( destParam->name(), value ); } isFinalOutput = true; break; } } if ( !isFinalOutput ) { // output is temporary // check whether it's optional, and if so - is it required? bool required = true; if ( destParam->flags() & QgsProcessingParameterDefinition::FlagOptional ) { required = childOutputIsRequired( child.childId(), destParam->name() ); } // not optional, or required elsewhere in model if ( required ) childParams.insert( destParam->name(), destParam->generateTemporaryDestination() ); } } }