From b80103e0882b13384364f06e4e1c44728cf2087a Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Tue, 18 Jun 2019 14:28:16 +0300 Subject: [PATCH] Improve saving a layout result. --HG-- branch : develop --- src/libs/vlayout/vbestsquare.cpp | 32 ++++++++++++++++++++++----- src/libs/vlayout/vbestsquare.h | 2 ++ src/libs/vlayout/vlayoutdef.h | 2 ++ src/libs/vlayout/vlayoutgenerator.cpp | 1 + src/libs/vlayout/vlayoutpaper.cpp | 13 +++++++++++ src/libs/vlayout/vlayoutpaper.h | 3 +++ src/libs/vlayout/vlayoutpaper_p.h | 4 +++- src/libs/vlayout/vlayoutpiece.cpp | 1 + src/libs/vlayout/vposition.cpp | 6 +++-- src/libs/vlayout/vposition.h | 4 ++-- 10 files changed, 58 insertions(+), 10 deletions(-) diff --git a/src/libs/vlayout/vbestsquare.cpp b/src/libs/vlayout/vbestsquare.cpp index cd0306078..e3c35d708 100644 --- a/src/libs/vlayout/vbestsquare.cpp +++ b/src/libs/vlayout/vbestsquare.cpp @@ -28,6 +28,7 @@ #include "vbestsquare.h" #include "vbestsquare_p.h" +#include "../vmisc/def.h" #include @@ -76,21 +77,33 @@ void VBestSquare::NewResult(const VBestSquareResData &data) const qint64 candidateSquare = Square(data.bestSize); - if (candidateSquare > 0) + if (candidateSquare > 0 && data.type >= d->data.type && candidateSquare <= Square(d->data.bestSize)) { - if (data.type >= d->data.type && candidateSquare <= Square(d->data.bestSize) - && data.depthPosition <= d->data.depthPosition) + if (not HasValidResult()) + { + SaveResult(); // First result + } + else { if (d->saveLength) { - if (data.depthPosition <= d->data.depthPosition) + if (VFuzzyComparePossibleNulls(data.depthPosition, d->data.depthPosition) + && IsImprovedSidePosition(data.sidePosition)) + { + SaveResult(); + } + else if (data.depthPosition < d->data.depthPosition) { SaveResult(); } } else { - SaveResult(); + if (IsImprovedSidePosition(data.sidePosition) + || VFuzzyComparePossibleNulls(data.sidePosition, d->data.sidePosition)) + { + SaveResult(); + } } } } @@ -165,6 +178,15 @@ bool VBestSquare::IsSaveLength() const return d->saveLength; } +//--------------------------------------------------------------------------------------------------------------------- +bool VBestSquare::IsImprovedSidePosition(qreal sidePosition) const +{ + const bool lessThan = d->data.sidePosition < sidePosition; + const bool greaterThan = d->data.sidePosition > sidePosition; + + return IsPortrait() ? greaterThan : lessThan; +} + //--------------------------------------------------------------------------------------------------------------------- bool VBestSquare::IsPortrait() const { diff --git a/src/libs/vlayout/vbestsquare.h b/src/libs/vlayout/vbestsquare.h index 53e818da1..bad0a0688 100644 --- a/src/libs/vlayout/vbestsquare.h +++ b/src/libs/vlayout/vbestsquare.h @@ -69,10 +69,12 @@ public: VBestSquareResData BestResultData() const; bool IsSaveLength() const; + bool IsImprovedSidePosition(qreal sidePosition) const; bool IsPortrait() const; private: QSharedDataPointer d; + }; Q_DECLARE_TYPEINFO(VBestSquare, Q_MOVABLE_TYPE); diff --git a/src/libs/vlayout/vlayoutdef.h b/src/libs/vlayout/vlayoutdef.h index 995632bd8..019712899 100644 --- a/src/libs/vlayout/vlayoutdef.h +++ b/src/libs/vlayout/vlayoutdef.h @@ -63,6 +63,8 @@ struct VBestSquareResData BestFrom type{BestFrom::Rotation}; // cppcheck-suppress unusedStructMember qreal depthPosition{INT_MAX}; + // cppcheck-suppress unusedStructMember + qreal sidePosition{0}; }; struct VCachedPositions diff --git a/src/libs/vlayout/vlayoutgenerator.cpp b/src/libs/vlayout/vlayoutgenerator.cpp index 1962185e6..c130a12e5 100644 --- a/src/libs/vlayout/vlayoutgenerator.cpp +++ b/src/libs/vlayout/vlayoutgenerator.cpp @@ -179,6 +179,7 @@ void VLayoutGenerator::Generate(QElapsedTimer timer, qint64 timeout) paper.SetFollowGrainline(followGrainline); paper.SetRotationNumber(rotationNumber); paper.SetSaveLength(saveLength); + paper.SetOriginPaperPortrait(IsPortrait()); do { const int index = bank->GetNext(); diff --git a/src/libs/vlayout/vlayoutpaper.cpp b/src/libs/vlayout/vlayoutpaper.cpp index 66da5fa62..47ef7e60b 100644 --- a/src/libs/vlayout/vlayoutpaper.cpp +++ b/src/libs/vlayout/vlayoutpaper.cpp @@ -192,6 +192,18 @@ void VLayoutPaper::SetPaperIndex(quint32 index) d->paperIndex = index; } +//--------------------------------------------------------------------------------------------------------------------- +bool VLayoutPaper::IsOriginPaperPortrait() const +{ + return d->originPaperOrientation; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VLayoutPaper::SetOriginPaperPortrait(bool portrait) +{ + d->originPaperOrientation = portrait; +} + //--------------------------------------------------------------------------------------------------------------------- bool VLayoutPaper::ArrangeDetail(const VLayoutPiece &detail, std::atomic_bool &stop) { @@ -253,6 +265,7 @@ bool VLayoutPaper::AddToSheet(const VLayoutPiece &detail, std::atomic_bool &stop data.rotationNumber = d->localRotationNumber; data.followGrainline = d->followGrainline; data.positionsCache = d->positionsCache; + data.isOriginPaperOrientationPortrait = d->originPaperOrientation; auto *thread = new VPosition(data, &stop, d->saveLength); //Info for debug diff --git a/src/libs/vlayout/vlayoutpaper.h b/src/libs/vlayout/vlayoutpaper.h index a70685c80..071b9dc56 100644 --- a/src/libs/vlayout/vlayoutpaper.h +++ b/src/libs/vlayout/vlayoutpaper.h @@ -90,6 +90,9 @@ public: void SetPaperIndex(quint32 index); + bool IsOriginPaperPortrait() const; + void SetOriginPaperPortrait(bool portrait); + bool ArrangeDetail(const VLayoutPiece &detail, std::atomic_bool &stop); int Count() const; Q_REQUIRED_RESULT QGraphicsRectItem *GetPaperItem(bool autoCrop, bool textAsPaths) const; diff --git a/src/libs/vlayout/vlayoutpaper_p.h b/src/libs/vlayout/vlayoutpaper_p.h index 39ae99ee9..224d570eb 100644 --- a/src/libs/vlayout/vlayoutpaper_p.h +++ b/src/libs/vlayout/vlayoutpaper_p.h @@ -64,7 +64,8 @@ public: globalRotationNumber(paper.globalRotationNumber), localRotationNumber(paper.localRotationNumber), saveLength(paper.saveLength), - followGrainline(paper.followGrainline) + followGrainline(paper.followGrainline), + originPaperOrientation(paper.originPaperOrientation) {} ~VLayoutPaperData() {} @@ -86,6 +87,7 @@ public: int localRotationNumber{2}; bool saveLength{false}; bool followGrainline{false}; + bool originPaperOrientation{true}; private: VLayoutPaperData& operator=(const VLayoutPaperData&) Q_DECL_EQ_DELETE; diff --git a/src/libs/vlayout/vlayoutpiece.cpp b/src/libs/vlayout/vlayoutpiece.cpp index 4d6dc84a7..7baa5cabc 100644 --- a/src/libs/vlayout/vlayoutpiece.cpp +++ b/src/libs/vlayout/vlayoutpiece.cpp @@ -51,6 +51,7 @@ #include "../vmisc/vabstractapplication.h" #include "../vpatterndb/calculator.h" #include "../vpatterndb/vpassmark.h" +#include "../vpatterndb/vpiecenode.h" #include "../vgeometry/vpointf.h" #include "../vgeometry/vplacelabelitem.h" #include "vlayoutdef.h" diff --git a/src/libs/vlayout/vposition.cpp b/src/libs/vlayout/vposition.cpp index f8544c900..7f165991a 100644 --- a/src/libs/vlayout/vposition.cpp +++ b/src/libs/vlayout/vposition.cpp @@ -315,8 +315,9 @@ void VPosition::SaveCandidate(VBestSquare &bestResult, const VLayoutPiece &detai QVector newGContour = m_data.gContour.UniteWithContour(detail, globalI, detJ, type); newGContour.append(newGContour.first()); const QSizeF size = QPolygonF(newGContour).boundingRect().size(); - const qreal depthPosition = m_data.gContour.IsPortrait() ? detail.DetailBoundingRect().y() : - detail.DetailBoundingRect().x(); + const QRectF boundingRect = detail.DetailBoundingRect(); + const qreal depthPosition = m_data.isOriginPaperOrientationPortrait ? boundingRect.y() : boundingRect.x(); + const qreal sidePosition = m_data.isOriginPaperOrientationPortrait ? boundingRect.x() : boundingRect.y(); VBestSquareResData data; data.bestSize = size; @@ -326,6 +327,7 @@ void VPosition::SaveCandidate(VBestSquare &bestResult, const VLayoutPiece &detai data.resMirror = detail.IsMirror(); data.type = type; data.depthPosition = depthPosition; + data.sidePosition = sidePosition; bestResult.NewResult(data); } diff --git a/src/libs/vlayout/vposition.h b/src/libs/vlayout/vposition.h index 10934131b..4b2f31ba2 100644 --- a/src/libs/vlayout/vposition.h +++ b/src/libs/vlayout/vposition.h @@ -50,6 +50,7 @@ struct VPositionData int rotationNumber{0}; bool followGrainline{false}; QVector positionsCache{}; + bool isOriginPaperOrientationPortrait{true}; }; class VPosition : public QRunnable @@ -140,8 +141,7 @@ private: */ inline QLineF VPosition::FabricGrainline() const { - return m_data.gContour.GetHeight() >= m_data.gContour.GetWidth() ? QLineF(10, 10, 10, 100) : - QLineF(10, 10, 100, 10); + return m_data.isOriginPaperOrientationPortrait ? QLineF(10, 10, 10, 100) : QLineF(10, 10, 100, 10); } #endif // VPOSITION_H