/************************************************************************ ** ** @file vabstractcurve.h ** @author Roman Telezhynskyi ** @date 25 6, 2014 ** ** @brief ** @copyright ** This source code is part of the Valentina project, a pattern making ** program, whose allow create and modeling patterns of clothing. ** Copyright (C) 2013-2015 Valentina project ** All Rights Reserved. ** ** Valentina is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** Valentina is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Valentina. If not, see . ** *************************************************************************/ #ifndef VABSTRACTCURVE_H #define VABSTRACTCURVE_H #include #include #include #include #include #include #include #include "../ifc/ifcdef.h" #include "../vmisc/vmath.h" #include "vgeometrydef.h" #include "vgobject.h" typedef QPair DirectionArrow; class QPainterPath; class VAbstractCurveData; QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wsuggest-final-types") QT_WARNING_DISABLE_GCC("-Wsuggest-final-methods") class VAbstractCurve :public VGObject { public: explicit VAbstractCurve(const GOType &type, const quint32 &idObject = NULL_ID, const Draw &mode = Draw::Calculation); explicit VAbstractCurve(const VAbstractCurve &curve); virtual ~VAbstractCurve() override; VAbstractCurve& operator= (const VAbstractCurve &curve); #ifdef Q_COMPILER_RVALUE_REFS VAbstractCurve(VAbstractCurve &&curve) Q_DECL_NOTHROW; VAbstractCurve &operator=(VAbstractCurve &&curve) Q_DECL_NOTHROW; #endif virtual QVector GetPoints() const =0; static QVector GetSegmentPoints(const QVector &points, const QPointF &begin, const QPointF &end, bool reverse, QString &error); QVector GetSegmentPoints(const QPointF &begin, const QPointF &end, bool reverse, const QString &piece = QString()) const; virtual QPainterPath GetPath() const; virtual qreal GetLength() const =0; qreal GetLengthByPoint(const QPointF &point) const; virtual QVector IntersectLine(const QLineF &line) const; virtual bool IsIntersectLine(const QLineF &line) const; static bool IsPointOnCurve(const QVector &points, const QPointF &p); bool IsPointOnCurve(const QPointF &p) const; static bool SubdividePath(const QVector &points, QPointF p, QVector &sub1, QVector &sub2); virtual qreal GetStartAngle () const=0; virtual qreal GetEndAngle () const=0; quint32 GetDuplicate() const; void SetDuplicate(quint32 number); QString GetColor() const; void SetColor(const QString &color); QString GetPenStyle() const; void SetPenStyle(const QString &penStyle); qreal GetApproximationScale() const; void SetApproximationScale(qreal value); static qreal PathLength(const QVector &path); static QVector CurveIntersectLine(const QVector &points, const QLineF &line); static bool CurveIntersectAxis(const QPointF &point, qreal angle, const QVector &curvePoints, QPointF *intersectionPoint); virtual QString NameForHistory(const QString &toolName) const=0; virtual QVector DirectionArrows() const; static QPainterPath ShowDirection(const QVector &arrows, qreal width); static qreal LengthCurveDirectionArrow(); virtual void SetAliasSuffix(const QString &aliasSuffix) override; protected: virtual void CreateName() =0; virtual void CreateAlias() =0; private: QSharedDataPointer d; static QVector FromBegin(const QVector &points, const QPointF &begin, bool *ok = nullptr); static QVector ToEnd(const QVector &points, const QPointF &end, bool *ok = nullptr); }; QT_WARNING_POP Q_DECLARE_TYPEINFO(VAbstractCurve, Q_MOVABLE_TYPE); #endif // VABSTRACTCURVE_H