QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
qgsprocessingparametermeshdataset.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsprocessingparametermeshdataset.cpp
3  ---------------------
4  Date : October 2020
5  Copyright : (C) 2020 by Vincent Cloarec
6  Email : vcloarec at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
17 
21  const QString &description,
22  const QString &meshLayerParameterName,
23  const QSet<int> supportedDataType,
24  bool optional ):
25  QgsProcessingParameterDefinition( name, description, QVariant(), optional, QString() ),
26  mMeshLayerParameterName( meshLayerParameterName ),
27  mSupportedDataType( supportedDataType )
28 {
29 }
30 
32 {
33  return new QgsProcessingParameterMeshDatasetGroups( name(), description(), mMeshLayerParameterName, mSupportedDataType );
34 }
35 
37 {
38  return typeName();
39 }
40 
42 {
43  Q_UNUSED( context );
44  return valueIsAcceptable( input, mFlags & FlagOptional );
45 }
46 
47 QString QgsProcessingParameterMeshDatasetGroups::valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const
48 {
49  Q_UNUSED( context );
50  QStringList parts;
51  const QVariantList variantDatasetGroupIndexes = value.toList();
52  for ( const QVariant &variantIndex : variantDatasetGroupIndexes )
53  parts.append( QString::number( variantIndex.toInt() ) );
54 
55  return parts.join( ',' ).prepend( '[' ).append( ']' );
56 }
57 
59 {
60  switch ( outputType )
61  {
63  {
64  QString code = QStringLiteral( "QgsProcessingParameterMeshDatasetGroups('%1', '%2'" )
65  .arg( name(), description() );
66  if ( !mMeshLayerParameterName.isEmpty() )
67  code += QStringLiteral( ", meshLayerParameterName=%1" ).arg( QgsProcessingUtils::stringToPythonLiteral( mMeshLayerParameterName ) );
68 
69  QStringList dt;
70  if ( mSupportedDataType.contains( QgsMeshDatasetGroupMetadata::DataOnFaces ) )
71  dt.append( QStringLiteral( "QgsMeshDatasetGroupMetadata.DataOnFaces" ) );
72  if ( mSupportedDataType.contains( QgsMeshDatasetGroupMetadata::DataOnVertices ) )
73  dt.append( QStringLiteral( "QgsMeshDatasetGroupMetadata.DataOnVertices" ) );
74  if ( mSupportedDataType.contains( QgsMeshDatasetGroupMetadata::DataOnVolumes ) )
75  dt.append( QStringLiteral( "QgsMeshDatasetGroupMetadata.DataOnVolumes" ) );
76  if ( mSupportedDataType.contains( QgsMeshDatasetGroupMetadata::DataOnEdges ) )
77  dt.append( QStringLiteral( "QgsMeshDatasetGroupMetadata.DataOnEdges" ) );
78  if ( !dt.isEmpty() )
79  {
80  code += QLatin1String( ", dataType=[" );
81  code += dt.join( ',' );
82  code += ']';
83  }
84 
85  if ( mFlags & FlagOptional )
86  code += QLatin1String( ", optional=True" );
87  code += ')';
88  return code;
89  }
90  }
91  return QString();
92 }
93 
95 {
96  if ( mMeshLayerParameterName.isEmpty() )
97  return QStringList();
98  else
99  return QStringList() << mMeshLayerParameterName;
100 }
101 
103 {
104  return mMeshLayerParameterName;
105 }
106 
108 {
109  return mSupportedDataType.contains( dataType );
110 }
111 
112 QList<int> QgsProcessingParameterMeshDatasetGroups::valueAsDatasetGroup( const QVariant &value )
113 {
114  if ( !valueIsAcceptable( value, true ) )
115  return QList<int>();
116  QVariantList list = value.toList();
117  QList<int> ret;
118  for ( const QVariant &v : list )
119  ret.append( v.toInt() );
120 
121  return ret;
122 }
123 
124 bool QgsProcessingParameterMeshDatasetGroups::valueIsAcceptable( const QVariant &input, bool allowEmpty )
125 {
126  if ( !input.isValid() )
127  return allowEmpty;
128 
129  if ( input.type() != QVariant::List )
130  return false;
131  const QVariantList list = input.toList();
132 
133  if ( !allowEmpty && list.isEmpty() )
134  return false;
135 
136  for ( const QVariant &var : list )
137  if ( var.type() != QVariant::Int )
138  return false;
139 
140  return true;
141 }
142 
144  const QString &description,
145  const QString &meshLayerParameterName,
146  const QString &datasetGroupParameterName )
147  : QgsProcessingParameterDefinition( name, description, QVariant() )
148  , mMeshLayerParameterName( meshLayerParameterName )
149  , mDatasetGroupParameterName( datasetGroupParameterName )
150 {
151 
152 }
153 
155 {
156  return new QgsProcessingParameterMeshDatasetTime( name(), description(), mMeshLayerParameterName, mDatasetGroupParameterName );
157 }
158 
160 {
161  return typeName();
162 }
163 
165 {
166  Q_UNUSED( context );
167  return valueIsAcceptable( input, mFlags & FlagOptional );
168 }
169 
170 QString QgsProcessingParameterMeshDatasetTime::valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const
171 {
172  Q_UNUSED( context );
173  QStringList parts;
174  const QVariantMap variantTimeDataset = value.toMap();
175  parts << QStringLiteral( "'type': " ) + QgsProcessingUtils::variantToPythonLiteral( variantTimeDataset.value( QStringLiteral( "type" ) ).toString() );
176 
177  if ( variantTimeDataset.value( QStringLiteral( "type" ) ) == QLatin1String( "dataset-time-step" ) )
178  {
179  QVariantList datasetIndex = variantTimeDataset.value( QStringLiteral( "value" ) ).toList();
180  parts << QStringLiteral( "'value': " ) + QString( "QgsMeshDatasetIndex(%1,%2)" ).arg( datasetIndex.at( 0 ).toString() ).arg( datasetIndex.at( 1 ).toString() );
181  }
182  else if ( variantTimeDataset.value( QStringLiteral( "type" ) ) == QLatin1String( "defined-date-time" ) )
183  {
184  parts << QStringLiteral( "'value': " ) + QgsProcessingUtils::variantToPythonLiteral( variantTimeDataset.value( QStringLiteral( "value" ) ) );
185  }
186 
187  return parts.join( ',' ).prepend( '{' ).append( '}' );
188 }
189 
191 {
192  switch ( outputType )
193  {
195  {
196  QString code = QStringLiteral( "QgsProcessingParameterMeshDatasetTime('%1', '%2'" )
197  .arg( name(), description() );
198  if ( !mMeshLayerParameterName.isEmpty() )
199  code += QStringLiteral( ", meshLayerParameterName=%1" ).arg( QgsProcessingUtils::stringToPythonLiteral( mMeshLayerParameterName ) );
200 
201  if ( !mDatasetGroupParameterName.isEmpty() )
202  code += QStringLiteral( ", datasetGroupParameterName=%1" ).arg( QgsProcessingUtils::stringToPythonLiteral( mDatasetGroupParameterName ) );
203 
204  if ( mFlags & FlagOptional )
205  code += QLatin1String( ", optional=True" );
206  code += ')';
207  return code;
208  }
209  }
210  return QString();
211 }
212 
214 {
215  QStringList otherParameters;
216  if ( !mMeshLayerParameterName.isEmpty() )
217  otherParameters << mMeshLayerParameterName;
218 
219  if ( !mDatasetGroupParameterName.isEmpty() )
220  otherParameters << mMeshLayerParameterName << mDatasetGroupParameterName;
221 
222  return otherParameters;
223 }
224 
226 {
227  return mMeshLayerParameterName;
228 }
229 
231 {
232  return mDatasetGroupParameterName;
233 }
234 
235 QString QgsProcessingParameterMeshDatasetTime::valueAsTimeType( const QVariant &value )
236 {
237  if ( !valueIsAcceptable( value, false ) )
238  return QString();
239 
240  return value.toMap().value( QStringLiteral( "type" ) ).toString();
241 }
242 
244 {
245  if ( !valueIsAcceptable( value, false ) || valueAsTimeType( value ) != QLatin1String( "dataset-time-step" ) )
246  return QgsMeshDatasetIndex( -1, -1 );
247 
248  QVariantList list = value.toMap().value( QStringLiteral( "value" ) ).toList();
249  return QgsMeshDatasetIndex( list.at( 0 ).toInt(), list.at( 1 ).toInt() );
250 }
251 
253 {
254  if ( !valueIsAcceptable( value, false ) && valueAsTimeType( value ) != QLatin1String( "defined-date-time" ) )
255  return QDateTime();
256 
257  return value.toMap().value( QStringLiteral( "value" ) ).toDateTime();
258 }
259 
260 bool QgsProcessingParameterMeshDatasetTime::valueIsAcceptable( const QVariant &input, bool allowEmpty )
261 {
262  if ( !input.isValid() )
263  return allowEmpty;
264 
265  if ( input.type() != QVariant::Map )
266  return false;
267  const QVariantMap map = input.toMap();
268  if ( ! map.contains( QStringLiteral( "type" ) ) )
269  return false;
270 
271  QString type = map.value( QStringLiteral( "type" ) ).toString();
272  QVariant value = map.value( QStringLiteral( "value" ) );
273 
274  if ( type == QLatin1String( "static" ) || type == QLatin1String( "current-context-time" ) )
275  return true;
276 
277  if ( type == QLatin1String( "dataset-time-step" ) )
278  {
279  if ( value.type() != QVariant::List )
280  return false;
281  QVariantList list = value.toList();
282  if ( value.toList().count() != 2 )
283  return false;
284  if ( list.at( 0 ).type() != QVariant::Int || list.at( 1 ).type() != QVariant::Int )
285  return false;
286  }
287  else if ( type == QLatin1String( "defined-date-time" ) )
288  {
289  if ( value.type() != QVariant::DateTime )
290  return false;
291  }
292  else
293  return false;
294 
295  return true;
296 }
297 
DataType
Location of where data is specified for datasets in the dataset group.
@ DataOnEdges
Data is defined on edges.
@ DataOnFaces
Data is defined on faces.
@ DataOnVertices
Data is defined on vertices.
@ DataOnVolumes
Data is defined on volumes.
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
Contains information about the context in which a processing algorithm is executed.
Base class for the definition of processing parameters.
QString description() const
Returns the description for the parameter.
QString name() const
Returns the name of the parameter.
QgsProcessingParameterMeshDatasetGroups(const QString &name, const QString &description=QString(), const QString &meshLayerParameterName=QString(), QSet< int > supportedDataType=QSet< int >(), bool optional=false)
Constructor.
static QString typeName()
Returns the type name for the parameter class.
static QList< int > valueAsDatasetGroup(const QVariant &value)
Returns the value as a list if dataset group indexes.
QStringList dependsOnOtherParameters() const override
Returns a list of other parameter names on which this parameter is dependent (e.g.
QString valueAsPythonString(const QVariant &value, QgsProcessingContext &context) const override
Returns a string version of the parameter input value, which is suitable for use as an input paramete...
bool checkValueIsAcceptable(const QVariant &input, QgsProcessingContext *context=nullptr) const override
Checks whether the specified input value is acceptable for the parameter.
QString type() const override
Unique parameter type name.
QString asPythonString(QgsProcessing::PythonOutputType outputType=QgsProcessing::PythonQgsProcessingAlgorithmSubclass) const override
Returns the parameter definition as a Python command which can be used within a Python Processing scr...
QString meshLayerParameterName() const
Returns the name of the mesh layer parameter.
bool isDataTypeSupported(QgsMeshDatasetGroupMetadata::DataType dataType) const
Returns whether the data type is supported by the parameter.
QgsProcessingParameterDefinition * clone() const override
Creates a clone of the parameter definition.
QgsProcessingParameterMeshDatasetTime(const QString &name, const QString &description=QString(), const QString &meshLayerParameterName=QString(), const QString &datasetGroupParameterName=QString())
Constructor.
QString valueAsPythonString(const QVariant &value, QgsProcessingContext &context) const override
Returns a string version of the parameter input value, which is suitable for use as an input paramete...
QgsProcessingParameterDefinition * clone() const override
Creates a clone of the parameter definition.
static QString valueAsTimeType(const QVariant &value)
Returns the dataset value time type as a string : current-context-time : the time is store in the pro...
QString asPythonString(QgsProcessing::PythonOutputType outputType=QgsProcessing::PythonQgsProcessingAlgorithmSubclass) const override
Returns the parameter definition as a Python command which can be used within a Python Processing scr...
QString datasetGroupParameterName() const
Returns the name of the dataset groups parameter.
QString meshLayerParameterName() const
Returns the name of the mesh layer parameter.
static QgsMeshDatasetIndex timeValueAsDatasetIndex(const QVariant &value)
Returns the value as a QgsMeshDatasetIndex if the value has "dataset-time-step" type.
QStringList dependsOnOtherParameters() const override
Returns a list of other parameter names on which this parameter is dependent (e.g.
static QString typeName()
Returns the type name for the parameter class.
bool checkValueIsAcceptable(const QVariant &input, QgsProcessingContext *context=nullptr) const override
Checks whether the specified input value is acceptable for the parameter.
static QDateTime timeValueAsDefinedDateTime(const QVariant &value)
Returns the value as a QDateTime if the value has "defined-date-time" type.
QString type() const override
Unique parameter type name.
static QString stringToPythonLiteral(const QString &string)
Converts a string to a Python string literal.
static QString variantToPythonLiteral(const QVariant &value)
Converts a variant to a Python literal.
PythonOutputType
Available Python output types.
Definition: qgsprocessing.h:59
@ PythonQgsProcessingAlgorithmSubclass
Full Python QgsProcessingAlgorithm subclass.
Definition: qgsprocessing.h:60