Handle seam allowance angles.
--HG-- branch : feature
This commit is contained in:
parent
7aa7ba8e57
commit
854e54ebc0
|
@ -29,11 +29,14 @@
|
||||||
#include "vabstractpiece.h"
|
#include "vabstractpiece.h"
|
||||||
#include "vabstractpiece_p.h"
|
#include "vabstractpiece_p.h"
|
||||||
#include "../vmisc/vabstractapplication.h"
|
#include "../vmisc/vabstractapplication.h"
|
||||||
|
#include "../vgeometry/vpointf.h"
|
||||||
|
|
||||||
#include <QLineF>
|
#include <QLineF>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
|
||||||
|
const qreal maxL = 2.4;
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
VAbstractPiece::VAbstractPiece()
|
VAbstractPiece::VAbstractPiece()
|
||||||
: d(new VAbstractPieceData)
|
: d(new VAbstractPieceData)
|
||||||
|
@ -402,11 +405,20 @@ QT_WARNING_DISABLE_GCC("-Wswitch-default")
|
||||||
case PieceNodeAngle::ByLength:
|
case PieceNodeAngle::ByLength:
|
||||||
return AngleByLength(p2Line1, bigLine1.p1(), CrosPoint, bigLine2.p2(), localWidth);
|
return AngleByLength(p2Line1, bigLine1.p1(), CrosPoint, bigLine2.p2(), localWidth);
|
||||||
case PieceNodeAngle::ByPointsIntersection:
|
case PieceNodeAngle::ByPointsIntersection:
|
||||||
|
return AngleByIntersection(p1Line1, p2Line1, p1Line2, bigLine1.p1(), CrosPoint, bigLine2.p2(),
|
||||||
|
localWidth);
|
||||||
case PieceNodeAngle::ByFirstEdgeSymmetry:
|
case PieceNodeAngle::ByFirstEdgeSymmetry:
|
||||||
|
return AngleByFirstSymmetry(p1Line1, p2Line1, bigLine1.p1(), CrosPoint, bigLine2.p2(),
|
||||||
|
localWidth);
|
||||||
case PieceNodeAngle::BySecondEdgeSymmetry:
|
case PieceNodeAngle::BySecondEdgeSymmetry:
|
||||||
|
return AngleBySecondSymmetry(p2Line1, p1Line2, bigLine1.p1(), CrosPoint,bigLine2.p2(),
|
||||||
|
localWidth);
|
||||||
case PieceNodeAngle::ByFirstEdgeRightAngle:
|
case PieceNodeAngle::ByFirstEdgeRightAngle:
|
||||||
|
return AngleByFirstRightAngle(p1Line1, p2Line1, bigLine1.p1(), CrosPoint, bigLine2.p2(),
|
||||||
|
localWidth);
|
||||||
case PieceNodeAngle::BySecondEdgeRightAngle:
|
case PieceNodeAngle::BySecondEdgeRightAngle:
|
||||||
break;
|
return AngleBySecondRightAngle(p2Line1, p1Line2, bigLine1.p1(), CrosPoint, bigLine2.p2(),
|
||||||
|
localWidth);
|
||||||
}
|
}
|
||||||
QT_WARNING_POP
|
QT_WARNING_POP
|
||||||
}
|
}
|
||||||
|
@ -483,7 +495,7 @@ QVector<QPointF> VAbstractPiece::AngleByLength(const QPointF &p2, const QPointF
|
||||||
|
|
||||||
QLineF line(p2, sp2);
|
QLineF line(p2, sp2);
|
||||||
const qreal length = line.length();
|
const qreal length = line.length();
|
||||||
if (length > width*2.4)
|
if (length > width*maxL)
|
||||||
{ // Cutting too long a cut angle
|
{ // Cutting too long a cut angle
|
||||||
line.setLength(width);
|
line.setLength(width);
|
||||||
QLineF cutLine(line.p2(), sp2); // Cut line is a perpendicular
|
QLineF cutLine(line.p2(), sp2); // Cut line is a perpendicular
|
||||||
|
@ -514,6 +526,205 @@ QVector<QPointF> VAbstractPiece::AngleByLength(const QPointF &p2, const QPointF
|
||||||
return points;
|
return points;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QVector<QPointF> VAbstractPiece::AngleByIntersection(const QPointF &p1, const QPointF &p2, const QPointF &p3,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width)
|
||||||
|
{
|
||||||
|
QVector<QPointF> points;
|
||||||
|
|
||||||
|
QLineF edge2(p2, p3);
|
||||||
|
QLineF sEdge1(sp1, sp2);
|
||||||
|
|
||||||
|
QPointF px;
|
||||||
|
QLineF::IntersectType type = edge2.intersect(sEdge1, &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
QLineF edge1(p1, p2);
|
||||||
|
QLineF sEdge2(sp2, sp3);
|
||||||
|
|
||||||
|
type = edge1.intersect(sEdge2, &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QVector<QPointF> VAbstractPiece::AngleByFirstSymmetry(const QPointF &p1, const QPointF &p2,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width)
|
||||||
|
{
|
||||||
|
QVector<QPointF> points;
|
||||||
|
|
||||||
|
QLineF sEdge2(sp2, sp3);
|
||||||
|
QPointF fp1 = VPointF::FlipPF(sEdge2, p1);
|
||||||
|
QPointF fp2 = VPointF::FlipPF(sEdge2, p2);
|
||||||
|
QLineF fEdge(fp1, fp2);
|
||||||
|
|
||||||
|
QPointF px;
|
||||||
|
QLineF sEdge1(sp1, sp2);
|
||||||
|
QLineF::IntersectType type = fEdge.intersect(sEdge1, &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
type = fEdge.intersect(sEdge2, &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QVector<QPointF> VAbstractPiece::AngleBySecondSymmetry(const QPointF &p2, const QPointF &p3,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width)
|
||||||
|
{
|
||||||
|
QVector<QPointF> points;
|
||||||
|
|
||||||
|
QLineF sEdge1(sp1, sp2);
|
||||||
|
QPointF fp2 = VPointF::FlipPF(sEdge1, p2);
|
||||||
|
QPointF fp3 = VPointF::FlipPF(sEdge1, p3);
|
||||||
|
QLineF fEdge(fp2, fp3);
|
||||||
|
|
||||||
|
QPointF px;
|
||||||
|
QLineF::IntersectType type = fEdge.intersect(sEdge1, &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
QLineF sEdge2(sp2, sp3);
|
||||||
|
type = fEdge.intersect(sEdge2, &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QVector<QPointF> VAbstractPiece::AngleByFirstRightAngle(const QPointF &p1, const QPointF &p2,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width)
|
||||||
|
{
|
||||||
|
QVector<QPointF> points;
|
||||||
|
|
||||||
|
QLineF edge1(p2, p1);
|
||||||
|
edge1.setAngle(edge1.angle()-90);
|
||||||
|
|
||||||
|
QPointF px;
|
||||||
|
QLineF::IntersectType type = edge1.intersect(QLineF(sp1, sp2), &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
type = edge1.intersect(QLineF(sp2, sp3), &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QVector<QPointF> VAbstractPiece::AngleBySecondRightAngle(const QPointF &p2, const QPointF &p3,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width)
|
||||||
|
{
|
||||||
|
QVector<QPointF> points;
|
||||||
|
|
||||||
|
QLineF edge2(p2, p3);
|
||||||
|
edge2.setAngle(edge2.angle()+90);
|
||||||
|
|
||||||
|
QPointF px;
|
||||||
|
QLineF::IntersectType type = edge2.intersect(QLineF(sp1, sp2), &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
type = edge2.intersect(QLineF(sp2, sp3), &px);
|
||||||
|
if (type == QLineF::NoIntersection)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QLineF(p2, px).length() > width*maxL)
|
||||||
|
{
|
||||||
|
return AngleByLength(p2, sp1, sp2, sp3, width);
|
||||||
|
}
|
||||||
|
points.append(px);
|
||||||
|
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
QLineF VAbstractPiece::ParallelLine(const VSAPoint &p1, const VSAPoint &p2, qreal width)
|
QLineF VAbstractPiece::ParallelLine(const VSAPoint &p1, const VSAPoint &p2, qreal width)
|
||||||
{
|
{
|
||||||
|
|
|
@ -176,6 +176,21 @@ private:
|
||||||
const VSAPoint &p1Line2, const VSAPoint &p2Line2, qreal width);
|
const VSAPoint &p1Line2, const VSAPoint &p2Line2, qreal width);
|
||||||
static QVector<QPointF> AngleByLength(const QPointF &p2, const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
static QVector<QPointF> AngleByLength(const QPointF &p2, const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
qreal width);
|
qreal width);
|
||||||
|
static QVector<QPointF> AngleByIntersection(const QPointF &p1, const QPointF &p2, const QPointF &p3,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width);
|
||||||
|
static QVector<QPointF> AngleByFirstSymmetry(const QPointF &p1, const QPointF &p2,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width);
|
||||||
|
static QVector<QPointF> AngleBySecondSymmetry(const QPointF &p2, const QPointF &p3,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width);
|
||||||
|
static QVector<QPointF> AngleByFirstRightAngle(const QPointF &p1, const QPointF &p2,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
qreal width);
|
||||||
|
static QVector<QPointF> AngleBySecondRightAngle(const QPointF &p2, const QPointF &p3,
|
||||||
|
const QPointF &sp1, const QPointF &sp2, const QPointF &sp3,
|
||||||
|
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 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);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user