Fix generation tiles.

This commit is contained in:
Roman Telezhynskyi 2021-09-07 20:26:35 +03:00
parent 22da66e4d8
commit 048035db79
3 changed files with 115 additions and 100 deletions

View File

@ -2,6 +2,7 @@
#include "../vptilefactory.h" #include "../vptilefactory.h"
#include "../layout/vplayout.h" #include "../layout/vplayout.h"
#include "../layout/vpsheet.h"
namespace namespace
{ {
@ -24,12 +25,21 @@ auto VPGraphicsTileGrid::boundingRect() const -> QRectF
{ {
VPSheetPtr sheet = layout->GetSheet(m_sheetUuid); VPSheetPtr sheet = layout->GetSheet(m_sheetUuid);
QMarginsF sheetMargins;
if (not sheet.isNull() && not sheet->IgnoreMargins())
{
sheetMargins = sheet->GetSheetMargins();
}
qreal xScale = layout->LayoutSettings().HorizontalScale(); qreal xScale = layout->LayoutSettings().HorizontalScale();
qreal yScale = layout->LayoutSettings().VerticalScale(); qreal yScale = layout->LayoutSettings().VerticalScale();
QRectF rect(0, 0, qreal width = layout->TileFactory()->DrawingAreaWidth() - VPTileFactory::tileStripeWidth;
layout->TileFactory()->ColNb(sheet) * (layout->TileFactory()->DrawingAreaWidth() / xScale), qreal height = layout->TileFactory()->DrawingAreaHeight() - VPTileFactory::tileStripeWidth;
layout->TileFactory()->RowNb(sheet) * (layout->TileFactory()->DrawingAreaHeight() / yScale));
QRectF rect(sheetMargins.left(), sheetMargins.top(),
layout->TileFactory()->ColNb(sheet) * (width / xScale),
layout->TileFactory()->RowNb(sheet) * (height / yScale));
constexpr qreal halfPenWidth = penWidth/2.; constexpr qreal halfPenWidth = penWidth/2.;
@ -50,6 +60,12 @@ void VPGraphicsTileGrid::paint(QPainter *painter, const QStyleOptionGraphicsItem
{ {
VPSheetPtr sheet = layout->GetSheet(m_sheetUuid); VPSheetPtr sheet = layout->GetSheet(m_sheetUuid);
QMarginsF sheetMargins;
if (not sheet.isNull() && not sheet->IgnoreMargins())
{
sheetMargins = sheet->GetSheetMargins();
}
QPen pen(QColor(255,0,0,127), penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); QPen pen(QColor(255,0,0,127), penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
pen.setCosmetic(true); pen.setCosmetic(true);
pen.setStyle(Qt::DashLine); pen.setStyle(Qt::DashLine);
@ -60,19 +76,24 @@ void VPGraphicsTileGrid::paint(QPainter *painter, const QStyleOptionGraphicsItem
qreal xScale = layout->LayoutSettings().HorizontalScale(); qreal xScale = layout->LayoutSettings().HorizontalScale();
qreal yScale = layout->LayoutSettings().VerticalScale(); qreal yScale = layout->LayoutSettings().VerticalScale();
const qreal drawingAreaWidth = layout->TileFactory()->DrawingAreaWidth() / xScale; const qreal width = (layout->TileFactory()->DrawingAreaWidth() - VPTileFactory::tileStripeWidth) / xScale;
const qreal drawingAreaHeight = layout->TileFactory()->DrawingAreaHeight() / yScale; const qreal height = (layout->TileFactory()->DrawingAreaHeight() - VPTileFactory::tileStripeWidth) / yScale;
for(int i=0;i<=layout->TileFactory()->ColNb(sheet);i++) const int nbCol = layout->TileFactory()->ColNb(sheet);
const int nbRow = layout->TileFactory()->RowNb(sheet);
for(int i=0;i<=nbCol;++i)
{ {
painter->drawLine(QPointF(i*drawingAreaWidth, 0), // vertical lines
QPointF(i*drawingAreaWidth, layout->TileFactory()->RowNb(sheet)*drawingAreaHeight)); painter->drawLine(QPointF(sheetMargins.left()+i*width, sheetMargins.top()),
QPointF(sheetMargins.left()+i*width, sheetMargins.top() + nbRow*height));
} }
for(int j=0;j<=layout->TileFactory()->RowNb(sheet);j++) for(int j=0;j<=nbRow;++j)
{ {
painter->drawLine(QPointF(0, j*drawingAreaHeight), // horizontal lines
QPointF(layout->TileFactory()->ColNb(sheet)*drawingAreaWidth, j*drawingAreaHeight)); painter->drawLine(QPointF(sheetMargins.left(), sheetMargins.top()+j*height),
QPointF(sheetMargins.left()+nbCol*width, sheetMargins.top()+j*height));
} }
} }
} }

View File

@ -12,8 +12,7 @@
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
VPTileFactory::VPTileFactory(const VPLayoutPtr &layout, VCommonSettings *commonSettings): VPTileFactory::VPTileFactory(const VPLayoutPtr &layout, VCommonSettings *commonSettings):
m_layout(layout), m_layout(layout),
m_commonSettings(commonSettings), m_commonSettings(commonSettings)
m_infoStripeWidth(UnitConvertor(1, Unit::Cm, Unit::Px))
{ {
} }
@ -31,11 +30,7 @@ void VPTileFactory::refreshTileInfos()
if (not layout->LayoutSettings().IgnoreTilesMargins()) if (not layout->LayoutSettings().IgnoreTilesMargins())
{ {
m_drawingAreaHeight -= tilesMargins.top() + tilesMargins.bottom() + m_infoStripeWidth; m_drawingAreaHeight -= tilesMargins.top() + tilesMargins.bottom();
}
else
{
m_drawingAreaHeight += m_infoStripeWidth;
} }
// sets the drawing width // sets the drawing width
@ -43,11 +38,7 @@ void VPTileFactory::refreshTileInfos()
if (not layout->LayoutSettings().IgnoreTilesMargins()) if (not layout->LayoutSettings().IgnoreTilesMargins())
{ {
m_drawingAreaWidth -= tilesMargins.left() + tilesMargins.right() + m_infoStripeWidth; m_drawingAreaWidth -= tilesMargins.left() + tilesMargins.right();
}
else
{
m_drawingAreaWidth += m_infoStripeWidth;
} }
} }
} }
@ -69,6 +60,12 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
return; return;
} }
QMarginsF sheetMargins;
if (not sheet->IgnoreMargins())
{
sheetMargins = sheet->GetSheetMargins();
}
const int nbCol = ColNb(sheet); const int nbCol = ColNb(sheet);
const int nbRow = RowNb(sheet); const int nbRow = RowNb(sheet);
@ -88,17 +85,15 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
// paint the content of the page // paint the content of the page
qreal xScale = layout->LayoutSettings().HorizontalScale(); qreal xScale = layout->LayoutSettings().HorizontalScale();
qreal yScale = layout->LayoutSettings().VerticalScale(); qreal yScale = layout->LayoutSettings().VerticalScale();
QRectF source = QRectF(col*m_drawingAreaWidth / xScale, QRectF source = QRectF(sheetMargins.left() + col*(m_drawingAreaWidth - tileStripeWidth) / xScale,
row*m_drawingAreaHeight / yScale, sheetMargins.top() + row*(m_drawingAreaHeight - tileStripeWidth) / yScale,
m_drawingAreaWidth / xScale + m_infoStripeWidth, m_drawingAreaWidth / xScale,
m_drawingAreaHeight / yScale + m_infoStripeWidth m_drawingAreaHeight / yScale);
);
QRectF target = QRectF(col*m_drawingAreaWidth, QRectF target = QRectF(0,
row*m_drawingAreaHeight, 0,
m_drawingAreaWidth + m_infoStripeWidth, m_drawingAreaWidth,
m_drawingAreaHeight + m_infoStripeWidth m_drawingAreaHeight);
);
sheet->SceneData()->Scene()->render(painter, VPrintLayout::SceneTargetRect(printer, target), source, sheet->SceneData()->Scene()->render(painter, VPrintLayout::SceneTargetRect(printer, target), source,
Qt::IgnoreAspectRatio); Qt::IgnoreAspectRatio);
@ -126,34 +121,35 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
// add top triangle // add top triangle
QPainterPath triangleTop = QPainterPath triangleTop =
QTransform() QTransform()
.translate(tilesMargins.left()+m_drawingAreaWidth/2, tilesMargins.top()) .translate(m_drawingAreaWidth/2, 0)
.map(triangleBasic); .map(triangleBasic);
painter->fillPath(triangleTop, triangleBush); painter->fillPath(triangleTop, triangleBush);
// scissors along the top line // scissors along the top line
svgRenderer->load(QStringLiteral("://puzzleicon/svg/icon_scissors_horizontal.svg")); svgRenderer->load(QStringLiteral("://puzzleicon/svg/icon_scissors_horizontal.svg"));
svgRenderer->render(painter, QRectF(tilesMargins.left() + m_drawingAreaWidth, svgRenderer->render(painter, QRectF(m_drawingAreaWidth - tileStripeWidth, 0,
tilesMargins.top(), UnitConvertor(0.95, Unit::Cm, Unit::Px),
UnitConvertor(1, Unit::Cm, Unit::Px),
UnitConvertor(0.56, Unit::Cm, Unit::Px))); UnitConvertor(0.56, Unit::Cm, Unit::Px)));
// dashed top line (for cutting) // dashed top line (for cutting)
penTileInfos.setStyle(Qt::DashLine); penTileInfos.setStyle(Qt::DashLine);
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->drawLine(QPointF(tilesMargins.left(), painter->drawLine(QPointF(), QPointF(m_drawingAreaWidth, 0));
tilesMargins.top()),
QPointF(tilesMargins.left() + m_drawingAreaWidth + m_infoStripeWidth,
tilesMargins.top()));
} }
else else
{ {
// solid top line stopping at the edge // solid top line stopping at the edge
penTileInfos.setStyle(Qt::SolidLine); penTileInfos.setStyle(Qt::SolidLine);
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->drawLine(QPointF(tilesMargins.left(),
tilesMargins.top()), if(col < nbCol - 1)
QPointF(tilesMargins.left() + m_drawingAreaWidth + ((col < nbCol-1)? m_infoStripeWidth : 0), {
tilesMargins.top())); painter->drawLine(QPointF(), QPointF(m_drawingAreaWidth, 0));
}
else
{
painter->drawLine(QPointF(), QPointF(m_drawingAreaWidth - tileStripeWidth, 0));
}
} }
if(col > 0) if(col > 0)
@ -161,38 +157,36 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
// add left triangle // add left triangle
QPainterPath triangleLeft = QPainterPath triangleLeft =
QTransform() QTransform()
.translate(tilesMargins.left(), tilesMargins.top()+ m_drawingAreaHeight/2) .translate(0, m_drawingAreaHeight/2)
.rotate(-90) .rotate(-90)
.map(triangleBasic); .map(triangleBasic);
painter->fillPath(triangleLeft, triangleBush); painter->fillPath(triangleLeft, triangleBush);
// scissors along the left line // scissors along the left line
svgRenderer->load(QStringLiteral("://puzzleicon/svg/icon_scissors_vertical.svg")); svgRenderer->load(QStringLiteral("://puzzleicon/svg/icon_scissors_vertical.svg"));
svgRenderer->render(painter, QRectF(tilesMargins.left(), svgRenderer->render(painter, QRectF(0, m_drawingAreaHeight - tileStripeWidth,
tilesMargins.top()+m_drawingAreaHeight, UnitConvertor(0.56, Unit::Cm, Unit::Px),
UnitConvertor(0.56, Unit::Cm, Unit::Px), UnitConvertor(0.95, Unit::Cm, Unit::Px)));
UnitConvertor(1, Unit::Cm, Unit::Px)
));
// dashed left line (for cutting) // dashed left line (for cutting)
penTileInfos.setStyle(Qt::DashLine); penTileInfos.setStyle(Qt::DashLine);
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->drawLine(QPointF(tilesMargins.left(), painter->drawLine(QPointF(), QPointF(0, m_drawingAreaHeight));
tilesMargins.top()),
QPointF(tilesMargins.left(),
tilesMargins.top() + m_drawingAreaHeight + m_infoStripeWidth)
);
} }
else else
{ {
// solid left line at the edge // solid left line at the edge
penTileInfos.setStyle(Qt::SolidLine); penTileInfos.setStyle(Qt::SolidLine);
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->drawLine(QPointF(tilesMargins.left(),
tilesMargins.top()), if(row < nbRow - 1)
QPointF(tilesMargins.left(), {
tilesMargins.top() + m_drawingAreaHeight + ((row < nbRow-1)? m_infoStripeWidth : 0)) painter->drawLine(QPointF(), QPointF(0, m_drawingAreaHeight));
); }
else
{
painter->drawLine(QPointF(), QPointF(0, m_drawingAreaHeight - tileStripeWidth));
}
} }
if(row < nbRow-1) if(row < nbRow-1)
@ -200,7 +194,7 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
// add bottom triangle // add bottom triangle
QPainterPath triangleBottom = QPainterPath triangleBottom =
QTransform() QTransform()
.translate(tilesMargins.left()+ m_drawingAreaWidth/2, tilesMargins.top()+ m_drawingAreaHeight) .translate(m_drawingAreaWidth/2, m_drawingAreaHeight - tileStripeWidth)
.rotate(180) .rotate(180)
.map(triangleBasic); .map(triangleBasic);
@ -209,22 +203,25 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
// dotted bottom line (for glueing) // dotted bottom line (for glueing)
penTileInfos.setStyle(Qt::DotLine); penTileInfos.setStyle(Qt::DotLine);
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->drawLine(QPointF(tilesMargins.left(), painter->drawLine(QPointF(0, m_drawingAreaHeight - tileStripeWidth),
tilesMargins.top() + m_drawingAreaHeight), QPointF(m_drawingAreaWidth, m_drawingAreaHeight - tileStripeWidth));
QPointF(tilesMargins.left() + m_drawingAreaWidth + m_infoStripeWidth,
tilesMargins.top() + m_drawingAreaHeight)
);
} }
else else
{ {
// solid bottom line at the edge // solid bottom line at the edge
penTileInfos.setStyle(Qt::SolidLine); penTileInfos.setStyle(Qt::SolidLine);
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->drawLine(QPointF(tilesMargins.left(),
tilesMargins.top() + m_drawingAreaHeight), if(col < nbCol - 1)
QPointF(tilesMargins.left() + m_drawingAreaWidth + ((col < nbCol-1)? m_infoStripeWidth : 0), {
tilesMargins.top() + m_drawingAreaHeight) painter->drawLine(QPointF(0, m_drawingAreaHeight - tileStripeWidth),
); QPointF(m_drawingAreaWidth, m_drawingAreaHeight - tileStripeWidth));
}
else
{
painter->drawLine(QPointF(0, m_drawingAreaHeight - tileStripeWidth),
QPointF(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight - tileStripeWidth));;
}
} }
if(col < nbCol-1) if(col < nbCol-1)
@ -232,7 +229,7 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
// add right triangle // add right triangle
QPainterPath triangleRight = QPainterPath triangleRight =
QTransform() QTransform()
.translate(tilesMargins.left()+ m_drawingAreaWidth, tilesMargins.top()+ m_drawingAreaHeight/2) .translate(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight/2)
.rotate(90) .rotate(90)
.map(triangleBasic); .map(triangleBasic);
painter->fillPath(triangleRight, triangleBush); painter->fillPath(triangleRight, triangleBush);
@ -240,30 +237,30 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
// dotted right line (for glueing) // dotted right line (for glueing)
penTileInfos.setStyle(Qt::DotLine); penTileInfos.setStyle(Qt::DotLine);
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->drawLine(QPointF(tilesMargins.left() + m_drawingAreaWidth, painter->drawLine(QPointF(m_drawingAreaWidth - tileStripeWidth, 0),
tilesMargins.top()), QPointF(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight));
QPointF(tilesMargins.left() + m_drawingAreaWidth,
tilesMargins.top()+ m_drawingAreaHeight + m_infoStripeWidth)
);
} }
else else
{ {
// solid right line at the edge // solid right line at the edge
penTileInfos.setStyle(Qt::SolidLine); penTileInfos.setStyle(Qt::SolidLine);
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->drawLine(QPointF(tilesMargins.left() + m_drawingAreaWidth,
tilesMargins.top()), if(row < nbRow - 1)
QPointF(tilesMargins.left() + m_drawingAreaWidth, {
tilesMargins.top()+ m_drawingAreaHeight + ((row < nbRow-1) ? m_infoStripeWidth : 0)) painter->drawLine(QPointF(m_drawingAreaWidth - tileStripeWidth, 0),
); QPointF(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight));
}
else
{
painter->drawLine(QPointF(m_drawingAreaWidth - tileStripeWidth, 0),
QPointF(m_drawingAreaWidth - tileStripeWidth, m_drawingAreaHeight - tileStripeWidth));
}
} }
// prepare the painting for the text information // prepare the painting for the text information
QTextDocument td; QTextDocument td;
td.setPageSize(QSizeF( td.setPageSize(QSizeF(m_drawingAreaWidth - UnitConvertor(2, Unit::Cm, Unit::Px), m_drawingAreaHeight));
m_drawingAreaWidth - UnitConvertor(2, Unit::Cm, Unit::Px),
m_drawingAreaHeight
));
// paint the grid information // paint the grid information
const QString grid = tr("Grid ( %1 , %2 )").arg(row+1).arg(col+1); const QString grid = tr("Grid ( %1 , %2 )").arg(row+1).arg(col+1);
@ -276,9 +273,7 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
.arg(grid)); .arg(grid));
painter->setPen(penTileInfos); painter->setPen(penTileInfos);
painter->save(); painter->save();
painter->translate(QPointF(tilesMargins.left()+ UnitConvertor(1, Unit::Cm, Unit::Px), painter->translate(QPointF(UnitConvertor(1, Unit::Cm, Unit::Px), m_drawingAreaHeight - tileStripeWidth));
m_drawingAreaHeight + tilesMargins.top()
));
td.drawContents(painter); td.drawContents(painter);
painter->restore(); painter->restore();
@ -299,9 +294,8 @@ void VPTileFactory::drawTile(QPainter *painter, QPrinter *printer, const VPSheet
.arg(page).arg(clippedSheetName)); .arg(page).arg(clippedSheetName));
painter->save(); painter->save();
painter->rotate(-90); painter->rotate(-90);
painter->translate(QPointF(-(m_drawingAreaHeight+tilesMargins.top()) + UnitConvertor(1, Unit::Cm, Unit::Px), painter->translate(QPointF(-(m_drawingAreaHeight) + UnitConvertor(1, Unit::Cm, Unit::Px),
m_drawingAreaWidth + tilesMargins.left() m_drawingAreaWidth - tileStripeWidth));
));
td.drawContents(painter); td.drawContents(painter);
painter->restore(); painter->restore();
} }
@ -322,7 +316,7 @@ auto VPTileFactory::RowNb(const VPSheetPtr &sheet) const -> int
} }
QSizeF sheetSize = sheet->GetSheetSize(); QSizeF sheetSize = sheet->GetSheetSize();
return qCeil(sheetSize.height() * yScale / m_drawingAreaHeight); return qCeil(sheetSize.height() * yScale / (m_drawingAreaHeight - tileStripeWidth));
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -341,7 +335,7 @@ auto VPTileFactory::ColNb(const VPSheetPtr &sheet) const -> int
} }
QSizeF sheetSize = sheet->GetSheetSize(); QSizeF sheetSize = sheet->GetSheetSize();
return qCeil(sheetSize.width() * xScale / m_drawingAreaWidth); return qCeil(sheetSize.width() * xScale / (m_drawingAreaWidth - tileStripeWidth));
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------

View File

@ -85,6 +85,11 @@ public:
*/ */
auto DrawingAreaWidth() const -> qreal; auto DrawingAreaWidth() const -> qreal;
/**
* @brief tileStripeWidth the width of the info / glueing stripe in Px
*/
static constexpr qreal tileStripeWidth = UnitConvertor(1, Unit::Cm, Unit::Px);
private: private:
Q_DISABLE_COPY(VPTileFactory) Q_DISABLE_COPY(VPTileFactory)
@ -101,11 +106,6 @@ private:
*/ */
qreal m_drawingAreaWidth{0}; qreal m_drawingAreaWidth{0};
/**
* @brief m_infoStripeWidth the width of the info / glueing stripe in Px
*/
qreal m_infoStripeWidth;
}; };
#endif // VPTILEFACTORY_H #endif // VPTILEFACTORY_H