42 #include <QRegularExpression>
50 map.insert( QStringLiteral(
"feature_limit" ),
featureLimit );
51 map.insert( QStringLiteral(
"flags" ),
static_cast< int >(
flags ) );
52 map.insert( QStringLiteral(
"geometry_check" ),
static_cast< int >(
geometryCheck ) );
60 featureLimit = map.value( QStringLiteral(
"feature_limit" ), -1 ).toLongLong();
61 flags =
static_cast< Flags
>( map.value( QStringLiteral(
"flags" ), 0 ).toInt() );
74 mRemappingDefinition = definition;
81 map.insert( QStringLiteral(
"create_options" ),
createOptions );
83 map.insert( QStringLiteral(
"remapping" ), QVariant::fromValue( mRemappingDefinition ) );
90 createOptions = map.value( QStringLiteral(
"create_options" ) ).toMap();
91 if ( map.contains( QStringLiteral(
"remapping" ) ) )
98 mUseRemapping =
false;
106 && mUseRemapping == other.mUseRemapping && mRemappingDefinition == other.mRemappingDefinition;
111 return !( *
this == other );
116 const QVariant val = parameters.value( name );
136 QVariant val = value;
140 if ( !val.isValid() )
149 return destParam->generateTemporaryDestination();
152 return val.toString();
168 const QVariant val = value;
172 if ( val.isValid() && !val.toString().isEmpty() )
176 return val.toString();
196 QVariant val = value;
201 const double res = val.toDouble( &ok );
207 return val.toDouble();
223 QVariant val = value;
228 double dbl = val.toDouble( &ok );
233 dbl = val.toDouble( &ok );
240 const double round = std::round( dbl );
241 if ( round > std::numeric_limits<int>::max() || round < -std::numeric_limits<int>::max() )
246 return static_cast< int >( std::round( dbl ) );
255 return QList< int >();
263 return QList< int >();
265 QList< int > resultList;
266 const QVariant val = value;
271 else if ( val.type() == QVariant::List )
273 const QVariantList list = val.toList();
274 for (
auto it = list.constBegin(); it != list.constEnd(); ++it )
275 resultList << it->toInt();
279 const QStringList parts = val.toString().split(
';' );
280 for (
auto it = parts.constBegin(); it != parts.constEnd(); ++it )
281 resultList << it->toInt();
285 if ( resultList.isEmpty() )
290 if ( definition->
defaultValue().type() == QVariant::List )
292 const QVariantList list = definition->
defaultValue().toList();
293 for (
auto it = list.constBegin(); it != list.constEnd(); ++it )
294 resultList << it->toInt();
298 const QStringList parts = definition->
defaultValue().toString().split(
';' );
299 for (
auto it = parts.constBegin(); it != parts.constEnd(); ++it )
300 resultList << it->toInt();
321 QVariant val = value;
325 QDateTime d = val.toDateTime();
326 if ( !d.isValid() && val.type() == QVariant::String )
328 d = QDateTime::fromString( val.toString() );
335 d = val.toDateTime();
337 if ( !d.isValid() && val.type() == QVariant::String )
339 d = QDateTime::fromString( val.toString() );
358 QVariant val = value;
362 QDate d = val.toDate();
363 if ( !d.isValid() && val.type() == QVariant::String )
365 d = QDate::fromString( val.toString() );
374 if ( !d.isValid() && val.type() == QVariant::String )
376 d = QDate::fromString( val.toString() );
395 QVariant val = value;
401 if ( val.type() == QVariant::DateTime )
402 d = val.toDateTime().time();
406 if ( !d.isValid() && val.type() == QVariant::String )
408 d = QTime::fromString( val.toString() );
417 if ( !d.isValid() && val.type() == QVariant::String )
419 d = QTime::fromString( val.toString() );
440 if ( enumDef && val >= enumDef->
options().size() )
460 QVariantList resultList;
461 const QVariant val = value;
464 else if ( val.type() == QVariant::List )
466 const auto constToList = val.toList();
467 for (
const QVariant &var : constToList )
470 else if ( val.type() == QVariant::String )
472 const auto constSplit = val.toString().split(
',' );
473 for (
const QString &var : constSplit )
479 if ( resultList.isEmpty() )
480 return QList< int >();
482 if ( ( !val.isValid() || !resultList.at( 0 ).isValid() ) && definition )
486 if ( definition->
defaultValue().type() == QVariant::List )
488 const auto constToList = definition->
defaultValue().toList();
489 for (
const QVariant &var : constToList )
492 else if ( definition->
defaultValue().type() == QVariant::String )
494 const auto constSplit = definition->
defaultValue().toString().split(
',' );
495 for (
const QString &var : constSplit )
504 const auto constResultList = resultList;
505 for (
const QVariant &var : constResultList )
507 const int resInt = var.toInt();
508 if ( !enumDef || resInt < enumDef->options().size() )
531 if ( enumText.isEmpty() || !enumDef->
options().contains( enumText ) )
540 return QStringList();
548 return QStringList();
550 const QVariant val = value;
552 QStringList enumValues;
554 std::function< void(
const QVariant &var ) > processVariant;
555 processVariant = [ &enumValues, &context, &definition, &processVariant ](
const QVariant & var )
557 if ( var.type() == QVariant::List )
559 const auto constToList = var.toList();
560 for (
const QVariant &listVar : constToList )
562 processVariant( listVar );
565 else if ( var.type() == QVariant::StringList )
567 const auto constToStringList = var.toStringList();
568 for (
const QString &s : constToStringList )
577 const QStringList parts = var.toString().split(
',' );
578 for (
const QString &s : parts )
585 processVariant( val );
591 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
592 QSet<QString> subtraction = enumValues.toSet().subtract( enumDef->
options().toSet() );
594 const QStringList options = enumDef->
options();
595 const QSet<QString> subtraction = QSet<QString>( enumValues.begin(), enumValues.end() ).subtract( QSet<QString>( options.begin(), options.end() ) );
598 if ( enumValues.isEmpty() || !subtraction.isEmpty() )
630 const QVariant val = value;
633 else if ( val.isValid() )
646 const QVariant val = value;
649 else if ( val.isValid() )
657 QgsProcessingContext &context, QString &destinationIdentifier, QgsFeatureSink::SinkFlags sinkFlags,
658 const QVariantMap &createOptions,
const QStringList &datasourceOptions,
const QStringList &layerOptions )
663 val = parameters.value( definition->
name() );
666 return parameterAsSink( definition, val, fields, geometryType,
crs, context, destinationIdentifier, sinkFlags, createOptions, datasourceOptions, layerOptions );
669 QgsFeatureSink *
QgsProcessingParameters::parameterAsSink(
const QgsProcessingParameterDefinition *definition,
const QVariant &value,
const QgsFields &fields,
QgsWkbTypes::Type geometryType,
const QgsCoordinateReferenceSystem &
crs,
QgsProcessingContext &context, QString &destinationIdentifier, QgsFeatureSink::SinkFlags sinkFlags,
const QVariantMap &createOptions,
const QStringList &datasourceOptions,
const QStringList &layerOptions )
671 QVariantMap options = createOptions;
672 QVariant val = value;
677 bool useRemapDefinition =
false;
689 useRemapDefinition =
true;
699 else if ( !val.isValid() || val.toString().isEmpty() )
715 dest = val.toString();
720 dest = destParam->generateTemporaryDestination();
723 if ( dest.isEmpty() )
726 std::unique_ptr< QgsFeatureSink > sink(
QgsProcessingUtils::createFeatureSink( dest, context, fields, geometryType,
crs, options, datasourceOptions, layerOptions, sinkFlags, useRemapDefinition ? &remapDefinition :
nullptr ) );
727 destinationIdentifier = dest;
729 if ( destinationProject )
731 if ( destName.isEmpty() && definition )
737 outputName = definition->
name();
741 return sink.release();
765 QVariant val = parameters.value( definition->
name() );
767 bool selectedFeaturesOnly =
false;
768 long long featureLimit = -1;
790 vl = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( val ) );
799 else if ( !val.isValid() || val.toString().isEmpty() )
805 vl = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( val ) );
811 layerRef = val.toString();
816 if ( layerRef.isEmpty() )
828 compatibleFormats, preferredFormat, context, feedback, *layerName, featureLimit );
831 compatibleFormats, preferredFormat, context, feedback, featureLimit );
841 QString *destLayer = layerName;
856 return parameterAsLayer( definition, parameters.value( definition->
name() ), context, layerHint );
864 QVariant val = value;
870 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
887 if ( !val.isValid() || val.toString().isEmpty() )
893 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
898 QString layerRef = val.toString();
899 if ( layerRef.isEmpty() )
902 if ( layerRef.isEmpty() )
933 val = parameters.value( definition->
name() );
940 QVariant val = value;
958 else if ( definition && ( !val.isValid() || val.toString().isEmpty() ) )
965 dest = val.toString();
970 dest = destParam->generateTemporaryDestination();
973 if ( destinationProject )
976 if ( destName.isEmpty() && definition )
981 outputName = definition->
name();
1002 val = parameters.value( definition->
name() );
1009 QVariant val = value;
1019 if ( definition && val.canConvert<
QgsProperty>() )
1023 else if ( definition && ( !val.isValid() || val.toString().isEmpty() ) )
1030 dest = val.toString();
1035 dest = destParam->generateTemporaryDestination();
1055 return parameterAsCrs( definition, parameters.value( definition->
name() ), context );
1080 QVariant val = value;
1130 QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) );
1136 rectText = val.toString();
1138 if ( rectText.isEmpty() && !layer )
1141 const QRegularExpression rx( QStringLiteral(
"^(.*?)\\s*,\\s*(.*?),\\s*(.*?),\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*$" ) );
1142 const QRegularExpressionMatch match = rx.match( rectText );
1143 if ( match.hasMatch() )
1145 bool xMinOk =
false;
1146 const double xMin = match.captured( 1 ).toDouble( &xMinOk );
1147 bool xMaxOk =
false;
1148 const double xMax = match.captured( 2 ).toDouble( &xMaxOk );
1149 bool yMinOk =
false;
1150 const double yMin = match.captured( 3 ).toDouble( &yMinOk );
1151 bool yMaxOk =
false;
1152 const double yMax = match.captured( 4 ).toDouble( &yMaxOk );
1153 if ( xMinOk && xMaxOk && yMinOk && yMaxOk )
1204 QVariant val = parameters.value( definition->
name() );
1212 g = g.densifyByCount( 20 );
1248 rectText = val.toString();
1250 if ( !rectText.isEmpty() )
1252 const QRegularExpression rx( QStringLiteral(
"^(.*?)\\s*,\\s*(.*?),\\s*(.*?),\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*$" ) );
1253 const QRegularExpressionMatch match = rx.match( rectText );
1254 if ( match.hasMatch() )
1256 bool xMinOk =
false;
1257 const double xMin = match.captured( 1 ).toDouble( &xMinOk );
1258 bool xMaxOk =
false;
1259 const double xMax = match.captured( 2 ).toDouble( &xMaxOk );
1260 bool yMinOk =
false;
1261 const double yMin = match.captured( 3 ).toDouble( &yMinOk );
1262 bool yMaxOk =
false;
1263 const double yMax = match.captured( 4 ).toDouble( &yMaxOk );
1264 if ( xMinOk && xMaxOk && yMinOk && yMaxOk )
1290 QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) );
1319 const QVariant val = parameters.value( definition->
name() );
1325 QVariant val = value;
1353 QString valueAsString;
1357 valueAsString = val.toString();
1359 const QRegularExpression rx( QStringLiteral(
"^(.*?)\\s*,\\s*(.*?),\\s*(.*?),\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*$" ) );
1361 const QRegularExpressionMatch match = rx.match( valueAsString );
1362 if ( match.hasMatch() )
1388 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
1389 return layer->crs();
1391 return layer->crs();
1393 if (
auto *lProject = context.
project() )
1394 return lProject->crs();
1412 const QVariant val = value;
1442 if ( pointText.isEmpty() )
1445 if ( pointText.isEmpty() )
1448 const QRegularExpression rx( QStringLiteral(
"^\\s*\\(?\\s*(.*?)\\s*,\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*\\)?\\s*$" ) );
1451 const QRegularExpressionMatch match = rx.match( valueAsString );
1452 if ( match.hasMatch() )
1455 const double x = match.captured( 1 ).toDouble( &xOk );
1457 const double y = match.captured( 2 ).toDouble( &yOk );
1485 const QVariant val = parameters.value( definition->
name() );
1500 const QRegularExpression rx( QStringLiteral(
"^\\s*\\(?\\s*(.*?)\\s*,\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*\\)?\\s*$" ) );
1503 const QRegularExpressionMatch match = rx.match( valueAsString );
1504 if ( match.hasMatch() )
1511 if (
auto *lProject = context.
project() )
1512 return lProject->crs();
1530 const QVariant val = value;
1570 g = g.densifyByCount( 20 );
1603 if ( valueAsString.isEmpty() )
1606 if ( valueAsString.isEmpty() )
1609 const QRegularExpression rx( QStringLiteral(
"^\\s*(?:CRS=(.*);)?(.*?)$" ) );
1611 const QRegularExpressionMatch match = rx.match( valueAsString );
1612 if ( match.hasMatch() )
1639 const QVariant val = parameters.value( definition->
name() );
1673 const QRegularExpression rx( QStringLiteral(
"^\\s*(?:CRS=(.*);)?(.*?)$" ) );
1676 const QRegularExpressionMatch match = rx.match( valueAsString );
1677 if ( match.hasMatch() )
1684 if (
auto *lProject = context.
project() )
1685 return lProject->crs();
1696 if ( fileText.isEmpty() )
1707 if ( fileText.isEmpty() )
1715 return QVariantList();
1723 return QVariantList();
1725 QString resultString;
1726 const QVariant val = value;
1729 else if ( val.type() == QVariant::List )
1730 return val.toList();
1732 resultString = val.toString();
1734 if ( resultString.isEmpty() )
1737 if ( definition->
defaultValue().type() == QVariant::List )
1743 QVariantList result;
1744 const auto constSplit = resultString.split(
',' );
1747 for (
const QString &s : constSplit )
1749 number = s.toDouble( &ok );
1750 result << ( ok ? QVariant( number ) : s );
1759 return QList<QgsMapLayer *>();
1767 return QList<QgsMapLayer *>();
1769 const QVariant val = value;
1770 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
1772 return QList<QgsMapLayer *>() << layer;
1775 QList<QgsMapLayer *> layers;
1777 std::function< void(
const QVariant &var ) > processVariant;
1778 processVariant = [ &layers, &context, &definition, &processVariant ](
const QVariant & var )
1780 if ( var.type() == QVariant::List )
1782 const auto constToList = var.toList();
1783 for (
const QVariant &listVar : constToList )
1785 processVariant( listVar );
1788 else if ( var.type() == QVariant::StringList )
1790 const auto constToStringList = var.toStringList();
1791 for (
const QString &s : constToStringList )
1793 processVariant( s );
1802 const QVariant sink = fromVar.
sink;
1808 else if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( var ) ) )
1820 processVariant( val );
1822 if ( layers.isEmpty() )
1825 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( definition->
defaultValue() ) ) )
1829 else if ( definition->
defaultValue().type() == QVariant::List )
1831 const auto constToList = definition->
defaultValue().toList();
1832 for (
const QVariant &var : constToList )
1834 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( var ) ) )
1840 processVariant( var );
1854 return QStringList();
1856 const QVariant val = value;
1860 std::function< void(
const QVariant &var ) > processVariant;
1861 processVariant = [ &files, &context, &definition, &processVariant ](
const QVariant & var )
1863 if ( var.type() == QVariant::List )
1865 const auto constToList = var.toList();
1866 for (
const QVariant &listVar : constToList )
1868 processVariant( listVar );
1871 else if ( var.type() == QVariant::StringList )
1873 const auto constToStringList = var.toStringList();
1874 for (
const QString &s : constToStringList )
1876 processVariant( s );
1883 files << var.toString();
1887 processVariant( val );
1889 if ( files.isEmpty() )
1900 return QStringList();
1908 return QList<double>();
1916 return QList<double>();
1918 QStringList resultStringList;
1919 const QVariant val = value;
1923 else if ( val.type() == QVariant::List )
1925 const auto constToList = val.toList();
1926 for (
const QVariant &var : constToList )
1927 resultStringList << var.toString();
1930 resultStringList << val.toString();
1932 if ( ( resultStringList.isEmpty() || ( resultStringList.size() == 1 && resultStringList.at( 0 ).isEmpty() ) ) )
1934 resultStringList.clear();
1936 if ( definition->
defaultValue().type() == QVariant::List )
1938 const auto constToList = definition->
defaultValue().toList();
1939 for (
const QVariant &var : constToList )
1940 resultStringList << var.toString();
1943 resultStringList << definition->
defaultValue().toString();
1946 if ( resultStringList.size() == 1 )
1948 resultStringList = resultStringList.at( 0 ).split(
',' );
1951 if ( resultStringList.size() < 2 )
1952 return QList< double >() << std::numeric_limits<double>::quiet_NaN() << std::numeric_limits<double>::quiet_NaN() ;
1954 QList< double > result;
1956 double n = resultStringList.at( 0 ).toDouble( &ok );
1960 result << std::numeric_limits<double>::quiet_NaN() ;
1962 n = resultStringList.at( 1 ).toDouble( &ok );
1966 result << std::numeric_limits<double>::quiet_NaN() ;
1974 return QStringList();
1976 const QStringList resultStringList;
1983 return QStringList();
1985 QStringList resultStringList;
1986 const QVariant val = value;
1987 if ( val.isValid() )
1991 else if ( val.type() == QVariant::List )
1993 const auto constToList = val.toList();
1994 for (
const QVariant &var : constToList )
1995 resultStringList << var.toString();
1997 else if ( val.type() == QVariant::StringList )
1999 resultStringList = val.toStringList();
2002 resultStringList.append( val.toString().split(
';' ) );
2005 if ( ( resultStringList.isEmpty() || resultStringList.at( 0 ).isEmpty() ) )
2007 resultStringList.clear();
2011 if ( definition->
defaultValue().type() == QVariant::List )
2013 const auto constToList = definition->
defaultValue().toList();
2014 for (
const QVariant &var : constToList )
2015 resultStringList << var.toString();
2017 else if ( definition->
defaultValue().type() == QVariant::StringList )
2019 resultStringList = definition->
defaultValue().toStringList();
2022 resultStringList.append( definition->
defaultValue().toString().split(
';' ) );
2026 return resultStringList;
2040 if ( layoutName.isEmpty() )
2092 QVariant val = value;
2097 if ( val.type() == QVariant::Color )
2099 QColor
c = val.value< QColor >();
2101 if ( !colorParam->opacityEnabled() )
2109 if ( definition->
defaultValue().type() == QVariant::Color )
2115 if ( colorText.isEmpty() )
2118 bool containsAlpha =
false;
2121 if (
c.isValid() && !colorParam->opacityEnabled() )
2193 const QString type = map.value( QStringLiteral(
"parameter_type" ) ).toString();
2194 const QString name = map.value( QStringLiteral(
"name" ) ).toString();
2195 std::unique_ptr< QgsProcessingParameterDefinition > def;
2268 def.reset( paramType->
create( name ) );
2274 def->fromVariantMap( map );
2275 return def.release();
2280 QString desc = name;
2281 desc.replace(
'_',
' ' );
2287 bool isOptional =
false;
2291 if ( !parseScriptCodeParameterOptions( code, isOptional, name, type, definition ) )
2296 if ( type == QLatin1String(
"boolean" ) )
2298 else if ( type == QLatin1String(
"crs" ) )
2300 else if ( type == QLatin1String(
"layer" ) )
2302 else if ( type == QLatin1String(
"extent" ) )
2304 else if ( type == QLatin1String(
"point" ) )
2306 else if ( type == QLatin1String(
"geometry" ) )
2308 else if ( type == QLatin1String(
"file" ) )
2310 else if ( type == QLatin1String(
"folder" ) )
2312 else if ( type == QLatin1String(
"matrix" ) )
2314 else if ( type == QLatin1String(
"multiple" ) )
2316 else if ( type == QLatin1String(
"number" ) )
2318 else if ( type == QLatin1String(
"distance" ) )
2320 else if ( type == QLatin1String(
"duration" ) )
2322 else if ( type == QLatin1String(
"scale" ) )
2324 else if ( type == QLatin1String(
"range" ) )
2326 else if ( type == QLatin1String(
"raster" ) )
2328 else if ( type == QLatin1String(
"enum" ) )
2330 else if ( type == QLatin1String(
"string" ) )
2332 else if ( type == QLatin1String(
"authcfg" ) )
2334 else if ( type == QLatin1String(
"expression" ) )
2336 else if ( type == QLatin1String(
"field" ) )
2338 else if ( type == QLatin1String(
"vector" ) )
2340 else if ( type == QLatin1String(
"source" ) )
2342 else if ( type == QLatin1String(
"sink" ) )
2344 else if ( type == QLatin1String(
"vectordestination" ) )
2346 else if ( type == QLatin1String(
"rasterdestination" ) )
2348 else if ( type == QLatin1String(
"pointclouddestination" ) )
2350 else if ( type == QLatin1String(
"filedestination" ) )
2352 else if ( type == QLatin1String(
"folderdestination" ) )
2354 else if ( type == QLatin1String(
"band" ) )
2356 else if ( type == QLatin1String(
"mesh" ) )
2358 else if ( type == QLatin1String(
"layout" ) )
2360 else if ( type == QLatin1String(
"layoutitem" ) )
2362 else if ( type == QLatin1String(
"color" ) )
2364 else if ( type == QLatin1String(
"coordinateoperation" ) )
2366 else if ( type == QLatin1String(
"maptheme" ) )
2368 else if ( type == QLatin1String(
"datetime" ) )
2370 else if ( type == QLatin1String(
"providerconnection" ) )
2372 else if ( type == QLatin1String(
"databaseschema" ) )
2374 else if ( type == QLatin1String(
"databasetable" ) )
2376 else if ( type == QLatin1String(
"pointcloud" ) )
2378 else if ( type == QLatin1String(
"annotation" ) )
2384 bool QgsProcessingParameters::parseScriptCodeParameterOptions(
const QString &code,
bool &isOptional, QString &name, QString &type, QString &definition )
2386 const QRegularExpression re( QStringLiteral(
"(?:#*)(.*?)=\\s*(.*)" ) );
2387 QRegularExpressionMatch m = re.match( code );
2388 if ( !m.hasMatch() )
2391 name = m.captured( 1 );
2392 QString tokens = m.captured( 2 );
2393 if ( tokens.startsWith( QLatin1String(
"optional" ), Qt::CaseInsensitive ) )
2396 tokens.remove( 0, 8 );
2403 tokens = tokens.trimmed();
2405 const QRegularExpression re2( QStringLiteral(
"(.*?)\\s+(.*)" ) );
2406 m = re2.match( tokens );
2407 if ( !m.hasMatch() )
2409 type = tokens.toLower().trimmed();
2414 type = m.captured( 1 ).toLower().trimmed();
2415 definition = m.captured( 2 );
2426 , mDescription( description )
2428 , mDefault( defaultValue )
2429 , mFlags( optional ? FlagOptional : 0 )
2434 if ( !input.isValid() && !
mDefault.isValid() )
2437 if ( ( input.type() == QVariant::String && input.toString().isEmpty() )
2438 || ( !input.isValid() &&
mDefault.type() == QVariant::String &&
mDefault.toString().isEmpty() ) )
2446 if ( !value.isValid() )
2447 return QStringLiteral(
"None" );
2450 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
2457 if ( !value.isValid() )
2461 if ( value.type() == QVariant::Type::Map )
2463 const QVariantMap sourceMap = value.toMap();
2464 QVariantMap resultMap;
2465 for (
auto it = sourceMap.constBegin(); it != sourceMap.constEnd(); it++ )
2471 else if ( value.type() == QVariant::Type::List || value.type() == QVariant::Type::StringList )
2473 const QVariantList sourceList = value.toList();
2474 QVariantList resultList;
2475 resultList.reserve( sourceList.size() );
2476 for (
const QVariant &v : sourceList )
2484 switch ( value.userType() )
2487 case QMetaType::Bool:
2488 case QMetaType::Char:
2489 case QMetaType::Int:
2490 case QMetaType::Double:
2491 case QMetaType::Float:
2492 case QMetaType::LongLong:
2493 case QMetaType::ULongLong:
2494 case QMetaType::UInt:
2495 case QMetaType::ULong:
2496 case QMetaType::UShort:
2504 if ( value.userType() == QMetaType::type(
"QgsProperty" ) )
2517 QgsDebugMsg( QStringLiteral(
"could not convert expression/field based property to JSON object" ) );
2523 if ( value.userType() == QMetaType::type(
"QgsCoordinateReferenceSystem" ) )
2533 else if ( value.userType() == QMetaType::type(
"QgsRectangle" ) )
2541 else if ( value.userType() == QMetaType::type(
"QgsReferencedRectangle" ) )
2549 else if ( value.userType() == QMetaType::type(
"QgsGeometry" ) )
2561 else if ( value.userType() == QMetaType::type(
"QgsReferencedGeometry" ) )
2576 else if ( value.userType() == QMetaType::type(
"QgsPointXY" ) )
2582 else if ( value.userType() == QMetaType::type(
"QgsReferencedPointXY" ) )
2589 else if ( value.userType() == QMetaType::type(
"QgsProcessingFeatureSourceDefinition" ) )
2596 else if ( value.userType() == QMetaType::type(
"QgsProcessingOutputLayerDefinition" ) )
2601 else if ( value.userType() == QMetaType::type(
"QColor" ) )
2603 const QColor fromVar = value.value< QColor >();
2604 if ( !fromVar.isValid() )
2607 return QStringLiteral(
"rgba( %1, %2, %3, %4 )" ).arg( fromVar.red() ).arg( fromVar.green() ).arg( fromVar.blue() ).arg( QString::number( fromVar.alphaF(),
'f', 2 ) );
2609 else if ( value.userType() == QMetaType::type(
"QDateTime" ) )
2611 const QDateTime fromVar = value.toDateTime();
2612 if ( !fromVar.isValid() )
2615 return fromVar.toString( Qt::ISODate );
2617 else if ( value.userType() == QMetaType::type(
"QDate" ) )
2619 const QDate fromVar = value.toDate();
2620 if ( !fromVar.isValid() )
2623 return fromVar.toString( Qt::ISODate );
2625 else if ( value.userType() == QMetaType::type(
"QTime" ) )
2627 const QTime fromVar = value.toTime();
2628 if ( !fromVar.isValid() )
2631 return fromVar.toString( Qt::ISODate );
2636 p.insert(
name(), value );
2640 if ( !source.isEmpty() )
2646 if ( value.userType() == QMetaType::QString )
2651 Q_ASSERT_X(
false,
"QgsProcessingParameterDefinition::valueAsJsonObject", QStringLiteral(
"unsupported variant type %1" ).arg(
QMetaType::typeName( value.userType() ) ).toLocal8Bit() );
2659 if ( !value.isValid() )
2662 switch ( value.userType() )
2665 case QMetaType::Bool:
2666 case QMetaType::Char:
2667 case QMetaType::Int:
2668 case QMetaType::Double:
2669 case QMetaType::Float:
2670 case QMetaType::LongLong:
2671 case QMetaType::ULongLong:
2672 case QMetaType::UInt:
2673 case QMetaType::ULong:
2674 case QMetaType::UShort:
2675 return value.toString();
2681 if ( value.userType() == QMetaType::type(
"QgsProperty" ) )
2694 QgsDebugMsg( QStringLiteral(
"could not convert expression/field based property to string" ) );
2700 if ( value.userType() == QMetaType::type(
"QgsCoordinateReferenceSystem" ) )
2710 else if ( value.userType() == QMetaType::type(
"QgsRectangle" ) )
2718 else if ( value.userType() == QMetaType::type(
"QgsReferencedRectangle" ) )
2726 else if ( value.userType() == QMetaType::type(
"QgsGeometry" ) )
2738 else if ( value.userType() == QMetaType::type(
"QgsReferencedGeometry" ) )
2753 else if ( value.userType() == QMetaType::type(
"QgsPointXY" ) )
2759 else if ( value.userType() == QMetaType::type(
"QgsReferencedPointXY" ) )
2766 else if ( value.userType() == QMetaType::type(
"QgsProcessingFeatureSourceDefinition" ) )
2771 else if ( value.userType() == QMetaType::type(
"QgsProcessingOutputLayerDefinition" ) )
2776 else if ( value.userType() == QMetaType::type(
"QColor" ) )
2778 const QColor fromVar = value.value< QColor >();
2779 if ( !fromVar.isValid() )
2782 return QStringLiteral(
"rgba( %1, %2, %3, %4 )" ).arg( fromVar.red() ).arg( fromVar.green() ).arg( fromVar.blue() ).arg( QString::number( fromVar.alphaF(),
'f', 2 ) );
2784 else if ( value.userType() == QMetaType::type(
"QDateTime" ) )
2786 const QDateTime fromVar = value.toDateTime();
2787 if ( !fromVar.isValid() )
2790 return fromVar.toString( Qt::ISODate );
2792 else if ( value.userType() == QMetaType::type(
"QDate" ) )
2794 const QDate fromVar = value.toDate();
2795 if ( !fromVar.isValid() )
2798 return fromVar.toString( Qt::ISODate );
2800 else if ( value.userType() == QMetaType::type(
"QTime" ) )
2802 const QTime fromVar = value.toTime();
2803 if ( !fromVar.isValid() )
2806 return fromVar.toString( Qt::ISODate );
2811 p.insert(
name(), value );
2815 if ( !source.isEmpty() )
2821 if ( value.userType() == QMetaType::QString )
2822 return value.toString();
2827 return value.toString();
2833 if ( !value.isValid( ) )
2834 return QStringList();
2836 if ( value.type() == QVariant::Type::List || value.type() == QVariant::Type::StringList )
2838 const QVariantList sourceList = value.toList();
2839 QStringList resultList;
2840 resultList.reserve( sourceList.size() );
2841 for (
const QVariant &v : sourceList )
2850 return QStringList();
2862 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
2864 code += QLatin1String(
"optional " );
2865 code +=
type() +
' ';
2867 return code.trimmed();
2875 switch ( outputType )
2879 QString code = t->className() + QStringLiteral(
"('%1', %2" )
2882 code += QLatin1String(
", optional=True" );
2898 map.insert( QStringLiteral(
"parameter_type" ),
type() );
2899 map.insert( QStringLiteral(
"name" ),
mName );
2900 map.insert( QStringLiteral(
"description" ),
mDescription );
2901 map.insert( QStringLiteral(
"help" ),
mHelp );
2902 map.insert( QStringLiteral(
"default" ),
mDefault );
2903 map.insert( QStringLiteral(
"defaultGui" ),
mGuiDefault );
2904 map.insert( QStringLiteral(
"flags" ),
static_cast< int >(
mFlags ) );
2905 map.insert( QStringLiteral(
"metadata" ),
mMetadata );
2911 mName = map.value( QStringLiteral(
"name" ) ).toString();
2912 mDescription = map.value( QStringLiteral(
"description" ) ).toString();
2913 mHelp = map.value( QStringLiteral(
"help" ) ).toString();
2914 mDefault = map.value( QStringLiteral(
"default" ) );
2915 mGuiDefault = map.value( QStringLiteral(
"defaultGui" ) );
2916 mFlags =
static_cast< Flags
>( map.value( QStringLiteral(
"flags" ) ).toInt() );
2917 mMetadata = map.value( QStringLiteral(
"metadata" ) ).toMap();
2933 QString text = QStringLiteral(
"<p><b>%1</b></p>" ).arg(
description() );
2934 if ( !
help().isEmpty() )
2936 text += QStringLiteral(
"<p>%1</p>" ).arg(
help() );
2938 text += QStringLiteral(
"<p>%1</p>" ).arg( QObject::tr(
"Python identifier: ‘%1’" ).arg( QStringLiteral(
"<i>%1</i>" ).arg(
name() ) ) );
2953 if ( !val.isValid() )
2954 return QStringLiteral(
"None" );
2958 return val.toBool() ? QStringLiteral(
"True" ) : QStringLiteral(
"False" );
2963 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
2965 code += QLatin1String(
"optional " );
2966 code +=
type() +
' ';
2967 code +=
mDefault.toBool() ? QStringLiteral(
"true" ) : QStringLiteral(
"false" );
2968 return code.trimmed();
2989 if ( !input.isValid() )
3011 if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( input ) ) )
3014 if ( input.type() != QVariant::String || input.toString().isEmpty() )
3022 if ( !value.isValid() )
3023 return QStringLiteral(
"None" );
3028 return QStringLiteral(
"QgsCoordinateReferenceSystem()" );
3034 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
3037 p.insert(
name(), value );
3064 if ( !input.isValid() )
3072 if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( input ) ) )
3077 if ( input.type() != QVariant::String || input.toString().isEmpty() )
3095 if ( !val.isValid() )
3096 return QStringLiteral(
"None" );
3102 p.insert(
name(), val );
3112 for (
const QString &raster : rasters )
3114 if ( !vectors.contains( raster ) )
3118 for (
const QString &mesh : meshFilters )
3120 if ( !vectors.contains( mesh ) )
3124 for (
const QString &pointCloud : pointCloudFilters )
3126 if ( !vectors.contains( pointCloud ) )
3127 vectors << pointCloud;
3129 vectors.removeAll( QObject::tr(
"All files (*.*)" ) );
3130 std::sort( vectors.begin(), vectors.end() );
3132 return QObject::tr(
"All files (*.*)" ) + QStringLiteral(
";;" ) + vectors.join( QLatin1String(
";;" ) );
3142 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
3144 code += QLatin1String(
"optional " );
3145 code += QLatin1String(
"layer " );
3152 code += QLatin1String(
"hasgeometry " );
3156 code += QLatin1String(
"point " );
3160 code += QLatin1String(
"line " );
3164 code += QLatin1String(
"polygon " );
3168 code += QLatin1String(
"raster " );
3172 code += QLatin1String(
"mesh " );
3176 code += QLatin1String(
"plugin " );
3180 code += QLatin1String(
"pointcloud " );
3184 code += QLatin1String(
"annotation " );
3190 return code.trimmed();
3196 QString def = definition;
3199 if ( def.startsWith( QLatin1String(
"hasgeometry" ), Qt::CaseInsensitive ) )
3202 def = def.mid( 12 );
3205 else if ( def.startsWith( QLatin1String(
"point" ), Qt::CaseInsensitive ) )
3211 else if ( def.startsWith( QLatin1String(
"line" ), Qt::CaseInsensitive ) )
3217 else if ( def.startsWith( QLatin1String(
"polygon" ), Qt::CaseInsensitive ) )
3223 else if ( def.startsWith( QLatin1String(
"raster" ), Qt::CaseInsensitive ) )
3229 else if ( def.startsWith( QLatin1String(
"mesh" ), Qt::CaseInsensitive ) )
3235 else if ( def.startsWith( QLatin1String(
"plugin" ), Qt::CaseInsensitive ) )
3241 else if ( def.startsWith( QLatin1String(
"pointcloud" ), Qt::CaseInsensitive ) )
3244 def = def.mid( 11 );
3247 else if ( def.startsWith( QLatin1String(
"annotation" ), Qt::CaseInsensitive ) )
3250 def = def.mid( 11 );
3261 switch ( outputType )
3265 QString code = QStringLiteral(
"QgsProcessingParameterMapLayer('%1', %2" )
3268 code += QLatin1String(
", optional=True" );
3275 QStringList options;
3279 code += QStringLiteral(
", types=[%1])" ).arg( options.join(
',' ) );
3283 code += QLatin1Char(
')' );
3300 map.insert( QStringLiteral(
"data_types" ), types );
3308 const QVariantList values = map.value( QStringLiteral(
"data_types" ) ).toList();
3309 for (
const QVariant &val : values )
3329 if ( !input.isValid() )
3362 if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( input ) ) )
3365 if ( input.type() != QVariant::String || input.toString().isEmpty() )
3374 const QRegularExpression rx( QStringLiteral(
"^(.*?)\\s*,\\s*(.*?)\\s*,\\s*(.*?)\\s*,\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*$" ) );
3375 const QRegularExpressionMatch match = rx.match( input.toString() );
3376 if ( match.hasMatch() )
3378 bool xMinOk =
false;
3379 ( void )match.captured( 1 ).toDouble( &xMinOk );
3380 bool xMaxOk =
false;
3381 ( void )match.captured( 2 ).toDouble( &xMaxOk );
3382 bool yMinOk =
false;
3383 ( void )match.captured( 3 ).toDouble( &yMinOk );
3384 bool yMaxOk =
false;
3385 ( void )match.captured( 4 ).toDouble( &yMaxOk );
3386 if ( xMinOk && xMaxOk && yMinOk && yMaxOk )
3396 if ( !value.isValid() )
3397 return QStringLiteral(
"None" );
3400 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
3423 const QString wkt = g.
asWkt();
3424 return QStringLiteral(
"QgsGeometry.fromWkt('%1')" ).arg( wkt );
3429 p.insert(
name(), value );
3455 if ( !input.isValid() )
3476 if ( input.type() == QVariant::String )
3478 if ( input.toString().isEmpty() )
3482 const QRegularExpression rx( QStringLiteral(
"^\\s*\\(?\\s*(.*?)\\s*,\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*\\)?\\s*$" ) );
3484 const QRegularExpressionMatch match = rx.match( input.toString() );
3485 if ( match.hasMatch() )
3488 ( void )match.captured( 1 ).toDouble( &xOk );
3490 ( void )match.captured( 2 ).toDouble( &yOk );
3499 if ( !value.isValid() )
3500 return QStringLiteral(
"None" );
3503 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
3523 const QString wkt = g.
asWkt();
3524 return QStringLiteral(
"QgsGeometry.fromWkt('%1')" ).arg( wkt );
3537 const QVariant &defaultValue,
bool optional,
const QList<int> &geometryTypes,
bool allowMultipart )
3539 mGeomTypes( geometryTypes ),
3540 mAllowMultipart( allowMultipart )
3552 if ( !input.isValid() )
3564 return ( anyTypeAllowed || mGeomTypes.contains( input.value<
QgsGeometry>().
type() ) ) &&
3565 ( mAllowMultipart || !input.value<
QgsGeometry>().isMultipart() );
3594 if ( input.type() == QVariant::String )
3596 if ( input.toString().isEmpty() )
3601 const QRegularExpression rx( QStringLiteral(
"^\\s*(?:CRS=(.*);)?(.*?)$" ) );
3603 const QRegularExpressionMatch match = rx.match( input.toString() );
3604 if ( match.hasMatch() )
3609 return ( anyTypeAllowed || mGeomTypes.contains( g.
type() ) ) && ( mAllowMultipart || !g.
isMultipart() );
3629 if ( !value.isValid() )
3630 return QStringLiteral(
"None" );
3682 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
3684 code += QLatin1String(
"optional " );
3685 code +=
type() +
' ';
3687 for (
const int type : mGeomTypes )
3692 code += QLatin1String(
"point " );
3696 code += QLatin1String(
"line " );
3700 code += QLatin1String(
"polygon " );
3704 code += QLatin1String(
"unknown " );
3710 return code.trimmed();
3715 switch ( outputType )
3719 QString code = QStringLiteral(
"QgsProcessingParameterGeometry('%1', %2" )
3722 code += QLatin1String(
", optional=True" );
3724 if ( !mGeomTypes.empty() )
3731 return QStringLiteral(
"PointGeometry" );
3734 return QStringLiteral(
"LineGeometry" );
3737 return QStringLiteral(
"PolygonGeometry" );
3740 return QStringLiteral(
"UnknownGeometry" );
3743 return QStringLiteral(
"NullGeometry" );
3748 QStringList options;
3749 options.reserve( mGeomTypes.size() );
3750 for (
const int type : mGeomTypes )
3754 code += QStringLiteral(
", geometryTypes=[%1 ]" ).arg( options.join(
',' ) );
3757 if ( ! mAllowMultipart )
3759 code += QLatin1String(
", allowMultipart=False" );
3774 for (
const int type : mGeomTypes )
3778 map.insert( QStringLiteral(
"geometrytypes" ), types );
3779 map.insert( QStringLiteral(
"multipart" ), mAllowMultipart );
3787 const QVariantList values = map.value( QStringLiteral(
"geometrytypes" ) ).toList();
3788 for (
const QVariant &val : values )
3790 mGeomTypes << val.toInt();
3792 mAllowMultipart = map.value( QStringLiteral(
"multipart" ) ).toBool();
3803 , mBehavior( behavior )
3804 , mExtension( fileFilter.isEmpty() ? extension : QString() )
3805 , mFileFilter( fileFilter.isEmpty() && extension.isEmpty() ? QObject::tr(
"All files (*.*)" ) : fileFilter )
3817 if ( !input.isValid() )
3825 const QString
string = input.toString().trimmed();
3827 if ( input.type() != QVariant::String ||
string.isEmpty() )
3830 switch ( mBehavior )
3834 if ( !mExtension.isEmpty() )
3836 return string.endsWith( mExtension, Qt::CaseInsensitive );
3838 else if ( !mFileFilter.isEmpty() )
3856 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
3858 code += QLatin1String(
"optional " );
3859 code += ( mBehavior ==
File ? QStringLiteral(
"file" ) : QStringLiteral(
"folder" ) ) +
' ';
3861 return code.trimmed();
3866 switch ( outputType )
3871 QString code = QStringLiteral(
"QgsProcessingParameterFile('%1', %2" )
3874 code += QLatin1String(
", optional=True" );
3875 code += QStringLiteral(
", behavior=%1" ).arg( mBehavior ==
File ? QStringLiteral(
"QgsProcessingParameterFile.File" ) : QStringLiteral(
"QgsProcessingParameterFile.Folder" ) );
3876 if ( !mExtension.isEmpty() )
3877 code += QStringLiteral(
", extension='%1'" ).arg( mExtension );
3878 if ( !mFileFilter.isEmpty() )
3879 code += QStringLiteral(
", fileFilter='%1'" ).arg( mFileFilter );
3890 switch ( mBehavior )
3894 if ( !mFileFilter.isEmpty() )
3895 return mFileFilter != QObject::tr(
"All files (*.*)" ) ? mFileFilter + QStringLiteral(
";;" ) + QObject::tr(
"All files (*.*)" ) : mFileFilter;
3896 else if ( !mExtension.isEmpty() )
3897 return QObject::tr(
"%1 files" ).arg( mExtension.toUpper() ) + QStringLiteral(
" (*." ) + mExtension.toLower() + QStringLiteral(
");;" ) + QObject::tr(
"All files (*.*)" );
3899 return QObject::tr(
"All files (*.*)" );
3911 mFileFilter.clear();
3921 mFileFilter = filter;
3928 map.insert( QStringLiteral(
"behavior" ), mBehavior );
3929 map.insert( QStringLiteral(
"extension" ), mExtension );
3930 map.insert( QStringLiteral(
"filefilter" ), mFileFilter );
3937 mBehavior =
static_cast< Behavior >( map.value( QStringLiteral(
"behavior" ) ).toInt() );
3938 mExtension = map.value( QStringLiteral(
"extension" ) ).toString();
3939 mFileFilter = map.value( QStringLiteral(
"filefilter" ) ).toString();
3950 , mHeaders( headers )
3951 , mNumberRows( numberRows )
3952 , mFixedNumberRows( fixedNumberRows )
3964 if ( !input.isValid() )
3967 if ( input.type() == QVariant::String )
3969 if ( input.toString().isEmpty() )
3973 else if ( input.type() == QVariant::List )
3975 if ( input.toList().isEmpty() )
3979 else if ( input.type() == QVariant::Double || input.type() == QVariant::Int )
3989 if ( !value.isValid() )
3990 return QStringLiteral(
"None" );
3993 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
3996 p.insert(
name(), value );
4004 switch ( outputType )
4008 QString code = QStringLiteral(
"QgsProcessingParameterMatrix('%1', %2" )
4011 code += QLatin1String(
", optional=True" );
4012 code += QStringLiteral(
", numberRows=%1" ).arg( mNumberRows );
4013 code += QStringLiteral(
", hasFixedNumberRows=%1" ).arg( mFixedNumberRows ? QStringLiteral(
"True" ) : QStringLiteral(
"False" ) );
4016 headers.reserve( mHeaders.size() );
4017 for (
const QString &h : mHeaders )
4019 code += QStringLiteral(
", headers=[%1]" ).arg(
headers.join(
',' ) );
4051 return mFixedNumberRows;
4056 mFixedNumberRows = fixedNumberRows;
4062 map.insert( QStringLiteral(
"headers" ), mHeaders );
4063 map.insert( QStringLiteral(
"rows" ), mNumberRows );
4064 map.insert( QStringLiteral(
"fixed_number_rows" ), mFixedNumberRows );
4071 mHeaders = map.value( QStringLiteral(
"headers" ) ).toStringList();
4072 mNumberRows = map.value( QStringLiteral(
"rows" ) ).toInt();
4073 mFixedNumberRows = map.value( QStringLiteral(
"fixed_number_rows" ) ).toBool();
4084 , mLayerType( layerType )
4096 if ( !input.isValid() )
4101 if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( input ) ) )
4107 if ( input.type() == QVariant::String )
4109 if ( input.toString().isEmpty() )
4112 if ( mMinimumNumberInputs > 1 )
4123 else if ( input.type() == QVariant::List )
4125 if ( input.toList().count() < mMinimumNumberInputs )
4128 if ( mMinimumNumberInputs > input.toList().count() )
4136 const auto constToList = input.toList();
4137 for (
const QVariant &v : constToList )
4139 if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( v ) ) )
4148 else if ( input.type() == QVariant::StringList )
4150 if ( input.toStringList().count() < mMinimumNumberInputs )
4153 if ( mMinimumNumberInputs > input.toStringList().count() )
4161 const auto constToStringList = input.toStringList();
4162 for (
const QString &v : constToStringList )
4175 if ( !value.isValid() )
4176 return QStringLiteral(
"None" );
4179 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
4184 if ( value.type() == QVariant::StringList )
4186 const QStringList list = value.toStringList();
4187 parts.reserve( list.count() );
4188 for (
const QString &v : list )
4191 else if ( value.type() == QVariant::List )
4193 const QVariantList list = value.toList();
4194 parts.reserve( list.count() );
4195 for (
const QVariant &v : list )
4198 if ( !parts.isEmpty() )
4199 return parts.join(
',' ).prepend(
'[' ).append(
']' );
4204 p.insert(
name(), value );
4206 if ( !list.isEmpty() )
4209 parts.reserve( list.count() );
4214 return parts.join(
',' ).prepend(
'[' ).append(
']' );
4223 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
4225 code += QLatin1String(
"optional " );
4226 switch ( mLayerType )
4229 code += QLatin1String(
"multiple raster" );
4233 code += QLatin1String(
"multiple file" );
4237 code += QLatin1String(
"multiple vector" );
4241 if (
mDefault.type() == QVariant::List )
4244 const auto constToList =
mDefault.toList();
4245 for (
const QVariant &var : constToList )
4247 parts << var.toString();
4249 code += parts.join(
',' );
4251 else if (
mDefault.type() == QVariant::StringList )
4253 code +=
mDefault.toStringList().join(
',' );
4259 return code.trimmed();
4264 switch ( outputType )
4268 QString code = QStringLiteral(
"QgsProcessingParameterMultipleLayers('%1', %2" )
4271 code += QLatin1String(
", optional=True" );
4275 code += QStringLiteral(
", layerType=%1" ).arg(
layerType );
4286 const QStringList exts;
4287 switch ( mLayerType )
4290 return QObject::tr(
"All files (*.*)" );
4328 return mMinimumNumberInputs;
4340 map.insert( QStringLiteral(
"layer_type" ), mLayerType );
4341 map.insert( QStringLiteral(
"min_inputs" ), mMinimumNumberInputs );
4349 mMinimumNumberInputs = map.value( QStringLiteral(
"min_inputs" ) ).toInt();
4355 QString
type = definition;
4357 const QRegularExpression re( QStringLiteral(
"(.*?)\\s+(.*)" ) );
4358 const QRegularExpressionMatch m = re.match( definition );
4361 type = m.captured( 1 ).toLower().trimmed();
4362 defaultVal = m.captured( 2 );
4365 if (
type == QLatin1String(
"vector" ) )
4367 else if (
type == QLatin1String(
"raster" ) )
4369 else if (
type == QLatin1String(
"file" ) )
4382 QgsMessageLog::logMessage( QObject::tr(
"Invalid number parameter \"%1\": min value %2 is >= max value %3!" ).arg(
name ).arg( mMin ).arg( mMax ), QObject::tr(
"Processing" ) );
4393 QVariant input = value;
4394 if ( !input.isValid() )
4408 const double res = input.toDouble( &ok );
4412 return !( res < mMin || res > mMax );
4417 if ( !value.isValid() )
4418 return QStringLiteral(
"None" );
4421 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
4423 return value.toString();
4430 if ( mMin > std::numeric_limits<double>::lowest() + 1 )
4431 parts << QObject::tr(
"Minimum value: %1" ).arg( mMin );
4432 if ( mMax < std::numeric_limits<double>::max() )
4433 parts << QObject::tr(
"Maximum value: %1" ).arg( mMax );
4435 parts << QObject::tr(
"Default value: %1" ).arg( mDataType ==
Integer ?
mDefault.toInt() :
mDefault.toDouble() );
4436 const QString extra = parts.join( QLatin1String(
"<br />" ) );
4437 if ( !extra.isEmpty() )
4438 text += QStringLiteral(
"<p>%1</p>" ).arg( extra );
4444 switch ( outputType )
4448 QString code = QStringLiteral(
"QgsProcessingParameterNumber('%1', %2" )
4451 code += QLatin1String(
", optional=True" );
4453 code += QStringLiteral(
", type=%1" ).arg( mDataType ==
Integer ? QStringLiteral(
"QgsProcessingParameterNumber.Integer" ) : QStringLiteral(
"QgsProcessingParameterNumber.Double" ) );
4455 if ( mMin != std::numeric_limits<double>::lowest() + 1 )
4456 code += QStringLiteral(
", minValue=%1" ).arg( mMin );
4457 if ( mMax != std::numeric_limits<double>::max() )
4458 code += QStringLiteral(
", maxValue=%1" ).arg( mMax );
4500 map.insert( QStringLiteral(
"min" ), mMin );
4501 map.insert( QStringLiteral(
"max" ), mMax );
4502 map.insert( QStringLiteral(
"data_type" ), mDataType );
4509 mMin = map.value( QStringLiteral(
"min" ) ).toDouble();
4510 mMax = map.value( QStringLiteral(
"max" ) ).toDouble();
4511 mDataType =
static_cast< Type >( map.value( QStringLiteral(
"data_type" ) ).toInt() );
4518 : ( definition.toLower().trimmed() == QLatin1String(
"none" ) ? QVariant() : definition ), isOptional );
4535 if ( !input.isValid() )
4543 if ( input.type() == QVariant::String )
4545 const QStringList list = input.toString().split(
',' );
4546 if ( list.count() != 2 )
4549 list.at( 0 ).toDouble( &ok );
4551 list.at( 1 ).toDouble( &ok2 );
4556 else if ( input.type() == QVariant::List )
4558 if ( input.toList().count() != 2 )
4562 input.toList().at( 0 ).toDouble( &ok );
4564 input.toList().at( 1 ).toDouble( &ok2 );
4575 if ( !value.isValid() )
4576 return QStringLiteral(
"None" );
4579 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
4582 p.insert(
name(), value );
4585 QStringList stringParts;
4586 const auto constParts = parts;
4587 for (
const double v : constParts )
4589 stringParts << QString::number( v );
4591 return stringParts.join(
',' ).prepend(
'[' ).append(
']' );
4596 switch ( outputType )
4600 QString code = QStringLiteral(
"QgsProcessingParameterRange('%1', %2" )
4603 code += QLatin1String(
", optional=True" );
4605 code += QStringLiteral(
", type=%1" ).arg( mDataType ==
QgsProcessingParameterNumber::Integer ? QStringLiteral(
"QgsProcessingParameterNumber.Integer" ) : QStringLiteral(
"QgsProcessingParameterNumber.Double" ) );
4628 map.insert( QStringLiteral(
"data_type" ), mDataType );
4642 : ( definition.toLower().trimmed() == QLatin1String(
"none" ) ? QVariant() : definition ), isOptional );
4658 if ( !input.isValid() )
4666 if ( qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( input ) ) )
4669 if ( input.type() != QVariant::String || input.toString().isEmpty() )
4687 if ( !val.isValid() )
4688 return QStringLiteral(
"None" );
4694 p.insert(
name(), val );
4712 , mOptions( options )
4713 , mAllowMultiple( allowMultiple )
4714 , mUsesStaticStrings( usesStaticStrings )
4726 QVariant input = value;
4727 if ( !input.isValid() )
4740 if ( mUsesStaticStrings )
4742 if ( input.type() == QVariant::List )
4744 if ( !mAllowMultiple )
4747 const QVariantList values = input.toList();
4751 for (
const QVariant &val : values )
4753 if ( !mOptions.contains( val.toString() ) )
4759 else if ( input.type() == QVariant::StringList )
4761 if ( !mAllowMultiple )
4764 const QStringList values = input.toStringList();
4769 if ( values.count() > 1 && !mAllowMultiple )
4772 for (
const QString &val : values )
4774 if ( !mOptions.contains( val ) )
4779 else if ( input.type() == QVariant::String )
4781 const QStringList parts = input.toString().split(
',' );
4782 if ( parts.count() > 1 && !mAllowMultiple )
4785 const auto constParts = parts;
4786 for (
const QString &part : constParts )
4788 if ( !mOptions.contains( part ) )
4796 if ( input.type() == QVariant::List )
4798 if ( !mAllowMultiple )
4801 const QVariantList values = input.toList();
4805 for (
const QVariant &val : values )
4808 const int res = val.toInt( &ok );
4811 else if ( res < 0 || res >= mOptions.count() )
4817 else if ( input.type() == QVariant::String )
4819 const QStringList parts = input.toString().split(
',' );
4820 if ( parts.count() > 1 && !mAllowMultiple )
4823 const auto constParts = parts;
4824 for (
const QString &part : constParts )
4827 const int res = part.toInt( &ok );
4830 else if ( res < 0 || res >= mOptions.count() )
4835 else if ( input.type() == QVariant::Int || input.type() == QVariant::Double )
4838 const int res = input.toInt( &ok );
4841 else if ( res >= 0 && res < mOptions.count() )
4851 if ( !value.isValid() )
4852 return QStringLiteral(
"None" );
4855 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
4857 if ( mUsesStaticStrings )
4859 if ( value.type() == QVariant::StringList )
4862 const QStringList constList = value.toStringList();
4863 for (
const QString &val : constList )
4867 return parts.join(
',' ).prepend(
'[' ).append(
']' );
4869 else if ( value.type() == QVariant::String )
4872 const QStringList constList = value.toString().split(
',' );
4873 if ( constList.count() > 1 )
4875 for (
const QString &val : constList )
4879 return parts.join(
',' ).prepend(
'[' ).append(
']' );
4887 if ( value.type() == QVariant::List )
4890 const auto constToList = value.toList();
4891 for (
const QVariant &val : constToList )
4893 parts << QString::number( static_cast< int >( val.toDouble() ) );
4895 return parts.join(
',' ).prepend(
'[' ).append(
']' );
4897 else if ( value.type() == QVariant::String )
4899 const QStringList parts = value.toString().split(
',' );
4900 if ( parts.count() > 1 )
4902 return parts.join(
',' ).prepend(
'[' ).append(
']' );
4906 return QString::number(
static_cast< int >( value.toDouble() ) );
4912 if ( !value.isValid() )
4918 if ( mUsesStaticStrings )
4924 if ( value.type() == QVariant::List )
4927 const QVariantList toList = value.toList();
4928 parts.reserve( toList.size() );
4929 for (
const QVariant &val : toList )
4931 parts << mOptions.value(
static_cast< int >( val.toDouble() ) );
4933 return parts.join(
',' );
4935 else if ( value.type() == QVariant::String )
4937 const QStringList parts = value.toString().split(
',' );
4938 QStringList comments;
4939 if ( parts.count() > 1 )
4941 for (
const QString &part : parts )
4944 const int val = part.toInt( &ok );
4946 comments << mOptions.value( val );
4948 return comments.join(
',' );
4952 return mOptions.value(
static_cast< int >( value.toDouble() ) );
4958 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
4960 code += QLatin1String(
"optional " );
4961 code += QLatin1String(
"enum " );
4963 if ( mAllowMultiple )
4964 code += QLatin1String(
"multiple " );
4966 if ( mUsesStaticStrings )
4967 code += QLatin1String(
"static " );
4969 code += mOptions.join(
';' ) +
' ';
4972 return code.trimmed();
4977 switch ( outputType )
4981 QString code = QStringLiteral(
"QgsProcessingParameterEnum('%1', %2" )
4984 code += QLatin1String(
", optional=True" );
4987 options.reserve( mOptions.size() );
4988 for (
const QString &o : mOptions )
4990 code += QStringLiteral(
", options=[%1]" ).arg(
options.join(
',' ) );
4992 code += QStringLiteral(
", allowMultiple=%1" ).arg( mAllowMultiple ? QStringLiteral(
"True" ) : QStringLiteral(
"False" ) );
4994 code += QStringLiteral(
", usesStaticStrings=%1" ).arg( mUsesStaticStrings ? QStringLiteral(
"True" ) : QStringLiteral(
"False" ) );
5017 return mAllowMultiple;
5027 return mUsesStaticStrings;
5038 map.insert( QStringLiteral(
"options" ), mOptions );
5039 map.insert( QStringLiteral(
"allow_multiple" ), mAllowMultiple );
5040 map.insert( QStringLiteral(
"uses_static_strings" ), mUsesStaticStrings );
5047 mOptions = map.value( QStringLiteral(
"options" ) ).toStringList();
5048 mAllowMultiple = map.value( QStringLiteral(
"allow_multiple" ) ).toBool();
5049 mUsesStaticStrings = map.value( QStringLiteral(
"uses_static_strings" ) ).toBool();
5056 QString def = definition;
5058 bool multiple =
false;
5059 if ( def.startsWith( QLatin1String(
"multiple" ), Qt::CaseInsensitive ) )
5065 bool staticStrings =
false;
5066 if ( def.startsWith( QLatin1String(
"static" ), Qt::CaseInsensitive ) )
5068 staticStrings =
true;
5072 const QRegularExpression re( QStringLiteral(
"(.*)\\s+(.*?)$" ) );
5073 const QRegularExpressionMatch m = re.match( def );
5074 QString values = def;
5077 values = m.captured( 1 ).trimmed();
5078 defaultVal = m.captured( 2 );
5086 , mMultiLine( multiLine )
5098 if ( !value.isValid() || value.isNull() )
5099 return QStringLiteral(
"None" );
5102 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
5104 const QString s = value.toString();
5110 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
5112 code += QLatin1String(
"optional " );
5113 code += QLatin1String(
"string " );
5116 code += QLatin1String(
"long " );
5119 return code.trimmed();
5124 switch ( outputType )
5128 QString code = QStringLiteral(
"QgsProcessingParameterString('%1', %2" )
5131 code += QLatin1String(
", optional=True" );
5132 code += QStringLiteral(
", multiLine=%1" ).arg( mMultiLine ? QStringLiteral(
"True" ) : QStringLiteral(
"False" ) );
5155 map.insert( QStringLiteral(
"multiline" ), mMultiLine );
5162 mMultiLine = map.value( QStringLiteral(
"multiline" ) ).toBool();
5168 QString def = definition;
5170 if ( def.startsWith( QLatin1String(
"long" ), Qt::CaseInsensitive ) )
5176 if ( def.startsWith(
'"' ) || def.startsWith(
'\'' ) )
5178 if ( def.endsWith(
'"' ) || def.endsWith(
'\'' ) )
5182 if ( def == QLatin1String(
"None" ) )
5205 if ( !value.isValid() )
5206 return QStringLiteral(
"None" );
5208 const QString s = value.toString();
5214 QString code = QStringLiteral(
"##%1=" ).arg(
mName );
5216 code += QLatin1String(
"optional " );
5217 code += QLatin1String(
"authcfg " );
5220 return code.trimmed();
5225 QString def = definition;
5227 if ( def.startsWith(
'"' ) || def.startsWith(
'\'' ) )
5229 if ( def.endsWith(
'"' ) || def.endsWith(
'\'' ) )
5233 if ( def == QLatin1String(
"None" ) )
5246 , mParentLayerParameterName( parentLayerParameterName )
5258 if ( !value.isValid() )
5259 return QStringLiteral(
"None" );
5262 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
5264 const QString s = value.toString();
5270 QStringList depends;
5271 if ( !mParentLayerParameterName.isEmpty() )
5272 depends << mParentLayerParameterName;
5278 switch ( outputType )
5282 QString code = QStringLiteral(
"QgsProcessingParameterExpression('%1', %2" )
5285 code += QLatin1String(
", optional=True" );
5287 code += QStringLiteral(
", parentLayerParameterName='%1'" ).arg( mParentLayerParameterName );
5299 return mParentLayerParameterName;
5310 map.insert( QStringLiteral(
"parent_layer" ), mParentLayerParameterName );
5317 mParentLayerParameterName = map.value( QStringLiteral(
"parent_layer" ) ).toString();
5358 if ( qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( var ) ) )
5361 if ( var.type() != QVariant::String || var.toString().isEmpty() )
5379 if ( !val.isValid() )
5380 return QStringLiteral(
"None" );
5386 p.insert(
name(), val );
5394 switch ( outputType )
5398 QString code = QStringLiteral(
"QgsProcessingParameterVectorLayer('%1', %2" )
5401 code += QLatin1String(
", optional=True" );
5405 QStringList options;
5408 code += QStringLiteral(
", types=[%1]" ).arg( options.join(
',' ) );
5442 map.insert( QStringLiteral(
"data_types" ), types );
5450 const QVariantList values = map.value( QStringLiteral(
"data_types" ) ).toList();
5451 for (
const QVariant &val : values )
5464 const QVariant &defaultValue,
bool optional )