diff --git a/src/libs/vlayout/vabstractpiece.h b/src/libs/vlayout/vabstractpiece.h index e45a8a385..2bfc21ca4 100644 --- a/src/libs/vlayout/vabstractpiece.h +++ b/src/libs/vlayout/vabstractpiece.h @@ -181,6 +181,7 @@ protected: template static QVector RemoveDublicates(const QVector &points, bool removeFirstAndLast = true); static qreal MaxLocalSA(const VSAPoint &p, qreal width); + static bool IsEkvPointOnLine(const QPointF &iPoint, const QPointF &prevPoint, const QPointF &nextPoint); static bool IsEkvPointOnLine(const VSAPoint &iPoint, const VSAPoint &prevPoint, const VSAPoint &nextPoint); private: @@ -213,7 +214,6 @@ private: static QPointF SingleParallelPoint(const QPointF &p1, const QPointF &p2, qreal angle, qreal width); static QLineF BisectorLine(const QPointF &p1, const QPointF &p2, const QPointF &p3); static qreal AngleBetweenBisectors(const QLineF &b1, const QLineF &b2); - static bool IsEkvPointOnLine(const QPointF &iPoint, const QPointF &prevPoint, const QPointF &nextPoint); }; Q_DECLARE_TYPEINFO(VAbstractPiece, Q_MOVABLE_TYPE); diff --git a/src/libs/vpatterndb/vpiece.cpp b/src/libs/vpatterndb/vpiece.cpp index fff605cb3..d5fc46c57 100644 --- a/src/libs/vpatterndb/vpiece.cpp +++ b/src/libs/vpatterndb/vpiece.cpp @@ -991,7 +991,16 @@ bool VPiece::GetSeamPassmarkSAPoint(const VSAPoint &previousSAPoint, const VSAPo QVector ekvPoints; const qreal width = ToPixel(GetSAWidth(), *data->GetPatternUnit()); - if (IsEkvPointOnLine(passmarkSAPoint, previousSAPoint, nextSAPoint)) // see issue #665 + + /* Because method VAbstractPiece::EkvPoint has troubles with edges on a same line we should specially treat such + cases. + First check if two edges and seam alowance create paralell lines. + Second case check if two edges are on a same line geometrically and a passmark point has equal SA width.*/ + if (IsEkvPointOnLine(passmarkSAPoint, previousSAPoint, nextSAPoint)// see issue #665 + || (IsEkvPointOnLine(static_cast(passmarkSAPoint), static_cast(previousSAPoint), + static_cast(nextSAPoint)) + && qAbs(passmarkSAPoint.GetSABefore(width) + - passmarkSAPoint.GetSAAfter(width)) < VGObject::accuracyPointOnLine)) { QLineF line (passmarkSAPoint, nextSAPoint); line.setAngle(line.angle() + 90);