From 225cb47f170df0325fea2db84e6000a9bad968df Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 19 Jan 2024 18:15:30 +0200 Subject: [PATCH] Fixed bug in seam allowance with mirror line. --- src/libs/vpatterndb/vpiece.cpp | 21 +++++++++++-------- src/libs/vpatterndb/vpiecepath.cpp | 33 ++++++++++++++++++++++++++---- src/libs/vpatterndb/vpiecepath.h | 3 ++- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/libs/vpatterndb/vpiece.cpp b/src/libs/vpatterndb/vpiece.cpp index ccb97bdff..3daeac300 100644 --- a/src/libs/vpatterndb/vpiece.cpp +++ b/src/libs/vpatterndb/vpiece.cpp @@ -779,14 +779,16 @@ auto VPiece::SeamAllowancePointsWithRotation(const VContainer *data, vsizetype m { { VSAPoint ekvPoint = VPiecePath::PreparePointEkv(node, data); - if (showMirrorLine && VFuzzyComparePoints(ekvPoint, mirrorLine.p1())) + if (showMirrorLine) { - ekvPoint.SetSAAfter(0); - } - - if (showMirrorLine && VFuzzyComparePoints(ekvPoint, mirrorLine.p2())) - { - ekvPoint.SetSABefore(0); + if (VFuzzyComparePoints(ekvPoint, mirrorLine.p1())) + { + ekvPoint.SetSAAfter(0); + } + else if (VFuzzyComparePoints(ekvPoint, mirrorLine.p2())) + { + ekvPoint.SetSABefore(0); + } } pointsEkv.append(ekvPoint); @@ -832,7 +834,7 @@ auto VPiece::SeamAllowancePointsWithRotation(const VContainer *data, vsizetype m const QSharedPointer curve = data->GeometricObject(node.GetId()); pointsEkv += VPiecePath::CurveSeamAllowanceSegment(data, unitedPath, curve, i, node.GetReverse(), - width, GetName()); + width, mirrorLine, GetName()); } } break; @@ -1081,7 +1083,8 @@ auto VPiece::GetNodeSAPoints(const QVector &path, vsizetype index, c const QSharedPointer curve = data->GeometricObject(node.GetId()); const qreal width = ToPixel(GetSAWidth(), *data->GetPatternUnit()); - points += VPiecePath::CurveSeamAllowanceSegment(data, path, curve, index, node.GetReverse(), width, GetName()); + points += VPiecePath::CurveSeamAllowanceSegment(data, path, curve, index, node.GetReverse(), width, QLineF(), + GetName()); } return points; } diff --git a/src/libs/vpatterndb/vpiecepath.cpp b/src/libs/vpatterndb/vpiecepath.cpp index 071fbc248..13467262b 100644 --- a/src/libs/vpatterndb/vpiecepath.cpp +++ b/src/libs/vpatterndb/vpiecepath.cpp @@ -552,7 +552,8 @@ auto VPiecePath::SeamAllowancePoints(const VContainer *data, qreal width, bool r case (Tool::NodeSplinePath): { const QSharedPointer curve = data->GeometricObject(node.GetId()); - pointsEkv += CurveSeamAllowanceSegment(data, d->m_nodes, curve, i, node.GetReverse(), width, GetName()); + pointsEkv += CurveSeamAllowanceSegment(data, d->m_nodes, curve, i, node.GetReverse(), width, QLineF(), + GetName()); } break; default: @@ -1152,10 +1153,34 @@ auto VPiecePath::PreparePointEkv(const VPieceNode &node, const VContainer *data) //--------------------------------------------------------------------------------------------------------------------- auto VPiecePath::CurveSeamAllowanceSegment(const VContainer *data, const QVector &nodes, const QSharedPointer &curve, vsizetype i, bool reverse, - qreal width, const QString &piece) -> QVector + qreal width, const QLineF &mirrorLine, const QString &piece) + -> QVector { - const VSAPoint begin = StartSegment(data, nodes, i); - const VSAPoint end = EndSegment(data, nodes, i); + VSAPoint begin = StartSegment(data, nodes, i); + if (!mirrorLine.isNull()) + { + if (VFuzzyComparePoints(begin, mirrorLine.p1())) + { + begin.SetSAAfter(0); + } + else if (VFuzzyComparePoints(begin, mirrorLine.p2())) + { + begin.SetSABefore(0); + } + } + + VSAPoint end = EndSegment(data, nodes, i); + if (!mirrorLine.isNull()) + { + if (VFuzzyComparePoints(end, mirrorLine.p1())) + { + end.SetSAAfter(0); + } + else if (VFuzzyComparePoints(end, mirrorLine.p2())) + { + end.SetSABefore(0); + } + } const QVector points = curve->GetSegmentPoints(begin, end, reverse, piece); if (points.size() < 2) diff --git a/src/libs/vpatterndb/vpiecepath.h b/src/libs/vpatterndb/vpiecepath.h index 00e73dac6..1f616bb03 100644 --- a/src/libs/vpatterndb/vpiecepath.h +++ b/src/libs/vpatterndb/vpiecepath.h @@ -137,7 +137,8 @@ public: static auto CurveSeamAllowanceSegment(const VContainer *data, const QVector &nodes, const QSharedPointer &curve, vsizetype i, bool reverse, - qreal width, const QString &piece = QString()) -> QVector; + qreal width, const QLineF &mirrorLine, const QString &piece = QString()) + -> QVector; static auto NodeName(const QVector &nodes, vsizetype nodeIndex, const VContainer *data) -> QString;