diff --git a/ChangeLog.txt b/ChangeLog.txt index 985ab89fe..49dccb56f 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -43,6 +43,7 @@ - Redesign standard path system. - New option: Translate formula. - Fix filling piece label data. +- New piece option Follow grainline. # Valentina 0.7.52 September 12, 2022 - Fix crash when default locale is ru. diff --git a/src/app/puzzle/undocommands/vpundomovepieceonsheet.cpp b/src/app/puzzle/undocommands/vpundomovepieceonsheet.cpp index 85c2159f4..ad240a427 100644 --- a/src/app/puzzle/undocommands/vpundomovepieceonsheet.cpp +++ b/src/app/puzzle/undocommands/vpundomovepieceonsheet.cpp @@ -26,16 +26,16 @@ ** *************************************************************************/ #include "vpundomovepieceonsheet.h" -#include "../vmisc/def.h" -#include "../layout/vpsheet.h" #include "../layout/vplayout.h" #include "../layout/vppiece.h" +#include "../layout/vpsheet.h" +#include "../vmisc/def.h" //--------------------------------------------------------------------------------------------------------------------- VPUndoMovePieceOnSheet::VPUndoMovePieceOnSheet(const VPSheetPtr &sheet, const VPPiecePtr &piece, QUndoCommand *parent) - : VPUndoCommand(false, parent), - m_sheet(sheet), - m_piece(piece) + : VPUndoCommand(false, parent), + m_sheet(sheet), + m_piece(piece) { SCASSERT(not piece.isNull()) @@ -116,7 +116,7 @@ void VPUndoMovePieceOnSheet::redo() piece->SetSelected(false); } - if (m_followGrainline) + if (m_followGrainline || piece->IsFollowGrainline()) { QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wnoexcept") diff --git a/src/app/puzzle/undocommands/vpundopiecerotate.cpp b/src/app/puzzle/undocommands/vpundopiecerotate.cpp index 6476aebe6..eb41ef0b0 100644 --- a/src/app/puzzle/undocommands/vpundopiecerotate.cpp +++ b/src/app/puzzle/undocommands/vpundopiecerotate.cpp @@ -26,8 +26,8 @@ ** *************************************************************************/ #include "vpundopiecerotate.h" -#include "../layout/vppiece.h" #include "../layout/vplayout.h" +#include "../layout/vppiece.h" namespace { @@ -37,16 +37,16 @@ auto RoundAngle(qreal angle) -> qreal l.setAngle(angle); return l.angle(); } -} +} // namespace //--------------------------------------------------------------------------------------------------------------------- VPUndoPieceRotate::VPUndoPieceRotate(const VPPiecePtr &piece, const VPTransformationOrigon &origin, qreal angle, qreal angleSum, bool allowMerge, QUndoCommand *parent) - : VPUndoCommand(allowMerge, parent), - m_piece(piece), - m_origin(origin), - m_angle(angle), - m_angleSum(angleSum) + : VPUndoCommand(allowMerge, parent), + m_piece(piece), + m_origin(origin), + m_angle(angle), + m_angleSum(angleSum) { SCASSERT(not piece.isNull()) @@ -107,7 +107,7 @@ void VPUndoPieceRotate::redo() if (m_firstCall) { - if (m_followGrainline && piece->IsGrainlineEnabled()) + if ((m_followGrainline || piece->IsFollowGrainline()) && piece->IsGrainlineEnabled()) { piece->Rotate(m_origin.origin, m_angleSum); } @@ -121,7 +121,7 @@ void VPUndoPieceRotate::redo() piece->Rotate(m_origin.origin, m_angle); } - if (m_followGrainline) + if (m_followGrainline || piece->IsFollowGrainline()) { piece->RotateToGrainline(m_origin); } @@ -149,8 +149,8 @@ auto VPUndoPieceRotate::mergeWith(const QUndoCommand *command) -> bool VPPiecePtr piece = Piece(); if (not moveCommand->AllowMerge() || (moveCommand->Piece().isNull() || piece.isNull()) || - moveCommand->Piece() != piece || moveCommand->Origin() != m_origin || - moveCommand->FollowGrainline() != m_followGrainline) + moveCommand->Piece() != piece || moveCommand->Origin() != m_origin || + moveCommand->FollowGrainline() != m_followGrainline) { return false; } @@ -170,14 +170,14 @@ auto VPUndoPieceRotate::id() const -> int //--------------------------------------------------------------------------------------------------------------------- VPUndoPiecesRotate::VPUndoPiecesRotate(const QList &pieces, const VPTransformationOrigon &origin, qreal angle, qreal angleSum, bool allowMerge, QUndoCommand *parent) - : VPUndoCommand(allowMerge, parent), - m_origin(origin), - m_angle(angle), - m_angleSum(angleSum) + : VPUndoCommand(allowMerge, parent), + m_origin(origin), + m_angle(angle), + m_angleSum(angleSum) { setText(QObject::tr("rotate pieces")); - for (const auto& piece : pieces) + for (const auto &piece : pieces) { if (not piece.isNull()) { @@ -213,7 +213,7 @@ void VPUndoPiecesRotate::undo() layout->SetFocusedSheet(sheet); } - for (const auto& piece : qAsConst(m_pieces)) + for (const auto &piece : qAsConst(m_pieces)) { VPPiecePtr p = piece.toStrongRef(); if (not p.isNull()) @@ -247,14 +247,14 @@ void VPUndoPiecesRotate::redo() layout->SetFocusedSheet(sheet); } - for (const auto& piece : qAsConst(m_pieces)) + for (const auto &piece : qAsConst(m_pieces)) { VPPiecePtr p = piece.toStrongRef(); if (not p.isNull()) { if (m_firstCall) { - if (m_followGrainline && p->IsGrainlineEnabled()) + if ((m_followGrainline || p->IsFollowGrainline()) && p->IsGrainlineEnabled()) { p->Rotate(m_origin.origin, m_angleSum); } @@ -268,7 +268,7 @@ void VPUndoPiecesRotate::redo() p->Rotate(m_origin.origin, m_angle); } - if (m_followGrainline) + if (m_followGrainline || p->IsFollowGrainline()) { p->RotateToGrainline(m_origin); } @@ -297,7 +297,7 @@ auto VPUndoPiecesRotate::mergeWith(const QUndoCommand *command) -> bool SCASSERT(moveCommand != nullptr) if (not moveCommand->AllowMerge() || moveCommand->PieceIds() != PieceIds() || moveCommand->Origin() != m_origin || - moveCommand->FollowGrainline() != m_followGrainline) + moveCommand->FollowGrainline() != m_followGrainline) { return false; } @@ -317,7 +317,7 @@ auto VPUndoPiecesRotate::id() const -> int auto VPUndoPiecesRotate::PieceIds() const -> QSet { QSet ids; - for (const auto& piece : m_pieces) + for (const auto &piece : m_pieces) { VPPiecePtr p = piece.toStrongRef(); if (not p.isNull()) @@ -332,7 +332,7 @@ auto VPUndoPiecesRotate::PieceIds() const -> QSet //--------------------------------------------------------------------------------------------------------------------- auto VPUndoPiecesRotate::Layout() const -> VPLayoutPtr { - for (const auto& piece : m_pieces) + for (const auto &piece : m_pieces) { VPPiecePtr p = piece.toStrongRef(); if (not p.isNull()) @@ -347,7 +347,7 @@ auto VPUndoPiecesRotate::Layout() const -> VPLayoutPtr //--------------------------------------------------------------------------------------------------------------------- auto VPUndoPiecesRotate::Sheet() const -> VPSheetPtr { - for (const auto& piece : m_pieces) + for (const auto &piece : m_pieces) { VPPiecePtr p = piece.toStrongRef(); if (not p.isNull()) diff --git a/src/app/puzzle/xml/vplayoutfilereader.cpp b/src/app/puzzle/xml/vplayoutfilereader.cpp index c2091f6d0..38759ccf9 100644 --- a/src/app/puzzle/xml/vplayoutfilereader.cpp +++ b/src/app/puzzle/xml/vplayoutfilereader.cpp @@ -512,6 +512,7 @@ void VPLayoutFileReader::ReadPiece(const VPPiecePtr &piece) piece->SetMirror(ReadAttributeBool(attribs, ML::AttrMirrored, falseStr)); piece->SetForbidFlipping(ReadAttributeBool(attribs, ML::AttrForbidFlipping, falseStr)); piece->SetForceFlipping(ReadAttributeBool(attribs, ML::AttrForceFlipping, falseStr)); + piece->SetFollowGrainline(ReadAttributeBool(attribs, ML::AttrFollowGrainline, falseStr)); piece->SetSewLineOnDrawing(ReadAttributeBool(attribs, ML::AttrSewLineOnDrawing, falseStr)); piece->SetMatrix(StringToTransfrom(ReadAttributeEmptyString(attribs, ML::AttrTransform))); diff --git a/src/app/puzzle/xml/vplayoutfilewriter.cpp b/src/app/puzzle/xml/vplayoutfilewriter.cpp index 46599e081..4a25aad57 100644 --- a/src/app/puzzle/xml/vplayoutfilewriter.cpp +++ b/src/app/puzzle/xml/vplayoutfilewriter.cpp @@ -265,6 +265,8 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece) [](bool forbid) noexcept { return not forbid; }); SetAttributeOrRemoveIf(ML::AttrForceFlipping, piece->IsForceFlipping(), [](bool force) noexcept { return not force; }); + SetAttributeOrRemoveIf(ML::AttrFollowGrainline, piece->IsFollowGrainline(), + [](bool follow) noexcept { return not follow; }); SetAttributeOrRemoveIf(ML::AttrSewLineOnDrawing, piece->IsSewLineOnDrawing(), [](bool value) noexcept { return not value; }); SetAttribute(ML::AttrTransform, TransformToString(piece->GetMatrix())); diff --git a/src/app/valentina/xml/vpattern.cpp b/src/app/valentina/xml/vpattern.cpp index aad3be434..e1f2ccaab 100644 --- a/src/app/valentina/xml/vpattern.cpp +++ b/src/app/valentina/xml/vpattern.cpp @@ -964,6 +964,7 @@ void VPattern::ParseDetailElement(QDomElement &domElement, const Document &parse initData.detail.SetForceFlipping(GetParametrBool( domElement, AttrForceFlipping, QString().setNum(VAbstractValApplication::VApp()->ValentinaSettings()->GetForceWorkpieceFlipping()))); + initData.detail.SetFollowGrainline(GetParametrBool(domElement, AttrFollowGrainline, falseStr)); initData.detail.SetSewLineOnDrawing(GetParametrBool( domElement, AttrSewLineOnDrawing, QString().setNum(VAbstractValApplication::VApp()->ValentinaSettings()->GetSewLineOnDrawing()))); diff --git a/src/libs/ifc/ifcdef.cpp b/src/libs/ifc/ifcdef.cpp index 96b9730ac..1a59f8f8e 100644 --- a/src/libs/ifc/ifcdef.cpp +++ b/src/libs/ifc/ifcdef.cpp @@ -126,6 +126,7 @@ const QString AttrIdObject = QStringLiteral("idObject"); const QString AttrInLayout = QStringLiteral("inLayout"); const QString AttrForbidFlipping = QStringLiteral("forbidFlipping"); const QString AttrForceFlipping = QStringLiteral("forceFlipping"); +const QString AttrFollowGrainline = QStringLiteral("followGrainline"); const QString AttrSewLineOnDrawing = QStringLiteral("sewLineOnDrawing"); const QString AttrRotationAngle = QStringLiteral("rotationAngle"); const QString AttrClosed = QStringLiteral("closed"); diff --git a/src/libs/ifc/ifcdef.h b/src/libs/ifc/ifcdef.h index 15dcbcbb1..4ffdf942d 100644 --- a/src/libs/ifc/ifcdef.h +++ b/src/libs/ifc/ifcdef.h @@ -144,6 +144,7 @@ extern const QString AttrIdObject; extern const QString AttrInLayout; extern const QString AttrForbidFlipping; extern const QString AttrForceFlipping; +extern const QString AttrFollowGrainline; extern const QString AttrSewLineOnDrawing; extern const QString AttrClosed; extern const QString AttrShowLabel; diff --git a/src/libs/ifc/schema.qrc b/src/libs/ifc/schema.qrc index ace77acdc..9dfb0bba8 100644 --- a/src/libs/ifc/schema.qrc +++ b/src/libs/ifc/schema.qrc @@ -68,6 +68,7 @@ schema/pattern/v0.9.0.xsd schema/pattern/v0.9.1.xsd schema/pattern/v0.9.2.xsd + schema/pattern/v0.9.3.xsd schema/multisize_measurements/v0.3.0.xsd schema/multisize_measurements/v0.4.0.xsd schema/multisize_measurements/v0.4.1.xsd @@ -97,5 +98,6 @@ schema/layout/v0.1.3.xsd schema/layout/v0.1.4.xsd schema/layout/v0.1.5.xsd + schema/layout/v0.1.6.xsd diff --git a/src/libs/ifc/schema/layout/v0.1.6.xsd b/src/libs/ifc/schema/layout/v0.1.6.xsd new file mode 100644 index 000000000..ec72b04ea --- /dev/null +++ b/src/libs/ifc/schema/layout/v0.1.6.xsd @@ -0,0 +1,589 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/ifc/schema/pattern/v0.9.3.xsd b/src/libs/ifc/schema/pattern/v0.9.3.xsd new file mode 100644 index 000000000..228cfd89d --- /dev/null +++ b/src/libs/ifc/schema/pattern/v0.9.3.xsd @@ -0,0 +1,1225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/ifc/xml/vlayoutconverter.cpp b/src/libs/ifc/xml/vlayoutconverter.cpp index 662cb081a..594824846 100644 --- a/src/libs/ifc/xml/vlayoutconverter.cpp +++ b/src/libs/ifc/xml/vlayoutconverter.cpp @@ -45,8 +45,8 @@ using namespace Qt::Literals::StringLiterals; */ const QString VLayoutConverter::LayoutMinVerStr = QStringLiteral("0.1.0"); -const QString VLayoutConverter::LayoutMaxVerStr = QStringLiteral("0.1.5"); -const QString VLayoutConverter::CurrentSchema = QStringLiteral("://schema/layout/v0.1.5.xsd"); +const QString VLayoutConverter::LayoutMaxVerStr = QStringLiteral("0.1.6"); +const QString VLayoutConverter::CurrentSchema = QStringLiteral("://schema/layout/v0.1.6.xsd"); // VLayoutConverter::LayoutMinVer; // <== DON'T FORGET TO UPDATE TOO!!!! // VLayoutConverter::LayoutMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!! @@ -147,7 +147,8 @@ auto VLayoutConverter::XSDSchemas() -> QHash std::make_pair(FormatVersion(0, 1, 2), QStringLiteral("://schema/layout/v0.1.2.xsd")), std::make_pair(FormatVersion(0, 1, 3), QStringLiteral("://schema/layout/v0.1.3.xsd")), std::make_pair(FormatVersion(0, 1, 4), QStringLiteral("://schema/layout/v0.1.4.xsd")), - std::make_pair(FormatVersion(0, 1, 5), CurrentSchema), + std::make_pair(FormatVersion(0, 1, 5), QStringLiteral("://schema/layout/v0.1.5.xsd")), + std::make_pair(FormatVersion(0, 1, 6), CurrentSchema), }; return schemas; @@ -182,9 +183,12 @@ void VLayoutConverter::ApplyPatches() case (FormatVersion(0, 1, 3)): case (FormatVersion(0, 1, 4)): ToV0_1_5(); - ValidateXML(CurrentSchema); Q_FALLTHROUGH(); case (FormatVersion(0, 1, 5)): + ToV0_1_6(); + ValidateXML(CurrentSchema); + Q_FALLTHROUGH(); + case (FormatVersion(0, 1, 6)): break; default: InvalidVersion(m_ver); @@ -394,3 +398,13 @@ void VLayoutConverter::ToV0_1_5() SetVersion(QStringLiteral("0.1.5")); Save(); } + +//--------------------------------------------------------------------------------------------------------------------- +void VLayoutConverter::ToV0_1_6() +{ + // TODO. Delete if minimal supported version is 0.1.6 + Q_STATIC_ASSERT_X(VLayoutConverter::LayoutMinVer < FormatVersion(0, 1, 6), "Time to refactor the code."); + + SetVersion(QStringLiteral("0.1.6")); + Save(); +} diff --git a/src/libs/ifc/xml/vlayoutconverter.h b/src/libs/ifc/xml/vlayoutconverter.h index 51cdc2345..563460bef 100644 --- a/src/libs/ifc/xml/vlayoutconverter.h +++ b/src/libs/ifc/xml/vlayoutconverter.h @@ -28,8 +28,8 @@ #ifndef VLAYOUTCONVERTER_H #define VLAYOUTCONVERTER_H -#include "vabstractconverter.h" #include "../vmisc/projectversion.h" +#include "vabstractconverter.h" class QDomElement; class QString; @@ -37,18 +37,19 @@ class QString; class VLayoutConverter : public VAbstractConverter { Q_OBJECT // NOLINT + public: explicit VLayoutConverter(const QString &fileName); - ~VLayoutConverter() override =default; + ~VLayoutConverter() override = default; auto GetFormatVersionStr() const -> QString override; static const QString LayoutMaxVerStr; static const QString CurrentSchema; static Q_DECL_CONSTEXPR const unsigned LayoutMinVer = FormatVersion(0, 1, 0); - static Q_DECL_CONSTEXPR const unsigned LayoutMaxVer = FormatVersion(0, 1, 5); + static Q_DECL_CONSTEXPR const unsigned LayoutMaxVer = FormatVersion(0, 1, 6); - static auto XSDSchemas() -> QHash ; + static auto XSDSchemas() -> QHash; protected: void SetVersion(const QString &version) override; @@ -64,7 +65,7 @@ protected: auto IsReadOnly() const -> bool override; - auto Schemas() const -> QHash override; + auto Schemas() const -> QHash override; void ConvertPiecesToV0_1_3(); void ConvertPathToV0_1_3(QDomElement &node); @@ -73,6 +74,7 @@ protected: void ToV0_1_3(); void ToV0_1_5(); + void ToV0_1_6(); private: Q_DISABLE_COPY_MOVE(VLayoutConverter) // NOLINT diff --git a/src/libs/ifc/xml/vpatternconverter.cpp b/src/libs/ifc/xml/vpatternconverter.cpp index 9b712c551..d7182960b 100644 --- a/src/libs/ifc/xml/vpatternconverter.cpp +++ b/src/libs/ifc/xml/vpatternconverter.cpp @@ -63,8 +63,8 @@ class QDomElement; */ const QString VPatternConverter::PatternMinVerStr = QStringLiteral("0.1.4"); // NOLINT -const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.9.2"); // NOLINT -const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.9.2.xsd"); // NOLINT +const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.9.3"); // NOLINT +const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.9.3.xsd"); // NOLINT // VPatternConverter::PatternMinVer; // <== DON'T FORGET TO UPDATE TOO!!!! // VPatternConverter::PatternMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!! @@ -264,7 +264,8 @@ auto VPatternConverter::XSDSchemas() -> QHash std::make_pair(FormatVersion(0, 8, 13), QStringLiteral("://schema/pattern/v0.8.13.xsd")), std::make_pair(FormatVersion(0, 9, 0), QStringLiteral("://schema/pattern/v0.9.0.xsd")), std::make_pair(FormatVersion(0, 9, 1), QStringLiteral("://schema/pattern/v0.9.1.xsd")), - std::make_pair(FormatVersion(0, 9, 2), CurrentSchema)}; + std::make_pair(FormatVersion(0, 9, 2), QStringLiteral("://schema/pattern/v0.9.2.xsd")), + std::make_pair(FormatVersion(0, 9, 3), CurrentSchema)}; return schemas; } @@ -382,9 +383,12 @@ void VPatternConverter::ApplyPatches() Q_FALLTHROUGH(); case (FormatVersion(0, 9, 1)): ToV0_9_2(); - ValidateXML(CurrentSchema); Q_FALLTHROUGH(); case (FormatVersion(0, 9, 2)): + ToV0_9_3(); + ValidateXML(CurrentSchema); + Q_FALLTHROUGH(); + case (FormatVersion(0, 9, 3)): break; default: InvalidVersion(m_ver); @@ -402,7 +406,7 @@ void VPatternConverter::DowngradeToCurrentMaxVersion() auto VPatternConverter::IsReadOnly() const -> bool { // Check if attribute readOnly was not changed in file format - Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == FormatVersion(0, 9, 2), "Check attribute readOnly."); + Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == FormatVersion(0, 9, 3), "Check attribute readOnly."); // Possibly in future attribute readOnly will change position etc. // For now position is the same for all supported format versions. @@ -577,6 +581,16 @@ void VPatternConverter::ToV0_9_2() Save(); } +//--------------------------------------------------------------------------------------------------------------------- +void VPatternConverter::ToV0_9_3() +{ + // TODO. Delete if minimal supported version is 0.9.3 + Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FormatVersion(0, 9, 3), "Time to refactor the code."); + + SetVersion(QStringLiteral("0.9.3")); + Save(); +} + //--------------------------------------------------------------------------------------------------------------------- void VPatternConverter::TagUnitToV0_2_0() { diff --git a/src/libs/ifc/xml/vpatternconverter.h b/src/libs/ifc/xml/vpatternconverter.h index ac729b599..771134920 100644 --- a/src/libs/ifc/xml/vpatternconverter.h +++ b/src/libs/ifc/xml/vpatternconverter.h @@ -54,7 +54,7 @@ public: static const QString PatternMaxVerStr; static const QString CurrentSchema; static Q_DECL_CONSTEXPR const unsigned PatternMinVer = FormatVersion(0, 1, 4); - static Q_DECL_CONSTEXPR const unsigned PatternMaxVer = FormatVersion(0, 9, 2); + static Q_DECL_CONSTEXPR const unsigned PatternMaxVer = FormatVersion(0, 9, 3); static auto XSDSchemas() -> QHash; @@ -91,6 +91,7 @@ private: void ToV0_9_0(); void ToV0_9_1(); void ToV0_9_2(); + void ToV0_9_3(); void TagUnitToV0_2_0(); void TagIncrementToV0_2_0(); diff --git a/src/libs/vlayout/vabstractpiece.cpp b/src/libs/vlayout/vabstractpiece.cpp index b3e750993..778ffac50 100644 --- a/src/libs/vlayout/vabstractpiece.cpp +++ b/src/libs/vlayout/vabstractpiece.cpp @@ -992,6 +992,18 @@ void VAbstractPiece::SetForceFlipping(bool value) } } +//--------------------------------------------------------------------------------------------------------------------- +auto VAbstractPiece::IsFollowGrainline() const -> bool +{ + return d->m_followGrainline; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VAbstractPiece::SetFollowGrainline(bool value) +{ + d->m_followGrainline = value; +} + //--------------------------------------------------------------------------------------------------------------------- auto VAbstractPiece::IsSeamAllowance() const -> bool { diff --git a/src/libs/vlayout/vabstractpiece.h b/src/libs/vlayout/vabstractpiece.h index 2fd836257..16ccb2bb9 100644 --- a/src/libs/vlayout/vabstractpiece.h +++ b/src/libs/vlayout/vabstractpiece.h @@ -74,6 +74,9 @@ public: auto IsForceFlipping() const -> bool; void SetForceFlipping(bool value); + auto IsFollowGrainline() const -> bool; + void SetFollowGrainline(bool value); + auto IsSeamAllowance() const -> bool; void SetSeamAllowance(bool value); diff --git a/src/libs/vlayout/vabstractpiece_p.h b/src/libs/vlayout/vabstractpiece_p.h index 2bdc841e1..b465fb15a 100644 --- a/src/libs/vlayout/vabstractpiece_p.h +++ b/src/libs/vlayout/vabstractpiece_p.h @@ -58,9 +58,10 @@ public: friend auto operator>>(QDataStream &dataStream, VAbstractPieceData &piece) -> QDataStream &; QString m_name{tr("Detail")}; // NOLINT (misc-non-private-member-variables-in-classes) - /** @brief forbidFlipping forbid piece be mirrored in a layout. */ + /** @brief forbidFlipping forbid piece to be mirrored in a layout. */ bool m_forbidFlipping{false}; // NOLINT (misc-non-private-member-variables-in-classes) bool m_forceFlipping{false}; // NOLINT (misc-non-private-member-variables-in-classes) + bool m_followGrainline{false}; // NOLINT (misc-non-private-member-variables-in-classes) bool m_seamAllowance{false}; // NOLINT (misc-non-private-member-variables-in-classes) bool m_seamAllowanceBuiltIn{false}; // NOLINT (misc-non-private-member-variables-in-classes) bool m_hideMainPath{false}; // NOLINT (misc-non-private-member-variables-in-classes) @@ -75,7 +76,7 @@ private: Q_DISABLE_ASSIGN_MOVE(VAbstractPieceData) // NOLINT static constexpr quint32 streamHeader = 0x05CDD73A; // CRC-32Q string "VAbstractPieceData" - static constexpr quint16 classVersion = 4; + static constexpr quint16 classVersion = 5; }; QT_WARNING_POP @@ -112,6 +113,9 @@ inline auto operator<<(QDataStream &dataStream, const VAbstractPieceData &piece) // Added in classVersion = 4 dataStream << piece.m_onDrawing; + // Added in classVersion = 5 + dataStream << piece.m_followGrainline; + return dataStream; } @@ -167,6 +171,11 @@ inline auto operator>>(QDataStream &dataStream, VAbstractPieceData &piece) -> QD dataStream >> piece.m_onDrawing; } + if (actualClassVersion >= 5) + { + dataStream >> piece.m_followGrainline; + } + return dataStream; } diff --git a/src/libs/vlayout/vlayoutpiece.cpp b/src/libs/vlayout/vlayoutpiece.cpp index 084e9ee40..9908770ad 100644 --- a/src/libs/vlayout/vlayoutpiece.cpp +++ b/src/libs/vlayout/vlayoutpiece.cpp @@ -655,6 +655,7 @@ auto VLayoutPiece::Create(const VPiece &piece, vidtype id, const VContainer *pat det.SetSAWidth(VAbstractValApplication::VApp()->toPixel(piece.GetSAWidth())); det.SetForbidFlipping(piece.IsForbidFlipping()); det.SetForceFlipping(piece.IsForceFlipping()); + det.SetFollowGrainline(piece.IsFollowGrainline()); det.SetSewLineOnDrawing(piece.IsSewLineOnDrawing()); det.SetId(id); diff --git a/src/libs/vlayout/vposition.cpp b/src/libs/vlayout/vposition.cpp index 7186041ea..3fcd48b3a 100644 --- a/src/libs/vlayout/vposition.cpp +++ b/src/libs/vlayout/vposition.cpp @@ -49,7 +49,6 @@ #include "../ifc/exception/vexception.h" #include "../vlayout/vlayoutpoint.h" #include "../vmisc/def.h" -#include "../vpatterndb/floatItemData/floatitemdef.h" #include "vpiecegrainline.h" namespace @@ -379,7 +378,7 @@ auto VPosition::CheckRotationEdges(VLayoutPiece &detail, int j, int dEdge, qreal if (detail.IsForceFlipping()) { - detail.Mirror(not m_data.followGrainline ? globalEdge : QLineF(10, 10, 10, 100)); + detail.Mirror(m_data.followGrainline || detail.IsFollowGrainline() ? QLineF(10, 10, 10, 100) : globalEdge); } RotateEdges(detail, globalEdge, dEdge, angle); @@ -548,7 +547,9 @@ void VPosition::FollowGrainline() if (m_data.detail.IsForceFlipping()) { VLayoutPiece workDetail = m_data.detail; // We need copy for temp change - workDetail.Mirror(not m_data.followGrainline ? m_data.gContour.GlobalEdge(m_data.j) : QLineF(10, 10, 10, 100)); + workDetail.Mirror(m_data.followGrainline || workDetail.IsFollowGrainline() + ? QLineF(10, 10, 10, 100) + : m_data.gContour.GlobalEdge(m_data.j)); detailGrainline = workDetail.GetMatrix().map(detailGrainline); } @@ -603,41 +604,40 @@ void VPosition::FindBestPosition() return; } - if (not m_data.followGrainline || not m_data.detail.IsGrainlineEnabled()) + if (m_data.detail.IsGrainlineEnabled() && (m_data.followGrainline || m_data.detail.IsFollowGrainline())) { - // We should use copy of the detail. - VLayoutPiece workDetail = m_data.detail; + FollowGrainline(); + return; + } - int dEdge = m_data.i; // For mirror detail edge will be different - if (CheckCombineEdges(workDetail, m_data.j, dEdge)) - { - if (stop->load()) - { - return; - } - -#ifdef LAYOUT_DEBUG -#ifdef SHOW_CANDIDATE_BEST - DumpFrame(m_data.gContour, workDetail, m_data.mutex, m_data.details); -#endif -#endif - - SaveCandidate(m_bestResult, workDetail, m_data.j, dEdge, BestFrom::Combine); - } + // We should use copy of the detail. + VLayoutPiece workDetail = m_data.detail; + int dEdge = m_data.i; // For mirror detail edge will be different + if (CheckCombineEdges(workDetail, m_data.j, dEdge)) + { if (stop->load()) { return; } - if (m_data.rotate) - { - Rotate(m_data.rotationNumber); - } +#ifdef LAYOUT_DEBUG +#ifdef SHOW_CANDIDATE_BEST + DumpFrame(m_data.gContour, workDetail, m_data.mutex, m_data.details); +#endif +#endif + + SaveCandidate(m_bestResult, workDetail, m_data.j, dEdge, BestFrom::Combine); } - else + + if (stop->load()) { - FollowGrainline(); + return; + } + + if (m_data.rotate) + { + Rotate(m_data.rotationNumber); } } diff --git a/src/libs/vlayout/vrawlayout.cpp b/src/libs/vlayout/vrawlayout.cpp index 0e786fc09..0e00c94f7 100644 --- a/src/libs/vlayout/vrawlayout.cpp +++ b/src/libs/vlayout/vrawlayout.cpp @@ -103,11 +103,6 @@ auto operator>>(QDataStream &dataStream, VRawLayoutData &data) -> QDataStream & return dataStream; } -//--------------------------------------------------------------------------------------------------------------------- -VRawLayout::VRawLayout() -{ -} - //--------------------------------------------------------------------------------------------------------------------- auto VRawLayout::WriteFile(QIODevice *ioDevice, const VRawLayoutData &data) -> bool { @@ -119,7 +114,7 @@ auto VRawLayout::WriteFile(QIODevice *ioDevice, const VRawLayoutData &data) -> b if (wasOpen || ioDevice->open(QIODevice::WriteOnly)) { QDataStream dataStream(ioDevice); - dataStream.setVersion(QDataStream::Qt_5_4); + dataStream.setVersion(QDataStream::Qt_5_6); // Don't use the << operator for QByteArray. See the note in ReadFile() below. dataStream.writeRawData(fileHeaderByteArray.constData(), static_cast(fileHeaderByteArray.size())); @@ -159,7 +154,7 @@ auto VRawLayout::ReadFile(QIODevice *ioDevice, VRawLayoutData &data) -> bool }); QDataStream dataStream(ioDevice); - dataStream.setVersion(QDataStream::Qt_5_4); + dataStream.setVersion(QDataStream::Qt_5_6); // Note: we could have used the QDataStream << and >> operators on QByteArray but since the first // bytes of the stream will be the size of the array, we might end up attempting to allocate diff --git a/src/libs/vlayout/vrawlayout.h b/src/libs/vlayout/vrawlayout.h index c7089676f..dd021eef8 100644 --- a/src/libs/vlayout/vrawlayout.h +++ b/src/libs/vlayout/vrawlayout.h @@ -42,12 +42,12 @@ private: static const quint16 classVersion; }; - class VRawLayout { Q_DECLARE_TR_FUNCTIONS(VRawLayout) // NOLINT + public: - VRawLayout(); + VRawLayout() = default; auto WriteFile(QIODevice *ioDevice, const VRawLayoutData &data) -> bool; auto ReadFile(QIODevice *ioDevice, VRawLayoutData &data) -> bool; diff --git a/src/libs/vtools/dialogs/tools/piece/dialogseamallowance.cpp b/src/libs/vtools/dialogs/tools/piece/dialogseamallowance.cpp index 535375214..398ff9272 100644 --- a/src/libs/vtools/dialogs/tools/piece/dialogseamallowance.cpp +++ b/src/libs/vtools/dialogs/tools/piece/dialogseamallowance.cpp @@ -355,6 +355,7 @@ void DialogSeamAllowance::SetPiece(const VPiece &piece) uiTabPaths->checkBoxForbidFlipping->setChecked(piece.IsForbidFlipping()); uiTabPaths->checkBoxForceFlipping->setChecked(piece.IsForceFlipping()); + uiTabPaths->checkBoxFollowGrainline->setChecked(piece.IsFollowGrainline()); uiTabPaths->checkBoxOnDrawing->setChecked(piece.IsSewLineOnDrawing()); uiTabPaths->checkBoxSeams->setChecked(piece.IsSeamAllowance()); uiTabPaths->checkBoxBuiltIn->setChecked(piece.IsSeamAllowanceBuiltIn()); @@ -2751,6 +2752,7 @@ auto DialogSeamAllowance::CreatePiece() const -> VPiece piece.SetPlaceLabels(GetListInternals(uiTabPlaceLabels->listWidgetPlaceLabels)); piece.SetForbidFlipping(uiTabPaths->checkBoxForbidFlipping->isChecked()); piece.SetForceFlipping(uiTabPaths->checkBoxForceFlipping->isChecked()); + piece.SetFollowGrainline(uiTabPaths->checkBoxFollowGrainline->isChecked()); piece.SetSewLineOnDrawing(uiTabPaths->checkBoxOnDrawing->isChecked()); piece.SetSeamAllowance(uiTabPaths->checkBoxSeams->isChecked()); piece.SetSeamAllowanceBuiltIn(uiTabPaths->checkBoxBuiltIn->isChecked()); diff --git a/src/libs/vtools/dialogs/tools/piece/tabs/tabpaths.ui b/src/libs/vtools/dialogs/tools/piece/tabs/tabpaths.ui index 82ad9654f..5e793a603 100644 --- a/src/libs/vtools/dialogs/tools/piece/tabs/tabpaths.ui +++ b/src/libs/vtools/dialogs/tools/piece/tabs/tabpaths.ui @@ -111,7 +111,7 @@ Move on top - + @@ -128,7 +128,7 @@ Move up - + @@ -145,7 +145,7 @@ Move down - + @@ -162,7 +162,7 @@ Move on bottom - + @@ -325,6 +325,16 @@ + + + + Force piece to always follow grainline direction regardless of layout settings. + + + Follow grainline + + + @@ -457,7 +467,7 @@ Formula wizard - + @@ -696,7 +706,7 @@ Formula wizard - + @@ -886,7 +896,7 @@ Formula wizard - + diff --git a/src/libs/vtools/tools/vtoolseamallowance.cpp b/src/libs/vtools/tools/vtoolseamallowance.cpp index 8e9ae0f64..27ec1f154 100644 --- a/src/libs/vtools/tools/vtoolseamallowance.cpp +++ b/src/libs/vtools/tools/vtoolseamallowance.cpp @@ -418,6 +418,7 @@ void VToolSeamAllowance::AddAttributes(VAbstractPattern *doc, QDomElement &domEl [](bool inLayout) noexcept { return inLayout; }); doc->SetAttribute(domElement, AttrForbidFlipping, piece.IsForbidFlipping()); doc->SetAttribute(domElement, AttrForceFlipping, piece.IsForceFlipping()); + doc->SetAttribute(domElement, AttrFollowGrainline, piece.IsFollowGrainline()); doc->SetAttribute(domElement, AttrSewLineOnDrawing, piece.IsSewLineOnDrawing()); doc->SetAttributeOrRemoveIf(domElement, AttrSeamAllowance, piece.IsSeamAllowance(), [](bool seamAllowance) noexcept { return not seamAllowance; });