Skip to content

Commit f037b11

Browse files
committedJun 22, 2015
[georef] Allow report to flow onto multiple pages to show all
GCPs (fix #4602)
1 parent 0912314 commit f037b11

File tree

9 files changed

+215
-41
lines changed

9 files changed

+215
-41
lines changed
 

‎python/core/composer/qgscomposertablecolumn.sip

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ class QgsComposerTableColumn: QObject
88
%End
99
public:
1010

11-
QgsComposerTableColumn();
11+
/** Constructor for QgsComposerTableColumn.
12+
* @param heading column heading
13+
*/
14+
QgsComposerTableColumn( const QString& heading = QString() );
15+
1216
virtual ~QgsComposerTableColumn();
1317

1418
/**Writes the column's properties to xml for storage.

‎python/core/composer/qgscomposertexttable.sip

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,41 @@ class QgsComposerTextTable: QgsComposerTable
4646
*/
4747
// bool getFeatureAttributes( QList<QgsAttributeMap>& attributeMaps );
4848
};
49+
50+
51+
52+
/**A text table item that reads text from string lists
53+
* @note added in QGIS 2.10
54+
*/
55+
class QgsComposerTextTableV2 : QgsComposerTableV2
56+
{
57+
58+
%TypeHeaderCode
59+
#include <qgscomposertexttable.h>
60+
%End
61+
62+
public:
63+
QgsComposerTextTableV2( QgsComposition* c /TransferThis/, bool createUndoCommands );
64+
~QgsComposerTextTableV2();
65+
66+
/** Adds a row to the table
67+
* @param row list of strings to use for each cell's value in the newly added row
68+
* @note If row is shorter than the number of columns in the table than blank cells
69+
* will be inserted at the end of the row. If row co ntains more strings then the number
70+
* of columns in the table then these extra strings will be ignored.
71+
* @note if adding many rows, @link setContents @endlink is much faster
72+
*/
73+
void addRow( const QStringList& row );
74+
75+
/** Sets the contents of the text table.
76+
* @param contents list of table rows
77+
* @see addRow
78+
*/
79+
void setContents( const QList< QStringList >& contents );
80+
81+
bool getTableContents( QgsComposerTableContents &contents );
82+
83+
virtual void addFrame( QgsComposerFrame* frame, bool recalcFrameSizes = true );
84+
85+
};
86+

‎src/core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ SET(QGIS_CORE_MOC_HDRS
433433
composer/qgscomposertable.h
434434
composer/qgscomposertablev2.h
435435
composer/qgscomposertablecolumn.h
436+
composer/qgscomposertexttable.h
436437
composer/qgscomposerhtml.h
437438
composer/qgscomposermultiframe.h
438439
composer/qgscomposereffect.h

‎src/core/composer/qgscomposertablecolumn.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,18 @@
1717

1818
#include "qgscomposertablecolumn.h"
1919

20-
QgsComposerTableColumn::QgsComposerTableColumn() :
20+
QgsComposerTableColumn::QgsComposerTableColumn( const QString& heading ) :
2121
mBackgroundColor( Qt::transparent ),
2222
mHAlignment( Qt::AlignLeft ),
23+
mHeading( heading ),
2324
mSortByRank( 0 ),
2425
mSortOrder( Qt::AscendingOrder ),
2526
mWidth( 0.0 )
2627
{
2728

2829
}
2930

31+
3032
QgsComposerTableColumn::~QgsComposerTableColumn()
3133
{
3234

‎src/core/composer/qgscomposertablecolumn.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ class CORE_EXPORT QgsComposerTableColumn: public QObject
3030

3131
public:
3232

33-
QgsComposerTableColumn();
33+
/** Constructor for QgsComposerTableColumn.
34+
* @param heading column heading
35+
*/
36+
QgsComposerTableColumn( const QString& heading = QString() );
37+
3438
virtual ~QgsComposerTableColumn();
3539

3640
/**Writes the column's properties to xml for storage.

‎src/core/composer/qgscomposertablev2.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,6 @@ void QgsComposerTableV2::render( QPainter *p, const QRectF &renderExtent, const
265265
return;
266266
}
267267

268-
//calculate which rows to show in this frame
269-
QPair< int, int > rowsToShow = rowRange( renderExtent, frameIndex );
270-
271268
if ( mComposition->plotStyle() == QgsComposition::Print ||
272269
mComposition->plotStyle() == QgsComposition::Postscript )
273270
{
@@ -276,6 +273,9 @@ void QgsComposerTableV2::render( QPainter *p, const QRectF &renderExtent, const
276273
refreshAttributes();
277274
}
278275

276+
//calculate which rows to show in this frame
277+
QPair< int, int > rowsToShow = rowRange( renderExtent, frameIndex );
278+
279279
double gridSize = mShowGrid ? mGridStrokeWidth : 0;
280280
QList<QgsComposerTableColumn*>::const_iterator columnIt = mColumns.constBegin();
281281

‎src/core/composer/qgscomposertexttable.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "qgscomposertexttable.h"
1919
#include "qgscomposertablecolumn.h"
20+
#include "qgscomposerframe.h"
2021

2122
QgsComposerTextTable::QgsComposerTextTable( QgsComposition* c ): QgsComposerTable( c )
2223
{
@@ -84,3 +85,72 @@ bool QgsComposerTextTable::getFeatureAttributes( QList<QgsAttributeMap>& attribu
8485

8586
return true;
8687
}
88+
89+
90+
QgsComposerTextTableV2::QgsComposerTextTableV2( QgsComposition* c, bool createUndoCommands )
91+
: QgsComposerTableV2( c, createUndoCommands )
92+
{
93+
94+
}
95+
96+
QgsComposerTextTableV2::~QgsComposerTextTableV2()
97+
{
98+
99+
}
100+
101+
void QgsComposerTextTableV2::addRow( const QStringList& row )
102+
{
103+
mRowText.append( row );
104+
refreshAttributes();
105+
}
106+
107+
void QgsComposerTextTableV2::setContents( const QList<QStringList>& contents )
108+
{
109+
mRowText = contents;
110+
refreshAttributes();
111+
}
112+
113+
bool QgsComposerTextTableV2::getTableContents( QgsComposerTableContents& contents )
114+
{
115+
contents.clear();
116+
117+
QList< QStringList >::const_iterator rowIt = mRowText.constBegin();
118+
for ( ; rowIt != mRowText.constEnd(); ++rowIt )
119+
{
120+
QgsComposerTableRow currentRow;
121+
122+
for ( int i = 0; i < mColumns.count(); ++i )
123+
{
124+
if ( i < ( *rowIt ).count() )
125+
{
126+
currentRow << ( *rowIt ).at( i );
127+
}
128+
else
129+
{
130+
currentRow << QString();
131+
}
132+
}
133+
contents << currentRow;
134+
}
135+
136+
recalculateTableSize();
137+
return true;
138+
}
139+
140+
void QgsComposerTextTableV2::addFrame( QgsComposerFrame* frame, bool recalcFrameSizes )
141+
{
142+
mFrameItems.push_back( frame );
143+
connect( frame, SIGNAL( sizeChanged() ), this, SLOT( recalculateFrameSizes() ) );
144+
145+
if ( mComposition )
146+
{
147+
//TODO - if QgsComposerTextTableV2 gains a UI, this will need a dedicated add method
148+
//added to QgsComposition
149+
mComposition->addItem( frame );
150+
}
151+
152+
if ( recalcFrameSizes )
153+
{
154+
recalculateFrameSizes();
155+
}
156+
}

‎src/core/composer/qgscomposertexttable.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define QGSCOMPOSERTEXTTABLE_H
2020

2121
#include "qgscomposertable.h"
22+
#include "qgscomposertablev2.h"
2223

2324
/**A text table item that reads text from string lists*/
2425
class CORE_EXPORT QgsComposerTextTable: public QgsComposerTable
@@ -70,4 +71,40 @@ class CORE_EXPORT QgsComposerTextTable: public QgsComposerTable
7071
QList< QStringList > mRowText;
7172
};
7273

74+
/**A text table item that reads text from string lists
75+
* @note added in QGIS 2.10
76+
*/
77+
class CORE_EXPORT QgsComposerTextTableV2 : public QgsComposerTableV2
78+
{
79+
80+
Q_OBJECT
81+
82+
public:
83+
QgsComposerTextTableV2( QgsComposition* c, bool createUndoCommands );
84+
~QgsComposerTextTableV2();
85+
86+
/** Adds a row to the table
87+
* @param row list of strings to use for each cell's value in the newly added row
88+
* @note If row is shorter than the number of columns in the table than blank cells
89+
* will be inserted at the end of the row. If row contains more strings then the number
90+
* of columns in the table then these extra strings will be ignored.
91+
* @note if adding many rows, @link setContents @endlink is much faster
92+
*/
93+
void addRow( const QStringList& row );
94+
95+
/** Sets the contents of the text table.
96+
* @param contents list of table rows
97+
* @see addRow
98+
*/
99+
void setContents( const QList< QStringList >& contents );
100+
101+
bool getTableContents( QgsComposerTableContents &contents ) override;
102+
103+
virtual void addFrame( QgsComposerFrame* frame, bool recalcFrameSizes = true ) override;
104+
105+
private:
106+
/**One stringlist per row*/
107+
QList< QStringList > mRowText;
108+
};
109+
73110
#endif // QGSCOMPOSERTEXTTABLE_H

‎src/plugins/georeferencer/qgsgeorefplugingui.cpp

Lines changed: 53 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
#include "qgscomposerlabel.h"
3939
#include "qgscomposermap.h"
4040
#include "qgscomposertexttable.h"
41+
#include "qgscomposertablecolumn.h"
42+
#include "qgscomposerframe.h"
4143
#include "qgsmapcanvas.h"
4244
#include "qgsmapcoordsdialog.h"
4345
#include "qgsmaplayerregistry.h"
@@ -1585,15 +1587,11 @@ bool QgsGeorefPluginGui::writePDFReportFile( const QString& fileName, const QgsG
15851587
return false;
15861588
}
15871589

1588-
QPrinter printer;
1589-
printer.setOutputFormat( QPrinter::PdfFormat );
1590-
printer.setOutputFileName( fileName );
1591-
15921590
//create composition A4 with 300 dpi
15931591
QgsComposition* composition = new QgsComposition( mCanvas->mapSettings() );
15941592
composition->setPaperSize( 210, 297 ); //A4
15951593
composition->setPrintResolution( 300 );
1596-
printer.setPaperSize( QSizeF( composition->paperWidth(), composition->paperHeight() ), QPrinter::Millimeter );
1594+
composition->setNumPages( 2 );
15971595

15981596
QFont titleFont;
15991597
titleFont.setPointSize( 9 );
@@ -1646,10 +1644,8 @@ bool QgsGeorefPluginGui::writePDFReportFile( const QString& fileName, const QgsG
16461644
composerMap->zoomToExtent( layerExtent );
16471645
composerMap->setMapCanvas( mCanvas );
16481646
composition->addItem( composerMap );
1649-
printer.setFullPage( true );
1650-
printer.setColorMode( QPrinter::Color );
16511647

1652-
QgsComposerTextTable* parameterTable = 0;
1648+
QgsComposerTextTableV2* parameterTable = 0;
16531649
double scaleX, scaleY, rotation;
16541650
QgsPoint origin;
16551651

@@ -1667,6 +1663,7 @@ bool QgsGeorefPluginGui::writePDFReportFile( const QString& fileName, const QgsG
16671663
residualUnits = tr( "pixels" );
16681664
}
16691665

1666+
QGraphicsRectItem* previousItem = composerMap;
16701667
if ( wldTransform )
16711668
{
16721669
QString parameterTitle = tr( "Transformation parameters" ) + QString( " (" ) + convertTransformEnumToString( transform.transformParametrisation() ) + QString( ")" );
@@ -1682,25 +1679,30 @@ bool QgsGeorefPluginGui::writePDFReportFile( const QString& fileName, const QgsG
16821679
double meanError = 0;
16831680
calculateMeanError( meanError );
16841681

1685-
parameterTable = new QgsComposerTextTable( composition );
1682+
parameterTable = new QgsComposerTextTableV2( composition, false );
16861683
parameterTable->setHeaderFont( tableHeaderFont );
16871684
parameterTable->setContentFont( tableContentFont );
1688-
QStringList headers;
1689-
headers << tr( "Translation x" ) << tr( "Translation y" ) << tr( "Scale x" ) << tr( "Scale y" ) << tr( "Rotation [degrees]" ) << tr( "Mean error [%1]" ).arg( residualUnits );
1690-
parameterTable->setHeaderLabels( headers );
1685+
1686+
QgsComposerTableColumns columns;
1687+
columns << new QgsComposerTableColumn( tr( "Translation x" ) )
1688+
<< new QgsComposerTableColumn( tr( "Translation y" ) )
1689+
<< new QgsComposerTableColumn( tr( "Scale x" ) )
1690+
<< new QgsComposerTableColumn( tr( "Scale y" ) )
1691+
<< new QgsComposerTableColumn( tr( "Rotation [degrees]" ) )
1692+
<< new QgsComposerTableColumn( tr( "Mean error [%1]" ).arg( residualUnits ) );
1693+
1694+
parameterTable->setColumns( columns );
16911695
QStringList row;
16921696
row << QString::number( origin.x(), 'f', 3 ) << QString::number( origin.y(), 'f', 3 ) << QString::number( scaleX ) << QString::number( scaleY ) << QString::number( rotation * 180 / M_PI ) << QString::number( meanError );
16931697
parameterTable->addRow( row );
1694-
composition->addItem( parameterTable );
1695-
parameterTable->setSceneRect( QRectF( leftMargin, parameterLabel->rect().bottom() + parameterLabel->pos().y() + 5, contentWidth, 20 ) );
1698+
1699+
QgsComposerFrame* tableFrame = new QgsComposerFrame( composition, parameterTable, leftMargin, parameterLabel->rect().bottom() + parameterLabel->pos().y() + 5, contentWidth, 12 );
1700+
parameterTable->addFrame( tableFrame );
1701+
1702+
composition->addItem( tableFrame );
16961703
parameterTable->setGridStrokeWidth( 0.1 );
1697-
parameterTable->adjustFrameToSize();
1698-
}
16991704

1700-
QGraphicsRectItem* previousItem = composerMap;
1701-
if ( parameterTable )
1702-
{
1703-
previousItem = parameterTable;
1705+
previousItem = tableFrame;
17041706
}
17051707

17061708
QgsComposerLabel* residualLabel = new QgsComposerLabel( composition );
@@ -1720,14 +1722,25 @@ bool QgsGeorefPluginGui::writePDFReportFile( const QString& fileName, const QgsG
17201722
//necessary for the correct scale bar unit label
17211723
resPlotItem->setConvertScaleToMapUnits( residualUnits == tr( "map units" ) );
17221724

1723-
QgsComposerTextTable* gcpTable = new QgsComposerTextTable( composition );
1725+
QgsComposerTextTableV2* gcpTable = new QgsComposerTextTableV2( composition, false );
17241726
gcpTable->setHeaderFont( tableHeaderFont );
17251727
gcpTable->setContentFont( tableContentFont );
1726-
QStringList gcpHeader;
1727-
gcpHeader << "id" << "enabled" << "pixelX" << "pixelY" << "mapX" << "mapY" << "resX [" + residualUnits + "]" << "resY [" + residualUnits + "]" << "resTot [" + residualUnits + "]";
1728-
gcpTable->setHeaderLabels( gcpHeader );
1728+
gcpTable->setHeaderMode( QgsComposerTableV2::AllFrames );
1729+
QgsComposerTableColumns columns;
1730+
columns << new QgsComposerTableColumn( tr( "ID" ) )
1731+
<< new QgsComposerTableColumn( tr( "Enabled" ) )
1732+
<< new QgsComposerTableColumn( tr( "Pixel X" ) )
1733+
<< new QgsComposerTableColumn( tr( "Pixel Y" ) )
1734+
<< new QgsComposerTableColumn( tr( "Map X" ) )
1735+
<< new QgsComposerTableColumn( tr( "Map Y" ) )
1736+
<< new QgsComposerTableColumn( tr( "Res X (%1)" ).arg( residualUnits ) )
1737+
<< new QgsComposerTableColumn( tr( "Res Y (%1)" ).arg( residualUnits ) )
1738+
<< new QgsComposerTableColumn( tr( "Res Total (%1)" ).arg( residualUnits ) );
1739+
1740+
gcpTable->setColumns( columns );
17291741

17301742
QgsGCPList::const_iterator gcpIt = mPoints.constBegin();
1743+
QList< QStringList > gcpTableContents;
17311744
for ( ; gcpIt != mPoints.constEnd(); ++gcpIt )
17321745
{
17331746
QStringList currentGCPStrings;
@@ -1745,27 +1758,32 @@ bool QgsGeorefPluginGui::writePDFReportFile( const QString& fileName, const QgsG
17451758
}
17461759
currentGCPStrings << QString::number(( *gcpIt )->pixelCoords().x(), 'f', 0 ) << QString::number(( *gcpIt )->pixelCoords().y(), 'f', 0 ) << QString::number(( *gcpIt )->mapCoords().x(), 'f', 3 )
17471760
<< QString::number(( *gcpIt )->mapCoords().y(), 'f', 3 ) << QString::number( residual.x() ) << QString::number( residual.y() ) << QString::number( residualTot );
1748-
gcpTable->addRow( currentGCPStrings );
1761+
gcpTableContents << currentGCPStrings ;
17491762
}
17501763

1751-
composition->addItem( gcpTable );
1764+
gcpTable->setContents( gcpTableContents );
1765+
1766+
double firstFrameY = resPlotItem->rect().bottom() + resPlotItem->pos().y() + 5;
1767+
double firstFrameHeight = 287 - firstFrameY;
1768+
QgsComposerFrame* gcpFirstFrame = new QgsComposerFrame( composition, gcpTable, leftMargin, firstFrameY, contentWidth, firstFrameHeight );
1769+
gcpTable->addFrame( gcpFirstFrame );
1770+
composition->addItem( gcpFirstFrame );
1771+
1772+
QgsComposerFrame* gcpSecondFrame = new QgsComposerFrame( composition, gcpTable, leftMargin, 10, contentWidth, 277.0 );
1773+
gcpSecondFrame->setItemPosition( leftMargin, 10, QgsComposerItem::UpperLeft, 2 );
1774+
gcpSecondFrame->setHidePageIfEmpty( true );
1775+
gcpTable->addFrame( gcpSecondFrame );
1776+
composition->addItem( gcpSecondFrame );
17521777

1753-
gcpTable->setSceneRect( QRectF( leftMargin, resPlotItem->rect().bottom() + resPlotItem->pos().y() + 5, contentWidth, 100 ) );
17541778
gcpTable->setGridStrokeWidth( 0.1 );
1779+
gcpTable->setResizeMode( QgsComposerMultiFrame::RepeatUntilFinished );
17551780

1756-
printer.setResolution( composition->printResolution() );
1757-
QPainter p( &printer );
1758-
composition->setPlotStyle( QgsComposition::Print );
1759-
QRectF paperRectMM = printer.pageRect( QPrinter::Millimeter );
1760-
QRectF paperRectPixel = printer.pageRect( QPrinter::DevicePixel );
1761-
composition->render( &p, paperRectPixel, paperRectMM );
1781+
composition->exportAsPDF( fileName );
17621782

17631783
delete titleLabel;
17641784
delete parameterLabel;
17651785
delete residualLabel;
17661786
delete resPlotItem;
1767-
delete parameterTable;
1768-
delete gcpTable;
17691787
delete composerMap;
17701788
delete composition;
17711789
return true;

0 commit comments

Comments
 (0)
Please sign in to comment.