26
26
27
27
// /@cond PRIVATE
28
28
29
- QString QgsLayoutAtlasToPdfAlgorithm::name () const
30
- {
31
- return QStringLiteral ( " atlaslayouttopdf" );
32
- }
33
-
34
- QString QgsLayoutAtlasToPdfAlgorithm::displayName () const
35
- {
36
- return QObject::tr ( " Export atlas layout as PDF" );
37
- }
29
+ // QgsLayoutAtlasToPdfAlgorithmBase
38
30
39
- QStringList QgsLayoutAtlasToPdfAlgorithm ::tags () const
31
+ QStringList QgsLayoutAtlasToPdfAlgorithmBase ::tags () const
40
32
{
41
33
return QObject::tr ( " layout,atlas,composer,composition,save" ).split ( ' ,' );
42
34
}
43
35
44
- QString QgsLayoutAtlasToPdfAlgorithm ::group () const
36
+ QString QgsLayoutAtlasToPdfAlgorithmBase ::group () const
45
37
{
46
38
return QObject::tr ( " Cartography" );
47
39
}
48
40
49
- QString QgsLayoutAtlasToPdfAlgorithm ::groupId () const
41
+ QString QgsLayoutAtlasToPdfAlgorithmBase ::groupId () const
50
42
{
51
43
return QStringLiteral ( " cartography" );
52
44
}
53
45
54
- QString QgsLayoutAtlasToPdfAlgorithm::shortDescription () const
55
- {
56
- return QObject::tr ( " Exports an atlas layout as a PDF." );
57
- }
58
-
59
- QString QgsLayoutAtlasToPdfAlgorithm::shortHelpString () const
46
+ QgsProcessingAlgorithm::Flags QgsLayoutAtlasToPdfAlgorithmBase::flags () const
60
47
{
61
- return QObject::tr ( " This algorithm outputs an atlas layout as a PDF file.\n\n "
62
- " If a coverage layer is set, the selected layout's atlas settings exposed in this algorithm "
63
- " will be overwritten. In this case, an empty filter or sort by expression will turn those "
64
- " settings off." );
48
+ return QgsProcessingAlgorithm::flags () | FlagNoThreading;
65
49
}
66
50
67
- void QgsLayoutAtlasToPdfAlgorithm ::initAlgorithm ( const QVariantMap & )
51
+ void QgsLayoutAtlasToPdfAlgorithmBase ::initAlgorithm ( const QVariantMap & )
68
52
{
69
53
addParameter ( new QgsProcessingParameterLayout ( QStringLiteral ( " LAYOUT" ), QObject::tr ( " Atlas layout" ) ) );
70
54
@@ -73,8 +57,6 @@ void QgsLayoutAtlasToPdfAlgorithm::initAlgorithm( const QVariantMap & )
73
57
addParameter ( new QgsProcessingParameterExpression ( QStringLiteral ( " SORTBY_EXPRESSION" ), QObject::tr ( " Sort expression" ), QString (), QStringLiteral ( " COVERAGE_LAYER" ), true ) );
74
58
addParameter ( new QgsProcessingParameterBoolean ( QStringLiteral ( " SORTBY_REVERSE" ), QObject::tr ( " Reverse sort order (used when a sort expression is provided)" ), false , true ) );
75
59
76
- addParameter ( new QgsProcessingParameterFileDestination ( QStringLiteral ( " OUTPUT" ), QObject::tr ( " PDF file" ), QObject::tr ( " PDF Format" ) + " (*.pdf *.PDF)" ) );
77
-
78
60
std::unique_ptr< QgsProcessingParameterMultipleLayers > layersParam = std::make_unique< QgsProcessingParameterMultipleLayers>( QStringLiteral ( " LAYERS" ), QObject::tr ( " Map layers to assign to unlocked map item(s)" ), QgsProcessing::TypeMapLayer, QVariant (), true );
79
61
layersParam->setFlags ( layersParam->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
80
62
addParameter ( layersParam.release () );
@@ -114,17 +96,7 @@ void QgsLayoutAtlasToPdfAlgorithm::initAlgorithm( const QVariantMap & )
114
96
addParameter ( textFormat.release () );
115
97
}
116
98
117
- QgsProcessingAlgorithm::Flags QgsLayoutAtlasToPdfAlgorithm::flags () const
118
- {
119
- return QgsProcessingAlgorithm::flags () | FlagNoThreading;
120
- }
121
-
122
- QgsLayoutAtlasToPdfAlgorithm *QgsLayoutAtlasToPdfAlgorithm::createInstance () const
123
- {
124
- return new QgsLayoutAtlasToPdfAlgorithm ();
125
- }
126
-
127
- QVariantMap QgsLayoutAtlasToPdfAlgorithm::processAlgorithm ( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
99
+ bool QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm ( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
128
100
{
129
101
// this needs to be done in main thread, layouts are not thread safe
130
102
QgsPrintLayout *l = parameterAsLayout ( parameters, QStringLiteral ( " LAYOUT" ), context );
@@ -179,7 +151,7 @@ QVariantMap QgsLayoutAtlasToPdfAlgorithm::processAlgorithm( const QVariantMap &p
179
151
settings.appendGeoreference = parameterAsBool ( parameters, QStringLiteral ( " GEOREFERENCE" ), context );
180
152
settings.exportMetadata = parameterAsBool ( parameters, QStringLiteral ( " INCLUDE_METADATA" ), context );
181
153
settings.simplifyGeometries = parameterAsBool ( parameters, QStringLiteral ( " SIMPLIFY" ), context );
182
- settings.textRenderFormat = parameterAsEnum ( parameters, QStringLiteral ( " TEXT_FORMAT" ), context ) == 0 ? Qgis::TextRenderFormat::AlwaysOutlines : Qgis::TextRenderFormat::AlwaysText ;
154
+ settings.textRenderFormat = parameterAsEnum ( parameters, QStringLiteral ( " TEXT_FORMAT" ), context ) == 0 ? QgsRenderContext::TextFormatAlwaysOutlines : QgsRenderContext::TextFormatAlwaysText ;
183
155
184
156
if ( parameterAsBool ( parameters, QStringLiteral ( " DISABLE_TILED" ), context ) )
185
157
settings.flags = settings.flags | QgsLayoutRenderContext::FlagDisableTiledRasterLayerRenders;
@@ -204,6 +176,81 @@ QVariantMap QgsLayoutAtlasToPdfAlgorithm::processAlgorithm( const QVariantMap &p
204
176
}
205
177
}
206
178
179
+ mAtlas = atlas;
180
+ mExporter = exporter;
181
+ mSettings = settings;
182
+ mError = error;
183
+
184
+ return true ;
185
+ }
186
+
187
+ QgsLayoutAtlas *QgsLayoutAtlasToPdfAlgorithmBase::atlas ()
188
+ {
189
+ return mAtlas ;
190
+ }
191
+
192
+ QgsLayoutExporter QgsLayoutAtlasToPdfAlgorithmBase::exporter ()
193
+ {
194
+ return mExporter ;
195
+ }
196
+
197
+ QgsLayoutExporter::PdfExportSettings QgsLayoutAtlasToPdfAlgorithmBase::settings ()
198
+ {
199
+ return mSettings ;
200
+ }
201
+
202
+ QString QgsLayoutAtlasToPdfAlgorithmBase::error ()
203
+ {
204
+ return mError ;
205
+ }
206
+
207
+
208
+
209
+ // QgsLayoutAtlasToPdfAlgorithm
210
+
211
+ QString QgsLayoutAtlasToPdfAlgorithm::name () const
212
+ {
213
+ return QStringLiteral ( " atlaslayouttopdf" );
214
+ }
215
+
216
+ QString QgsLayoutAtlasToPdfAlgorithm::displayName () const
217
+ {
218
+ return QObject::tr ( " Export atlas layout as PDF (single file)" );
219
+ }
220
+
221
+ QString QgsLayoutAtlasToPdfAlgorithm::shortDescription () const
222
+ {
223
+ return QObject::tr ( " Exports an atlas layout as a single PDF file." );
224
+ }
225
+
226
+ QString QgsLayoutAtlasToPdfAlgorithm::shortHelpString () const
227
+ {
228
+ return QObject::tr ( " This algorithm outputs an atlas layout as a single PDF file.\n\n "
229
+ " If a coverage layer is set, the selected layout's atlas settings exposed in this algorithm "
230
+ " will be overwritten. In this case, an empty filter or sort by expression will turn those "
231
+ " settings off." );
232
+ }
233
+
234
+ void QgsLayoutAtlasToPdfAlgorithm::initAlgorithm ( const QVariantMap & )
235
+ {
236
+ QgsLayoutAtlasToPdfAlgorithmBase::initAlgorithm ();
237
+ addParameter ( new QgsProcessingParameterFileDestination ( QStringLiteral ( " OUTPUT" ), QObject::tr ( " PDF file" ), QObject::tr ( " PDF Format" ) + " (*.pdf *.PDF)" ) );
238
+ }
239
+
240
+ QgsLayoutAtlasToPdfAlgorithm *QgsLayoutAtlasToPdfAlgorithm::createInstance () const
241
+ {
242
+ return new QgsLayoutAtlasToPdfAlgorithm ();
243
+ }
244
+
245
+ QVariantMap QgsLayoutAtlasToPdfAlgorithm::processAlgorithm ( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
246
+ {
247
+ QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm ( parameters, context, feedback );
248
+
249
+ QgsLayoutAtlas *atlas = QgsLayoutAtlasToPdfAlgorithmBase::atlas ();
250
+ QgsLayoutExporter exporter = QgsLayoutAtlasToPdfAlgorithmBase::exporter ();
251
+ QgsLayoutExporter::PdfExportSettings settings = QgsLayoutAtlasToPdfAlgorithmBase::settings ();
252
+ QString error = QgsLayoutAtlasToPdfAlgorithmBase::error ();
253
+
207
254
const QString dest = parameterAsFileOutput ( parameters, QStringLiteral ( " OUTPUT" ), context );
208
255
if ( atlas->updateFeatures () )
209
256
{
@@ -248,5 +295,113 @@ QVariantMap QgsLayoutAtlasToPdfAlgorithm::processAlgorithm( const QVariantMap &p
248
295
return outputs;
249
296
}
250
297
298
+ // QgsLayoutAtlasToMultiplePdfAlgorithm
299
+
300
+ QString QgsLayoutAtlasToMultiplePdfAlgorithm::name () const
301
+ {
302
+ return QStringLiteral ( " atlaslayouttomultiplepdf" );
303
+ }
304
+
305
+ QString QgsLayoutAtlasToMultiplePdfAlgorithm::displayName () const
306
+ {
307
+ return QObject::tr ( " Export atlas layout as PDF (multiple files)" );
308
+ }
309
+
310
+ QString QgsLayoutAtlasToMultiplePdfAlgorithm::shortDescription () const
311
+ {
312
+ return QObject::tr ( " Exports an atlas layout to multiple PDF files." );
313
+ }
314
+
315
+ QString QgsLayoutAtlasToMultiplePdfAlgorithm::shortHelpString () const
316
+ {
317
+ return QObject::tr ( " This algorithm outputs an atlas layout to multiple PDF files.\n\n "
318
+ " If a coverage layer is set, the selected layout's atlas settings exposed in this algorithm "
319
+ " will be overwritten. In this case, an empty filter or sort by expression will turn those "
320
+ " settings off.\n "
321
+ );
322
+ }
323
+
324
+ void QgsLayoutAtlasToMultiplePdfAlgorithm::initAlgorithm ( const QVariantMap & )
325
+ {
326
+ QgsLayoutAtlasToPdfAlgorithmBase::initAlgorithm ();
327
+ addParameter ( new QgsProcessingParameterExpression ( QStringLiteral ( " OUTPUT_FILENAME" ), QObject::tr ( " Output filename" ), QString ( " 'output_'||@atlas_featurenumber" ), QString (), false ) );
328
+ addParameter ( new QgsProcessingParameterFile ( QStringLiteral ( " OUTPUT_FOLDER" ), QObject::tr ( " Output folder" ), QgsProcessingParameterFile::Folder ) );
329
+ }
330
+
331
+
332
+ QgsLayoutAtlasToMultiplePdfAlgorithm *QgsLayoutAtlasToMultiplePdfAlgorithm::createInstance () const
333
+ {
334
+ return new QgsLayoutAtlasToMultiplePdfAlgorithm ();
335
+ }
336
+
337
+
338
+ QVariantMap QgsLayoutAtlasToMultiplePdfAlgorithm::processAlgorithm ( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
339
+ {
340
+ QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm ( parameters, context, feedback );
341
+
342
+ QgsLayoutAtlas *atlas = QgsLayoutAtlasToPdfAlgorithmBase::atlas ();
343
+ QgsLayoutExporter exporter = QgsLayoutAtlasToPdfAlgorithmBase::exporter ();
344
+ QgsLayoutExporter::PdfExportSettings settings = QgsLayoutAtlasToPdfAlgorithmBase::settings ();
345
+ QString error = QgsLayoutAtlasToPdfAlgorithmBase::error ();
346
+
347
+ const QString filename = parameterAsString ( parameters, QStringLiteral ( " OUTPUT_FILENAME" ), context );
348
+
349
+ const QString destFolder = parameterAsFile ( parameters, QStringLiteral ( " OUTPUT_FOLDER" ), context );
350
+
351
+ const QString dest = QStringLiteral ( " %1/%2.pdf" ).arg ( destFolder, filename );
352
+
353
+ if ( atlas->updateFeatures () )
354
+ {
355
+ feedback->pushInfo ( QObject::tr ( " Exporting %n atlas feature(s)" , " " , atlas->count () ) );
356
+
357
+ QgsLayoutExporter::ExportResult result;
358
+ if ( !atlas->setFilenameExpression ( filename, error ) )
359
+ {
360
+ throw QgsProcessingException ( QObject::tr ( " Output filename could not be set to create filenames for the files, \n "
361
+ " use a correct QGIS expression" ) );
362
+ }
363
+
364
+ result = exporter.exportToPdfs ( atlas, dest, settings, error, feedback );
365
+
366
+ switch ( result )
367
+ {
368
+ case QgsLayoutExporter::Success:
369
+ {
370
+ feedback->pushInfo ( QObject::tr ( " Successfully exported layout to %1" ).arg ( QDir::toNativeSeparators ( destFolder ) ) );
371
+ break ;
372
+ }
373
+
374
+ case QgsLayoutExporter::FileError:
375
+ throw QgsProcessingException ( QObject::tr ( " Cannot write to %1.\n\n This file may be open in another application." ).arg ( QDir::toNativeSeparators ( dest ) ) );
376
+
377
+ case QgsLayoutExporter::PrintError:
378
+ throw QgsProcessingException ( QObject::tr ( " Could not create print device." ) );
379
+
380
+ case QgsLayoutExporter::MemoryError:
381
+ throw QgsProcessingException ( QObject::tr ( " Trying to create the image "
382
+ " resulted in a memory overflow.\n\n "
383
+ " Please try a lower resolution or a smaller paper size." ) );
384
+
385
+ case QgsLayoutExporter::IteratorError:
386
+ throw QgsProcessingException ( QObject::tr ( " Error encountered while exporting atlas." ) );
387
+
388
+ case QgsLayoutExporter::SvgLayerError:
389
+ case QgsLayoutExporter::Canceled:
390
+ // no meaning for imageexports, will not be encountered
391
+ break ;
392
+ }
393
+ }
394
+ else
395
+ {
396
+ feedback->reportError ( QObject::tr ( " No atlas features found" ) );
397
+ }
398
+
399
+ feedback->setProgress ( 100 );
400
+
401
+ QVariantMap outputs;
402
+ outputs.insert ( QStringLiteral ( " OUTPUT_FOLDER" ), destFolder );
403
+ return outputs;
404
+ }
405
+
251
406
// /@endcond
252
407
0 commit comments