diff --git a/src/app/dialogs/app/dialoglayoutsettings.cpp b/src/app/dialogs/app/dialoglayoutsettings.cpp
index f8012c286..befced84b 100644
--- a/src/app/dialogs/app/dialoglayoutsettings.cpp
+++ b/src/app/dialogs/app/dialoglayoutsettings.cpp
@@ -214,6 +214,18 @@ void DialogLayoutSettings::SetAutoCrop(bool autoCrop)
ui->checkBoxAutoCrop->setChecked(autoCrop);
}
+//---------------------------------------------------------------------------------------------------------------------
+bool DialogLayoutSettings::IsSaveLength() const
+{
+ return ui->checkBoxSaveLength->isChecked();
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+void DialogLayoutSettings::SetSaveLength(bool save)
+{
+ ui->checkBoxSaveLength->setChecked(save);
+}
+
//---------------------------------------------------------------------------------------------------------------------
void DialogLayoutSettings::TemplateSelected()
{
@@ -315,6 +327,7 @@ void DialogLayoutSettings::DialogAccepted()
generator->SetRotate(GetRotate());
generator->SetRotationIncrease(GetIncrease());
generator->SetAutoCrop(GetAutoCrop());
+ generator->SetSaveLength(IsSaveLength());
accepted();
}
@@ -402,61 +415,85 @@ QSizeF DialogLayoutSettings::Template()
{
case PaperSizeTemplate::A0:
SetAutoCrop(false);
+ SetSaveLength(false);
+
width = VAbstractMeasurements::UnitConvertor(841, Unit::Mm, paperUnit);
height = VAbstractMeasurements::UnitConvertor(1189, Unit::Mm, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::A1:
SetAutoCrop(false);
+ SetSaveLength(false);
+
width = VAbstractMeasurements::UnitConvertor(594, Unit::Mm, paperUnit);
height = VAbstractMeasurements::UnitConvertor(841, Unit::Mm, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::A2:
SetAutoCrop(false);
+ SetSaveLength(false);
+
width = VAbstractMeasurements::UnitConvertor(420, Unit::Mm, paperUnit);
height = VAbstractMeasurements::UnitConvertor(594, Unit::Mm, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::A3:
SetAutoCrop(false);
+ SetSaveLength(false);
+
width = VAbstractMeasurements::UnitConvertor(297, Unit::Mm, paperUnit);
height = VAbstractMeasurements::UnitConvertor(420, Unit::Mm, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::A4:
SetAutoCrop(false);
+ SetSaveLength(false);
+
width = VAbstractMeasurements::UnitConvertor(210, Unit::Mm, paperUnit);
height = VAbstractMeasurements::UnitConvertor(297, Unit::Mm, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::Letter:
SetAutoCrop(false);
+ SetSaveLength(false);
+
width = VAbstractMeasurements::UnitConvertor(8.5, Unit::Inch, paperUnit);
height = VAbstractMeasurements::UnitConvertor(11, Unit::Inch, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::Legal:
SetAutoCrop(false);
+ SetSaveLength(false);
+
width = VAbstractMeasurements::UnitConvertor(11, Unit::Inch, paperUnit);
height = VAbstractMeasurements::UnitConvertor(17, Unit::Inch, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::Roll24in:
SetAutoCrop(true);
+ SetSaveLength(true);
+
width = VAbstractMeasurements::UnitConvertor(24, Unit::Inch, paperUnit);
height = VAbstractMeasurements::UnitConvertor(QIMAGE_MAX, Unit::Px, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::Roll30in:
SetAutoCrop(true);
+ SetSaveLength(true);
+
width = VAbstractMeasurements::UnitConvertor(30, Unit::Inch, paperUnit);
height = VAbstractMeasurements::UnitConvertor(QIMAGE_MAX, Unit::Px, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::Roll36in:
SetAutoCrop(true);
+ SetSaveLength(true);
+
width = VAbstractMeasurements::UnitConvertor(36, Unit::Inch, paperUnit);
height = VAbstractMeasurements::UnitConvertor(QIMAGE_MAX, Unit::Px, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::Roll42in:
SetAutoCrop(true);
+ SetSaveLength(true);
+
width = VAbstractMeasurements::UnitConvertor(42, Unit::Inch, paperUnit);
height = VAbstractMeasurements::UnitConvertor(QIMAGE_MAX, Unit::Px, paperUnit);
return QSizeF(width, height);
case PaperSizeTemplate::Roll44in:
SetAutoCrop(true);
+ SetSaveLength(true);
+
width = VAbstractMeasurements::UnitConvertor(44, Unit::Inch, paperUnit);
height = VAbstractMeasurements::UnitConvertor(QIMAGE_MAX, Unit::Px, paperUnit);
return QSizeF(width, height);
diff --git a/src/app/dialogs/app/dialoglayoutsettings.h b/src/app/dialogs/app/dialoglayoutsettings.h
index 4b46d9859..80891bd71 100644
--- a/src/app/dialogs/app/dialoglayoutsettings.h
+++ b/src/app/dialogs/app/dialoglayoutsettings.h
@@ -72,6 +72,9 @@ public:
bool GetAutoCrop() const;
void SetAutoCrop(bool crop);
+ bool IsSaveLength() const;
+ void SetSaveLength(bool save);
+
public slots:
void ConvertPaperSize();
void ConvertLayoutSize();
diff --git a/src/app/dialogs/app/dialoglayoutsettings.ui b/src/app/dialogs/app/dialoglayoutsettings.ui
index 0e8806b7c..67ce64c61 100644
--- a/src/app/dialogs/app/dialoglayoutsettings.ui
+++ b/src/app/dialogs/app/dialoglayoutsettings.ui
@@ -17,10 +17,6 @@
:/icon/64x64/icon64x64.png:/icon/64x64/icon64x64.png
-
-
- :/icon/64x64/icon64x64.png:/icon/64x64/icon64x64.png
-
-
@@ -429,6 +425,13 @@
+ -
+
+
+ Save length of the sheet
+
+
+
-
diff --git a/src/libs/vlayout/vbestsquare.cpp b/src/libs/vlayout/vbestsquare.cpp
index 74b23ba29..54401ea40 100644
--- a/src/libs/vlayout/vbestsquare.cpp
+++ b/src/libs/vlayout/vbestsquare.cpp
@@ -29,39 +29,60 @@
#include "vbestsquare.h"
//---------------------------------------------------------------------------------------------------------------------
-VBestSquare::VBestSquare()
- :resI(0), resJ(0), resMatrix(QMatrix()), resSquare(LLONG_MAX), valideResult(false), resMirror(false),
- type (BestFrom::Rotation)
+VBestSquare::VBestSquare(const QSizeF &sheetSize, bool saveLength)
+ :resI(0), resJ(0), resMatrix(QMatrix()), bestSize(QSizeF(sheetSize.width()+10, sheetSize.height()+10)),
+ sheetWidth(sheetSize.width()), valideResult(false), resMirror(false), type (BestFrom::Rotation),
+ saveLength(saveLength)
{}
//---------------------------------------------------------------------------------------------------------------------
-void VBestSquare::NewResult(qint64 square, int i, int j, const QTransform &matrix, bool mirror, BestFrom type)
+void VBestSquare::NewResult(const QSizeF &candidate, int i, int j, const QTransform &matrix, bool mirror, BestFrom type)
{
- if (square <= resSquare && square > 0 && type >= this->type)
+ if (saveLength)
{
- resI = i;
- resJ = j;
- resMatrix = matrix;
- resSquare = square;
- valideResult = true;
- resMirror = mirror;
- this->type = type;
+ const QSizeF saveLengthSize(sheetWidth, candidate.height());
+ if (Square(saveLengthSize) <= Square(bestSize) && Square(saveLengthSize) > 0 && type >= this->type)
+ {
+ bestSize = saveLengthSize;
+ }
+ else
+ {
+ return;
+ }
}
+ else
+ {
+ if (Square(candidate) <= Square(bestSize) && Square(candidate) > 0 && type >= this->type)
+ {
+ bestSize = candidate;
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ resI = i;
+ resJ = j;
+ resMatrix = matrix;
+ valideResult = true;
+ resMirror = mirror;
+ this->type = type;
}
//---------------------------------------------------------------------------------------------------------------------
void VBestSquare::NewResult(const VBestSquare &best)
{
- if (best.ValidResult())
+ if (best.ValidResult() && saveLength == best.IsSaveLength())
{
- NewResult(best.BestSquare(), best.GContourEdge(), best.DetailEdge(), best.Matrix(), best.Mirror(), best.Type());
+ NewResult(best.BestSize(), best.GContourEdge(), best.DetailEdge(), best.Matrix(), best.Mirror(), best.Type());
}
}
//---------------------------------------------------------------------------------------------------------------------
-qint64 VBestSquare::BestSquare() const
+QSizeF VBestSquare::BestSize() const
{
- return resSquare;
+ return bestSize;
}
//---------------------------------------------------------------------------------------------------------------------
@@ -99,3 +120,15 @@ BestFrom VBestSquare::Type() const
{
return type;
}
+
+//---------------------------------------------------------------------------------------------------------------------
+bool VBestSquare::IsSaveLength() const
+{
+ return saveLength;
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+qint64 VBestSquare::Square(const QSizeF &size)
+{
+ return static_cast(size.width()*size.height());
+}
diff --git a/src/libs/vlayout/vbestsquare.h b/src/libs/vlayout/vbestsquare.h
index ba360f0b9..bc134c4c1 100644
--- a/src/libs/vlayout/vbestsquare.h
+++ b/src/libs/vlayout/vbestsquare.h
@@ -36,12 +36,12 @@
class VBestSquare
{
public:
- VBestSquare();
+ VBestSquare(const QSizeF &sheetSize, bool saveLength);
- void NewResult(qint64 square, int i, int j, const QTransform &matrix, bool mirror, BestFrom type);
+ void NewResult(const QSizeF &candidate, int i, int j, const QTransform &matrix, bool mirror, BestFrom type);
void NewResult(const VBestSquare &best);
- qint64 BestSquare() const;
+ QSizeF BestSize() const;
int GContourEdge() const;
int DetailEdge() const;
QTransform Matrix() const;
@@ -49,15 +49,21 @@ public:
bool Mirror() const;
BestFrom Type() const;
+ bool IsSaveLength() const;
+
private:
// All nedded information about best result
int resI; // Edge of global contour
int resJ; // Edge of detail
QTransform resMatrix; // Matrix for rotation and translation detail
- qint64 resSquare; // Best square size (least). For begin set max value.
+ QSizeF bestSize;
+ qreal sheetWidth;
bool valideResult;
bool resMirror;
BestFrom type;
+ bool saveLength;
+
+ static qint64 Square(const QSizeF &size);
};
#endif // VBESTSQUARE_H
diff --git a/src/libs/vlayout/vcontour.cpp b/src/libs/vlayout/vcontour.cpp
index a93f4ea75..a9499fc2e 100644
--- a/src/libs/vlayout/vcontour.cpp
+++ b/src/libs/vlayout/vcontour.cpp
@@ -116,6 +116,12 @@ void VContour::SetWidth(int width)
d->paperWidth = width;
}
+//---------------------------------------------------------------------------------------------------------------------
+QSizeF VContour::GetSize() const
+{
+ return QSizeF(d->paperWidth, d->paperHeight);
+}
+
//---------------------------------------------------------------------------------------------------------------------
QVector VContour::UniteWithContour(const VLayoutDetail &detail, int globalI, int detJ, BestFrom type) const
{
diff --git a/src/libs/vlayout/vcontour.h b/src/libs/vlayout/vcontour.h
index bef34f6d0..56c3bac9a 100644
--- a/src/libs/vlayout/vcontour.h
+++ b/src/libs/vlayout/vcontour.h
@@ -33,6 +33,7 @@
#include
#include
+#include
class VContourData;
class QPointF;
@@ -60,6 +61,8 @@ public:
int GetWidth() const;
void SetWidth(int width);
+ QSizeF GetSize() const;
+
QVector UniteWithContour(const VLayoutDetail &detail, int globalI, int detJ, BestFrom type) const;
int EdgesCount() const;
diff --git a/src/libs/vlayout/vlayoutgenerator.cpp b/src/libs/vlayout/vlayoutgenerator.cpp
index 9e7b41457..1b9c350a5 100644
--- a/src/libs/vlayout/vlayoutgenerator.cpp
+++ b/src/libs/vlayout/vlayoutgenerator.cpp
@@ -40,7 +40,7 @@
VLayoutGenerator::VLayoutGenerator(QObject *parent)
:QObject(parent), papers(QVector()), bank(new VBank()), paperHeight(0), paperWidth(0),
stopGeneration(false), state(LayoutErrors::NoError), shift(0), rotate(true), rotationIncrease(180),
- autoCrop(false)
+ autoCrop(false), saveLength(false)
{}
//---------------------------------------------------------------------------------------------------------------------
@@ -106,6 +106,7 @@ void VLayoutGenerator::Generate()
paper.SetPaperIndex(static_cast(papers.count()));
paper.SetRotate(rotate);
paper.SetRotationIncrease(rotationIncrease);
+ paper.SetSaveLength(saveLength);
do
{
const int index = bank->GetTiket();
@@ -189,6 +190,18 @@ void VLayoutGenerator::Abort()
#endif
}
+//---------------------------------------------------------------------------------------------------------------------
+bool VLayoutGenerator::IsSaveLength() const
+{
+ return saveLength;
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+void VLayoutGenerator::SetSaveLength(bool value)
+{
+ saveLength = value;
+}
+
//---------------------------------------------------------------------------------------------------------------------
bool VLayoutGenerator::GetAutoCrop() const
{
diff --git a/src/libs/vlayout/vlayoutgenerator.h b/src/libs/vlayout/vlayoutgenerator.h
index 71fb1974f..93a6d681e 100644
--- a/src/libs/vlayout/vlayoutgenerator.h
+++ b/src/libs/vlayout/vlayoutgenerator.h
@@ -76,6 +76,9 @@ public:
bool GetAutoCrop() const;
void SetAutoCrop(bool value);
+ bool IsSaveLength() const;
+ void SetSaveLength(bool value);
+
signals:
void Start();
void Arranged(int count);
@@ -97,6 +100,7 @@ private:
bool rotate;
int rotationIncrease;
bool autoCrop;
+ bool saveLength;
void CheckDetailsSize();
};
diff --git a/src/libs/vlayout/vlayoutpaper.cpp b/src/libs/vlayout/vlayoutpaper.cpp
index 1e967ea04..41c159e41 100644
--- a/src/libs/vlayout/vlayoutpaper.cpp
+++ b/src/libs/vlayout/vlayoutpaper.cpp
@@ -147,6 +147,18 @@ void VLayoutPaper::SetRotationIncrease(int value)
}
}
+//---------------------------------------------------------------------------------------------------------------------
+bool VLayoutPaper::IsSaveLength() const
+{
+ return d->saveLength;
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+void VLayoutPaper::SetSaveLength(bool value)
+{
+ d->saveLength = value;
+}
+
//---------------------------------------------------------------------------------------------------------------------
void VLayoutPaper::SetPaperIndex(quint32 index)
{
@@ -181,7 +193,7 @@ int VLayoutPaper::Count() const
//---------------------------------------------------------------------------------------------------------------------
bool VLayoutPaper::AddToSheet(const VLayoutDetail &detail, volatile bool &stop)
{
- VBestSquare bestResult;
+ VBestSquare bestResult(d->globalContour.GetSize(), d->saveLength);
QThreadPool *thread_pool = QThreadPool::globalInstance();
thread_pool->setExpiryTimeout(1000);
QVector threads;
@@ -190,7 +202,8 @@ bool VLayoutPaper::AddToSheet(const VLayoutDetail &detail, volatile bool &stop)
{
for (int i=1; i<= detail.EdgesCount(); i++)
{
- VPosition *thread = new VPosition(d->globalContour, j, detail, i, &stop, d->rotate, d->rotationIncrease);
+ VPosition *thread = new VPosition(d->globalContour, j, detail, i, &stop, d->rotate, d->rotationIncrease,
+ d->saveLength);
//Info for debug
#ifdef LAYOUT_DEBUG
thread->setPaperIndex(d->paperIndex);
diff --git a/src/libs/vlayout/vlayoutpaper.h b/src/libs/vlayout/vlayoutpaper.h
index 1fc409493..9fb22f6c1 100644
--- a/src/libs/vlayout/vlayoutpaper.h
+++ b/src/libs/vlayout/vlayoutpaper.h
@@ -65,6 +65,9 @@ public:
int GetRotationIncrease() const;
void SetRotationIncrease(int value);
+ bool IsSaveLength() const;
+ void SetSaveLength(bool value);
+
void SetPaperIndex(quint32 index);
bool ArrangeDetail(const VLayoutDetail &detail, volatile bool &stop);
diff --git a/src/libs/vlayout/vlayoutpaper_p.h b/src/libs/vlayout/vlayoutpaper_p.h
index fb31a0649..d047e0f47 100644
--- a/src/libs/vlayout/vlayoutpaper_p.h
+++ b/src/libs/vlayout/vlayoutpaper_p.h
@@ -46,18 +46,18 @@ class VLayoutPaperData : public QSharedData
public:
VLayoutPaperData()
:details(QVector()), globalContour(VContour()), paperIndex(0), frame(0), layoutWidth(0),
- rotate(true), rotationIncrease(180)
+ rotate(true), rotationIncrease(180), saveLength(false)
{}
VLayoutPaperData(int height, int width)
:details(QVector()), globalContour(VContour(height, width)), paperIndex(0), frame(0),
- layoutWidth(0), rotate(true), rotationIncrease(180)
+ layoutWidth(0), rotate(true), rotationIncrease(180), saveLength(false)
{}
VLayoutPaperData(const VLayoutPaperData &paper)
:QSharedData(paper), details(paper.details), globalContour(paper.globalContour), paperIndex(paper.paperIndex),
frame(paper.frame), layoutWidth(paper.layoutWidth), rotate(paper.rotate),
- rotationIncrease(paper.rotationIncrease)
+ rotationIncrease(paper.rotationIncrease), saveLength(paper.saveLength)
{}
~VLayoutPaperData() {}
@@ -73,6 +73,7 @@ public:
qreal layoutWidth;
bool rotate;
int rotationIncrease;
+ bool saveLength;
};
#ifdef Q_CC_GNU
diff --git a/src/libs/vlayout/vposition.cpp b/src/libs/vlayout/vposition.cpp
index 7532799c6..ca38e199b 100644
--- a/src/libs/vlayout/vposition.cpp
+++ b/src/libs/vlayout/vposition.cpp
@@ -47,9 +47,10 @@
//---------------------------------------------------------------------------------------------------------------------
VPosition::VPosition(const VContour &gContour, int j, const VLayoutDetail &detail, int i, volatile bool *stop,
- bool rotate, int rotationIncrease)
- :QRunnable(), bestResult(VBestSquare()), gContour(gContour), detail(detail), i(i), j(j), paperIndex(0), frame(0),
- detailsCount(0), details(QVector()), stop(stop), rotate(rotate), rotationIncrease(rotationIncrease)
+ bool rotate, int rotationIncrease, bool saveLength)
+ :QRunnable(), bestResult(VBestSquare(gContour.GetSize(), saveLength)), gContour(gContour), detail(detail), i(i),
+ j(j), paperIndex(0), frame(0), detailsCount(0), details(QVector()), stop(stop), rotate(rotate),
+ rotationIncrease(rotationIncrease)
{
if ((rotationIncrease >= 1 && rotationIncrease <= 180 && 360 % rotationIncrease == 0) == false)
{
@@ -225,9 +226,8 @@ void VPosition::SaveCandidate(VBestSquare &bestResult, const VLayoutDetail &deta
{
QVector newGContour = gContour.UniteWithContour(detail, globalI, detJ, type);
newGContour.append(newGContour.first());
- const QRectF rec = QPolygonF(newGContour).boundingRect();
- bestResult.NewResult(static_cast(rec.width()*rec.height()), globalI, detJ, detail.GetMatrix(),
- detail.IsMirror(), type);
+ const QSizeF size = QPolygonF(newGContour).boundingRect().size();
+ bestResult.NewResult(size, globalI, detJ, detail.GetMatrix(), detail.IsMirror(), type);
}
//---------------------------------------------------------------------------------------------------------------------
diff --git a/src/libs/vlayout/vposition.h b/src/libs/vlayout/vposition.h
index ba2461a79..a4f62c718 100644
--- a/src/libs/vlayout/vposition.h
+++ b/src/libs/vlayout/vposition.h
@@ -47,7 +47,7 @@ class VPosition : public QRunnable
{
public:
VPosition(const VContour &gContour, int j, const VLayoutDetail &detail, int i, volatile bool *stop, bool rotate,
- int rotationIncrease);
+ int rotationIncrease, bool saveLength);
virtual ~VPosition(){}
quint32 getPaperIndex() const;