Skip to content

Commit 4764b53

Browse files
committed
[composer] Fix world file map is not restored from project
1 parent 8722ace commit 4764b53

File tree

5 files changed

+94
-46
lines changed

5 files changed

+94
-46
lines changed

python/core/composer/qgscomposition.sip

+26-2
Original file line numberDiff line numberDiff line change
@@ -378,10 +378,34 @@ class QgsComposition : QGraphicsScene
378378
bool printAsRaster() const;
379379
void setPrintAsRaster( const bool enabled );
380380

381+
/** Returns true if the composition will generate corresponding world files when pages
382+
* are exported.
383+
* @see setGenerateWorldFile()
384+
* @see worldFileMap()
385+
*/
381386
bool generateWorldFile() const;
382-
void setGenerateWorldFile( const bool enabled );
383387

384-
QgsComposerMap* worldFileMap();
388+
/** Sets whether the composition will generate corresponding world files when pages
389+
* are exported.
390+
* @param enabled set to true to generate world files
391+
* @see generateWorldFile()
392+
* @see setWorldFileMap()
393+
*/
394+
void setGenerateWorldFile( bool enabled );
395+
396+
/** Returns the map item which will be used to generate corresponding world files when the
397+
* composition is exported, or nullptr if no corresponding map is set.
398+
* @see setWorldFileMap()
399+
* @see generateWorldFile()
400+
*/
401+
QgsComposerMap* worldFileMap() const;
402+
403+
/** Sets the map item which will be used to generate corresponding world files when the
404+
* composition is exported.
405+
* @param map composer map item
406+
* @see worldFileMap()
407+
* @see setGenerateWorldFile()
408+
*/
385409
void setWorldFileMap( QgsComposerMap* map );
386410

387411
/** Returns true if a composition should use advanced effects such as blend modes */

src/app/composer/qgscomposer.cpp

+2-18
Original file line numberDiff line numberDiff line change
@@ -3563,7 +3563,6 @@ void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument&
35633563

35643564
connectViewSlots();
35653565
connectCompositionSlots();
3566-
createCompositionWidget();
35673566

35683567
//read and restore all the items
35693568
QDomElement atlasElem;
@@ -3581,23 +3580,8 @@ void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument&
35813580

35823581
mActionShowPage->setChecked( mComposition->pagesVisible() );
35833582

3584-
// look for world file composer map, if needed
3585-
// Note: this must be done after maps have been added by addItemsFromXML
3586-
if ( mComposition->generateWorldFile() )
3587-
{
3588-
QDomElement compositionElem = compositionNodeList.at( 0 ).toElement();
3589-
QgsComposerMap* worldFileMap = nullptr;
3590-
QList<const QgsComposerMap*> maps = mComposition->composerMapItems();
3591-
for ( QList<const QgsComposerMap*>::const_iterator it = maps.begin(); it != maps.end(); ++it )
3592-
{
3593-
if (( *it )->id() == compositionElem.attribute( "worldFileMap" ).toInt() )
3594-
{
3595-
worldFileMap = const_cast<QgsComposerMap*>( *it );
3596-
break;
3597-
}
3598-
}
3599-
mComposition->setWorldFileMap( worldFileMap );
3600-
}
3583+
// update composition widget, must be done after items loaded
3584+
createCompositionWidget();
36013585

36023586
//make sure z values are consistent
36033587
mComposition->refreshZList();

src/app/composer/qgscompositionwidget.cpp

+14-7
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,24 @@ QgsCompositionWidget::QgsCompositionWidget( QWidget* parent, QgsComposition* c )
7878

7979
// world file generation
8080
mGenerateWorldFileCheckBox->setChecked( mComposition->generateWorldFile() );
81+
mWorldFileMapComboBox->setEnabled( mComposition->generateWorldFile() );
8182

8283
// populate the map list
8384
mWorldFileMapComboBox->clear();
8485
QList<const QgsComposerMap*> availableMaps = mComposition->composerMapItems();
8586
QList<const QgsComposerMap*>::const_iterator mapItemIt = availableMaps.constBegin();
8687
for ( ; mapItemIt != availableMaps.constEnd(); ++mapItemIt )
8788
{
88-
mWorldFileMapComboBox->addItem( tr( "Map %1" ).arg(( *mapItemIt )->id() ), qVariantFromValue(( void* )*mapItemIt ) );
89+
mWorldFileMapComboBox->addItem( tr( "Map %1" ).arg(( *mapItemIt )->id() ), ( *mapItemIt )->id() );
8990
}
9091

91-
int idx = mWorldFileMapComboBox->findData( qVariantFromValue(( void* )mComposition->worldFileMap() ) );
92-
if ( idx != -1 )
92+
if ( mComposition->worldFileMap() )
9393
{
94-
mWorldFileMapComboBox->setCurrentIndex( idx );
94+
int idx = mWorldFileMapComboBox->findData( mComposition->worldFileMap()->id() );
95+
if ( idx != -1 )
96+
{
97+
mWorldFileMapComboBox->setCurrentIndex( idx );
98+
}
9599
}
96100

97101
// Connect to addition / removal of maps
@@ -679,7 +683,7 @@ void QgsCompositionWidget::onComposerMapAdded( QgsComposerMap* map )
679683
return;
680684
}
681685

682-
mWorldFileMapComboBox->addItem( tr( "Map %1" ).arg( map->id() ), qVariantFromValue(( void* )map ) );
686+
mWorldFileMapComboBox->addItem( tr( "Map %1" ).arg( map->id() ), map->id() );
683687
if ( mWorldFileMapComboBox->count() == 1 )
684688
{
685689
mComposition->setWorldFileMap( map );
@@ -696,7 +700,7 @@ void QgsCompositionWidget::onItemRemoved( QgsComposerItem* item )
696700
QgsComposerMap* map = dynamic_cast<QgsComposerMap*>( item );
697701
if ( map )
698702
{
699-
int idx = mWorldFileMapComboBox->findData( qVariantFromValue(( void* )map ) );
703+
int idx = mWorldFileMapComboBox->findData( map->id() );
700704
if ( idx != -1 )
701705
{
702706
mWorldFileMapComboBox->removeItem( idx );
@@ -720,7 +724,8 @@ void QgsCompositionWidget::on_mWorldFileMapComboBox_currentIndexChanged( int ind
720724
}
721725
else
722726
{
723-
QgsComposerMap* map = reinterpret_cast<QgsComposerMap*>( mWorldFileMapComboBox->itemData( index ).value<void*>() );
727+
int mapId = mWorldFileMapComboBox->itemData( index ).toInt();
728+
QgsComposerMap* map = const_cast< QgsComposerMap* >( mComposition->getComposerMapById( mapId ) );
724729
mComposition->setWorldFileMap( map );
725730
}
726731
}
@@ -772,5 +777,7 @@ void QgsCompositionWidget::blockSignals( bool block )
772777
mOffsetXSpinBox->blockSignals( block );
773778
mOffsetYSpinBox->blockSignals( block );
774779
mSnapToleranceSpinBox->blockSignals( block );
780+
mGenerateWorldFileCheckBox->blockSignals( block );
781+
mWorldFileMapComboBox->blockSignals( block );
775782
}
776783

src/core/composer/qgscomposition.cpp

+22-14
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ void QgsComposition::init()
8686
mPageStyleSymbol = nullptr;
8787
mPrintAsRaster = false;
8888
mGenerateWorldFile = false;
89-
mWorldFileMap = nullptr;
9089
mUseAdvancedEffects = true;
9190
mSnapToGrid = false;
9291
mGridVisible = false;
@@ -164,7 +163,6 @@ QgsComposition::QgsComposition()
164163
, mPageStyleSymbol( 0 )
165164
, mPrintAsRaster( false )
166165
, mGenerateWorldFile( false )
167-
, mWorldFileMap( 0 )
168166
, mUseAdvancedEffects( true )
169167
, mSnapToGrid( false )
170168
, mGridVisible( false )
@@ -851,6 +849,17 @@ void QgsComposition::setPrintResolution( const int dpi )
851849
QgsProject::instance()->setDirty( true );
852850
}
853851

852+
QgsComposerMap* QgsComposition::worldFileMap() const
853+
{
854+
return dynamic_cast< QgsComposerMap* >( const_cast< QgsComposerItem* >( getComposerItemByUuid( mWorldFileMapId ) ) );
855+
}
856+
857+
void QgsComposition::setWorldFileMap( QgsComposerMap* map )
858+
{
859+
mWorldFileMapId = map ? map->uuid() : QString();
860+
QgsProject::instance()->setDirty( true );
861+
}
862+
854863
void QgsComposition::setUseAdvancedEffects( const bool effectsEnabled )
855864
{
856865
mUseAdvancedEffects = effectsEnabled;
@@ -933,10 +942,7 @@ bool QgsComposition::writeXML( QDomElement& composerElem, QDomDocument& doc )
933942
compositionElem.setAttribute( "printAsRaster", mPrintAsRaster );
934943

935944
compositionElem.setAttribute( "generateWorldFile", mGenerateWorldFile ? 1 : 0 );
936-
if ( mGenerateWorldFile && mWorldFileMap )
937-
{
938-
compositionElem.setAttribute( "worldFileMap", mWorldFileMap->id() );
939-
}
945+
compositionElem.setAttribute( "worldFileMap", mWorldFileMapId );
940946

941947
compositionElem.setAttribute( "alignmentSnap", mAlignmentSnap ? 1 : 0 );
942948
compositionElem.setAttribute( "guidesVisible", mGuidesVisible ? 1 : 0 );
@@ -1047,6 +1053,7 @@ bool QgsComposition::readXML( const QDomElement& compositionElem, const QDomDocu
10471053
mPrintResolution = compositionElem.attribute( "printResolution", "300" ).toInt();
10481054

10491055
mGenerateWorldFile = compositionElem.attribute( "generateWorldFile", "0" ).toInt() == 1 ? true : false;
1056+
mWorldFileMapId = compositionElem.attribute( "worldFileMap" );
10501057

10511058
//data defined properties
10521059
QgsComposerUtils::readDataDefinedPropertyMap( compositionElem, &mDataDefinedNames, &mDataDefinedProperties );
@@ -3105,12 +3112,13 @@ QGraphicsView *QgsComposition::graphicsView() const
31053112

31063113
void QgsComposition::computeWorldFileParameters( double& a, double& b, double& c, double& d, double& e, double& f ) const
31073114
{
3108-
if ( !mWorldFileMap )
3115+
const QgsComposerMap* map = worldFileMap();
3116+
if ( !map )
31093117
{
31103118
return;
31113119
}
31123120

3113-
int pageNumber = mWorldFileMap->page() - 1;
3121+
int pageNumber = map->page() - 1;
31143122
double pageY = pageNumber * ( mPageHeight + mSpaceBetweenPages );
31153123
QRectF pageRect( 0, pageY, mPageWidth, mPageHeight );
31163124
computeWorldFileParameters( pageRect, a, b, c, d, e, f );
@@ -3119,19 +3127,19 @@ void QgsComposition::computeWorldFileParameters( double& a, double& b, double& c
31193127
void QgsComposition::computeWorldFileParameters( const QRectF& exportRegion, double& a, double& b, double& c, double& d, double& e, double& f ) const
31203128
{
31213129
// World file parameters : affine transformation parameters from pixel coordinates to map coordinates
3122-
3123-
if ( !mWorldFileMap )
3130+
QgsComposerMap* map = worldFileMap();
3131+
if ( !map )
31243132
{
31253133
return;
31263134
}
31273135

31283136
double destinationHeight = exportRegion.height();
31293137
double destinationWidth = exportRegion.width();
31303138

3131-
QRectF mapItemSceneRect = mWorldFileMap->mapRectToScene( mWorldFileMap->rect() );
3132-
QgsRectangle mapExtent = *mWorldFileMap->currentMapExtent();
3139+
QRectF mapItemSceneRect = map->mapRectToScene( map->rect() );
3140+
QgsRectangle mapExtent = *map->currentMapExtent();
31333141

3134-
double alpha = mWorldFileMap->mapRotation() / 180 * M_PI;
3142+
double alpha = map->mapRotation() / 180 * M_PI;
31353143

31363144
double xRatio = mapExtent.width() / mapItemSceneRect.width();
31373145
double yRatio = mapExtent.height() / mapItemSceneRect.height();
@@ -3140,7 +3148,7 @@ void QgsComposition::computeWorldFileParameters( const QRectF& exportRegion, dou
31403148
double yCenter = mapExtent.center().y();
31413149

31423150
// get the extent (in map units) for the region
3143-
QPointF mapItemPos = mWorldFileMap->pos();
3151+
QPointF mapItemPos = map->pos();
31443152
//adjust item position so it is relative to export region
31453153
mapItemPos.rx() -= exportRegion.left();
31463154
mapItemPos.ry() -= exportRegion.top();

src/core/composer/qgscomposition.h

+30-5
Original file line numberDiff line numberDiff line change
@@ -442,11 +442,35 @@ class CORE_EXPORT QgsComposition : public QGraphicsScene
442442
bool printAsRaster() const {return mPrintAsRaster;}
443443
void setPrintAsRaster( const bool enabled ) { mPrintAsRaster = enabled; }
444444

445+
/** Returns true if the composition will generate corresponding world files when pages
446+
* are exported.
447+
* @see setGenerateWorldFile()
448+
* @see worldFileMap()
449+
*/
445450
bool generateWorldFile() const { return mGenerateWorldFile; }
446-
void setGenerateWorldFile( const bool enabled ) { mGenerateWorldFile = enabled; }
447451

448-
QgsComposerMap* worldFileMap() const { return mWorldFileMap; }
449-
void setWorldFileMap( QgsComposerMap* map ) { mWorldFileMap = map; }
452+
/** Sets whether the composition will generate corresponding world files when pages
453+
* are exported.
454+
* @param enabled set to true to generate world files
455+
* @see generateWorldFile()
456+
* @see setWorldFileMap()
457+
*/
458+
void setGenerateWorldFile( bool enabled ) { mGenerateWorldFile = enabled; }
459+
460+
/** Returns the map item which will be used to generate corresponding world files when the
461+
* composition is exported, or nullptr if no corresponding map is set.
462+
* @see setWorldFileMap()
463+
* @see generateWorldFile()
464+
*/
465+
QgsComposerMap* worldFileMap() const;
466+
467+
/** Sets the map item which will be used to generate corresponding world files when the
468+
* composition is exported.
469+
* @param map composer map item
470+
* @see worldFileMap()
471+
* @see setGenerateWorldFile()
472+
*/
473+
void setWorldFileMap( QgsComposerMap* map );
450474

451475
/** Returns true if a composition should use advanced effects such as blend modes */
452476
bool useAdvancedEffects() const {return mUseAdvancedEffects;}
@@ -912,8 +936,9 @@ class CORE_EXPORT QgsComposition : public QGraphicsScene
912936

913937
/** Flag if a world file should be generated on raster export */
914938
bool mGenerateWorldFile;
915-
/** Composer map to use for the world file generation */
916-
QgsComposerMap* mWorldFileMap;
939+
940+
/** Item ID for composer map to use for the world file generation */
941+
QString mWorldFileMapId;
917942

918943
/** Flag if advanced visual effects such as blend modes should be used. True by default*/
919944
bool mUseAdvancedEffects;

0 commit comments

Comments
 (0)