From ede640618f4db0446c434e0cf17d617bba2d6e25 Mon Sep 17 00:00:00 2001 From: dismine Date: Mon, 8 Sep 2014 11:23:53 +0300 Subject: [PATCH] Visualization for VToolCutSplinePath. Fixed issue #16. --HG-- branch : feature --- src/app/dialogs/tools/dialogcutsplinepath.cpp | 28 ++++- src/app/dialogs/tools/dialogcutsplinepath.h | 5 + src/app/dialogs/tools/dialogcutsplinepath.ui | 2 +- src/app/mainwindow.cpp | 7 +- .../tools/drawTools/vtoolcutsplinepath.cpp | 83 +++++++----- .../visualization/vistoolcutsplinepath.cpp | 118 ++++++++++++++++++ src/app/visualization/vistoolcutsplinepath.h | 53 ++++++++ src/app/visualization/visualization.pri | 6 +- src/app/xml/vpattern.cpp | 5 +- 9 files changed, 264 insertions(+), 43 deletions(-) create mode 100644 src/app/visualization/vistoolcutsplinepath.cpp create mode 100644 src/app/visualization/vistoolcutsplinepath.h diff --git a/src/app/dialogs/tools/dialogcutsplinepath.cpp b/src/app/dialogs/tools/dialogcutsplinepath.cpp index c6ad759b1..6c01dd21d 100644 --- a/src/app/dialogs/tools/dialogcutsplinepath.cpp +++ b/src/app/dialogs/tools/dialogcutsplinepath.cpp @@ -32,6 +32,7 @@ #include "../../geometry/vsplinepath.h" #include "../../container/vcontainer.h" #include "../../xml/vpattern.h" +#include "../../visualization/vistoolcutsplinepath.h" //--------------------------------------------------------------------------------------------------------------------- /** @@ -41,7 +42,7 @@ */ DialogCutSplinePath::DialogCutSplinePath(const VContainer *data, const quint32 &toolId, QWidget *parent) :DialogTool(data, toolId, parent), ui(new Ui::DialogCutSplinePath), formula(QString()), - splinePathId(NULL_ID), formulaBaseHeight(0) + splinePathId(NULL_ID), formulaBaseHeight(0), path(nullptr) { ui->setupUi(this); InitVariables(ui); @@ -50,7 +51,7 @@ DialogCutSplinePath::DialogCutSplinePath(const VContainer *data, const quint32 & labelEditNamePoint = ui->labelEditNamePoint; this->formulaBaseHeight = ui->plainTextEditFormula->height(); - InitOkCancel(ui); + InitOkCancelApply(ui); flagFormula = false; CheckState(); @@ -62,11 +63,14 @@ DialogCutSplinePath::DialogCutSplinePath(const VContainer *data, const quint32 & connect(ui->lineEditNamePoint, &QLineEdit::textChanged, this, &DialogCutSplinePath::NamePointChanged); connect(ui->plainTextEditFormula, &QPlainTextEdit::textChanged, this, &DialogCutSplinePath::FormulaChanged); connect(ui->pushButtonGrowLength, &QPushButton::clicked, this, &DialogCutSplinePath::DeployFormulaTextEdit); + + path = new VisToolCutSplinePath(data); } //--------------------------------------------------------------------------------------------------------------------- DialogCutSplinePath::~DialogCutSplinePath() { + delete path; delete ui; } @@ -96,6 +100,7 @@ void DialogCutSplinePath::setFormula(const QString &value) this->DeployFormulaTextEdit(); } ui->plainTextEditFormula->setPlainText(formula); + path->setLength(formula); } //--------------------------------------------------------------------------------------------------------------------- @@ -106,6 +111,7 @@ void DialogCutSplinePath::setFormula(const QString &value) void DialogCutSplinePath::setSplinePathId(const quint32 &value) { setCurrentSplinePathId(ui->comboBoxSplinePath, splinePathId, value, ComboBoxCutSpline::CutSpline); + path->setPoint1Id(splinePathId); } //--------------------------------------------------------------------------------------------------------------------- @@ -122,6 +128,8 @@ void DialogCutSplinePath::ChosenObject(quint32 id, const SceneObject &type) { if (SetObject(id, ui->comboBoxSplinePath, "")) { + path->VisualMode(id); + prepare = true; this->setModal(true); this->show(); } @@ -136,6 +144,10 @@ void DialogCutSplinePath::SaveData() formula = ui->plainTextEditFormula->toPlainText(); formula.replace("\n", " "); splinePathId = getCurrentObjectId(ui->comboBoxSplinePath); + + path->setPoint1Id(splinePathId); + path->setLength(formula); + path->RefreshGeometry(); } //--------------------------------------------------------------------------------------------------------------------- @@ -143,3 +155,15 @@ void DialogCutSplinePath::DeployFormulaTextEdit() { DeployFormula(ui->plainTextEditFormula, ui->pushButtonGrowLength, formulaBaseHeight); } + +//--------------------------------------------------------------------------------------------------------------------- +void DialogCutSplinePath::ShowVisualization() +{ + if (prepare == false) + { + VMainGraphicsScene *scene = qApp->getCurrentScene(); + connect(scene, &VMainGraphicsScene::NewFactor, path, &Visualization::SetFactor); + scene->addItem(path); + path->RefreshGeometry(); + } +} diff --git a/src/app/dialogs/tools/dialogcutsplinepath.h b/src/app/dialogs/tools/dialogcutsplinepath.h index 46d299379..ff06576c1 100644 --- a/src/app/dialogs/tools/dialogcutsplinepath.h +++ b/src/app/dialogs/tools/dialogcutsplinepath.h @@ -36,6 +36,8 @@ namespace Ui class DialogCutSplinePath; } +class VisToolCutSplinePath; + /** * @brief The DialogCutSplinePath class dialog for ToolCutSplinePath. */ @@ -61,6 +63,7 @@ public slots: */ void DeployFormulaTextEdit(); protected: + virtual void ShowVisualization(); /** * @brief SaveData Put dialog data in local variables */ @@ -79,6 +82,8 @@ private: /** @brief formulaBaseHeight base height defined by dialogui */ int formulaBaseHeight; + + VisToolCutSplinePath *path; }; //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/dialogs/tools/dialogcutsplinepath.ui b/src/app/dialogs/tools/dialogcutsplinepath.ui index 3a1cb2a0f..788de6c27 100644 --- a/src/app/dialogs/tools/dialogcutsplinepath.ui +++ b/src/app/dialogs/tools/dialogcutsplinepath.ui @@ -392,7 +392,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index e4558ee3a..9ec7f6495 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -535,9 +535,10 @@ void MainWindow::ToolSplinePath(bool checked) */ void MainWindow::ToolCutSplinePath(bool checked) { - SetToolButton(checked, Tool::CutSplinePath, - ":/cursor/splinepath_cut_point_cursor.png", tr("Select curve path"), - &MainWindow::ClosedDialog); + SetToolButtonWithApply(checked, Tool::CutSplinePath, + ":/cursor/splinepath_cut_point_cursor.png", tr("Select curve path"), + &MainWindow::ClosedDialogWithApply, + &MainWindow::ApplyDialog); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/tools/drawTools/vtoolcutsplinepath.cpp b/src/app/tools/drawTools/vtoolcutsplinepath.cpp index 4d54f0494..fc8d73562 100644 --- a/src/app/tools/drawTools/vtoolcutsplinepath.cpp +++ b/src/app/tools/drawTools/vtoolcutsplinepath.cpp @@ -30,6 +30,8 @@ #include "../../container/calculator.h" #include "../../dialogs/tools/dialogcutsplinepath.h" #include "../../geometry/vpointf.h" +#include "../../visualization/vistoolcutsplinepath.h" +#include "vabstractspline.h" #include "../../geometry/vsplinepath.h" @@ -169,16 +171,16 @@ VToolCutSplinePath* VToolCutSplinePath::Create(const quint32 _id, const QString splPath1->append(VSplinePoint(splP1.P(), splP1.KAsm1(), spl1.GetAngle1()+180, spl1.GetKasm1(), spl1.GetAngle1())); VSplinePoint cutPoint; - if (typeCreation == Source::FromGui) - { - cutPoint = VSplinePoint(*p, spl1.GetKasm2(), spl1.GetAngle2(), spl1.GetAngle2()+180, - spl1.GetAngle2()); - } - else - { +// if (typeCreation == Source::FromGui) +// { +// cutPoint = VSplinePoint(*p, spl1.GetKasm2(), spl1.GetAngle2(), spl2.GetKasm1(), +// spl1.GetAngle2()); +// } +// else +// { cutPoint = VSplinePoint(*p, spl1.GetKasm2(), spl1.GetAngle2(), spl2.GetKasm1(), spl1.GetAngle2()+180); - } +// } splPath1->append(cutPoint); continue; } @@ -245,33 +247,38 @@ VToolCutSplinePath* VToolCutSplinePath::Create(const quint32 _id, const QString //--------------------------------------------------------------------------------------------------------------------- void VToolCutSplinePath::ShowVisualization(bool show) { -// if (show) -// { -// if (vis == nullptr) -// { -// VisTool * visual = new VisTool(getData()); -// VMainGraphicsScene *scene = qApp->getCurrentScene(); -// connect(scene, &VMainGraphicsScene::NewFactor, visual, &Visualization::SetFactor); -// scene->addItem(visual); + if (show) + { + if (vis == nullptr) + { + VisToolCutSplinePath *visual = new VisToolCutSplinePath(getData()); + VMainGraphicsScene *scene = qApp->getCurrentScene(); + connect(scene, &VMainGraphicsScene::NewFactor, visual, &Visualization::SetFactor); + scene->addItem(visual); -// // add options -// visual->RefreshGeometry(); -// vis = visual; -// } -// else -// { -// VisTool * visual = qobject_cast(vis); -// if (visual != nullptr) -// { -// visual->show(); -// } -// } -// } -// else -// { -// delete vis; -// vis = nullptr; -// } + visual->setPoint1Id(curveCutId); + visual->setLength(formula); + visual->RefreshGeometry(); + vis = visual; + } + else + { + VisToolCutSplinePath *visual = qobject_cast(vis); + if (visual != nullptr) + { + visual->show(); + } + } + } + else + { + delete vis; + vis = nullptr; + } + if (VAbstractSpline *parentCurve = qobject_cast(doc->getTool(curveCutId))) + { + parentCurve->ShowFoot(show); + } } //--------------------------------------------------------------------------------------------------------------------- @@ -281,6 +288,14 @@ void VToolCutSplinePath::ShowVisualization(bool show) void VToolCutSplinePath::FullUpdateFromFile() { FullUpdateCurveFromFile(AttrSplinePath); + + if (vis != nullptr) + { + VisToolCutSplinePath *visual = qobject_cast(vis); + visual->setPoint1Id(curveCutId); + visual->setLength(formula); + visual->RefreshGeometry(); + } } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/visualization/vistoolcutsplinepath.cpp b/src/app/visualization/vistoolcutsplinepath.cpp new file mode 100644 index 000000000..9bf157428 --- /dev/null +++ b/src/app/visualization/vistoolcutsplinepath.cpp @@ -0,0 +1,118 @@ +/************************************************************************ + ** + ** @file vistoolcutsplinepath.cpp + ** @author Roman Telezhynskyi + ** @date 7 9, 2014 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentine project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2014 Valentina project + ** All Rights Reserved. + ** + ** Valentina is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with Valentina. If not, see . + ** + *************************************************************************/ + +#include "vistoolcutsplinepath.h" +#include "../container/vcontainer.h" +#include "../geometry/vsplinepath.h" + +//--------------------------------------------------------------------------------------------------------------------- +VisToolCutSplinePath::VisToolCutSplinePath(const VContainer *data, QGraphicsItem *parent) + :VisPath(data, parent), point(nullptr), splPath1(nullptr), splPath2(nullptr), length(0) +{ + splPath1 = InitItem(Qt::darkGreen, this); + splPath1->setFlag(QGraphicsItem::ItemStacksBehindParent, false); + splPath2 = InitItem(Qt::darkRed, this); + splPath2->setFlag(QGraphicsItem::ItemStacksBehindParent, false); + + point = InitPoint(mainColor, this); + point->setZValue(2); + point->setFlag(QGraphicsItem::ItemStacksBehindParent, false); +} + +//--------------------------------------------------------------------------------------------------------------------- +VisToolCutSplinePath::~VisToolCutSplinePath() +{} + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolCutSplinePath::RefreshGeometry() +{ + if (point1Id > 0) + { + const QSharedPointer splPath = Visualization::data->GeometricObject(point1Id); + DrawPath(this, splPath->GetPath(PathDirection::Show), supportColor, Qt::SolidLine, Qt::RoundCap); + + if (qFuzzyCompare(1 + length, 1 + 0) == false) + { + QPointF spl1p2, spl1p3, spl2p2, spl2p3; + qint32 p1 = 0, p2 = 0; + + const QPointF cutPoint = splPath->CutSplinePath(length, p1, p2, spl1p2, spl1p3, spl2p2, spl2p3); + VPointF p = VPointF(cutPoint); + + VSplinePoint splP1 = splPath->at(p1); + VSplinePoint splP2 = splPath->at(p2); + const VSpline spl1 = VSpline(splP1.P(), spl1p2, spl1p3, p, splPath->getKCurve()); + const VSpline spl2 = VSpline(p, spl2p2, spl2p3, splP2.P(), splPath->getKCurve()); + + VSplinePath spPath1 = VSplinePath(); + VSplinePath spPath2 = VSplinePath(); + + for (qint32 i = 0; i < splPath->CountPoint(); i++) + { + if (i <= p1 && i < p2) + { + if (i == p1) + { + spPath1.append(VSplinePoint(splP1.P(), splP1.KAsm1(), spl1.GetAngle1()+180, spl1.GetKasm1(), + spl1.GetAngle1())); + VSplinePoint cutPoint; + cutPoint = VSplinePoint(p, spl1.GetKasm2(), spl1.GetAngle2(), spl2.GetKasm1(), + spl1.GetAngle2()+180); + spPath1.append(cutPoint); + continue; + } + spPath1.append(splPath->at(i)); + } + else + { + if (i == p2) + { + const VSplinePoint cutPoint = VSplinePoint(p, spl1.GetKasm2(), spl2.GetAngle1()+180, + spl2.GetKasm1(), spl2.GetAngle1()); + spPath2.append(cutPoint); + spPath2.append(VSplinePoint(splP2.P(), spl2.GetKasm2(), spl2.GetAngle2(), splP2.KAsm2(), + spl2.GetAngle2()+180)); + continue; + } + spPath2.append(splPath->at(i)); + } + } + + DrawPoint(point, cutPoint, mainColor); + + DrawPath(splPath1, spPath1.GetPath(PathDirection::Show), Qt::darkGreen, Qt::SolidLine, Qt::RoundCap); + DrawPath(splPath2, spPath2.GetPath(PathDirection::Show), Qt::darkRed, Qt::SolidLine, Qt::RoundCap); + } + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolCutSplinePath::setLength(const QString &expression) +{ + length = FindLength(expression); +} diff --git a/src/app/visualization/vistoolcutsplinepath.h b/src/app/visualization/vistoolcutsplinepath.h new file mode 100644 index 000000000..6dd4bdfcb --- /dev/null +++ b/src/app/visualization/vistoolcutsplinepath.h @@ -0,0 +1,53 @@ +/************************************************************************ + ** + ** @file vistoolcutsplinepath.h + ** @author Roman Telezhynskyi + ** @date 7 9, 2014 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentine project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2014 Valentina project + ** All Rights Reserved. + ** + ** Valentina is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with Valentina. If not, see . + ** + *************************************************************************/ + +#ifndef VISTOOLCUTSPLINEPATH_H +#define VISTOOLCUTSPLINEPATH_H + +#include "vispath.h" + +class VisToolCutSplinePath : public VisPath +{ + Q_OBJECT +public: + VisToolCutSplinePath(const VContainer *data, QGraphicsItem *parent = 0); + virtual ~VisToolCutSplinePath(); + + virtual void RefreshGeometry(); + void setLength(const QString &expression); + virtual int type() const {return Type;} + enum { Type = UserType + static_cast(Vis::ToolCutSpline)}; +protected: + Q_DISABLE_COPY(VisToolCutSplinePath) + QGraphicsEllipseItem *point; + QGraphicsPathItem *splPath1; + QGraphicsPathItem *splPath2; + qreal length; +}; + +#endif // VISTOOLCUTSPLINEPATH_H diff --git a/src/app/visualization/visualization.pri b/src/app/visualization/visualization.pri index e35bd2fe8..abd4a6ea3 100644 --- a/src/app/visualization/visualization.pri +++ b/src/app/visualization/visualization.pri @@ -20,7 +20,8 @@ HEADERS += \ visualization/vistoolcutarc.h \ visualization/vistoolspline.h \ visualization/vistoolcutspline.h \ - visualization/vistoolsplinepath.h + visualization/vistoolsplinepath.h \ + visualization/vistoolcutsplinepath.h SOURCES += \ visualization/vgraphicssimpletextitem.cpp \ @@ -44,4 +45,5 @@ SOURCES += \ visualization/vistoolcutarc.cpp \ visualization/vistoolspline.cpp \ visualization/vistoolcutspline.cpp \ - visualization/vistoolsplinepath.cpp + visualization/vistoolsplinepath.cpp \ + visualization/vistoolcutsplinepath.cpp diff --git a/src/app/xml/vpattern.cpp b/src/app/xml/vpattern.cpp index 58f901c37..4d575376b 100644 --- a/src/app/xml/vpattern.cpp +++ b/src/app/xml/vpattern.cpp @@ -2452,7 +2452,10 @@ void VPattern::PrepareForParse(const Document &parse) else if (parse == Document::LiteParse) { data->ClearUniqueNames(); - data->ClearVariables(); + data->ClearVariables(VarType::ArcLength); + data->ClearVariables(VarType::LineAngle); + data->ClearVariables(VarType::LineLength); + data->ClearVariables(VarType::SplineLength); } }