Piece path now works with passmarks.

--HG--
branch : feature
This commit is contained in:
Roman Telezhynskyi 2017-03-29 14:18:33 +03:00
parent 330e831815
commit 11a7bf89b4
8 changed files with 413 additions and 75 deletions

View File

@ -67,52 +67,6 @@ QVector<quint32> PieceMissingNodes(const QVector<quint32> &d1Nodes, const QVecto
return r;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<CustomSARecord> FilterRecords(QVector<CustomSARecord> records)
{
if (records.size() < 2)
{
return records;
}
bool foundFilter = false;// Need in case "filter" will stay empty.
CustomSARecord filter;
int startIndex = records.size()-1;
for (int i = 0; i < records.size(); ++i)
{
if (records.at(i).startPoint < static_cast<quint32>(startIndex))
{
startIndex = i;
filter = records.at(i);
foundFilter = true;
}
}
if (not foundFilter)
{
return records; // return as is
}
records.remove(startIndex);
QVector<CustomSARecord> secondRound;
for (int i = 0; i < records.size(); ++i)
{
if (records.at(i).startPoint > filter.endPoint)
{
secondRound.append(records.at(i));
}
}
QVector<CustomSARecord> filtered;
filtered.append(filter);
filtered += FilterRecords(secondRound);
return filtered;
}
//---------------------------------------------------------------------------------------------------------------------
qreal PassmarkLength(const VSAPoint &passmarkSAPoint, qreal width)
{
@ -733,6 +687,55 @@ QVector<CustomSARecord> VPiece::GetValidRecords() const
return records;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<CustomSARecord> VPiece::FilterRecords(QVector<CustomSARecord> records) const
{
if (records.size() < 2)
{
return records;
}
bool foundFilter = false;// Need in case "filter" will stay empty.
CustomSARecord filter;
int startIndex = d->m_path.CountNodes()-1;
for (int i = 0; i < records.size(); ++i)
{
const int indexStartPoint = d->m_path.indexOfNode(records.at(i).startPoint);
if (indexStartPoint < startIndex)
{
startIndex = i;
filter = records.at(i);
foundFilter = true;
}
}
if (not foundFilter)
{
return records; // return as is
}
records.remove(startIndex);
QVector<CustomSARecord> secondRound;
for (int i = 0; i < records.size(); ++i)
{
const int indexStartPoint = d->m_path.indexOfNode(records.at(i).startPoint);
const int indexEndPoint = d->m_path.indexOfNode(filter.endPoint);
if (indexStartPoint > indexEndPoint)
{
secondRound.append(records.at(i));
}
}
QVector<CustomSARecord> filtered;
filtered.append(filter);
filtered += FilterRecords(secondRound);
return filtered;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<VSAPoint> VPiece::GetNodeSAPoints(int index, const VContainer *data) const
{

View File

@ -114,6 +114,7 @@ private:
QSharedDataPointer<VPieceData> d;
QVector<CustomSARecord> GetValidRecords() const;
QVector<CustomSARecord> FilterRecords(QVector<CustomSARecord> records) const;
QVector<VSAPoint> GetNodeSAPoints(int index, const VContainer *data) const;

View File

@ -55,6 +55,7 @@ DialogPiecePath::DialogPiecePath(const VContainer *data, quint32 toolId, QWidget
InitPathTab();
InitSeamAllowanceTab();
InitPassmarksTab();
flagName = true;//We have default name of piece.
flagError = PathIsValid();
@ -62,7 +63,8 @@ DialogPiecePath::DialogPiecePath(const VContainer *data, quint32 toolId, QWidget
vis = new VisToolPiecePath(data);
ui->tabWidget->removeTab(1);
ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabSeamAllowance));
ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabPassmarks));
}
//---------------------------------------------------------------------------------------------------------------------
@ -224,6 +226,7 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
SCASSERT(rowItem != nullptr);
VPieceNode rowNode = qvariant_cast<VPieceNode>(rowItem->data(Qt::UserRole));
QAction *actionPassmark = nullptr;
QAction *actionReverse = nullptr;
if (rowNode.GetTypeTool() != Tool::NodePoint)
{
@ -231,6 +234,12 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
actionReverse->setCheckable(true);
actionReverse->setChecked(rowNode.GetReverse());
}
else
{
actionPassmark = menu->addAction(tr("Passmark"));
actionPassmark->setCheckable(true);
actionPassmark->setChecked(rowNode.IsPassmark());
}
QAction *actionDelete = menu->addAction(QIcon::fromTheme("edit-delete"), tr("Delete"));
@ -238,16 +247,21 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
if (selectedAction == actionDelete)
{
delete ui->listWidget->item(row);
ValidObjects(PathIsValid());
}
else if (rowNode.GetTypeTool() != Tool::NodePoint && selectedAction == actionReverse)
{
rowNode.SetReverse(not rowNode.GetReverse());
rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode));
rowItem->setText(GetNodeName(rowNode, true));
ValidObjects(PathIsValid());
}
else if (selectedAction == actionPassmark)
{
rowNode.SetPassmark(not rowNode.IsPassmark());
rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode));
rowItem->setText(GetNodeName(rowNode, true));
}
ValidObjects(PathIsValid());
ListChanged();
}
@ -357,6 +371,68 @@ void DialogPiecePath::NodeChanged(int index)
ui->comboBoxAngle->blockSignals(false);
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::PassmarkChanged(int index)
{
ui->radioButtonOneLine->setDisabled(true);
ui->radioButtonTwoLines->setDisabled(true);
ui->radioButtonThreeLines->setDisabled(true);
ui->radioButtonStraightforward->setDisabled(true);
ui->radioButtonBisector->setDisabled(true);
ui->groupBoxLineType->blockSignals(true);
ui->groupBoxAngleType->blockSignals(true);
if (index != -1)
{
const VPiecePath path = CreatePath();
const int nodeIndex = path.indexOfNode(CURRENT_DATA(ui->comboBoxPassmarks).toUInt());
if (nodeIndex != -1)
{
const VPieceNode &node = path.at(nodeIndex);
// Line type
ui->radioButtonOneLine->setEnabled(true);
ui->radioButtonTwoLines->setEnabled(true);
ui->radioButtonThreeLines->setEnabled(true);
switch(node.GetPassmarkLineType())
{
case PassmarkLineType::OneLine:
ui->radioButtonOneLine->setChecked(true);
break;
case PassmarkLineType::TwoLines:
ui->radioButtonTwoLines->setChecked(true);
break;
case PassmarkLineType::ThreeLines:
ui->radioButtonThreeLines->setChecked(true);
break;
default:
break;
}
// Angle type
ui->radioButtonStraightforward->setEnabled(true);
ui->radioButtonBisector->setEnabled(true);
switch(node.GetPassmarkAngleType())
{
case PassmarkAngleType::Straightforward:
ui->radioButtonStraightforward->setChecked(true);
break;
case PassmarkAngleType::Bisector:
ui->radioButtonBisector->setChecked(true);
break;
default:
break;
}
}
}
ui->groupBoxLineType->blockSignals(false);
ui->groupBoxAngleType->blockSignals(false);
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::ReturnDefBefore()
{
@ -369,6 +445,70 @@ void DialogPiecePath::ReturnDefAfter()
ui->plainTextEditFormulaWidthAfter->setPlainText(currentSeamAllowance);
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::PassmarkLineTypeChanged(int id)
{
const int i = ui->comboBoxPassmarks->currentIndex();
if (i != -1)
{
QListWidgetItem *rowItem = GetItemById(CURRENT_DATA(ui->comboBoxPassmarks).toUInt());
if (rowItem)
{
VPieceNode rowNode = qvariant_cast<VPieceNode>(rowItem->data(Qt::UserRole));
PassmarkLineType lineType = PassmarkLineType::OneLine;
if (id == ui->buttonGroupLineType->id(ui->radioButtonOneLine))
{
lineType = PassmarkLineType::OneLine;
}
else if (id == ui->buttonGroupLineType->id(ui->radioButtonTwoLines))
{
lineType = PassmarkLineType::TwoLines;
}
else if (id == ui->buttonGroupLineType->id(ui->radioButtonThreeLines))
{
lineType = PassmarkLineType::ThreeLines;
}
rowNode.SetPassmarkLineType(lineType);
rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode));
rowItem->setText(GetNodeName(rowNode, true));
ListChanged();
}
}
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::PassmarkAngleTypeChanged(int id)
{
const int i = ui->comboBoxPassmarks->currentIndex();
if (i != -1)
{
QListWidgetItem *rowItem = GetItemById(CURRENT_DATA(ui->comboBoxPassmarks).toUInt());
if (rowItem)
{
VPieceNode rowNode = qvariant_cast<VPieceNode>(rowItem->data(Qt::UserRole));
PassmarkAngleType angleType = PassmarkAngleType::Straightforward;
if (id == ui->buttonGroupAngleType->id(ui->radioButtonStraightforward))
{
angleType = PassmarkAngleType::Straightforward;
}
else if (id == ui->buttonGroupAngleType->id(ui->radioButtonBisector))
{
angleType = PassmarkAngleType::Bisector;
}
rowNode.SetPassmarkAngleType(angleType);
rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode));
rowItem->setText(GetNodeName(rowNode, true));
ListChanged();
}
}
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::EvalWidth()
{
@ -581,6 +721,19 @@ void DialogPiecePath::InitSeamAllowanceTab()
&DialogPiecePath::DeployWidthAfterFormulaTextEdit);
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::InitPassmarksTab()
{
InitPassmarksList();
connect(ui->comboBoxPassmarks, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this, &DialogPiecePath::PassmarkChanged);
connect(ui->buttonGroupLineType, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
this, &DialogPiecePath::PassmarkLineTypeChanged);
connect(ui->buttonGroupAngleType, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
this, &DialogPiecePath::PassmarkAngleTypeChanged);
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::InitPathTypes()
{
@ -624,6 +777,40 @@ void DialogPiecePath::InitNodesList()
}
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::InitPassmarksList()
{
const quint32 id = CURRENT_DATA(ui->comboBoxPassmarks).toUInt();
ui->comboBoxPassmarks->blockSignals(true);
ui->comboBoxPassmarks->clear();
const QVector<VPieceNode> nodes = GetListInternals<VPieceNode>(ui->listWidget);
for (int i = 0; i < nodes.size(); ++i)
{
const VPieceNode node = nodes.at(i);
if (node.GetTypeTool() == Tool::NodePoint && node.IsPassmark())
{
const QString name = GetNodeName(node);
ui->comboBoxPassmarks->addItem(name, node.GetId());
}
}
ui->comboBoxPassmarks->blockSignals(false);
const int index = ui->comboBoxPassmarks->findData(id);
if (index != -1)
{
ui->comboBoxPassmarks->setCurrentIndex(index);
PassmarkChanged(index);// Need in case combox index was not changed
}
else
{
ui->comboBoxPassmarks->count() > 0 ? PassmarkChanged(0) : PassmarkChanged(-1);
}
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::NodeAngleChanged(int index)
{
@ -783,6 +970,11 @@ void DialogPiecePath::UpdateNodeSAAfter(const QString &formula)
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::SetFormulaSAWidth(const QString &formula)
{
if (formula.isEmpty())
{
return;
}
const QString width = qApp->TrVars()->FormulaToUser(formula, qApp->Settings()->GetOsSeparator());
// increase height if needed.
if (width.length() > 80)
@ -795,6 +987,16 @@ void DialogPiecePath::SetFormulaSAWidth(const QString &formula)
SCASSERT(path != nullptr)
path->SetPath(CreatePath());
if (ui->tabWidget->indexOf(ui->tabSeamAllowance) == -1)
{
ui->tabWidget->addTab(ui->tabSeamAllowance, tr("Seam allowance"));
}
if (ui->tabWidget->indexOf(ui->tabPassmarks) == -1)
{
ui->tabWidget->addTab(ui->tabPassmarks, tr("Passmarks"));
}
MoveCursorToEnd(ui->plainTextEditFormulaWidth);
}

View File

@ -70,8 +70,11 @@ private slots:
void ListChanged();
void NameChanged();
void NodeChanged(int index);
void PassmarkChanged(int index);
void ReturnDefBefore();
void ReturnDefAfter();
void PassmarkLineTypeChanged(int id);
void PassmarkAngleTypeChanged(int id);
void EvalWidth();
void EvalWidthBefore();
@ -105,9 +108,11 @@ private:
void InitPathTab();
void InitSeamAllowanceTab();
void InitPassmarksTab();
void InitPathTypes();
void InitListPieces();
void InitNodesList();
void InitPassmarksList();
void NodeAngleChanged(int index);
VPiecePath CreatePath() const;

View File

@ -792,6 +792,129 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tabPassmarks">
<attribute name="title">
<string>Passmarks</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<layout class="QFormLayout" name="formLayout_2">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Passmark:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxPassmarks"/>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBoxLineType">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title">
<string>Lines</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QRadioButton" name="radioButtonOneLine">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>One line</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroupLineType</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonTwoLines">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Two lines</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroupLineType</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonThreeLines">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Three lines</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroupLineType</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBoxAngleType">
<property name="title">
<string>Angle</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QRadioButton" name="radioButtonStraightforward">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Straightforward</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroupAngleType</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonBisector">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Bisector</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroupAngleType</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>85</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
@ -843,4 +966,8 @@
</hints>
</connection>
</connections>
<buttongroups>
<buttongroup name="buttonGroupLineType"/>
<buttongroup name="buttonGroupAngleType"/>
</buttongroups>
</ui>

View File

@ -256,6 +256,9 @@ protected:
template <typename T>
void AddVisualization();
template <typename T>
QVector<T> GetListInternals(const QListWidget *list) const;
void ChangeColor(QWidget *widget, const QColor &color);
virtual void ShowVisualization() {}
/**
@ -294,6 +297,20 @@ private:
};
//---------------------------------------------------------------------------------------------------------------------
template <typename T>
QVector<T> DialogTool::GetListInternals(const QListWidget *list) const
{
SCASSERT(list != nullptr)
QVector<T> internals;
for (qint32 i = 0; i < list->count(); ++i)
{
QListWidgetItem *item = list->item(i);
internals.append(qvariant_cast<T>(item->data(Qt::UserRole)));
}
return internals;
}
//---------------------------------------------------------------------------------------------------------------------
inline VAbstractTool *DialogTool::GetAssociatedTool()
{

View File

@ -2029,10 +2029,10 @@ void DialogSeamAllowance::PatternPinPointChanged()
VPiece DialogSeamAllowance::CreatePiece() const
{
VPiece piece;
piece.GetPath().SetNodes(GetPieceInternals<VPieceNode>(uiTabPaths->listWidgetMainPath));
piece.SetCustomSARecords(GetPieceInternals<CustomSARecord>(uiTabPaths->listWidgetCustomSA));
piece.SetInternalPaths(GetPieceInternals<quint32>(uiTabPaths->listWidgetInternalPaths));
piece.SetPins(GetPieceInternals<quint32>(uiTabPins->listWidgetPins));
piece.GetPath().SetNodes(GetListInternals<VPieceNode>(uiTabPaths->listWidgetMainPath));
piece.SetCustomSARecords(GetListInternals<CustomSARecord>(uiTabPaths->listWidgetCustomSA));
piece.SetInternalPaths(GetListInternals<quint32>(uiTabPaths->listWidgetInternalPaths));
piece.SetPins(GetListInternals<quint32>(uiTabPins->listWidgetPins));
piece.SetForbidFlipping(uiTabPaths->checkBoxForbidFlipping->isChecked());
piece.SetSeamAllowance(uiTabPaths->checkBoxSeams->isChecked());
piece.SetName(uiTabLabels->lineEditName->text());
@ -2232,7 +2232,7 @@ void DialogSeamAllowance::InitNodesList()
uiTabPaths->comboBoxNodes->blockSignals(true);
uiTabPaths->comboBoxNodes->clear();
const QVector<VPieceNode> nodes = GetPieceInternals<VPieceNode>(uiTabPaths->listWidgetMainPath);
const QVector<VPieceNode> nodes = GetListInternals<VPieceNode>(uiTabPaths->listWidgetMainPath);
for (int i = 0; i < nodes.size(); ++i)
{
@ -2266,7 +2266,7 @@ void DialogSeamAllowance::InitPassmarksList()
uiTabPassmarks->comboBoxPassmarks->blockSignals(true);
uiTabPassmarks->comboBoxPassmarks->clear();
const QVector<VPieceNode> nodes = GetPieceInternals<VPieceNode>(uiTabPaths->listWidgetMainPath);
const QVector<VPieceNode> nodes = GetListInternals<VPieceNode>(uiTabPaths->listWidgetMainPath);
for (int i = 0; i < nodes.size(); ++i)
{
@ -2495,7 +2495,7 @@ void DialogSeamAllowance::InitCSAPoint(QComboBox *box)
box->clear();
box->addItem(tr("Empty"), NULL_ID);
const QVector<VPieceNode> nodes = GetPieceInternals<VPieceNode>(uiTabPaths->listWidgetMainPath);
const QVector<VPieceNode> nodes = GetListInternals<VPieceNode>(uiTabPaths->listWidgetMainPath);
for (int i = 0; i < nodes.size(); ++i)
{
@ -2522,7 +2522,7 @@ void DialogSeamAllowance::InitPinPoint(QComboBox *box)
box->clear();
box->addItem(QLatin1String("<") + tr("no pin") + QLatin1String(">"), NULL_ID);
const QVector<quint32> pins = GetPieceInternals<quint32>(uiTabPins->listWidgetPins);
const QVector<quint32> pins = GetListInternals<quint32>(uiTabPins->listWidgetPins);
for (int i = 0; i < pins.size(); ++i)
{
@ -2803,20 +2803,6 @@ void DialogSeamAllowance::ClearFields()
uiTabLabels->comboBoxPlacement->setCurrentIndex(0);
}
//---------------------------------------------------------------------------------------------------------------------
template <typename T>
QVector<T> DialogSeamAllowance::GetPieceInternals(const QListWidget *list) const
{
SCASSERT(list != nullptr)
QVector<T> internals;
for (qint32 i = 0; i < list->count(); ++i)
{
QListWidgetItem *item = list->item(i);
internals.append(qvariant_cast<T>(item->data(Qt::UserRole)));
}
return internals;
}
//---------------------------------------------------------------------------------------------------------------------
void DialogSeamAllowance::SetGrainlineAngle(QString angleFormula)
{
@ -2984,7 +2970,7 @@ void DialogSeamAllowance::ShowPins()
m_visPins = new VisPiecePins(data);
}
m_visPins->SetPins(GetPieceInternals<quint32>(uiTabPins->listWidgetPins));
m_visPins->SetPins(GetListInternals<quint32>(uiTabPins->listWidgetPins));
if (not qApp->getCurrentScene()->items().contains(m_visPins))
{

View File

@ -256,9 +256,6 @@ private:
void SetFormulaSAWidth(const QString &formula);
template <typename T>
QVector<T> GetPieceInternals(const QListWidget *list) const;
void SetGrainlineAngle(QString angleFormula);
void SetGrainlineLength(QString lengthFormula);