Branch data Line data Source code
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 : :
16 : : #include "qgsprocessingparametermeshdataset.h"
17 : :
18 : : /// @cond PRIVATE
19 : : ///
20 : 0 : QgsProcessingParameterMeshDatasetGroups::QgsProcessingParameterMeshDatasetGroups( const QString &name,
21 : : const QString &description,
22 : : const QString &meshLayerParameterName,
23 : : const QSet<int> supportedDataType,
24 : : bool optional ):
25 : 0 : QgsProcessingParameterDefinition( name, description, QVariant(), optional, QString() ),
26 : 0 : mMeshLayerParameterName( meshLayerParameterName ),
27 : 0 : mSupportedDataType( supportedDataType )
28 : 0 : {
29 : 0 : }
30 : :
31 : 0 : QgsProcessingParameterDefinition *QgsProcessingParameterMeshDatasetGroups::clone() const
32 : : {
33 : 0 : return new QgsProcessingParameterMeshDatasetGroups( name(), description(), mMeshLayerParameterName, mSupportedDataType );
34 : 0 : }
35 : :
36 : 0 : QString QgsProcessingParameterMeshDatasetGroups::type() const
37 : : {
38 : 0 : return typeName();
39 : : }
40 : :
41 : 0 : bool QgsProcessingParameterMeshDatasetGroups::checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context ) const
42 : : {
43 : : Q_UNUSED( context );
44 : 0 : return valueIsAcceptable( input, mFlags & FlagOptional );
45 : : }
46 : :
47 : 0 : QString QgsProcessingParameterMeshDatasetGroups::valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const
48 : : {
49 : 0 : Q_UNUSED( context );
50 : 0 : QStringList parts;
51 : 0 : const QVariantList variantDatasetGroupIndexes = value.toList();
52 : 0 : for ( const QVariant &variantIndex : variantDatasetGroupIndexes )
53 : 0 : parts.append( QString::number( variantIndex.toInt() ) );
54 : :
55 : 0 : return parts.join( ',' ).prepend( '[' ).append( ']' );
56 : 0 : }
57 : :
58 : 0 : QString QgsProcessingParameterMeshDatasetGroups::asPythonString( QgsProcessing::PythonOutputType outputType ) const
59 : : {
60 : 0 : switch ( outputType )
61 : : {
62 : : case QgsProcessing::PythonQgsProcessingAlgorithmSubclass:
63 : : {
64 : 0 : QString code = QStringLiteral( "QgsProcessingParameterMeshDatasetGroups('%1', '%2'" )
65 : 0 : .arg( name(), description() );
66 : 0 : if ( !mMeshLayerParameterName.isEmpty() )
67 : 0 : code += QStringLiteral( ", meshLayerParameterName=%1" ).arg( QgsProcessingUtils::stringToPythonLiteral( mMeshLayerParameterName ) );
68 : :
69 : 0 : QStringList dt;
70 : 0 : if ( mSupportedDataType.contains( QgsMeshDatasetGroupMetadata::DataOnFaces ) )
71 : 0 : dt.append( QStringLiteral( "QgsMeshDatasetGroupMetadata.DataOnFaces" ) );
72 : 0 : if ( mSupportedDataType.contains( QgsMeshDatasetGroupMetadata::DataOnVertices ) )
73 : 0 : dt.append( QStringLiteral( "QgsMeshDatasetGroupMetadata.DataOnVertices" ) );
74 : 0 : if ( mSupportedDataType.contains( QgsMeshDatasetGroupMetadata::DataOnVolumes ) )
75 : 0 : dt.append( QStringLiteral( "QgsMeshDatasetGroupMetadata.DataOnVolumes" ) );
76 : 0 : if ( mSupportedDataType.contains( QgsMeshDatasetGroupMetadata::DataOnEdges ) )
77 : 0 : dt.append( QStringLiteral( "QgsMeshDatasetGroupMetadata.DataOnEdges" ) );
78 : 0 : if ( !dt.isEmpty() )
79 : : {
80 : 0 : code += QLatin1String( ", dataType=[" );
81 : 0 : code += dt.join( ',' );
82 : 0 : code += ']';
83 : 0 : }
84 : :
85 : 0 : if ( mFlags & FlagOptional )
86 : 0 : code += QLatin1String( ", optional=True" );
87 : 0 : code += ')';
88 : 0 : return code;
89 : 0 : }
90 : : }
91 : 0 : return QString();
92 : 0 : }
93 : :
94 : 0 : QStringList QgsProcessingParameterMeshDatasetGroups::dependsOnOtherParameters() const
95 : : {
96 : 0 : if ( mMeshLayerParameterName.isEmpty() )
97 : 0 : return QStringList();
98 : : else
99 : 0 : return QStringList() << mMeshLayerParameterName;
100 : 0 : }
101 : :
102 : 0 : QString QgsProcessingParameterMeshDatasetGroups::meshLayerParameterName() const
103 : : {
104 : 0 : return mMeshLayerParameterName;
105 : : }
106 : :
107 : 0 : bool QgsProcessingParameterMeshDatasetGroups::isDataTypeSupported( QgsMeshDatasetGroupMetadata::DataType dataType ) const
108 : : {
109 : 0 : return mSupportedDataType.contains( dataType );
110 : : }
111 : :
112 : 0 : QList<int> QgsProcessingParameterMeshDatasetGroups::valueAsDatasetGroup( const QVariant &value )
113 : : {
114 : 0 : if ( !valueIsAcceptable( value, true ) )
115 : 0 : return QList<int>();
116 : 0 : QVariantList list = value.toList();
117 : 0 : QList<int> ret;
118 : 0 : for ( const QVariant &v : list )
119 : 0 : ret.append( v.toInt() );
120 : :
121 : 0 : return ret;
122 : 0 : }
123 : :
124 : 0 : bool QgsProcessingParameterMeshDatasetGroups::valueIsAcceptable( const QVariant &input, bool allowEmpty )
125 : : {
126 : 0 : if ( !input.isValid() )
127 : 0 : return allowEmpty;
128 : :
129 : 0 : if ( input.type() != QVariant::List )
130 : 0 : return false;
131 : 0 : const QVariantList list = input.toList();
132 : :
133 : 0 : if ( !allowEmpty && list.isEmpty() )
134 : 0 : return false;
135 : :
136 : 0 : for ( const QVariant &var : list )
137 : 0 : if ( var.type() != QVariant::Int )
138 : 0 : return false;
139 : :
140 : 0 : return true;
141 : 0 : }
142 : :
143 : 0 : QgsProcessingParameterMeshDatasetTime::QgsProcessingParameterMeshDatasetTime( const QString &name,
144 : : const QString &description,
145 : : const QString &meshLayerParameterName,
146 : : const QString &datasetGroupParameterName )
147 : 0 : : QgsProcessingParameterDefinition( name, description, QVariant() )
148 : 0 : , mMeshLayerParameterName( meshLayerParameterName )
149 : 0 : , mDatasetGroupParameterName( datasetGroupParameterName )
150 : 0 : {
151 : :
152 : 0 : }
153 : :
154 : 0 : QgsProcessingParameterDefinition *QgsProcessingParameterMeshDatasetTime::clone() const
155 : : {
156 : 0 : return new QgsProcessingParameterMeshDatasetTime( name(), description(), mMeshLayerParameterName, mDatasetGroupParameterName );
157 : 0 : }
158 : :
159 : 0 : QString QgsProcessingParameterMeshDatasetTime::type() const
160 : : {
161 : 0 : return typeName();
162 : : }
163 : :
164 : 0 : bool QgsProcessingParameterMeshDatasetTime::checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context ) const
165 : : {
166 : : Q_UNUSED( context );
167 : 0 : return valueIsAcceptable( input, mFlags & FlagOptional );
168 : : }
169 : :
170 : 0 : QString QgsProcessingParameterMeshDatasetTime::valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const
171 : : {
172 : 0 : Q_UNUSED( context );
173 : 0 : QStringList parts;
174 : 0 : const QVariantMap variantTimeDataset = value.toMap();
175 : 0 : parts << QStringLiteral( "'type': " ) + QgsProcessingUtils::variantToPythonLiteral( variantTimeDataset.value( QStringLiteral( "type" ) ).toString() );
176 : :
177 : 0 : if ( variantTimeDataset.value( QStringLiteral( "type" ) ) == QLatin1String( "dataset-time-step" ) )
178 : : {
179 : 0 : QVariantList datasetIndex = variantTimeDataset.value( QStringLiteral( "value" ) ).toList();
180 : 0 : parts << QStringLiteral( "'value': " ) + QString( "QgsMeshDatasetIndex(%1,%2)" ).arg( datasetIndex.at( 0 ).toString() ).arg( datasetIndex.at( 1 ).toString() );
181 : 0 : }
182 : 0 : else if ( variantTimeDataset.value( QStringLiteral( "type" ) ) == QLatin1String( "defined-date-time" ) )
183 : : {
184 : 0 : parts << QStringLiteral( "'value': " ) + QgsProcessingUtils::variantToPythonLiteral( variantTimeDataset.value( QStringLiteral( "value" ) ) );
185 : 0 : }
186 : :
187 : 0 : return parts.join( ',' ).prepend( '{' ).append( '}' );
188 : 0 : }
189 : :
190 : 0 : QString QgsProcessingParameterMeshDatasetTime::asPythonString( QgsProcessing::PythonOutputType outputType ) const
191 : : {
192 : 0 : switch ( outputType )
193 : : {
194 : : case QgsProcessing::PythonQgsProcessingAlgorithmSubclass:
195 : : {
196 : 0 : QString code = QStringLiteral( "QgsProcessingParameterMeshDatasetTime('%1', '%2'" )
197 : 0 : .arg( name(), description() );
198 : 0 : if ( !mMeshLayerParameterName.isEmpty() )
199 : 0 : code += QStringLiteral( ", meshLayerParameterName=%1" ).arg( QgsProcessingUtils::stringToPythonLiteral( mMeshLayerParameterName ) );
200 : :
201 : 0 : if ( !mDatasetGroupParameterName.isEmpty() )
202 : 0 : code += QStringLiteral( ", datasetGroupParameterName=%1" ).arg( QgsProcessingUtils::stringToPythonLiteral( mDatasetGroupParameterName ) );
203 : :
204 : 0 : if ( mFlags & FlagOptional )
205 : 0 : code += QLatin1String( ", optional=True" );
206 : 0 : code += ')';
207 : 0 : return code;
208 : 0 : }
209 : : }
210 : 0 : return QString();
211 : 0 : }
212 : :
213 : 0 : QStringList QgsProcessingParameterMeshDatasetTime::dependsOnOtherParameters() const
214 : : {
215 : 0 : QStringList otherParameters;
216 : 0 : if ( !mMeshLayerParameterName.isEmpty() )
217 : 0 : otherParameters << mMeshLayerParameterName;
218 : :
219 : 0 : if ( !mDatasetGroupParameterName.isEmpty() )
220 : 0 : otherParameters << mMeshLayerParameterName << mDatasetGroupParameterName;
221 : :
222 : 0 : return otherParameters;
223 : 0 : }
224 : :
225 : 0 : QString QgsProcessingParameterMeshDatasetTime::meshLayerParameterName() const
226 : : {
227 : 0 : return mMeshLayerParameterName;
228 : : }
229 : :
230 : 0 : QString QgsProcessingParameterMeshDatasetTime::datasetGroupParameterName() const
231 : : {
232 : 0 : return mDatasetGroupParameterName;
233 : : }
234 : :
235 : 0 : QString QgsProcessingParameterMeshDatasetTime::valueAsTimeType( const QVariant &value )
236 : : {
237 : 0 : if ( !valueIsAcceptable( value, false ) )
238 : 0 : return QString();
239 : :
240 : 0 : return value.toMap().value( QStringLiteral( "type" ) ).toString();
241 : 0 : }
242 : :
243 : 0 : QgsMeshDatasetIndex QgsProcessingParameterMeshDatasetTime::timeValueAsDatasetIndex( const QVariant &value )
244 : : {
245 : 0 : if ( !valueIsAcceptable( value, false ) || valueAsTimeType( value ) != QLatin1String( "dataset-time-step" ) )
246 : 0 : return QgsMeshDatasetIndex( -1, -1 );
247 : :
248 : 0 : QVariantList list = value.toMap().value( QStringLiteral( "value" ) ).toList();
249 : 0 : return QgsMeshDatasetIndex( list.at( 0 ).toInt(), list.at( 1 ).toInt() );
250 : 0 : }
251 : :
252 : 0 : QDateTime QgsProcessingParameterMeshDatasetTime::timeValueAsDefinedDateTime( const QVariant &value )
253 : : {
254 : 0 : if ( !valueIsAcceptable( value, false ) && valueAsTimeType( value ) != QLatin1String( "defined-date-time" ) )
255 : 0 : return QDateTime();
256 : :
257 : 0 : return value.toMap().value( QStringLiteral( "value" ) ).toDateTime();
258 : 0 : }
259 : :
260 : 0 : bool QgsProcessingParameterMeshDatasetTime::valueIsAcceptable( const QVariant &input, bool allowEmpty )
261 : : {
262 : 0 : if ( !input.isValid() )
263 : 0 : return allowEmpty;
264 : :
265 : 0 : if ( input.type() != QVariant::Map )
266 : 0 : return false;
267 : 0 : const QVariantMap map = input.toMap();
268 : 0 : if ( ! map.contains( QStringLiteral( "type" ) ) )
269 : 0 : return false;
270 : :
271 : 0 : QString type = map.value( QStringLiteral( "type" ) ).toString();
272 : 0 : QVariant value = map.value( QStringLiteral( "value" ) );
273 : :
274 : 0 : if ( type == QLatin1String( "static" ) || type == QLatin1String( "current-context-time" ) )
275 : 0 : return true;
276 : :
277 : 0 : if ( type == QLatin1String( "dataset-time-step" ) )
278 : : {
279 : 0 : if ( value.type() != QVariant::List )
280 : 0 : return false;
281 : 0 : QVariantList list = value.toList();
282 : 0 : if ( value.toList().count() != 2 )
283 : 0 : return false;
284 : 0 : if ( list.at( 0 ).type() != QVariant::Int || list.at( 1 ).type() != QVariant::Int )
285 : 0 : return false;
286 : 0 : }
287 : 0 : else if ( type == QLatin1String( "defined-date-time" ) )
288 : : {
289 : 0 : if ( value.type() != QVariant::DateTime )
290 : 0 : return false;
291 : 0 : }
292 : : else
293 : 0 : return false;
294 : :
295 : 0 : return true;
296 : 0 : }
297 : :
298 : : /// @endcond PRIVATE
|