A seam allowance node angle. Read, write and set in the dialog. Not handled in
seam allowance itself. --HG-- branch : feature
This commit is contained in:
parent
d38f318569
commit
c21aedc541
|
@ -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<PieceNodeAngle>(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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -404,6 +404,7 @@
|
|||
<xs:attribute name="reverse" type="xs:unsignedInt"></xs:attribute>
|
||||
<xs:attribute name="before" type="xs:double"></xs:attribute>
|
||||
<xs:attribute name="after" type="xs:double"></xs:attribute>
|
||||
<xs:attribute name="angle" type="nodeAngle"></xs:attribute>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
|
@ -638,4 +639,14 @@
|
|||
<xs:enumeration value="2"/><!--New version-->
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="nodeAngle">
|
||||
<xs:restriction base="xs:unsignedInt">
|
||||
<xs:enumeration value="0"/><!--by length-->
|
||||
<xs:enumeration value="1"/><!--by points intersections-->
|
||||
<xs:enumeration value="2"/><!--by second edge symmetry-->
|
||||
<xs:enumeration value="3"/><!--by first edge symmetry-->
|
||||
<xs:enumeration value="4"/><!--by first edge right angle-->
|
||||
<xs:enumeration value="5"/><!--by first edge right angle-->
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:schema>
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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<VPieceNodeData> d;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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<void (QComboBox::*)(int)>(&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<unsigned char>(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<PieceNodeAngle>(ui->comboBoxAngle->itemData(index).toUInt());
|
||||
#else
|
||||
const PieceNodeAngle angle = static_cast<PieceNodeAngle>(ui->comboBoxAngle->currentData().toUInt());
|
||||
#endif
|
||||
|
||||
VPieceNode rowNode = qvariant_cast<VPieceNode>(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<unsigned char>(PieceNodeAngle::ByLength));
|
||||
ui->comboBoxAngle->addItem(tr("by points intersetions"),
|
||||
static_cast<unsigned char>(PieceNodeAngle::ByPointsIntersection));
|
||||
ui->comboBoxAngle->addItem(tr("by second edge symmetry"),
|
||||
static_cast<unsigned char>(PieceNodeAngle::BySecondEdgeSymmetry));
|
||||
ui->comboBoxAngle->addItem(tr("by first edge symmetry"),
|
||||
static_cast<unsigned char>(PieceNodeAngle::ByFirstEdgeSymmetry));
|
||||
ui->comboBoxAngle->addItem(tr("by first edge right angle"),
|
||||
static_cast<unsigned char>(PieceNodeAngle::ByFirstEdgeRightAngle));
|
||||
ui->comboBoxAngle->addItem(tr("by second edge right angle"),
|
||||
static_cast<unsigned char>(PieceNodeAngle::BySecondEdgeRightAngle));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QListWidgetItem *DialogSeamAllowance::GetItemById(quint32 id)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -256,6 +256,16 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="labelAngle">
|
||||
<property name="text">
|
||||
<string>Angle:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QComboBox" name="comboBoxAngle"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
@ -238,6 +238,14 @@ void VToolSeamAllowance::AddNode(VAbstractPattern *doc, QDomElement &domElement,
|
|||
qDebug()<<"May be wrong tool type!!! Ignoring."<<Q_FUNC_INFO;
|
||||
break;
|
||||
}
|
||||
|
||||
const unsigned char angleType = static_cast<unsigned char>(node.GetAngleType());
|
||||
|
||||
if (angleType > 0)
|
||||
{
|
||||
doc->SetAttribute(nod, AttrAngle, angleType);
|
||||
}
|
||||
|
||||
domElement.appendChild(nod);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user