Working with Spline Path.
--HG-- branch : feature
This commit is contained in:
parent
be3fc296f4
commit
c36f1eb8ef
|
@ -319,6 +319,7 @@ QVector<VSplinePoint> VSplinePath::GetSplinePath() const
|
|||
void VSplinePath::Clear()
|
||||
{
|
||||
d->path.clear();
|
||||
SetDuplicate(0);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -52,6 +52,8 @@ DialogSpline::DialogSpline(const VContainer *data, const quint32 &toolId, QWidge
|
|||
FillComboBoxPoints(ui->comboBoxP4);
|
||||
FillComboBoxLineColors(ui->comboBoxColor);
|
||||
|
||||
CheckState();
|
||||
|
||||
connect(ui->comboBoxP1, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged),
|
||||
this, &DialogSpline::PointNameChanged);
|
||||
connect(ui->comboBoxP4, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged),
|
||||
|
@ -132,14 +134,7 @@ void DialogSpline::SaveData()
|
|||
const quint32 d = spl.GetDuplicate();//Save previous value
|
||||
spl = VSpline(*GetP1(), *GetP4(), angle1, angle2, kAsm1, kAsm2, kCurve);
|
||||
|
||||
if (newDuplicate <= -1)
|
||||
{
|
||||
spl.SetDuplicate(d);
|
||||
}
|
||||
else
|
||||
{
|
||||
spl.SetDuplicate(static_cast<quint32>(newDuplicate));
|
||||
}
|
||||
newDuplicate <= -1 ? spl.SetDuplicate(d) : spl.SetDuplicate(static_cast<quint32>(newDuplicate));
|
||||
|
||||
auto path = qobject_cast<VisToolSpline *>(vis);
|
||||
SCASSERT(path != nullptr);
|
||||
|
@ -167,20 +162,6 @@ const QSharedPointer<VPointF> DialogSpline::GetP4() const
|
|||
return data->GeometricObject<VPointF>(getCurrentObjectId(ui->comboBoxP4));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
quint32 DialogSpline::DNumber(const QString &baseName) const
|
||||
{
|
||||
quint32 num = 1;
|
||||
QString name;
|
||||
do
|
||||
{
|
||||
name = baseName + QString("_%1").arg(num);
|
||||
++num;
|
||||
} while (not data->IsUnique(name));
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogSpline::PointNameChanged()
|
||||
{
|
||||
|
@ -194,7 +175,7 @@ void DialogSpline::PointNameChanged()
|
|||
flagError = false;
|
||||
color = errorColor;
|
||||
|
||||
ui->lineEditSplineName->setText(QString());
|
||||
ui->lineEditSplineName->setText(tr("Invalid spline"));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -216,11 +197,11 @@ void DialogSpline::PointNameChanged()
|
|||
{
|
||||
newDuplicate = DNumber(spline.name());
|
||||
spline.SetDuplicate(newDuplicate);
|
||||
|
||||
ui->lineEditSplineName->setText(spline.name());
|
||||
}
|
||||
ui->lineEditSplineName->setText(spline.name());
|
||||
}
|
||||
}
|
||||
ChangeColor(ui->labelName, color);
|
||||
ChangeColor(ui->labelFirstPoint, color);
|
||||
ChangeColor(ui->labelSecondPoint, color);
|
||||
CheckState();
|
||||
|
|
|
@ -75,8 +75,6 @@ private:
|
|||
|
||||
const QSharedPointer<VPointF> GetP1() const;
|
||||
const QSharedPointer<VPointF> GetP4() const;
|
||||
|
||||
quint32 DNumber(const QString &baseName) const;
|
||||
};
|
||||
|
||||
#endif // DIALOGSPLINE_H
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
* @param parent parent widget
|
||||
*/
|
||||
DialogSplinePath::DialogSplinePath(const VContainer *data, const quint32 &toolId, QWidget *parent)
|
||||
:DialogTool(data, toolId, parent), ui(new Ui::DialogSplinePath), path(VSplinePath())
|
||||
:DialogTool(data, toolId, parent), ui(new Ui::DialogSplinePath), path(VSplinePath()), newDuplicate(-1)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
InitOkCancelApply(ui);
|
||||
|
@ -94,6 +94,7 @@ void DialogSplinePath::SetPath(const VSplinePath &value)
|
|||
}
|
||||
ui->listWidget->setFocus(Qt::OtherFocusReason);
|
||||
ui->doubleSpinBoxKcurve->setValue(path.GetKCurve());
|
||||
ui->lineEditSplPathName->setText(path.name());
|
||||
|
||||
auto visPath = qobject_cast<VisToolSplinePath *>(vis);
|
||||
SCASSERT(visPath != nullptr);
|
||||
|
@ -123,7 +124,7 @@ void DialogSplinePath::ChosenObject(quint32 id, const SceneObject &type)
|
|||
{
|
||||
if (type == SceneObject::Point)
|
||||
{
|
||||
if (path.CountPoint() >= 2 && path.at(path.CountPoint()-1).P().id() == id)
|
||||
if (AllIds().contains(id))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -153,7 +154,9 @@ void DialogSplinePath::ChosenObject(quint32 id, const SceneObject &type)
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogSplinePath::SaveData()
|
||||
{
|
||||
const quint32 d = path.GetDuplicate();//Save previous value
|
||||
SavePath();
|
||||
newDuplicate <= -1 ? path.SetDuplicate(d) : path.SetDuplicate(static_cast<quint32>(newDuplicate));
|
||||
|
||||
auto visPath = qobject_cast<VisToolSplinePath *>(vis);
|
||||
SCASSERT(visPath != nullptr);
|
||||
|
@ -195,6 +198,45 @@ void DialogSplinePath::currentPointChanged(int index)
|
|||
DataPoint(p.P().id(), p.KAsm1(), p.Angle1(), p.KAsm2(), p.Angle2());
|
||||
EnableFields();
|
||||
item->setData(Qt::UserRole, QVariant::fromValue(p));
|
||||
item->setText(p.P().name());
|
||||
|
||||
QColor color = okColor;
|
||||
if (not IsPathValid())
|
||||
{
|
||||
flagError = false;
|
||||
color = errorColor;
|
||||
|
||||
ui->lineEditSplPathName->setText(tr("Invalid spline path"));
|
||||
}
|
||||
else
|
||||
{
|
||||
flagError = true;
|
||||
color = okColor;
|
||||
|
||||
auto first = qvariant_cast<VSplinePoint>(ui->listWidget->item(0)->data(Qt::UserRole));
|
||||
auto last = qvariant_cast<VSplinePoint>(ui->listWidget->item(ui->listWidget->count()-1)->data(Qt::UserRole));
|
||||
|
||||
if (first.P().id() == path.at(0).P().id() && last.P().id() == path.at(path.CountPoint()-1).P().id())
|
||||
{
|
||||
newDuplicate = -1;
|
||||
ui->lineEditSplPathName->setText(path.name());
|
||||
}
|
||||
else
|
||||
{
|
||||
VSplinePath newPath = ExtractPath();
|
||||
|
||||
if (not data->IsUnique(newPath.name()))
|
||||
{
|
||||
newDuplicate = DNumber(newPath.name());
|
||||
newPath.SetDuplicate(newDuplicate);
|
||||
}
|
||||
|
||||
ui->lineEditSplPathName->setText(newPath.name());
|
||||
}
|
||||
}
|
||||
ChangeColor(ui->labelName, color);
|
||||
ChangeColor(ui->labelPoint, color);
|
||||
CheckState();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -265,6 +307,12 @@ void DialogSplinePath::ShowDialog(bool click)
|
|||
if (path.CountPoint() >= 3)
|
||||
{
|
||||
emit ToolTip("");
|
||||
|
||||
if (not data->IsUnique(path.name()))
|
||||
{
|
||||
path.SetDuplicate(DNumber(path.name()));
|
||||
}
|
||||
|
||||
DialogAccepted();
|
||||
}
|
||||
}
|
||||
|
@ -368,10 +416,39 @@ void DialogSplinePath::EnableFields()
|
|||
void DialogSplinePath::SavePath()
|
||||
{
|
||||
path.Clear();
|
||||
path = ExtractPath();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QSet<quint32> DialogSplinePath::AllIds() const
|
||||
{
|
||||
QSet<quint32> ids;
|
||||
for (qint32 i = 0; i < ui->listWidget->count(); ++i)
|
||||
{
|
||||
QListWidgetItem *item = ui->listWidget->item(i);
|
||||
path.append( qvariant_cast<VSplinePoint>(item->data(Qt::UserRole)));
|
||||
ids.insert(qvariant_cast<VSplinePoint>(ui->listWidget->item(i)->data(Qt::UserRole)).P().id());
|
||||
}
|
||||
path.SetKCurve(ui->doubleSpinBoxKcurve->value());
|
||||
|
||||
return ids;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool DialogSplinePath::IsPathValid() const
|
||||
{
|
||||
if (path.CountPoint() < 3)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return (AllIds().size() == path.CountPoint());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VSplinePath DialogSplinePath::ExtractPath() const
|
||||
{
|
||||
VSplinePath path(ui->doubleSpinBoxKcurve->value());
|
||||
for (qint32 i = 0; i < ui->listWidget->count(); ++i)
|
||||
{
|
||||
path.append( qvariant_cast<VSplinePoint>(ui->listWidget->item(i)->data(Qt::UserRole)));
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
|
|
@ -77,10 +77,15 @@ private:
|
|||
/** @brief path spline path */
|
||||
VSplinePath path;
|
||||
|
||||
qint32 newDuplicate;
|
||||
|
||||
void NewItem(quint32 id, qreal kAsm1, qreal angle1, qreal kAsm2, qreal angle2);
|
||||
void DataPoint(quint32 id, qreal kAsm1, qreal angle1, qreal kAsm2, qreal angle2);
|
||||
void EnableFields();
|
||||
void SavePath();
|
||||
QSet<quint32> AllIds() const;
|
||||
bool IsPathValid() const;
|
||||
VSplinePath ExtractPath() const;
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>528</width>
|
||||
<height>322</height>
|
||||
<height>353</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
@ -28,7 +28,7 @@
|
|||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<widget class="QLabel" name="labelPoint">
|
||||
<property name="text">
|
||||
<string>Point of curve</string>
|
||||
</property>
|
||||
|
@ -196,6 +196,20 @@
|
|||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="comboBoxColor"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="labelName">
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="lineEditSplPathName">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
|
|
|
@ -311,6 +311,20 @@ bool DialogTool::eventFilter(QObject *object, QEvent *event)
|
|||
return false;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
quint32 DialogTool::DNumber(const QString &baseName) const
|
||||
{
|
||||
quint32 num = 0;
|
||||
QString name;
|
||||
do
|
||||
{
|
||||
++num;
|
||||
name = baseName + QString("_%1").arg(num);
|
||||
} while (not data->IsUnique(name));
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief ValFormulaChanged handle change formula
|
||||
|
|
|
@ -255,6 +255,7 @@ protected:
|
|||
virtual void SaveData() {}
|
||||
void MoveCursorToEnd(QPlainTextEdit *plainTextEdit);
|
||||
bool eventFilter(QObject *object, QEvent *event);
|
||||
quint32 DNumber(const QString &baseName) const;
|
||||
private:
|
||||
void FillList(QComboBox *box, const QMap<QString, quint32> &list)const;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user