From 1a2ba7233de5db2396cbbc009e1305904d48bf37 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Thu, 18 Jul 2024 19:33:47 +0300 Subject: [PATCH] Recalculate seam allowance mirror line if it is not valid. --- src/app/puzzle/scene/vpgraphicspiece.cpp | 14 ++++++++- src/libs/vlayout/vabstractpiece.cpp | 36 ++++++++++++++++++++++++ src/libs/vlayout/vabstractpiece.h | 3 ++ src/libs/vlayout/vlayoutpiece.cpp | 14 ++++++++- src/libs/vpatterndb/vpiece.cpp | 29 +------------------ 5 files changed, 66 insertions(+), 30 deletions(-) diff --git a/src/app/puzzle/scene/vpgraphicspiece.cpp b/src/app/puzzle/scene/vpgraphicspiece.cpp index 8a21b0325..c258705c1 100644 --- a/src/app/puzzle/scene/vpgraphicspiece.cpp +++ b/src/app/puzzle/scene/vpgraphicspiece.cpp @@ -927,9 +927,21 @@ void VPGraphicsPiece::PaintMirrorLine(QPainter *painter, const VPPiecePtr &piece } else if (not piece->IsSeamAllowanceBuiltIn()) { - QLineF const seamAllowanceMirrorLine = piece->GetMappedSeamAllowanceMirrorLine(); + QLineF seamAllowanceMirrorLine = piece->GetMappedSeamAllowanceMirrorLine(); if (!seamAllowanceMirrorLine.isNull() && piece->IsShowMirrorLine()) { + { // Trying to correct a seam allowance mirror line based on seam mirror line + QVector seamAllowance; + CastTo(piece->GetMappedContourPoints(), seamAllowance); + + if (!VAbstractCurve::IsPointOnCurve(seamAllowance, seamAllowanceMirrorLine.p1()) || + !VAbstractCurve::IsPointOnCurve(seamAllowance, seamAllowanceMirrorLine.p2())) + { + seamAllowanceMirrorLine = + piece->SeamAllowanceMirrorLine(piece->GetMappedSeamMirrorLine(), seamAllowance); + } + } + QPainterPath mirrorPath; mirrorPath.moveTo(seamAllowanceMirrorLine.p1()); mirrorPath.lineTo(seamAllowanceMirrorLine.p2()); diff --git a/src/libs/vlayout/vabstractpiece.cpp b/src/libs/vlayout/vabstractpiece.cpp index 12883728a..1ca30b280 100644 --- a/src/libs/vlayout/vabstractpiece.cpp +++ b/src/libs/vlayout/vabstractpiece.cpp @@ -2132,3 +2132,39 @@ auto VAbstractPiece::LabelShapePath(const PlaceLabelImg &shape) -> QPainterPath } return path; } + +//--------------------------------------------------------------------------------------------------------------------- +auto VAbstractPiece::SeamAllowanceMirrorLine(const QLineF &seamMirrorLine, + const QVector &seamAllowancePoints) const -> QLineF +{ + if (!IsSeamAllowance() || (IsSeamAllowance() && IsSeamAllowanceBuiltIn())) + { + return seamMirrorLine; + } + + auto rec = QRectF(0, 0, INT_MAX, INT_MAX); + rec.translate(-INT_MAX / 2.0, -INT_MAX / 2.0); + + auto axis = + QLineF(seamMirrorLine.center(), VGObject::BuildRay(seamMirrorLine.center(), seamMirrorLine.angle() + 180, rec)); + + QVector points = seamAllowancePoints; + + QVector intersections = VAbstractCurve::CurveIntersectLine(points, axis); + if (intersections.isEmpty()) + { + return {}; + } + + const QPointF startPoint = intersections.constFirst(); + + std::reverse(points.begin(), points.end()); + axis = QLineF(seamMirrorLine.center(), VGObject::BuildRay(seamMirrorLine.center(), seamMirrorLine.angle(), rec)); + intersections = VAbstractCurve::CurveIntersectLine(points, axis); + if (intersections.isEmpty()) + { + return {}; + } + + return {startPoint, intersections.constFirst()}; +} diff --git a/src/libs/vlayout/vabstractpiece.h b/src/libs/vlayout/vabstractpiece.h index d8083af57..17898d892 100644 --- a/src/libs/vlayout/vabstractpiece.h +++ b/src/libs/vlayout/vabstractpiece.h @@ -198,6 +198,9 @@ public: template static auto MapPoint(T obj, const QTransform &matrix) -> T; + auto SeamAllowanceMirrorLine(const QLineF &seamMirrorLine, const QVector &seamAllowancePoints) const + -> QLineF; + protected: static auto IsEkvPointOnLine(const QPointF &iPoint, const QPointF &prevPoint, const QPointF &nextPoint) -> bool; static auto IsEkvPointOnLine(const VSAPoint &iPoint, const VSAPoint &prevPoint, const VSAPoint &nextPoint) -> bool; diff --git a/src/libs/vlayout/vlayoutpiece.cpp b/src/libs/vlayout/vlayoutpiece.cpp index cb5187a60..a330fa2b2 100644 --- a/src/libs/vlayout/vlayoutpiece.cpp +++ b/src/libs/vlayout/vlayoutpiece.cpp @@ -834,7 +834,19 @@ auto VLayoutPiece::GetFullSeamAllowancePoints() const -> QVector points.reserve(d->m_seamAllowance.size()); if (!d->m_seamAllowanceMirrorLine.isNull() && IsShowFullPiece()) { - points = VAbstractPiece::FullSeamAllowancePath(d->m_seamAllowance, d->m_seamAllowanceMirrorLine, GetName()); + QLineF seamAllowanceMirrorLine = d->m_seamAllowanceMirrorLine; + { // Trying to correct a seam allowance mirror line based on seam mirror line + QVector seamAllowance; + CastTo(d->m_seamAllowance, seamAllowance); + + if (!VAbstractCurve::IsPointOnCurve(seamAllowance, seamAllowanceMirrorLine.p1()) || + !VAbstractCurve::IsPointOnCurve(seamAllowance, seamAllowanceMirrorLine.p2())) + { + seamAllowanceMirrorLine = SeamAllowanceMirrorLine(d->m_seamMirrorLine, seamAllowance); + } + } + + points = VAbstractPiece::FullSeamAllowancePath(d->m_seamAllowance, seamAllowanceMirrorLine, GetName()); points = CheckLoops(CorrectEquidistantPoints(points)); // A path can contains loops } else diff --git a/src/libs/vpatterndb/vpiece.cpp b/src/libs/vpatterndb/vpiece.cpp index d6432a848..4024c19dd 100644 --- a/src/libs/vpatterndb/vpiece.cpp +++ b/src/libs/vpatterndb/vpiece.cpp @@ -1670,37 +1670,10 @@ auto VPiece::SeamAllowanceMirrorLine(const VContainer *data) const -> QLineF { QLineF seamMirrorLine = SeamMirrorLine(data); - if (!IsSeamAllowance() || (IsSeamAllowance() && IsSeamAllowanceBuiltIn())) - { - return seamMirrorLine; - } - - auto rec = QRectF(0, 0, INT_MAX, INT_MAX); - rec.translate(-INT_MAX / 2.0, -INT_MAX / 2.0); - - auto axis = - QLineF(seamMirrorLine.center(), VGObject::BuildRay(seamMirrorLine.center(), seamMirrorLine.angle() + 180, rec)); - QVector points; CastTo(SeamAllowancePoints(data), points); - QVector intersections = VAbstractCurve::CurveIntersectLine(points, axis); - if (intersections.isEmpty()) - { - return {}; - } - - const QPointF startPoint = intersections.constFirst(); - - std::reverse(points.begin(), points.end()); - axis = QLineF(seamMirrorLine.center(), VGObject::BuildRay(seamMirrorLine.center(), seamMirrorLine.angle(), rec)); - intersections = VAbstractCurve::CurveIntersectLine(points, axis); - if (intersections.isEmpty()) - { - return {}; - } - - return {startPoint, intersections.constFirst()}; + return VAbstractPiece::SeamAllowanceMirrorLine(seamMirrorLine, points); } //---------------------------------------------------------------------------------------------------------------------