Fix seam allowance bug.

Fix reverse dart case.

--HG--
branch : feature
This commit is contained in:
Roman Telezhynskyi 2016-11-13 11:23:04 +02:00
parent 3544e5611e
commit 1a9af78bef
2 changed files with 63 additions and 9 deletions

View File

@ -323,6 +323,31 @@ QVector<QPointF> VAbstractPiece::CheckLoops(const QVector<QPointF> &points)
return ekvPoints; return ekvPoints;
} }
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR qreal VAbstractPiece::PointPosition(const QPointF &p, const QLineF &line)
{
return (line.p2().x() - line.p1().x()) * (p.y() - line.p1().y()) -
(line.p2().y() - line.p1().y()) * (p.x() - line.p1().x());
}
//---------------------------------------------------------------------------------------------------------------------
qreal VAbstractPiece::MaxLocalSA(const VSAPoint &p, qreal width)
{
qreal w1 = qApp->toPixel(p.GetSAAfter());
if (w1 < 0)
{
w1 = width;
}
qreal w2 = qApp->toPixel(p.GetSABefore());
if (w2 < 0)
{
w2 = width;
}
return qMax(w1, w2);
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
/** /**
* @brief EkvPoint return vector of points of equidistant two lines. Last point of two lines must be equal. * @brief EkvPoint return vector of points of equidistant two lines. Last point of two lines must be equal.
@ -356,17 +381,18 @@ QVector<QPointF> VAbstractPiece::EkvPoint(const VSAPoint &p1Line1, const VSAPoin
break; break;
case (QLineF::UnboundedIntersection): case (QLineF::UnboundedIntersection):
{ {
const qreal localWidth = MaxLocalSA(p2Line1, width);
QLineF line( p2Line1, CrosPoint ); QLineF line( p2Line1, CrosPoint );
const int angle1 = BisectorAngle(p1Line1, p2Line1, p1Line2); const int angle1 = BisectorAngle(p1Line1, p2Line1, p1Line2);
const int angle2 = BisectorAngle(bigLine1.p1(), CrosPoint, bigLine2.p2()); const int angle2 = BisectorAngle(bigLine1.p1(), CrosPoint, bigLine2.p2());
if (qAbs(angle1 - angle2) < 180)// Go in a same direction if (qAbs(angle1 - angle2) < 90)// Go in a same direction
{//Regular equdistant case {//Regular equdistant case
const qreal length = line.length(); const qreal length = line.length();
if (length > width*2.4) if (length > localWidth*2.4)
{ // Cutting too long a cut angle { // Cutting too long a cut angle
line.setLength(width); // Not sure about width value here line.setLength(localWidth); // Not sure about width value here
QLineF cutLine(line.p2(), CrosPoint); // Cut line is a perpendicular QLineF cutLine(line.p2(), CrosPoint); // Cut line is a perpendicular
cutLine.setLength(length); // Decided take this length cutLine.setLength(length); // Decided take this length
@ -395,8 +421,17 @@ QVector<QPointF> VAbstractPiece::EkvPoint(const VSAPoint &p1Line1, const VSAPoin
} }
} }
else else
{// Dart. Ignore if going outside of equdistant {
const QLineF bigEdge = ParallelLine(p1Line1, p1Line2, width ); QLineF bisector(p2Line1, p1Line1);
bisector.setAngle(angle1);
const qreal result1 = PointPosition(bisector.p2(), QLineF(p1Line1, p2Line1));
const qreal result2 = PointPosition(bisector.p2(), QLineF(p2Line2, p1Line2));
if (result1 <=0 && result2 <= 0)
{
// Dart. Ignore if going outside of equdistant
const QLineF bigEdge = ParallelLine(p1Line1, p1Line2, localWidth );
QPointF px; QPointF px;
const QLineF::IntersectType type = bigEdge.intersect(line, &px); const QLineF::IntersectType type = bigEdge.intersect(line, &px);
if (type != QLineF::BoundedIntersection) if (type != QLineF::BoundedIntersection)
@ -405,6 +440,14 @@ QVector<QPointF> VAbstractPiece::EkvPoint(const VSAPoint &p1Line1, const VSAPoin
return points; return points;
} }
} }
else
{
const QLineF bigEdge = ParallelLine(bigLine1.p2(), bigLine2.p1(), localWidth );
points.append(bigEdge.p1());
points.append(bigEdge.p2());
return points;
}
}
break; break;
} }
case (QLineF::NoIntersection): case (QLineF::NoIntersection):
@ -438,6 +481,14 @@ QLineF VAbstractPiece::ParallelLine(const VSAPoint &p1, const VSAPoint &p2, qrea
return paralel; return paralel;
} }
//---------------------------------------------------------------------------------------------------------------------
QLineF VAbstractPiece::ParallelLine(const QPointF &p1, const QPointF &p2, qreal width)
{
const QLineF paralel = QLineF(SingleParallelPoint(p1, p2, 90, width),
SingleParallelPoint(p2, p1, -90, width));
return paralel;
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QPointF VAbstractPiece::SingleParallelPoint(const QPointF &p1, const QPointF &p2, qreal angle, qreal width) QPointF VAbstractPiece::SingleParallelPoint(const QPointF &p1, const QPointF &p2, qreal angle, qreal width)
{ {

View File

@ -141,9 +141,12 @@ protected:
private: private:
QSharedDataPointer<VAbstractPieceData> d; QSharedDataPointer<VAbstractPieceData> d;
static Q_DECL_CONSTEXPR qreal PointPosition(const QPointF &p, const QLineF &line);
static qreal MaxLocalSA(const VSAPoint &p, qreal width);
static QVector<QPointF> EkvPoint(const VSAPoint &p1Line1, const VSAPoint &p2Line1, static QVector<QPointF> EkvPoint(const VSAPoint &p1Line1, const VSAPoint &p2Line1,
const VSAPoint &p1Line2, const VSAPoint &p2Line2, qreal width); const VSAPoint &p1Line2, const VSAPoint &p2Line2, qreal width);
static QLineF ParallelLine(const VSAPoint &p1, const VSAPoint &p2, qreal width); static QLineF ParallelLine(const VSAPoint &p1, const VSAPoint &p2, qreal width);
static QLineF ParallelLine(const QPointF &p1, const QPointF &p2, qreal width);
static QPointF SingleParallelPoint(const QPointF &p1, const QPointF &p2, qreal angle, qreal width); static QPointF SingleParallelPoint(const QPointF &p1, const QPointF &p2, qreal angle, qreal width);
static int BisectorAngle(const QPointF &p1, const QPointF &p2, const QPointF &p3); static int BisectorAngle(const QPointF &p1, const QPointF &p2, const QPointF &p3);
}; };