Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix implementation
  • Loading branch information
nyalldawson committed Nov 29, 2021
1 parent 0ab5f17 commit 0543a62
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 74 deletions.
89 changes: 31 additions & 58 deletions src/analysis/processing/qgsalgorithmlayoutatlastopdf.cpp
Expand Up @@ -96,7 +96,7 @@ void QgsLayoutAtlasToPdfAlgorithmBase::initAlgorithm( const QVariantMap & )
addParameter( textFormat.release() );
}

bool QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
QVariantMap QgsLayoutAtlasToPdfAlgorithmBase::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
{
// this needs to be done in main thread, layouts are not thread safe
QgsPrintLayout *l = parameterAsLayout( parameters, QStringLiteral( "LAYOUT" ), context );
Expand Down Expand Up @@ -137,7 +137,7 @@ bool QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm( const QVariantMap &para
}
else if ( !atlas->enabled() )
{
throw QgsProcessingException( QObject::tr( "Layout being export doesn't have an enabled atlas" ) );
throw QgsProcessingException( QObject::tr( "Selected layout does not have atlas functionality enabled" ) );
}

const QgsLayoutExporter exporter( layout.get() );
Expand All @@ -151,7 +151,7 @@ bool QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm( const QVariantMap &para
settings.appendGeoreference = parameterAsBool( parameters, QStringLiteral( "GEOREFERENCE" ), context );
settings.exportMetadata = parameterAsBool( parameters, QStringLiteral( "INCLUDE_METADATA" ), context );
settings.simplifyGeometries = parameterAsBool( parameters, QStringLiteral( "SIMPLIFY" ), context );
settings.textRenderFormat = parameterAsEnum( parameters, QStringLiteral( "TEXT_FORMAT" ), context ) == 0 ? QgsRenderContext::TextFormatAlwaysOutlines : QgsRenderContext::TextFormatAlwaysText;
settings.textRenderFormat = parameterAsEnum( parameters, QStringLiteral( "TEXT_FORMAT" ), context ) == 0 ? Qgis::TextRenderFormat::AlwaysOutlines : Qgis::TextRenderFormat::AlwaysText;

if ( parameterAsBool( parameters, QStringLiteral( "DISABLE_TILED" ), context ) )
settings.flags = settings.flags | QgsLayoutRenderContext::FlagDisableTiledRasterLayerRenders;
Expand All @@ -176,37 +176,12 @@ bool QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm( const QVariantMap &para
}
}

mAtlas = atlas;
mExporter = exporter;
mSettings = settings;
mError = error;

return true;
}

QgsLayoutAtlas *QgsLayoutAtlasToPdfAlgorithmBase::atlas()
{
return mAtlas;
}

QgsLayoutExporter QgsLayoutAtlasToPdfAlgorithmBase::exporter()
{
return mExporter;
}

QgsLayoutExporter::PdfExportSettings QgsLayoutAtlasToPdfAlgorithmBase::settings()
{
return mSettings;
}

QString QgsLayoutAtlasToPdfAlgorithmBase::error()
{
return mError;
return exportAtlas( atlas, exporter, settings, parameters, context, feedback );
}



//
// QgsLayoutAtlasToPdfAlgorithm
//

QString QgsLayoutAtlasToPdfAlgorithm::name() const
{
Expand Down Expand Up @@ -242,24 +217,20 @@ QgsLayoutAtlasToPdfAlgorithm *QgsLayoutAtlasToPdfAlgorithm::createInstance() con
return new QgsLayoutAtlasToPdfAlgorithm();
}

QVariantMap QgsLayoutAtlasToPdfAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
QVariantMap QgsLayoutAtlasToPdfAlgorithm::exportAtlas( QgsLayoutAtlas *atlas, const QgsLayoutExporter &exporter, const QgsLayoutExporter::PdfExportSettings &settings,
const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
{
QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm( parameters, context, feedback );

QgsLayoutAtlas *atlas = QgsLayoutAtlasToPdfAlgorithmBase::atlas();
QgsLayoutExporter exporter = QgsLayoutAtlasToPdfAlgorithmBase::exporter();
QgsLayoutExporter::PdfExportSettings settings = QgsLayoutAtlasToPdfAlgorithmBase::settings();
QString error = QgsLayoutAtlasToPdfAlgorithmBase::error();

const QString dest = parameterAsFileOutput( parameters, QStringLiteral( "OUTPUT" ), context );

QString error;
if ( atlas->updateFeatures() )
{
feedback->pushInfo( QObject::tr( "Exporting %n atlas feature(s)", "", atlas->count() ) );
switch ( exporter.exportToPdf( atlas, dest, settings, error, feedback ) )
{
case QgsLayoutExporter::Success:
{
feedback->pushInfo( QObject::tr( "Successfully exported layout to %1" ).arg( QDir::toNativeSeparators( dest ) ) );
feedback->pushInfo( QObject::tr( "Successfully exported atlas to %1" ).arg( QDir::toNativeSeparators( dest ) ) );
break;
}

Expand All @@ -279,7 +250,7 @@ QVariantMap QgsLayoutAtlasToPdfAlgorithm::processAlgorithm( const QVariantMap &p

case QgsLayoutExporter::SvgLayerError:
case QgsLayoutExporter::Canceled:
// no meaning for imageexports, will not be encountered
// no meaning for PDF exports, will not be encountered
break;
}
}
Expand All @@ -295,7 +266,9 @@ QVariantMap QgsLayoutAtlasToPdfAlgorithm::processAlgorithm( const QVariantMap &p
return outputs;
}

//
// QgsLayoutAtlasToMultiplePdfAlgorithm
//

QString QgsLayoutAtlasToMultiplePdfAlgorithm::name() const
{
Expand Down Expand Up @@ -324,41 +297,41 @@ QString QgsLayoutAtlasToMultiplePdfAlgorithm::shortHelpString() const
void QgsLayoutAtlasToMultiplePdfAlgorithm::initAlgorithm( const QVariantMap & )
{
QgsLayoutAtlasToPdfAlgorithmBase::initAlgorithm();
addParameter( new QgsProcessingParameterExpression( QStringLiteral( "OUTPUT_FILENAME" ), QObject::tr( "Output filename" ), QString( "'output_'||@atlas_featurenumber" ), QString(), false ) );
addParameter( new QgsProcessingParameterExpression( QStringLiteral( "OUTPUT_FILENAME" ), QObject::tr( "Output filename" ), QString(), QStringLiteral( "COVERAGE_LAYER" ), true ) );
addParameter( new QgsProcessingParameterFile( QStringLiteral( "OUTPUT_FOLDER" ), QObject::tr( "Output folder" ), QgsProcessingParameterFile::Folder ) );
}


QgsLayoutAtlasToMultiplePdfAlgorithm *QgsLayoutAtlasToMultiplePdfAlgorithm::createInstance() const
{
return new QgsLayoutAtlasToMultiplePdfAlgorithm();
}


QVariantMap QgsLayoutAtlasToMultiplePdfAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
QVariantMap QgsLayoutAtlasToMultiplePdfAlgorithm::exportAtlas( QgsLayoutAtlas *atlas, const QgsLayoutExporter &exporter, const QgsLayoutExporter::PdfExportSettings &settings,
const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
{
QgsLayoutAtlasToPdfAlgorithmBase::prepareAlgorithm( parameters, context, feedback );

QgsLayoutAtlas *atlas = QgsLayoutAtlasToPdfAlgorithmBase::atlas();
QgsLayoutExporter exporter = QgsLayoutAtlasToPdfAlgorithmBase::exporter();
QgsLayoutExporter::PdfExportSettings settings = QgsLayoutAtlasToPdfAlgorithmBase::settings();
QString error = QgsLayoutAtlasToPdfAlgorithmBase::error();
QString error;

const QString filename = parameterAsString( parameters, QStringLiteral( "OUTPUT_FILENAME" ), context );

const QString destFolder = parameterAsFile( parameters, QStringLiteral( "OUTPUT_FOLDER" ), context );

const QString dest = QStringLiteral( "%1/%2.pdf" ).arg( destFolder, filename );
// the "atlas.pdf" part will be overridden, only the folder is important
const QString dest = QStringLiteral( "%1/atlas.pdf" ).arg( destFolder );

if ( atlas->updateFeatures() )
{
feedback->pushInfo( QObject::tr( "Exporting %n atlas feature(s)", "", atlas->count() ) );

QgsLayoutExporter::ExportResult result;
if ( !atlas->setFilenameExpression( filename, error ) )
if ( atlas->filenameExpression().isEmpty() && filename.isEmpty() )
{
atlas->setFilenameExpression( QStringLiteral( "'output_'||@atlas_featurenumber" ), error );
}
else if ( !filename.isEmpty() )
{
throw QgsProcessingException( QObject::tr( "Output filename could not be set to create filenames for the files, \n"
"use a correct QGIS expression" ) );
if ( !atlas->setFilenameExpression( filename, error ) )
{
throw QgsProcessingException( QObject::tr( "Output file name expression is not valid: %1" ).arg( error ) );
}
}

result = exporter.exportToPdfs( atlas, dest, settings, error, feedback );
Expand All @@ -367,7 +340,7 @@ QVariantMap QgsLayoutAtlasToMultiplePdfAlgorithm::processAlgorithm( const QVaria
{
case QgsLayoutExporter::Success:
{
feedback->pushInfo( QObject::tr( "Successfully exported layout to %1" ).arg( QDir::toNativeSeparators( destFolder ) ) );
feedback->pushInfo( QObject::tr( "Successfully exported atlas to %1" ).arg( QDir::toNativeSeparators( destFolder ) ) );
break;
}

Expand All @@ -387,7 +360,7 @@ QVariantMap QgsLayoutAtlasToMultiplePdfAlgorithm::processAlgorithm( const QVaria

case QgsLayoutExporter::SvgLayerError:
case QgsLayoutExporter::Canceled:
// no meaning for imageexports, will not be encountered
// no meaning for PDF exports, will not be encountered
break;
}
}
Expand Down
25 changes: 9 additions & 16 deletions src/analysis/processing/qgsalgorithmlayoutatlastopdf.h
Expand Up @@ -48,17 +48,14 @@ class QgsLayoutAtlasToPdfAlgorithmBase : public QgsProcessingAlgorithm
QgsLayoutExporter::PdfExportSettings settings();
QString error();

protected:

QVariantMap processAlgorithm( const QVariantMap &parameters,
QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

protected:
virtual QVariantMap exportAtlas( QgsLayoutAtlas *atlas, const QgsLayoutExporter &exporter, const QgsLayoutExporter::PdfExportSettings &settings,
const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) = 0;

bool prepareAlgorithm( const QVariantMap &parameters,
QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
private:
QgsLayoutAtlas *mAtlas;
QgsLayoutExporter mExporter = QgsLayoutExporter( nullptr );
QgsLayoutExporter::PdfExportSettings mSettings;
QString mError;
};


Expand All @@ -79,10 +76,8 @@ class QgsLayoutAtlasToPdfAlgorithm : public QgsLayoutAtlasToPdfAlgorithmBase
QgsLayoutAtlasToPdfAlgorithm *createInstance() const override SIP_FACTORY;

protected:

QVariantMap processAlgorithm( const QVariantMap &parameters,
QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

QVariantMap exportAtlas( QgsLayoutAtlas *atlas, const QgsLayoutExporter &exporter, const QgsLayoutExporter::PdfExportSettings &settings,
const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

};

Expand All @@ -103,10 +98,8 @@ class QgsLayoutAtlasToMultiplePdfAlgorithm : public QgsLayoutAtlasToPdfAlgorithm
QgsLayoutAtlasToMultiplePdfAlgorithm *createInstance() const override SIP_FACTORY;

protected:

QVariantMap processAlgorithm( const QVariantMap &parameters,
QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

QVariantMap exportAtlas( QgsLayoutAtlas *atlas, const QgsLayoutExporter &exporter, const QgsLayoutExporter::PdfExportSettings &settings,
const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

};

Expand Down

0 comments on commit 0543a62

Please sign in to comment.