diff --git a/src/app/valentina/xml/vpattern.cpp b/src/app/valentina/xml/vpattern.cpp index cb385888a..d397a3434 100644 --- a/src/app/valentina/xml/vpattern.cpp +++ b/src/app/valentina/xml/vpattern.cpp @@ -751,6 +751,7 @@ void VPattern::ParseDetailNodes(const QDomElement &domElement, VPiece &detail) c const bool reverse = GetParametrUInt(element, VToolSeamAllowance::AttrNodeReverse, "0"); const qreal saBefore = GetParametrDouble(element, VToolSeamAllowance::AttrSABefore, "-1"); const qreal saAfter = GetParametrDouble(element, VToolSeamAllowance::AttrSAAfter, "-1"); + const PieceNodeAngle angle = static_cast(GetParametrUInt(element, AttrAngle, "0")); const QString t = GetParametrString(element, AttrType, VToolSeamAllowance::NodePoint); Tool tool; @@ -776,6 +777,7 @@ void VPattern::ParseDetailNodes(const QDomElement &domElement, VPiece &detail) c VPieceNode node(id, tool, reverse); node.SetSABefore(saBefore); node.SetSAAfter(saAfter); + node.SetAngleType(angle); detail.Append(node); } } diff --git a/src/libs/ifc/schema/pattern/v0.4.0.xsd b/src/libs/ifc/schema/pattern/v0.4.0.xsd index e98b35b89..0562a84f1 100644 --- a/src/libs/ifc/schema/pattern/v0.4.0.xsd +++ b/src/libs/ifc/schema/pattern/v0.4.0.xsd @@ -404,6 +404,7 @@ + @@ -638,4 +639,14 @@ + + + + + + + + + + diff --git a/src/libs/vmisc/def.h b/src/libs/vmisc/def.h index a5c420e90..f8e2655a3 100644 --- a/src/libs/vmisc/def.h +++ b/src/libs/vmisc/def.h @@ -64,6 +64,16 @@ enum class Source : char { FromGui, FromFile, FromTool }; enum class NodeUsage : bool {NotInUse = false, InUse = true}; enum class SelectionType : bool {ByMousePress, ByMouseRelease}; +enum class PieceNodeAngle : unsigned char +{ + ByLength = 0, + ByPointsIntersection, + ByFirstEdgeSymmetry, + BySecondEdgeSymmetry, + ByFirstEdgeRightAngle, + BySecondEdgeRightAngle +}; + typedef unsigned char ToolVisHolderType; enum class Tool : ToolVisHolderType { diff --git a/src/libs/vpatterndb/vpiecenode.cpp b/src/libs/vpatterndb/vpiecenode.cpp index 32481a696..4a6f7af26 100644 --- a/src/libs/vpatterndb/vpiecenode.cpp +++ b/src/libs/vpatterndb/vpiecenode.cpp @@ -150,6 +150,18 @@ void VPieceNode::SetSAAfter(qreal value) } } +//--------------------------------------------------------------------------------------------------------------------- +PieceNodeAngle VPieceNode::GetAngleType() const +{ + return d->m_angleType; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VPieceNode::SetAngleType(PieceNodeAngle type) +{ + d->m_angleType = type; +} + // Friend functions //--------------------------------------------------------------------------------------------------------------------- QDataStream& operator<<(QDataStream& out, const VPieceNode& p) diff --git a/src/libs/vpatterndb/vpiecenode.h b/src/libs/vpatterndb/vpiecenode.h index 4b4da1a2f..2653e472f 100644 --- a/src/libs/vpatterndb/vpiecenode.h +++ b/src/libs/vpatterndb/vpiecenode.h @@ -65,6 +65,9 @@ public: qreal GetSAAfter() const; qreal GetSAAfter(Unit unit) const; void SetSAAfter(qreal value); + + PieceNodeAngle GetAngleType() const; + void SetAngleType(PieceNodeAngle type); private: QSharedDataPointer d; }; diff --git a/src/libs/vpatterndb/vpiecenode_p.h b/src/libs/vpatterndb/vpiecenode_p.h index 63433bed7..25a1c0bad 100644 --- a/src/libs/vpatterndb/vpiecenode_p.h +++ b/src/libs/vpatterndb/vpiecenode_p.h @@ -44,7 +44,8 @@ public: m_typeTool(Tool::NodePoint), m_reverse(false), m_saBefore(-1), - m_saAfter(-1) + m_saAfter(-1), + m_angleType(PieceNodeAngle::ByLength) {} VPieceNodeData(quint32 id, Tool typeTool, bool reverse) @@ -52,7 +53,8 @@ public: m_typeTool(typeTool), m_reverse(reverse), m_saBefore(-1), - m_saAfter(-1) + m_saAfter(-1), + m_angleType(PieceNodeAngle::ByLength) { if (m_typeTool == Tool::NodePoint) { @@ -66,7 +68,8 @@ public: m_typeTool(node.m_typeTool), m_reverse(node.m_reverse), m_saBefore(node.m_saBefore), - m_saAfter(node.m_saAfter) + m_saAfter(node.m_saAfter), + m_angleType(node.m_angleType) {} ~VPieceNodeData(); @@ -83,6 +86,8 @@ public: qreal m_saBefore; qreal m_saAfter; + PieceNodeAngle m_angleType; + private: VPieceNodeData &operator=(const VPieceNodeData &) Q_DECL_EQ_DELETE; }; diff --git a/src/libs/vtools/dialogs/tools/dialogseamallowance.cpp b/src/libs/vtools/dialogs/tools/dialogseamallowance.cpp index 00f26ed8b..c6eae327c 100644 --- a/src/libs/vtools/dialogs/tools/dialogseamallowance.cpp +++ b/src/libs/vtools/dialogs/tools/dialogseamallowance.cpp @@ -87,10 +87,16 @@ DialogSeamAllowance::DialogSeamAllowance(const VContainer *data, const quint32 & connect(ui->listWidget->model(), &QAbstractItemModel::rowsMoved, this, &DialogSeamAllowance::ListChanged); connect(ui->checkBoxSeams, &QCheckBox::toggled, this, &DialogSeamAllowance::EnableSeamAllowance); + InitNodeAngles(); + connect(ui->comboBoxAngle, static_cast(&QComboBox::currentIndexChanged), this, + &DialogSeamAllowance::NodeAngleChanged); + if (not applyAllowed) { vis = new VisToolPiece(data); } + + ui->tabWidget->setCurrentIndex(1);// Show always first tab active on start. } //--------------------------------------------------------------------------------------------------------------------- @@ -307,9 +313,11 @@ void DialogSeamAllowance::NodeChanged(int index) ui->doubleSpinBoxSAAfter->setDisabled(true); ui->pushButtonDefBefore->setDisabled(true); ui->pushButtonDefAfter->setDisabled(true); + ui->comboBoxAngle->setDisabled(true); ui->doubleSpinBoxSABefore->blockSignals(true); ui->doubleSpinBoxSAAfter->blockSignals(true); + ui->comboBoxAngle->blockSignals(true); if (index != -1) { @@ -322,10 +330,11 @@ void DialogSeamAllowance::NodeChanged(int index) const int nodeIndex = piece.indexOfNode(id); if (nodeIndex != -1) { - const VPieceNode node = piece.at(nodeIndex); + const VPieceNode &node = piece.at(nodeIndex); ui->doubleSpinBoxSABefore->setEnabled(true); ui->doubleSpinBoxSAAfter->setEnabled(true); + ui->comboBoxAngle->setEnabled(true); qreal w1 = node.GetSABefore(); if (w1 < 0) @@ -348,16 +357,54 @@ void DialogSeamAllowance::NodeChanged(int index) ui->pushButtonDefAfter->setEnabled(true); } ui->doubleSpinBoxSAAfter->setValue(w2); + + const int index = ui->comboBoxAngle->findData(static_cast(node.GetAngleType())); + if (index != -1) + { + ui->comboBoxAngle->setCurrentIndex(index); + } } } else { ui->doubleSpinBoxSABefore->setValue(0); ui->doubleSpinBoxSAAfter->setValue(0); + ui->comboBoxAngle->setCurrentIndex(-1); } ui->doubleSpinBoxSABefore->blockSignals(false); ui->doubleSpinBoxSAAfter->blockSignals(false); + ui->comboBoxAngle->blockSignals(false); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogSeamAllowance::NodeAngleChanged(int index) +{ + const int i = ui->comboBoxNodes->currentIndex(); + if (i != -1 && index != -1) + { + #if QT_VERSION < QT_VERSION_CHECK(5, 2, 0) + const quint32 id = ui->comboBoxNodes->itemData(i).toUInt(); + #else + const quint32 id = ui->comboBoxNodes->currentData().toUInt(); + #endif + + QListWidgetItem *rowItem = GetItemById(id); + if (rowItem) + { + #if QT_VERSION < QT_VERSION_CHECK(5, 2, 0) + const PieceNodeAngle angle = static_cast(ui->comboBoxAngle->itemData(index).toUInt()); + #else + const PieceNodeAngle angle = static_cast(ui->comboBoxAngle->currentData().toUInt()); + #endif + + VPieceNode rowNode = qvariant_cast(rowItem->data(Qt::UserRole)); + rowNode.SetAngleType(angle); + rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode)); + + ListChanged(); + } + } } //--------------------------------------------------------------------------------------------------------------------- @@ -601,6 +648,24 @@ void DialogSeamAllowance::InitNodesList() } } +//--------------------------------------------------------------------------------------------------------------------- +void DialogSeamAllowance::InitNodeAngles() +{ + ui->comboBoxAngle->clear(); + + ui->comboBoxAngle->addItem(tr("by length"), static_cast(PieceNodeAngle::ByLength)); + ui->comboBoxAngle->addItem(tr("by points intersetions"), + static_cast(PieceNodeAngle::ByPointsIntersection)); + ui->comboBoxAngle->addItem(tr("by second edge symmetry"), + static_cast(PieceNodeAngle::BySecondEdgeSymmetry)); + ui->comboBoxAngle->addItem(tr("by first edge symmetry"), + static_cast(PieceNodeAngle::ByFirstEdgeSymmetry)); + ui->comboBoxAngle->addItem(tr("by first edge right angle"), + static_cast(PieceNodeAngle::ByFirstEdgeRightAngle)); + ui->comboBoxAngle->addItem(tr("by second edge right angle"), + static_cast(PieceNodeAngle::BySecondEdgeRightAngle)); +} + //--------------------------------------------------------------------------------------------------------------------- QListWidgetItem *DialogSeamAllowance::GetItemById(quint32 id) { diff --git a/src/libs/vtools/dialogs/tools/dialogseamallowance.h b/src/libs/vtools/dialogs/tools/dialogseamallowance.h index e0603c301..35e903df1 100644 --- a/src/libs/vtools/dialogs/tools/dialogseamallowance.h +++ b/src/libs/vtools/dialogs/tools/dialogseamallowance.h @@ -64,6 +64,7 @@ private slots: void ListChanged(); void EnableSeamAllowance(bool enable); void NodeChanged(int index); + void NodeAngleChanged(int index); void ReturnDefBefore(); void ReturnDefAfter(); void ChangedSABefore(double d); @@ -87,6 +88,7 @@ private: bool MainPathIsClockwise() const; QString GetNodeName(const VPieceNode &node) const; void InitNodesList(); + void InitNodeAngles(); QListWidgetItem *GetItemById(quint32 id); diff --git a/src/libs/vtools/dialogs/tools/dialogseamallowance.ui b/src/libs/vtools/dialogs/tools/dialogseamallowance.ui index b9b178fe8..bb48c8e31 100644 --- a/src/libs/vtools/dialogs/tools/dialogseamallowance.ui +++ b/src/libs/vtools/dialogs/tools/dialogseamallowance.ui @@ -256,6 +256,16 @@ + + + + Angle: + + + + + + diff --git a/src/libs/vtools/tools/vtoolseamallowance.cpp b/src/libs/vtools/tools/vtoolseamallowance.cpp index 391124a4b..1bf5663b4 100644 --- a/src/libs/vtools/tools/vtoolseamallowance.cpp +++ b/src/libs/vtools/tools/vtoolseamallowance.cpp @@ -238,6 +238,14 @@ void VToolSeamAllowance::AddNode(VAbstractPattern *doc, QDomElement &domElement, qDebug()<<"May be wrong tool type!!! Ignoring."<(node.GetAngleType()); + + if (angleType > 0) + { + doc->SetAttribute(nod, AttrAngle, angleType); + } + domElement.appendChild(nod); }