27 QString QgsLayoutMapExtentToLayerAlgorithm::name()
 const 
   29   return QStringLiteral( 
"printlayoutmapextenttolayer" );
 
   32 QString QgsLayoutMapExtentToLayerAlgorithm::displayName()
 const 
   34   return QObject::tr( 
"Print layout map extent to layer" );
 
   37 QStringList QgsLayoutMapExtentToLayerAlgorithm::tags()
 const 
   39   return QObject::tr( 
"layout,composer,composition,visible" ).split( 
',' );
 
   42 QString QgsLayoutMapExtentToLayerAlgorithm::group()
 const 
   44   return QObject::tr( 
"Cartography" );
 
   47 QString QgsLayoutMapExtentToLayerAlgorithm::groupId()
 const 
   49   return QStringLiteral( 
"cartography" );
 
   52 QString QgsLayoutMapExtentToLayerAlgorithm::shortDescription()
 const 
   54   return QObject::tr( 
"Creates a polygon layer containing the extent of a print layout map item." );
 
   57 void QgsLayoutMapExtentToLayerAlgorithm::initAlgorithm( 
const QVariantMap & )
 
   61   auto crsParam = qgis::make_unique< QgsProcessingParameterCrs >( QStringLiteral( 
"CRS" ), QObject::tr( 
"Override CRS" ), QVariant(), 
true );
 
   63   addParameter( crsParam.release() );
 
   71 QString QgsLayoutMapExtentToLayerAlgorithm::shortHelpString()
 const 
   73   return QObject::tr( 
"This algorithm creates a polygon layer containing the extent of a print layout map item (or items), " 
   74                       "with attributes specifying the map size (in layout units), scale and rotation.\n\n" 
   75                       "If the map item parameter is specified, then only the matching map extent will be exported. If it " 
   76                       "is not specified, all map extents from the layout will be exported.\n\n" 
   77                       "Optionally, a specific output CRS can be specified. If it is not specified, the original map " 
   78                       "item CRS will be used." );
 
   81 QgsLayoutMapExtentToLayerAlgorithm *QgsLayoutMapExtentToLayerAlgorithm::createInstance()
 const 
   83   return new QgsLayoutMapExtentToLayerAlgorithm();
 
   89   QgsPrintLayout *layout = parameterAsLayout( parameters, QStringLiteral( 
"LAYOUT" ), context );
 
   91     throw QgsProcessingException( QObject::tr( 
"Cannot find layout with name \"%1\"" ).arg( parameters.value( QStringLiteral( 
"LAYOUT" ) ).toString() ) );
 
   93   QgsLayoutItemMap *map = qobject_cast< QgsLayoutItemMap * >( parameterAsLayoutItem( parameters, QStringLiteral( 
"MAP" ), context, layout ) );
 
   94   if ( !map && parameters.value( QStringLiteral( 
"MAP" ) ).isValid() )
 
   95     throw QgsProcessingException( QObject::tr( 
"Cannot find matching map item with ID %1" ).arg( parameters.value( QStringLiteral( 
"MAP" ) ).toString() ) );
 
   97   QList< QgsLayoutItemMap *> maps;
 
  105   mFeatures.reserve( maps.size() );
 
  108     if ( !mCrs.isValid() )
 
  109       mCrs = !overrideCrs.
isValid() ? map->crs() : overrideCrs;
 
  112     if ( map->crs() != mCrs )
 
  120         feedback->
reportError( QObject::tr( 
"Error reprojecting map to destination CRS" ) );
 
  125     mWidth = map->rect().width();
 
  126     mHeight = map->rect().height();
 
  127     mScale = map->scale();
 
  128     mRotation = map->mapRotation();
 
  142   fields.
append( 
QgsField( QStringLiteral( 
"map" ), QVariant::String ) );
 
  143   fields.
append( 
QgsField( QStringLiteral( 
"width" ), QVariant::Double ) );
 
  144   fields.
append( 
QgsField( QStringLiteral( 
"height" ), QVariant::Double ) );
 
  145   fields.
append( 
QgsField( QStringLiteral( 
"scale" ), QVariant::Double ) );
 
  146   fields.
append( 
QgsField( QStringLiteral( 
"rotation" ), QVariant::Double ) );
 
  149   std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( 
"OUTPUT" ), context, dest, fields, 
QgsWkbTypes::Polygon, mCrs ) );
 
  159   outputs.insert( QStringLiteral( 
"OUTPUT" ), dest );
 
  161   outputs.insert( QStringLiteral( 
"WIDTH" ), mFeatures.size() == 1 ? mWidth : QVariant() );
 
  162   outputs.insert( QStringLiteral( 
"HEIGHT" ), mFeatures.size() == 1 ? mHeight : QVariant() );
 
  163   outputs.insert( QStringLiteral( 
"SCALE" ), mFeatures.size() == 1 ? mScale : QVariant() );
 
  164   outputs.insert( QStringLiteral( 
"ROTATION" ), mFeatures.size() == 1 ? mRotation : QVariant() );