/************************************************************************ ** ** @file ** @author Roman Telezhynskyi ** @date 3 11, 2016 ** ** @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) 2016 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 VPIECE_H #define VPIECE_H #include #include #include "../vlayout/vabstractpiece.h" class VPieceData; class VPieceNode; class VPiecePath; class VPatternLabelData; class VPieceLabelData; class VGrainlineData; class VContainer; class QPainterPath; class VPointF; class VPassmark; class VPiece : public VAbstractPiece { Q_DECLARE_TR_FUNCTIONS(VPiece) // NOLINT public: VPiece(); VPiece(const VPiece &piece); ~VPiece() override; auto operator=(const VPiece &piece) -> VPiece &; #ifdef Q_COMPILER_RVALUE_REFS VPiece(VPiece &&piece) noexcept; auto operator=(VPiece &&piece) noexcept -> VPiece &; #endif auto GetPath() const -> VPiecePath; auto GetPath() -> VPiecePath &; void SetPath(const VPiecePath &path); auto MainPathPoints(const VContainer *data) const -> QVector; auto UniteMainPathPoints(const VContainer *data) const -> QVector; auto MainPathNodePoints(const VContainer *data, bool showExcluded = false) const -> QVector; auto SeamAllowancePoints(const VContainer *data) const -> QVector; auto CuttingPathPoints(const VContainer *data) const -> QVector; auto PassmarksLines(const VContainer *data) const -> QVector; auto Passmarks(const VContainer *data) const -> QVector; auto CurvesPainterPath(const VContainer *data) const -> QVector; auto MainPathPath(const VContainer *data) const -> QPainterPath; static auto MainPathPath(const QVector &points) -> QPainterPath; auto SeamAllowancePath(const VContainer *data) const -> QPainterPath; template auto SeamAllowancePath(const QVector &points) const -> QPainterPath; auto PassmarksPath(const VContainer *data) const -> QPainterPath; auto PlaceLabelPath(const VContainer *data) const -> QPainterPath; auto IsSeamAllowanceValid(const VContainer *data) const -> bool; auto IsInLayout() const -> bool; void SetInLayout(bool inLayout); auto IsUnited() const -> bool; void SetUnited(bool united); auto GetShortName() const -> QString; void SetShortName(const QString &value); auto GetFormulaSAWidth() const -> QString; void SetFormulaSAWidth(const QString &formula, qreal value); auto GetInternalPaths() const -> QVector; auto GetInternalPaths() -> QVector &; void SetInternalPaths(const QVector &iPaths); auto GetCustomSARecords() const -> QVector; auto GetCustomSARecords() -> QVector &; void SetCustomSARecords(const QVector &records); auto GetPins() const -> QVector; auto GetPins() -> QVector &; void SetPins(const QVector &pins); auto GetPlaceLabels() const -> QVector; auto GetPlaceLabels() -> QVector &; void SetPlaceLabels(const QVector &labels); auto Dependencies() const -> QList; auto MissingNodes(const VPiece &det) const -> QVector; auto MissingCSAPath(const VPiece &det) const -> QVector; auto MissingInternalPaths(const VPiece &det) const -> QVector; auto MissingPins(const VPiece &det) const -> QVector; auto MissingPlaceLabels(const VPiece &det) const -> QVector; void SetPieceLabelData(const VPieceLabelData &data); auto GetPieceLabelData() -> VPieceLabelData &; auto GetPieceLabelData() const -> const VPieceLabelData &; void SetPatternLabelData(const VPatternLabelData &info); auto GetPatternLabelData() -> VPatternLabelData &; auto GetPatternLabelData() const -> const VPatternLabelData &; void SetGrainlineGeometry(const VGrainlineData &data); auto GetGrainlineGeometry() -> VGrainlineData &; auto GetGrainlineGeometry() const -> const VGrainlineData &; auto GetUnitedPath(const VContainer *data) const -> QVector; auto SeamAllowancePointsWithRotation(const VContainer *data, vsizetype makeFirst) const -> QVector; void SetGradationLabel(const QString &label); auto GetGradationLabel() const -> QString; static void DumpPiece(const VPiece &piece, const VContainer *data, const QString &templateName = QString()); void TestInternalPaths(const VContainer *data) const; static auto ShortNameRegExp() -> QString; auto ExternalArea(const VContainer *data) const -> qreal; auto SeamLineArea(const VContainer *data) const -> qreal; private: QSharedDataPointer d; auto GetValidRecords() const -> QVector; auto FilterRecords(QVector records) const -> QVector; auto GetNodeSAPoints(const QVector &path, vsizetype index, const VContainer *data) const -> QVector; auto GetPassmarkSAPoint(const QVector &path, vsizetype index, const VContainer *data, VSAPoint &point) const -> bool; auto GetPassmarkPreviousSAPoints(const QVector &path, vsizetype index, const VSAPoint &passmarkSAPoint, const VContainer *data, VSAPoint &point, vsizetype passmarkIndex) const -> bool; auto GetPassmarkNextSAPoints(const QVector &path, vsizetype index, const VSAPoint &passmarkSAPoint, const VContainer *data, VSAPoint &point, vsizetype passmarkIndex) const -> bool; auto IsPassmarkVisible(const QVector &path, vsizetype passmarkIndex) const -> bool; auto CreatePassmark(const QVector &path, vsizetype previousIndex, vsizetype passmarkIndex, vsizetype nextIndex, const VContainer *data) const -> VPassmark; static auto IsCSAStart(const QVector &records, quint32 id) -> int; auto MainPathToJson() const -> QJsonObject; auto DBToJson(const VContainer *data) const -> QJsonObject; auto GlobalPassmarkLength(const VContainer *data) const -> qreal; auto GlobalPassmarkWidth(const VContainer *data) const -> qreal; void TestInternalPathCuttingPathIntersection(const VContainer *data) const; void TestInternalPathsIntersections(const VContainer *data) const; auto Area(const QVector &shape, const VContainer *data) const -> qreal; }; Q_DECLARE_TYPEINFO(VPiece, Q_MOVABLE_TYPE); // NOLINT //--------------------------------------------------------------------------------------------------------------------- template inline auto VPiece::SeamAllowancePath(const QVector &points) const -> QPainterPath { QPainterPath ekv; // seam allowence if (IsSeamAllowance() && not IsSeamAllowanceBuiltIn()) { if (not points.isEmpty()) { ekv.moveTo(points.at(0)); for (qint32 i = 1; i < points.count(); ++i) { ekv.lineTo(points.at(i)); } #if !defined(V_NO_ASSERT) // uncomment for debug // QFont font; // font.setPixelSize(1); // for (qint32 i = 0; i < points.count(); ++i) // { // ekv.addEllipse(points.at(i).x()-accuracyPointOnLine, points.at(i).y()-accuracyPointOnLine, // accuracyPointOnLine*2., accuracyPointOnLine*2.); // ekv.addText(points.at(i).x()-accuracyPointOnLine, points.at(i).y()-accuracyPointOnLine, font, // QString::number(i+1)); // if (i > 250) // { // break; // } // } #endif ekv.setFillRule(Qt::WindingFill); } } return ekv; } #endif // VPIECE_H