diff --git a/src/app/dialogs/app/dialoghistory.cpp b/src/app/dialogs/app/dialoghistory.cpp index 143dc33a3..d4663186d 100644 --- a/src/app/dialogs/app/dialoghistory.cpp +++ b/src/app/dialogs/app/dialoghistory.cpp @@ -388,6 +388,10 @@ QString DialogHistory::Record(const VToolRecord &tool) { return QString(tr("%1 - point of arcs intersection")).arg(PointName(tool.getId())); } + case Tool::PointOfIntersectionCircles: + { + return QString(tr("%1 - point of circles intersection")).arg(PointName(tool.getId())); + } //Because "history" not only show history of pattern, but help restore current data for each pattern's //piece, we need add record about details and nodes, but don't show them. case Tool::Detail: diff --git a/src/app/dialogs/dialogs.h b/src/app/dialogs/dialogs.h index 2751cdf0f..c9b296c6a 100644 --- a/src/app/dialogs/dialogs.h +++ b/src/app/dialogs/dialogs.h @@ -52,6 +52,7 @@ #include "tools/dialoglineintersectaxis.h" #include "tools/dialogcurveintersectaxis.h" #include "tools/dialogpointofintersectionarcs.h" +#include "tools/dialogpointofintersectioncircles.h" #include "app/dialoghistory.h" #include "app/dialogincrements.h" diff --git a/src/app/dialogs/dialogs.pri b/src/app/dialogs/dialogs.pri index 27409388e..d5c073d11 100644 --- a/src/app/dialogs/dialogs.pri +++ b/src/app/dialogs/dialogs.pri @@ -45,7 +45,8 @@ HEADERS += \ $$PWD/app/dialoglayoutsettings.h \ $$PWD/app/dialoglayoutprogress.h \ $$PWD/app/dialogsavelayout.h \ - $$PWD/tools/dialogpointofintersectionarcs.h + $$PWD/tools/dialogpointofintersectionarcs.h \ + $$PWD/tools/dialogpointofintersectioncircles.h SOURCES += \ $$PWD/tools/dialogtriangle.cpp \ @@ -89,7 +90,8 @@ SOURCES += \ $$PWD/app/dialoglayoutsettings.cpp \ $$PWD/app/dialoglayoutprogress.cpp \ $$PWD/app/dialogsavelayout.cpp \ - $$PWD/tools/dialogpointofintersectionarcs.cpp + $$PWD/tools/dialogpointofintersectionarcs.cpp \ + $$PWD/tools/dialogpointofintersectioncircles.cpp FORMS += \ $$PWD/tools/dialogtriangle.ui \ @@ -127,4 +129,5 @@ FORMS += \ $$PWD/app/dialoglayoutsettings.ui \ $$PWD/app/dialoglayoutprogress.ui \ $$PWD/app/dialogsavelayout.ui \ - $$PWD/tools/dialogpointofintersectionarcs.ui + $$PWD/tools/dialogpointofintersectionarcs.ui \ + $$PWD/tools/dialogpointofintersectioncircles.ui diff --git a/src/app/dialogs/tools/dialogpointofintersectionarcs.cpp b/src/app/dialogs/tools/dialogpointofintersectionarcs.cpp index 2246568b8..1c77755f2 100644 --- a/src/app/dialogs/tools/dialogpointofintersectionarcs.cpp +++ b/src/app/dialogs/tools/dialogpointofintersectionarcs.cpp @@ -48,7 +48,7 @@ DialogPointOfIntersectionArcs::DialogPointOfIntersectionArcs(const VContainer *d FillComboBoxArcs(ui->comboBoxArc1); FillComboBoxArcs(ui->comboBoxArc2); - FillComboBoxCrossArcPoints(); + FillComboBoxCrossCirclesPoints(ui->comboBoxResult); connect(ui->lineEditNamePoint, &QLineEdit::textChanged, this, &DialogPointOfIntersectionArcs::NamePointChanged); connect(ui->comboBoxArc1, static_cast(&QComboBox::currentIndexChanged), @@ -106,36 +106,13 @@ void DialogPointOfIntersectionArcs::SetSecondArcId(const quint32 &value) } //--------------------------------------------------------------------------------------------------------------------- -CrossArcsPoint DialogPointOfIntersectionArcs::GetCrossArcPoint() const +CrossCirclesPoint DialogPointOfIntersectionArcs::GetCrossArcPoint() const { - int value; - bool ok = false; -#if QT_VERSION < QT_VERSION_CHECK(5, 2, 0) - value = ui->comboBoxResult->itemData(box->currentIndex()).toInt(&ok); -#else - value = ui->comboBoxResult->currentData().toInt(&ok); -#endif - if (not ok) - { - return CrossArcsPoint::FirstPoint; - } - - switch(value) - { - case 1: - return CrossArcsPoint::FirstPoint; - break; - case 2: - return CrossArcsPoint::SecondPoint; - break; - default: - return CrossArcsPoint::FirstPoint; - break; - } + return getCurrentCrossPoint(ui->comboBoxResult); } //--------------------------------------------------------------------------------------------------------------------- -void DialogPointOfIntersectionArcs::SetCrossArcPoint(CrossArcsPoint &p) +void DialogPointOfIntersectionArcs::SetCrossArcPoint(CrossCirclesPoint &p) { const qint32 index = ui->comboBoxResult->findData(static_cast(p)); if (index != -1) @@ -226,10 +203,3 @@ void DialogPointOfIntersectionArcs::SaveData() point->setCrossPoint(GetCrossArcPoint()); point->RefreshGeometry(); } - -//--------------------------------------------------------------------------------------------------------------------- -void DialogPointOfIntersectionArcs::FillComboBoxCrossArcPoints() -{ - ui->comboBoxResult->addItem(tr("First point"), QVariant(static_cast(CrossArcsPoint::FirstPoint))); - ui->comboBoxResult->addItem(tr("Second point"), QVariant(static_cast(CrossArcsPoint::SecondPoint))); -} diff --git a/src/app/dialogs/tools/dialogpointofintersectionarcs.h b/src/app/dialogs/tools/dialogpointofintersectionarcs.h index a555e42c3..c57909acd 100644 --- a/src/app/dialogs/tools/dialogpointofintersectionarcs.h +++ b/src/app/dialogs/tools/dialogpointofintersectionarcs.h @@ -42,7 +42,7 @@ class DialogPointOfIntersectionArcs : public DialogTool Q_OBJECT public: - explicit DialogPointOfIntersectionArcs(const VContainer *data, const quint32 &toolId, QWidget *parent = 0); + DialogPointOfIntersectionArcs(const VContainer *data, const quint32 &toolId, QWidget *parent = 0); virtual ~DialogPointOfIntersectionArcs(); void SetPointName(const QString &value); @@ -53,8 +53,8 @@ public: quint32 GetSecondArcId() const; void SetSecondArcId(const quint32 &value); - CrossArcsPoint GetCrossArcPoint() const; - void SetCrossArcPoint(CrossArcsPoint &p); + CrossCirclesPoint GetCrossArcPoint() const; + void SetCrossArcPoint(CrossCirclesPoint &p); public slots: virtual void ChosenObject(quint32 id, const SceneObject &type); @@ -71,8 +71,6 @@ private: Q_DISABLE_COPY(DialogPointOfIntersectionArcs) Ui::DialogPointOfIntersectionArcs *ui; - - void FillComboBoxCrossArcPoints(); }; #endif // DIALOGPOINTOFINTERSECTIONARCS_H diff --git a/src/app/dialogs/tools/dialogpointofintersectioncircles.cpp b/src/app/dialogs/tools/dialogpointofintersectioncircles.cpp new file mode 100644 index 000000000..770a5dd41 --- /dev/null +++ b/src/app/dialogs/tools/dialogpointofintersectioncircles.cpp @@ -0,0 +1,408 @@ +/************************************************************************ + ** + ** @file dialogpointofintersectioncircles.cpp + ** @author Roman Telezhynskyi + ** @date 29 5, 2015 + ** + ** @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) 2015 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 "dialogpointofintersectioncircles.h" +#include "ui_dialogpointofintersectioncircles.h" + +#include "../../libs/vgeometry/vpointf.h" +#include "../../container/vcontainer.h" +#include "../../visualization/vistoolpointofintersectioncircles.h" +#include "../../widgets/vmaingraphicsscene.h" +#include "dialogeditwrongformula.h" + +//--------------------------------------------------------------------------------------------------------------------- +DialogPointOfIntersectionCircles::DialogPointOfIntersectionCircles(const VContainer *data, const quint32 &toolId, + QWidget *parent) + :DialogTool(data, toolId, parent), ui(new Ui::DialogPointOfIntersectionCircles), flagCircle1Radius(false), + flagCircle2Radius(false), timerCircle1Radius(nullptr), timerCircle2Radius(nullptr), circle1Radius(), + circle2Radius(), formulaBaseHeightCircle1Radius(0), formulaBaseHeightCircle2Radius(0), + angleCircle1Radius(INT_MIN), angleCircle2Radius(INT_MIN) +{ + ui->setupUi(this); + + ui->lineEditNamePoint->setText(qApp->getCurrentDocument()->GenerateLabel(LabelType::NewLabel)); + labelEditNamePoint = ui->labelEditNamePoint; + + plainTextEditFormula = ui->plainTextEditCircle1Radius; + this->formulaBaseHeightCircle1Radius = ui->plainTextEditCircle1Radius->height(); + this->formulaBaseHeightCircle2Radius = ui->plainTextEditCircle2Radius->height(); + + ui->plainTextEditCircle1Radius->installEventFilter(this); + ui->plainTextEditCircle2Radius->installEventFilter(this); + + timerCircle1Radius = new QTimer(this); + connect(timerCircle1Radius, &QTimer::timeout, this, &DialogPointOfIntersectionCircles::EvalCircle1Radius); + + timerCircle2Radius = new QTimer(this); + connect(timerCircle2Radius, &QTimer::timeout, this, &DialogPointOfIntersectionCircles::EvalCircle2Radius); + + InitOkCancelApply(ui); + CheckState(); + + FillComboBoxPoints(ui->comboBoxCircle1Center); + FillComboBoxPoints(ui->comboBoxCircle2Center); + FillComboBoxCrossCirclesPoints(ui->comboBoxResult); + + connect(ui->lineEditNamePoint, &QLineEdit::textChanged, this, &DialogPointOfIntersectionCircles::NamePointChanged); + connect(ui->comboBoxCircle1Center, + static_cast(&QComboBox::currentIndexChanged), + this, &DialogPointOfIntersectionCircles::PointChanged); + connect(ui->comboBoxCircle2Center, + static_cast(&QComboBox::currentIndexChanged), + this, &DialogPointOfIntersectionCircles::PointChanged); + + connect(ui->toolButtonExprCircle1Radius, &QPushButton::clicked, this, + &DialogPointOfIntersectionCircles::FXCircle1Radius); + connect(ui->toolButtonExprCircle2Radius, &QPushButton::clicked, this, + &DialogPointOfIntersectionCircles::FXCircle2Radius); + + connect(ui->plainTextEditCircle1Radius, &QPlainTextEdit::textChanged, this, + &DialogPointOfIntersectionCircles::Circle1RadiusChanged); + connect(ui->plainTextEditCircle2Radius, &QPlainTextEdit::textChanged, this, + &DialogPointOfIntersectionCircles::Circle2RadiusChanged); + + connect(ui->pushButtonGrowCircle1Radius, &QPushButton::clicked, this, + &DialogPointOfIntersectionCircles::DeployCircle1RadiusTextEdit); + connect(ui->pushButtonGrowCircle2Radius, &QPushButton::clicked, this, + &DialogPointOfIntersectionCircles::DeployCircle2RadiusTextEdit); + + vis = new VisToolPointOfIntersectionCircles(data); +} + +//--------------------------------------------------------------------------------------------------------------------- +DialogPointOfIntersectionCircles::~DialogPointOfIntersectionCircles() +{ + DeleteVisualization(); + delete ui; +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::SetPointName(const QString &value) +{ + pointName = value; + ui->lineEditNamePoint->setText(pointName); +} + +//--------------------------------------------------------------------------------------------------------------------- +quint32 DialogPointOfIntersectionCircles::GetFirstCircleCenterId() const +{ + return getCurrentObjectId(ui->comboBoxCircle1Center); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::SetFirstCircleCenterId(const quint32 &value) +{ + setCurrentPointId(ui->comboBoxCircle1Center, value); + + VisToolPointOfIntersectionCircles *point = qobject_cast(vis); + SCASSERT(point != nullptr); + point->setPoint1Id(value); +} + +//--------------------------------------------------------------------------------------------------------------------- +quint32 DialogPointOfIntersectionCircles::GetSecondCircleCenterId() const +{ + return getCurrentObjectId(ui->comboBoxCircle2Center); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::SetSecondCircleCenterId(const quint32 &value) +{ + setCurrentPointId(ui->comboBoxCircle2Center, value); + + VisToolPointOfIntersectionCircles *point = qobject_cast(vis); + SCASSERT(point != nullptr); + point->setPoint2Id(value); +} + +//--------------------------------------------------------------------------------------------------------------------- +QString DialogPointOfIntersectionCircles::GetFirstCircleRadius() const +{ + return qApp->FormulaFromUser(ui->plainTextEditCircle1Radius->toPlainText()); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::SetFirstCircleRadius(const QString &value) +{ + const QString formula = qApp->FormulaToUser(value); + // increase height if needed. + if (formula.length() > 80) + { + this->DeployCircle1RadiusTextEdit(); + } + ui->plainTextEditCircle1Radius->setPlainText(formula); + + VisToolPointOfIntersectionCircles *point = qobject_cast(vis); + SCASSERT(point != nullptr); + point->setC1Radius(formula); + + MoveCursorToEnd(ui->plainTextEditCircle1Radius); +} + +//--------------------------------------------------------------------------------------------------------------------- +QString DialogPointOfIntersectionCircles::GetSecondCircleRadius() const +{ + return qApp->FormulaFromUser(ui->plainTextEditCircle2Radius->toPlainText()); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::SetSecondCircleRadius(const QString &value) +{ + const QString formula = qApp->FormulaToUser(value); + // increase height if needed. + if (formula.length() > 80) + { + this->DeployCircle2RadiusTextEdit(); + } + ui->plainTextEditCircle2Radius->setPlainText(formula); + + VisToolPointOfIntersectionCircles *point = qobject_cast(vis); + SCASSERT(point != nullptr); + point->setC2Radius(formula); + + MoveCursorToEnd(ui->plainTextEditCircle2Radius); +} + +//--------------------------------------------------------------------------------------------------------------------- +CrossCirclesPoint DialogPointOfIntersectionCircles::GetCrossCirclesPoint() const +{ + return getCurrentCrossPoint(ui->comboBoxResult); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::SetCrossCirclesPoint(CrossCirclesPoint &p) +{ + const qint32 index = ui->comboBoxResult->findData(static_cast(p)); + if (index != -1) + { + ui->comboBoxResult->setCurrentIndex(index); + + VisToolPointOfIntersectionCircles *point = qobject_cast(vis); + SCASSERT(point != nullptr); + point->setCrossPoint(p); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::ChosenObject(quint32 id, const SceneObject &type) +{ + if (prepare == false)// After first choose we ignore all objects + { + if (type == SceneObject::Point) + { + VisToolPointOfIntersectionCircles *point = qobject_cast(vis); + SCASSERT(point != nullptr); + + switch (number) + { + case 0: + if (SetObject(id, ui->comboBoxCircle1Center, tr("Select second circle center"))) + { + number++; + point->VisualMode(id); + } + break; + case 1: + if (getCurrentObjectId(ui->comboBoxCircle1Center) != id) + { + if (SetObject(id, ui->comboBoxCircle2Center, "")) + { + number = 0; + point->setPoint2Id(id); + point->RefreshGeometry(); + prepare = true; + this->setModal(true); + this->show(); + } + } + break; + default: + break; + } + } + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::PointChanged() +{ + QColor color = okColor; + if (getCurrentObjectId(ui->comboBoxCircle1Center) == getCurrentObjectId(ui->comboBoxCircle2Center)) + { + flagError = false; + color = errorColor; + } + else + { + flagError = true; + color = okColor; + } + ChangeColor(ui->labelCircle1Center, color); + ChangeColor(ui->labelCircle1Center, color); + CheckState(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::DeployCircle1RadiusTextEdit() +{ + DeployFormula(ui->plainTextEditCircle1Radius, ui->pushButtonGrowCircle1Radius, formulaBaseHeightCircle1Radius); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::DeployCircle2RadiusTextEdit() +{ + DeployFormula(ui->plainTextEditCircle2Radius, ui->pushButtonGrowCircle2Radius, formulaBaseHeightCircle2Radius); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::Circle1RadiusChanged() +{ + labelEditFormula = ui->labelEditCircle1Radius; + labelResultCalculation = ui->labelResultCircle1Radius; + ValFormulaChanged(flagCircle1Radius, ui->plainTextEditCircle1Radius, timerCircle1Radius); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::Circle2RadiusChanged() +{ + labelEditFormula = ui->labelEditCircle2Radius; + labelResultCalculation = ui->labelResultCircle2Radius; + ValFormulaChanged(flagCircle2Radius, ui->plainTextEditCircle2Radius, timerCircle2Radius); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::FXCircle1Radius() +{ + DialogEditWrongFormula *dialog = new DialogEditWrongFormula(data, toolId, this); + dialog->setWindowTitle(tr("Edit first circle radius")); + dialog->SetFormula(GetFirstCircleRadius()); + if (dialog->exec() == QDialog::Accepted) + { + SetFirstCircleRadius(dialog->GetFormula()); + } + delete dialog; +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::FXCircle2Radius() +{ + DialogEditWrongFormula *dialog = new DialogEditWrongFormula(data, toolId, this); + dialog->setWindowTitle(tr("Edit second circle radius")); + dialog->SetFormula(GetSecondCircleRadius()); + if (dialog->exec() == QDialog::Accepted) + { + SetSecondCircleRadius(dialog->GetFormula()); + } + delete dialog; +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::EvalCircle1Radius() +{ + labelEditFormula = ui->labelEditCircle1Radius; + const QString postfix = VDomDocument::UnitsToStr(qApp->patternUnit(), true); + const qreal radius = Eval(ui->plainTextEditCircle1Radius->toPlainText(), flagCircle1Radius, + ui->labelResultCircle1Radius, postfix); + + if (radius < 0) + { + flagCircle2Radius = false; + ChangeColor(labelEditFormula, Qt::red); + ui->labelResultCircle1Radius->setText(tr("Error")); + ui->labelResultCircle1Radius->setToolTip(tr("Radius can't be negative")); + + DialogPointOfIntersectionCircles::CheckState(); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::EvalCircle2Radius() +{ + labelEditFormula = ui->labelEditCircle2Radius; + const QString postfix = VDomDocument::UnitsToStr(qApp->patternUnit(), true); + const qreal radius = Eval(ui->plainTextEditCircle2Radius->toPlainText(), flagCircle2Radius, + ui->labelResultCircle2Radius, postfix); + + if (radius < 0) + { + flagCircle2Radius = false; + ChangeColor(labelEditFormula, Qt::red); + ui->labelResultCircle2Radius->setText(tr("Error")); + ui->labelResultCircle2Radius->setToolTip(tr("Radius can't be negative")); + + DialogPointOfIntersectionCircles::CheckState(); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::ShowVisualization() +{ + AddVisualization(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::SaveData() +{ + pointName = ui->lineEditNamePoint->text(); + + QString c1Radius = ui->plainTextEditCircle2Radius->toPlainText(); + c1Radius.replace("\n", " "); + + QString c2Radius = ui->plainTextEditCircle2Radius->toPlainText(); + c2Radius.replace("\n", " "); + + VisToolPointOfIntersectionCircles *point = qobject_cast(vis); + SCASSERT(point != nullptr); + + point->setPoint1Id(GetFirstCircleCenterId()); + point->setPoint2Id(GetSecondCircleCenterId()); + point->setC1Radius(c1Radius); + point->setC2Radius(c2Radius); + point->setCrossPoint(GetCrossCirclesPoint()); + point->RefreshGeometry(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::closeEvent(QCloseEvent *event) +{ + ui->plainTextEditCircle1Radius->blockSignals(true); + ui->plainTextEditCircle2Radius->blockSignals(true); + DialogTool::closeEvent(event); +} + +//--------------------------------------------------------------------------------------------------------------------- +void DialogPointOfIntersectionCircles::CheckState() +{ + SCASSERT(bOk != nullptr); + bOk->setEnabled(flagFormula && flagName && flagError && flagCircle1Radius && flagCircle2Radius); + // In case dialog hasn't apply button + if ( bApply != nullptr) + { + bApply->setEnabled(bOk->isEnabled()); + } +} diff --git a/src/app/dialogs/tools/dialogpointofintersectioncircles.h b/src/app/dialogs/tools/dialogpointofintersectioncircles.h new file mode 100644 index 000000000..192564776 --- /dev/null +++ b/src/app/dialogs/tools/dialogpointofintersectioncircles.h @@ -0,0 +1,111 @@ +/************************************************************************ + ** + ** @file dialogpointofintersectioncircles.h + ** @author Roman Telezhynskyi + ** @date 29 5, 2015 + ** + ** @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) 2015 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 DIALOGPOINTOFINTERSECTIONCIRCLES_H +#define DIALOGPOINTOFINTERSECTIONCIRCLES_H + +#include "dialogtool.h" +#include "../../xml/vpattern.h" + +namespace Ui +{ + class DialogPointOfIntersectionCircles; +} + +class DialogPointOfIntersectionCircles : public DialogTool +{ + Q_OBJECT + +public: + DialogPointOfIntersectionCircles(const VContainer *data, const quint32 &toolId, QWidget *parent = 0); + virtual ~DialogPointOfIntersectionCircles(); + + void SetPointName(const QString &value); + + quint32 GetFirstCircleCenterId() const; + void SetFirstCircleCenterId(const quint32 &value); + + quint32 GetSecondCircleCenterId() const; + void SetSecondCircleCenterId(const quint32 &value); + + QString GetFirstCircleRadius() const; + void SetFirstCircleRadius(const QString &value); + + QString GetSecondCircleRadius() const; + void SetSecondCircleRadius(const QString &value); + + CrossCirclesPoint GetCrossCirclesPoint() const; + void SetCrossCirclesPoint(CrossCirclesPoint &p); + +public slots: + virtual void ChosenObject(quint32 id, const SceneObject &type); + void PointChanged(); + + void DeployCircle1RadiusTextEdit(); + void DeployCircle2RadiusTextEdit(); + + void Circle1RadiusChanged(); + void Circle2RadiusChanged(); + + void FXCircle1Radius(); + void FXCircle2Radius(); + + void EvalCircle1Radius(); + void EvalCircle2Radius(); + +protected: + virtual void ShowVisualization(); + /** + * @brief SaveData Put dialog data in local variables + */ + virtual void SaveData(); + virtual void closeEvent(QCloseEvent *event); + virtual void CheckState(); + +private: + Q_DISABLE_COPY(DialogPointOfIntersectionCircles) + + Ui::DialogPointOfIntersectionCircles *ui; + + bool flagCircle1Radius; + bool flagCircle2Radius; + + QTimer *timerCircle1Radius; + QTimer *timerCircle2Radius; + + QString circle1Radius; + QString circle2Radius; + + int formulaBaseHeightCircle1Radius; + int formulaBaseHeightCircle2Radius; + + qreal angleCircle1Radius; + qreal angleCircle2Radius; +}; + +#endif // DIALOGPOINTOFINTERSECTIONCIRCLES_H diff --git a/src/app/dialogs/tools/dialogpointofintersectioncircles.ui b/src/app/dialogs/tools/dialogpointofintersectioncircles.ui new file mode 100644 index 000000000..d585b1fb3 --- /dev/null +++ b/src/app/dialogs/tools/dialogpointofintersectioncircles.ui @@ -0,0 +1,522 @@ + + + DialogPointOfIntersectionCircles + + + + 0 + 0 + 380 + 323 + + + + + 380 + 323 + + + + + 380 + 323 + + + + Dialog + + + + + + + + + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 159 + 158 + 158 + + + + + + + + Radius of the first circle + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + ... + + + + :/icon/24x24/fx.png:/icon/24x24/fx.png + + + + 24 + 24 + + + + + + + + + + + :/icon/24x24/equal.png + + + + + + + + 0 + 0 + + + + + 87 + 0 + + + + Value of radius + + + _ + + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 24 + + + + true + + + + + + + + 18 + 18 + + + + + 0 + 0 + + + + <html><head/><body><p>Show full calculation in message box</p></body></html> + + + + + + + + + + + + 16 + 16 + + + + true + + + + + + + + + + + + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 159 + 158 + 158 + + + + + + + + Radius of the second circle + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + ... + + + + :/icon/24x24/fx.png:/icon/24x24/fx.png + + + + 24 + 24 + + + + + + + + + + + :/icon/24x24/equal.png + + + + + + + + 0 + 0 + + + + + 87 + 0 + + + + Value of first angle + + + _ + + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 24 + + + + true + + + + + + + + 18 + 18 + + + + + 0 + 0 + + + + <html><head/><body><p>Show full calculation in message box</p></body></html> + + + + + + + + + + + + 16 + 16 + + + + true + + + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + + 0 + 0 + + + + Point label + + + + + + + + + + + 0 + 0 + + + + Center of the first circle + + + + + + + + 0 + 0 + + + + + 145 + 0 + + + + Select point of center of arc + + + + + + + + 0 + 0 + + + + Center of the second circle + + + + + + + + 0 + 0 + + + + + 143 + 0 + + + + + + + + Take + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + DialogPointOfIntersectionCircles + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DialogPointOfIntersectionCircles + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/app/dialogs/tools/dialogtool.cpp b/src/app/dialogs/tools/dialogtool.cpp index 207818f67..cedbfdae4 100644 --- a/src/app/dialogs/tools/dialogtool.cpp +++ b/src/app/dialogs/tools/dialogtool.cpp @@ -311,6 +311,15 @@ void DialogTool::FillComboBoxLineColors(QComboBox *box) const } } +//--------------------------------------------------------------------------------------------------------------------- +void DialogTool::FillComboBoxCrossCirclesPoints(QComboBox *box) const +{ + SCASSERT(box != nullptr); + + box->addItem(tr("First point"), QVariant(static_cast(CrossCirclesPoint::FirstPoint))); + box->addItem(tr("Second point"), QVariant(static_cast(CrossCirclesPoint::SecondPoint))); +} + //--------------------------------------------------------------------------------------------------------------------- QString DialogTool::GetComboBoxCurrentData(const QComboBox *box) const { @@ -574,6 +583,35 @@ quint32 DialogTool::getCurrentObjectId(QComboBox *box) const } } +//--------------------------------------------------------------------------------------------------------------------- +CrossCirclesPoint DialogTool::getCurrentCrossPoint(QComboBox *box) const +{ + int value; + bool ok = false; +#if QT_VERSION < QT_VERSION_CHECK(5, 2, 0) + value = box->itemData(box->currentIndex()).toInt(&ok); +#else + value = box->currentData().toInt(&ok); +#endif + if (not ok) + { + return CrossCirclesPoint::FirstPoint; + } + + switch(value) + { + case 1: + return CrossCirclesPoint::FirstPoint; + break; + case 2: + return CrossCirclesPoint::SecondPoint; + break; + default: + return CrossCirclesPoint::FirstPoint; + break; + } +} + //--------------------------------------------------------------------------------------------------------------------- bool DialogTool::SetObject(const quint32 &id, QComboBox *box, const QString &toolTip) { diff --git a/src/app/dialogs/tools/dialogtool.h b/src/app/dialogs/tools/dialogtool.h index 54ce603e3..c7e703eb7 100644 --- a/src/app/dialogs/tools/dialogtool.h +++ b/src/app/dialogs/tools/dialogtool.h @@ -33,6 +33,7 @@ #include "../../utils/logging.h" #include "../../widgets/vmaingraphicsscene.h" #include "../../visualization/visualization.h" +#include "../../xml/vpattern.h" #include #include @@ -192,6 +193,7 @@ protected: void FillComboBoxCurves(QComboBox *box)const; void FillComboBoxTypeLine(QComboBox *box, const QMap &stylesPics) const; void FillComboBoxLineColors(QComboBox *box)const; + void FillComboBoxCrossCirclesPoints(QComboBox *box) const; virtual void CheckState(); QString GetComboBoxCurrentData(const QComboBox *box)const; @@ -208,7 +210,10 @@ protected: void setCurrentSplinePathId(QComboBox *box, const quint32 &value, ComboBoxCutSpline cut = ComboBoxCutSpline::NoCutSpline) const; void setCurrentCurveId(QComboBox *box, const quint32 &value) const; - quint32 getCurrentObjectId(QComboBox *box) const; + + quint32 getCurrentObjectId(QComboBox *box) const; + CrossCirclesPoint getCurrentCrossPoint(QComboBox *box) const; + bool SetObject(const quint32 &id, QComboBox *box, const QString &toolTip); void DeployFormula(QPlainTextEdit *formula, QPushButton *buttonGrowLength, int formulaBaseHeight); template diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index d95c618e2..4ad200324 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -699,10 +699,20 @@ void MainWindow::ToolCurveIntersectAxis(bool checked) void MainWindow::ToolPointOfIntersectionArcs(bool checked) { SetToolButtonWithApply(checked, Tool::PointOfIntersectionArcs, - "://cursor/point_of_intersection_arcs.png", - tr("Select first an arc"), - &MainWindow::ClosedDialogWithApply, - &MainWindow::ApplyDialog); + "://cursor/point_of_intersection_arcs.png", + tr("Select first an arc"), + &MainWindow::ClosedDialogWithApply, + &MainWindow::ApplyDialog); +} + +//--------------------------------------------------------------------------------------------------------------------- +void MainWindow::ToolPointOfIntersectionCircles(bool checked) +{ + SetToolButtonWithApply(checked, Tool::PointOfIntersectionCircles, + "://cursor/point_of_intersection_circles.png", + tr("Select first circle center "), + &MainWindow::ClosedDialogWithApply, + &MainWindow::ApplyDialog); } //--------------------------------------------------------------------------------------------------------------------- @@ -1000,7 +1010,10 @@ void MainWindow::InitToolButtons() connect(ui->toolButtonCurveIntersectAxis, &QToolButton::clicked, this, &MainWindow::ToolCurveIntersectAxis); connect(ui->toolButtonArcIntersectAxis, &QToolButton::clicked, this, &MainWindow::ToolCurveIntersectAxis); connect(ui->toolButtonLayoutSettings, &QToolButton::clicked, this, &MainWindow::ToolLayoutSettings); - connect(ui->toolButtonPointOfIntersectionArcs, &QToolButton::clicked, this, &MainWindow::ToolPointOfIntersectionArcs); + connect(ui->toolButtonPointOfIntersectionArcs, &QToolButton::clicked, this, + &MainWindow::ToolPointOfIntersectionArcs); + connect(ui->toolButtonPointOfIntersectionCircles, &QToolButton::clicked, this, + &MainWindow::ToolPointOfIntersectionCircles); } //--------------------------------------------------------------------------------------------------------------------- @@ -1117,6 +1130,9 @@ void MainWindow::CancelTool() case Tool::PointOfIntersectionArcs: ui->toolButtonPointOfIntersectionArcs->setChecked(false); break; + case Tool::PointOfIntersectionCircles: + ui->toolButtonPointOfIntersectionCircles->setChecked(false); + break; case Tool::NodePoint: case Tool::NodeArc: case Tool::NodeSpline: @@ -2143,6 +2159,7 @@ void MainWindow::SetEnableTool(bool enable) ui->toolButtonCurveIntersectAxis->setEnabled(drawTools); ui->toolButtonArcIntersectAxis->setEnabled(drawTools); ui->toolButtonPointOfIntersectionArcs->setEnabled(drawTools); + ui->toolButtonPointOfIntersectionCircles->setEnabled(drawTools); ui->actionLast_tool->setEnabled(drawTools); @@ -2505,6 +2522,10 @@ void MainWindow::LastUsedTool() ui->toolButtonCurveIntersectAxis->setChecked(true); ToolCurveIntersectAxis(true); break; + case Tool::PointOfIntersectionCircles: + ui->toolButtonPointOfIntersectionCircles->setChecked(true); + ToolPointOfIntersectionCircles(true); + break; case Tool::NodePoint: case Tool::NodeArc: case Tool::NodeSpline: diff --git a/src/app/mainwindow.h b/src/app/mainwindow.h index 077115283..89e096073 100644 --- a/src/app/mainwindow.h +++ b/src/app/mainwindow.h @@ -116,6 +116,7 @@ public slots: void ToolLineIntersectAxis(bool checked); void ToolCurveIntersectAxis(bool checked); void ToolPointOfIntersectionArcs(bool checked); + void ToolPointOfIntersectionCircles(bool checked); void ClosedDialogDetail(int result); void ClosedDialogUnionDetails(int result); diff --git a/src/app/mainwindow.ui b/src/app/mainwindow.ui index 790353f1a..d2b9c5d77 100644 --- a/src/app/mainwindow.ui +++ b/src/app/mainwindow.ui @@ -48,7 +48,7 @@ - 0 + 3 @@ -573,7 +573,7 @@ 0 0 120 - 104 + 150 @@ -693,6 +693,32 @@ + + + + false + + + Point of intersection circles + + + ... + + + + :/icon/32x32/point_of_intersection_circles.png:/icon/32x32/point_of_intersection_circles.png + + + + 32 + 32 + + + + true + + + diff --git a/src/app/options.h b/src/app/options.h index f65601b42..478bf66a1 100644 --- a/src/app/options.h +++ b/src/app/options.h @@ -87,14 +87,15 @@ enum class Tool : unsigned char Triangle, LineIntersectAxis, PointOfIntersectionArcs, + PointOfIntersectionCircles, CurveIntersectAxis, PointOfIntersection, - UnionDetails // 31 + UnionDetails // 32 }; enum class Vis : unsigned char { - ControlPointSpline = 32, // increase this value if need more positions in Tool enum + ControlPointSpline = 33, // increase this value if need more positions in Tool enum GraphicsSimpleTextItem, SimpleSplinePath, Line, @@ -111,6 +112,7 @@ enum class Vis : unsigned char ToolPointOfContact, ToolPointOfIntersection, ToolPointOfIntersectionArcs, + ToolPointOfIntersectionCircles, ToolShoulderPoint, ToolSpline, ToolTriangle, diff --git a/src/app/share/resources/cursor.qrc b/src/app/share/resources/cursor.qrc index 5dacc775f..b59e2c58f 100644 --- a/src/app/share/resources/cursor.qrc +++ b/src/app/share/resources/cursor.qrc @@ -25,5 +25,6 @@ cursor/arc_intersect_axis_cursor.png cursor/curve_intersect_axis_cursor.png cursor/point_of_intersection_arcs.png + cursor/point_of_intersection_circles.png diff --git a/src/app/share/resources/cursor/point_of_intersection_circles.png b/src/app/share/resources/cursor/point_of_intersection_circles.png new file mode 100644 index 000000000..4e44bc2fd Binary files /dev/null and b/src/app/share/resources/cursor/point_of_intersection_circles.png differ diff --git a/src/app/share/resources/icon.qrc b/src/app/share/resources/icon.qrc index 810b2602c..f3ecd6276 100644 --- a/src/app/share/resources/icon.qrc +++ b/src/app/share/resources/icon.qrc @@ -62,5 +62,6 @@ icon/16x16/progress.gif icon/32x32/export_to_picture_document.png icon/32x32/point_of_intersection_arcs.png + icon/32x32/point_of_intersection_circles.png diff --git a/src/app/share/resources/icon/32x32/point_of_intersection_circles.png b/src/app/share/resources/icon/32x32/point_of_intersection_circles.png new file mode 100644 index 000000000..8c69b8a71 Binary files /dev/null and b/src/app/share/resources/icon/32x32/point_of_intersection_circles.png differ diff --git a/src/app/share/resources/icon/svg/point_of_intersection_circles.svg b/src/app/share/resources/icon/svg/point_of_intersection_circles.svg new file mode 100644 index 000000000..144326696 --- /dev/null +++ b/src/app/share/resources/icon/svg/point_of_intersection_circles.svg @@ -0,0 +1,91 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/app/tools/drawTools/drawtools.h b/src/app/tools/drawTools/drawtools.h index b8f771bf8..4134de51a 100644 --- a/src/app/tools/drawTools/drawtools.h +++ b/src/app/tools/drawTools/drawtools.h @@ -45,6 +45,7 @@ #include "vtooltriangle.h" #include "vtoolpointofintersection.h" #include "vtoolpointofintersectionarcs.h" +#include "vtoolpointofintersectioncircles.h" #include "vtoolcutspline.h" #include "vtoolcutsplinepath.h" #include "vtoolcutarc.h" diff --git a/src/app/tools/drawTools/vtoolpointofintersectionarcs.cpp b/src/app/tools/drawTools/vtoolpointofintersectionarcs.cpp index 883d2dc8c..f52a95248 100644 --- a/src/app/tools/drawTools/vtoolpointofintersectionarcs.cpp +++ b/src/app/tools/drawTools/vtoolpointofintersectionarcs.cpp @@ -37,7 +37,7 @@ const QString VToolPointOfIntersectionArcs::ToolType = QStringLiteral("pointOfIn //--------------------------------------------------------------------------------------------------------------------- VToolPointOfIntersectionArcs::VToolPointOfIntersectionArcs(VPattern *doc, VContainer *data, const quint32 &id, const quint32 &firstArcId, const quint32 &secondArcId, - CrossArcsPoint pType, const Source &typeCreation, + CrossCirclesPoint pType, const Source &typeCreation, QGraphicsItem *parent) :VToolPoint(doc, data, id, parent), firstArcId(firstArcId), secondArcId(secondArcId), crossPoint(pType) { @@ -66,7 +66,7 @@ VToolPointOfIntersectionArcs *VToolPointOfIntersectionArcs::Create(DialogTool *d SCASSERT(dialogTool != nullptr); const quint32 firstArcId = dialogTool->GetFirstArcId(); const quint32 secondArcId = dialogTool->GetSecondArcId(); - const CrossArcsPoint pType = dialogTool->GetCrossArcPoint(); + const CrossCirclesPoint pType = dialogTool->GetCrossArcPoint(); const QString pointName = dialogTool->getPointName(); VToolPointOfIntersectionArcs *point = nullptr; point = Create(0, pointName, firstArcId, secondArcId, pType, 5, 10, scene, doc, data, Document::FullParse, @@ -81,7 +81,7 @@ VToolPointOfIntersectionArcs *VToolPointOfIntersectionArcs::Create(DialogTool *d //--------------------------------------------------------------------------------------------------------------------- VToolPointOfIntersectionArcs *VToolPointOfIntersectionArcs::Create(const quint32 _id, const QString &pointName, const quint32 &firstArcId, - const quint32 &secondArcId, CrossArcsPoint pType, + const quint32 &secondArcId, CrossCirclesPoint pType, const qreal &mx, const qreal &my, VMainGraphicsScene *scene, VPattern *doc, VContainer *data, const Document &parse, @@ -123,7 +123,7 @@ VToolPointOfIntersectionArcs *VToolPointOfIntersectionArcs::Create(const quint32 } //--------------------------------------------------------------------------------------------------------------------- -QPointF VToolPointOfIntersectionArcs::FindPoint(const VArc *arc1, const VArc *arc2, const CrossArcsPoint pType) +QPointF VToolPointOfIntersectionArcs::FindPoint(const VArc *arc1, const VArc *arc2, const CrossCirclesPoint pType) { QPointF p1, p2; const int res = VGObject::IntersectionCircles(arc1->GetCenter().toQPointF(), arc1->GetRadius(), @@ -162,7 +162,7 @@ QPointF VToolPointOfIntersectionArcs::FindPoint(const VArc *arc1, const VArc *ar switch(localRes) { case 2: - if (pType == CrossArcsPoint::FirstPoint) + if (pType == CrossCirclesPoint::FirstPoint) { return p1; } @@ -244,13 +244,13 @@ void VToolPointOfIntersectionArcs::SetSecondArcId(const quint32 &value) } //--------------------------------------------------------------------------------------------------------------------- -CrossArcsPoint VToolPointOfIntersectionArcs::GetCrossArcsPoint() const +CrossCirclesPoint VToolPointOfIntersectionArcs::GetCrossCirclesPoint() const { return crossPoint; } //--------------------------------------------------------------------------------------------------------------------- -void VToolPointOfIntersectionArcs::SetCrossArcsPoint(CrossArcsPoint &value) +void VToolPointOfIntersectionArcs::SetCrossCirclesPoint(CrossCirclesPoint &value) { crossPoint = value; @@ -305,7 +305,7 @@ void VToolPointOfIntersectionArcs::ReadToolAttributes(const QDomElement &domElem { firstArcId = doc->GetParametrUInt(domElement, AttrFirstArc, NULL_ID_STR); secondArcId = doc->GetParametrUInt(domElement, AttrSecondArc, NULL_ID_STR); - crossPoint = static_cast(doc->GetParametrUInt(domElement, AttrCrossPoint, "1")); + crossPoint = static_cast(doc->GetParametrUInt(domElement, AttrCrossPoint, "1")); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/tools/drawTools/vtoolpointofintersectionarcs.h b/src/app/tools/drawTools/vtoolpointofintersectionarcs.h index 378852cdf..67c233c0a 100644 --- a/src/app/tools/drawTools/vtoolpointofintersectionarcs.h +++ b/src/app/tools/drawTools/vtoolpointofintersectionarcs.h @@ -40,17 +40,17 @@ class VToolPointOfIntersectionArcs : public VToolPoint public: VToolPointOfIntersectionArcs(VPattern *doc, VContainer *data, const quint32 &id, const quint32 &firstArcId, - const quint32 &secondArcId, CrossArcsPoint crossPoint, const Source &typeCreation, + const quint32 &secondArcId, CrossCirclesPoint crossPoint, const Source &typeCreation, QGraphicsItem * parent = nullptr); virtual void setDialog(); static VToolPointOfIntersectionArcs *Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern *doc, VContainer *data); static VToolPointOfIntersectionArcs *Create(const quint32 _id, const QString &pointName, const quint32 &firstArcId, - const quint32 &secondArcId, CrossArcsPoint crossPoint, + const quint32 &secondArcId, CrossCirclesPoint crossPoint, const qreal &mx, const qreal &my, VMainGraphicsScene *scene, VPattern *doc, VContainer *data, const Document &parse, const Source &typeCreation); - static QPointF FindPoint(const VArc *arc1, const VArc *arc2, const CrossArcsPoint crossPoint); + static QPointF FindPoint(const VArc *arc1, const VArc *arc2, const CrossCirclesPoint crossPoint); static const QString ToolType; virtual int type() const {return Type;} enum { Type = UserType + static_cast(Tool::PointOfIntersectionArcs) }; @@ -61,8 +61,8 @@ public: quint32 GetSecondArcId() const; void SetSecondArcId(const quint32 &value); - CrossArcsPoint GetCrossArcsPoint() const; - void SetCrossArcsPoint(CrossArcsPoint &value); + CrossCirclesPoint GetCrossCirclesPoint() const; + void SetCrossCirclesPoint(CrossCirclesPoint &value); virtual void ShowVisualization(bool show); protected: @@ -81,7 +81,7 @@ private: /** @brief secondArcId id second arc. */ quint32 secondArcId; - CrossArcsPoint crossPoint; + CrossCirclesPoint crossPoint; }; #endif // VTOOLPOINTOFINTERSECTIONARCS_H diff --git a/src/app/tools/drawTools/vtoolpointofintersectioncircles.cpp b/src/app/tools/drawTools/vtoolpointofintersectioncircles.cpp new file mode 100644 index 000000000..9b5ce9f3b --- /dev/null +++ b/src/app/tools/drawTools/vtoolpointofintersectioncircles.cpp @@ -0,0 +1,345 @@ +/************************************************************************ + ** + ** @file vtoolpointofintersectioncircles.cpp + ** @author Roman Telezhynskyi + ** @date 29 5, 2015 + ** + ** @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) 2015 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 "vtoolpointofintersectioncircles.h" +#include "../../dialogs/tools/dialogpointofintersectioncircles.h" +#include "../../libs/vgeometry/vpointf.h" +#include "../../libs/vgeometry/varc.h" +#include "../../visualization/vistoolpointofintersectioncircles.h" +#include "../container/vformula.h" + +const QString VToolPointOfIntersectionCircles::ToolType = QStringLiteral("pointOfIntersectionCircles"); + +//--------------------------------------------------------------------------------------------------------------------- +VToolPointOfIntersectionCircles::VToolPointOfIntersectionCircles(VPattern *doc, VContainer *data, const quint32 &id, + quint32 firstCircleCenterId, + quint32 secondCircleCenterId, + const QString &firstCircleRadius, + const QString &secondCircleRadius, + CrossCirclesPoint crossPoint, + const Source &typeCreation, QGraphicsItem *parent) + :VToolPoint(doc, data, id, parent), firstCircleCenterId(firstCircleCenterId), + secondCircleCenterId(secondCircleCenterId), firstCircleRadius(firstCircleRadius), + secondCircleRadius(secondCircleRadius), crossPoint(crossPoint) +{ + ToolCreation(typeCreation); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::setDialog() +{ + SCASSERT(dialog != nullptr); + DialogPointOfIntersectionCircles *dialogTool = qobject_cast(dialog); + SCASSERT(dialogTool != nullptr); + const QSharedPointer p = VAbstractTool::data.GeometricObject(id); + dialogTool->SetFirstCircleCenterId(firstCircleCenterId); + dialogTool->SetSecondCircleCenterId(secondCircleCenterId); + dialogTool->SetFirstCircleRadius(firstCircleRadius); + dialogTool->SetSecondCircleRadius(secondCircleRadius); + dialogTool->SetCrossCirclesPoint(crossPoint); + dialogTool->SetPointName(p->name()); +} + +//--------------------------------------------------------------------------------------------------------------------- +VToolPointOfIntersectionCircles *VToolPointOfIntersectionCircles::Create(DialogTool *dialog, VMainGraphicsScene *scene, + VPattern *doc, VContainer *data) +{ + SCASSERT(dialog != nullptr); + DialogPointOfIntersectionCircles *dialogTool = qobject_cast(dialog); + SCASSERT(dialogTool != nullptr); + const quint32 firstCircleCenterId = dialogTool->GetFirstCircleCenterId(); + const quint32 secondCircleCenterId = dialogTool->GetSecondCircleCenterId(); + QString firstCircleRadius = dialogTool->GetFirstCircleRadius(); + QString secondCircleRadius = dialogTool->GetSecondCircleRadius(); + const CrossCirclesPoint pType = dialogTool->GetCrossCirclesPoint(); + const QString pointName = dialogTool->getPointName(); + VToolPointOfIntersectionCircles *point = nullptr; + point = Create(0, pointName, firstCircleCenterId, secondCircleCenterId, firstCircleRadius, secondCircleRadius, + pType, 5, 10, scene, doc, data, Document::FullParse, Source::FromGui); + if (point != nullptr) + { + point->dialog=dialogTool; + } + return point; +} + +//--------------------------------------------------------------------------------------------------------------------- +VToolPointOfIntersectionCircles *VToolPointOfIntersectionCircles::Create(const quint32 _id, const QString &pointName, + quint32 firstCircleCenterId, + quint32 secondCircleCenterId, + QString &firstCircleRadius, + QString &secondCircleRadius, + CrossCirclesPoint crossPoint, const qreal &mx, + const qreal &my, VMainGraphicsScene *scene, + VPattern *doc, VContainer *data, + const Document &parse, + const Source &typeCreation) +{ + const qreal calcC1Radius = qApp->toPixel(CheckFormula(_id, firstCircleRadius, data)); + const qreal calcC2Radius = qApp->toPixel(CheckFormula(_id, secondCircleRadius, data)); + + const VPointF c1Point = *data->GeometricObject(firstCircleCenterId); + const VPointF c2Point = *data->GeometricObject(secondCircleCenterId); + + const QPointF point = FindPoint(c1Point.toQPointF(), c2Point.toQPointF(), calcC1Radius, calcC2Radius, crossPoint); + quint32 id = _id; + if (typeCreation == Source::FromGui) + { + id = data->AddGObject(new VPointF(point, pointName, mx, my)); + } + else + { + data->UpdateGObject(id, new VPointF(point, pointName, mx, my)); + if (parse != Document::FullParse) + { + doc->UpdateToolData(id, data); + } + } + VDrawTool::AddRecord(id, Tool::PointOfIntersectionCircles, doc); + if (parse == Document::FullParse) + { + VToolPointOfIntersectionCircles *point = new VToolPointOfIntersectionCircles(doc, data, id, firstCircleCenterId, + secondCircleCenterId, + firstCircleRadius, + secondCircleRadius, crossPoint, + typeCreation); + scene->addItem(point); + connect(point, &VToolPointOfIntersectionCircles::ChoosedTool, scene, &VMainGraphicsScene::ChoosedItem); + connect(scene, &VMainGraphicsScene::NewFactor, point, &VToolPointOfIntersectionCircles::SetFactor); + connect(scene, &VMainGraphicsScene::DisableItem, point, &VToolPointOfIntersectionCircles::Disable); + connect(scene, &VMainGraphicsScene::EnableToolMove, point, &VToolPointOfIntersectionCircles::EnableToolMove); + doc->AddTool(id, point); + doc->IncrementReferens(firstCircleCenterId); + doc->IncrementReferens(secondCircleCenterId); + return point; + } + return nullptr; +} + +//--------------------------------------------------------------------------------------------------------------------- +QPointF VToolPointOfIntersectionCircles::FindPoint(const QPointF &c1Point, const QPointF &c2Point, qreal c1Radius, + qreal c2Radius, const CrossCirclesPoint crossPoint) +{ + QPointF p1, p2; + const int res = VGObject::IntersectionCircles(c1Point, c1Radius, c2Point, c2Radius, p1, p2); + + switch(res) + { + case 2: + if (crossPoint == CrossCirclesPoint::FirstPoint) + { + return p1; + } + else + { + return p2; + } + break; + case 1: + return p1; + break; + case 3: + case 0: + default: + return QPointF(0, 0); + break; + } +} + +//--------------------------------------------------------------------------------------------------------------------- +quint32 VToolPointOfIntersectionCircles::GetFirstCircleCenterId() const +{ + return firstCircleCenterId; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::SetFirstCircleCenterId(const quint32 &value) +{ + if (value != NULL_ID) + { + firstCircleCenterId = value; + + QSharedPointer obj = VAbstractTool::data.GetGObject(id); + SaveOption(obj); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +quint32 VToolPointOfIntersectionCircles::GetSecondCircleCenterId() const +{ + return secondCircleCenterId; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::SetSecondCircleCenterId(const quint32 &value) +{ + if (value != NULL_ID) + { + secondCircleCenterId = value; + + QSharedPointer obj = VAbstractTool::data.GetGObject(id); + SaveOption(obj); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +VFormula VToolPointOfIntersectionCircles::GetFirstCircleRadius() const +{ + VFormula radius(firstCircleRadius, getData()); + radius.setCheckZero(true); + radius.setToolId(id); + radius.setPostfix(VDomDocument::UnitsToStr(qApp->patternUnit())); + return radius; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::SetFirstCircleRadius(const VFormula &value) +{ + if (value.error() == false) + { + if (value.getDoubleValue() > 0)// Formula don't check this, but radius can't be 0 or negative + { + firstCircleRadius = value.GetFormula(FormulaType::FromUser); + QSharedPointer obj = VAbstractTool::data.GetGObject(id); + SaveOption(obj); + } + } +} + +//--------------------------------------------------------------------------------------------------------------------- +VFormula VToolPointOfIntersectionCircles::GetSecondCircleRadius() const +{ + VFormula radius(secondCircleRadius, getData()); + radius.setCheckZero(true); + radius.setToolId(id); + radius.setPostfix(VDomDocument::UnitsToStr(qApp->patternUnit())); + return radius; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::SetSecondCircleRadius(const VFormula &value) +{ + if (value.error() == false) + { + if (value.getDoubleValue() > 0)// Formula don't check this, but radius can't be 0 or negative + { + secondCircleRadius = value.GetFormula(FormulaType::FromUser); + QSharedPointer obj = VAbstractTool::data.GetGObject(id); + SaveOption(obj); + } + } +} + +//--------------------------------------------------------------------------------------------------------------------- +CrossCirclesPoint VToolPointOfIntersectionCircles::GetCrossCirclesPoint() const +{ + return crossPoint; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::SetCrossCirclesPoint(CrossCirclesPoint &value) +{ + crossPoint = value; + + QSharedPointer obj = VAbstractTool::data.GetGObject(id); + SaveOption(obj); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::ShowVisualization(bool show) +{ + ShowToolVisualization(show); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::RemoveReferens() +{ + doc->DecrementReferens(firstCircleCenterId); + doc->DecrementReferens(secondCircleCenterId); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) +{ + ContextMenu(this, event); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::SaveDialog(QDomElement &domElement) +{ + SCASSERT(dialog != nullptr); + DialogPointOfIntersectionCircles *dialogTool = qobject_cast(dialog); + SCASSERT(dialogTool != nullptr); + doc->SetAttribute(domElement, AttrName, dialogTool->getPointName()); + doc->SetAttribute(domElement, AttrC1Center, QString().setNum(dialogTool->GetFirstCircleCenterId())); + doc->SetAttribute(domElement, AttrC2Center, QString().setNum(dialogTool->GetSecondCircleCenterId())); + doc->SetAttribute(domElement, AttrC1Radius, dialogTool->GetFirstCircleRadius()); + doc->SetAttribute(domElement, AttrC2Radius, dialogTool->GetSecondCircleRadius()); + doc->SetAttribute(domElement, AttrCrossPoint, + QString().setNum(static_cast(dialogTool->GetCrossCirclesPoint()))); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::SaveOptions(QDomElement &tag, QSharedPointer &obj) +{ + VToolPoint::SaveOptions(tag, obj); + + doc->SetAttribute(tag, AttrType, ToolType); + doc->SetAttribute(tag, AttrC1Center, firstCircleCenterId); + doc->SetAttribute(tag, AttrC2Center, secondCircleCenterId); + doc->SetAttribute(tag, AttrC1Radius, firstCircleRadius); + doc->SetAttribute(tag, AttrC2Radius, secondCircleRadius); + doc->SetAttribute(tag, AttrCrossPoint, static_cast(crossPoint)); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::ReadToolAttributes(const QDomElement &domElement) +{ + firstCircleCenterId = doc->GetParametrUInt(domElement, AttrC1Center, NULL_ID_STR); + secondCircleCenterId = doc->GetParametrUInt(domElement, AttrC2Center, NULL_ID_STR); + firstCircleRadius = doc->GetParametrString(domElement, AttrC1Radius); + secondCircleRadius = doc->GetParametrString(domElement, AttrC2Radius); + crossPoint = static_cast(doc->GetParametrUInt(domElement, AttrCrossPoint, "1")); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolPointOfIntersectionCircles::SetVisualization() +{ + if (vis != nullptr) + { + VisToolPointOfIntersectionCircles *visual = qobject_cast(vis); + SCASSERT(visual != nullptr); + + visual->setPoint1Id(firstCircleCenterId); + visual->setPoint2Id(secondCircleCenterId); + visual->setC1Radius(firstCircleRadius); + visual->setC2Radius(secondCircleRadius); + visual->setCrossPoint(crossPoint); + visual->RefreshGeometry(); + } +} diff --git a/src/app/tools/drawTools/vtoolpointofintersectioncircles.h b/src/app/tools/drawTools/vtoolpointofintersectioncircles.h new file mode 100644 index 000000000..57dd1b274 --- /dev/null +++ b/src/app/tools/drawTools/vtoolpointofintersectioncircles.h @@ -0,0 +1,97 @@ +/************************************************************************ + ** + ** @file vtoolpointofintersectioncircles.h + ** @author Roman Telezhynskyi + ** @date 29 5, 2015 + ** + ** @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) 2015 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 VTOOLPOINTOFINTERSECTIONCIRCLES_H +#define VTOOLPOINTOFINTERSECTIONCIRCLES_H + +#include "vtoolpoint.h" +#include "../../xml/vpattern.h" + +class VFormula; + +class VToolPointOfIntersectionCircles : public VToolPoint +{ + Q_OBJECT +public: + VToolPointOfIntersectionCircles(VPattern *doc, VContainer *data, const quint32 &id, const + quint32 firstCircleCenterId, quint32 secondCircleCenterId, + const QString &firstCircleRadius, const QString &secondCircleRadius, + CrossCirclesPoint crossPoint, const Source &typeCreation, + QGraphicsItem * parent = nullptr); + virtual void setDialog(); + static VToolPointOfIntersectionCircles *Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern *doc, + VContainer *data); + static VToolPointOfIntersectionCircles *Create(const quint32 _id, const QString &pointName, + quint32 firstCircleCenterId, quint32 secondCircleCenterId, + QString &firstCircleRadius, QString &secondCircleRadius, + CrossCirclesPoint crossPoint, + const qreal &mx, const qreal &my, VMainGraphicsScene *scene, + VPattern *doc, VContainer *data, const Document &parse, + const Source &typeCreation); + static QPointF FindPoint(const QPointF &c1Point, const QPointF &c2Point, qreal c1Radius, qreal c2Radius, + const CrossCirclesPoint crossPoint); + static const QString ToolType; + virtual int type() const {return Type;} + enum { Type = UserType + static_cast(Tool::PointOfIntersectionCircles) }; + + quint32 GetFirstCircleCenterId() const; + void SetFirstCircleCenterId(const quint32 &value); + + quint32 GetSecondCircleCenterId() const; + void SetSecondCircleCenterId(const quint32 &value); + + VFormula GetFirstCircleRadius() const; + void SetFirstCircleRadius(const VFormula &value); + + VFormula GetSecondCircleRadius() const; + void SetSecondCircleRadius(const VFormula &value); + + CrossCirclesPoint GetCrossCirclesPoint() const; + void SetCrossCirclesPoint(CrossCirclesPoint &value); + + virtual void ShowVisualization(bool show); +protected: + virtual void RemoveReferens(); + virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); + virtual void SaveDialog(QDomElement &domElement); + virtual void SaveOptions(QDomElement &tag, QSharedPointer &obj); + virtual void ReadToolAttributes(const QDomElement &domElement); + virtual void SetVisualization(); +private: + Q_DISABLE_COPY(VToolPointOfIntersectionCircles) + + quint32 firstCircleCenterId; + quint32 secondCircleCenterId; + + QString firstCircleRadius; + QString secondCircleRadius; + + CrossCirclesPoint crossPoint; +}; + +#endif // VTOOLPOINTOFINTERSECTIONCIRCLES_H diff --git a/src/app/tools/tools.pri b/src/app/tools/tools.pri index 425ed0dd5..e12a29f1a 100644 --- a/src/app/tools/tools.pri +++ b/src/app/tools/tools.pri @@ -39,7 +39,8 @@ HEADERS += \ $$PWD/drawTools/vtoolcut.h \ $$PWD/drawTools/vtoollineintersectaxis.h \ $$PWD/drawTools/vtoolcurveintersectaxis.h \ - $$PWD/drawTools/vtoolpointofintersectionarcs.h + $$PWD/drawTools/vtoolpointofintersectionarcs.h \ + $$PWD/drawTools/vtoolpointofintersectioncircles.h SOURCES += \ $$PWD/vtooldetail.cpp \ @@ -76,4 +77,5 @@ SOURCES += \ $$PWD/drawTools/vtoolcut.cpp \ $$PWD/drawTools/vtoollineintersectaxis.cpp \ $$PWD/drawTools/vtoolcurveintersectaxis.cpp \ - $$PWD/drawTools/vtoolpointofintersectionarcs.cpp + $$PWD/drawTools/vtoolpointofintersectionarcs.cpp \ + $$PWD/drawTools/vtoolpointofintersectioncircles.cpp diff --git a/src/app/tools/vabstracttool.cpp b/src/app/tools/vabstracttool.cpp index c8774cebe..f58a6bf24 100644 --- a/src/app/tools/vabstracttool.cpp +++ b/src/app/tools/vabstracttool.cpp @@ -79,6 +79,10 @@ const QString VAbstractTool::AttrColor = QStringLiteral("color"); const QString VAbstractTool::AttrFirstArc = QStringLiteral("firstArc"); const QString VAbstractTool::AttrSecondArc = QStringLiteral("secondArc"); const QString VAbstractTool::AttrCrossPoint = QStringLiteral("crossPoint"); +const QString VAbstractTool::AttrC1Center = QStringLiteral("c1Center"); +const QString VAbstractTool::AttrC2Center = QStringLiteral("c2Center"); +const QString VAbstractTool::AttrC1Radius = QStringLiteral("c1Radius"); +const QString VAbstractTool::AttrC2Radius = QStringLiteral("c2Radius"); const QString VAbstractTool::TypeLineNone = QStringLiteral("none"); const QString VAbstractTool::TypeLineLine = QStringLiteral("hair"); diff --git a/src/app/tools/vabstracttool.h b/src/app/tools/vabstracttool.h index 2d18ada20..1ff441f4d 100644 --- a/src/app/tools/vabstracttool.h +++ b/src/app/tools/vabstracttool.h @@ -94,6 +94,10 @@ public: static const QString AttrFirstArc; static const QString AttrSecondArc; static const QString AttrCrossPoint; + static const QString AttrC1Center; + static const QString AttrC2Center; + static const QString AttrC1Radius; + static const QString AttrC2Radius; static const QString TypeLineNone; static const QString TypeLineLine; diff --git a/src/app/visualization/vistoolpointofintersectionarcs.cpp b/src/app/visualization/vistoolpointofintersectionarcs.cpp index 0b5b4f469..82cffc774 100644 --- a/src/app/visualization/vistoolpointofintersectionarcs.cpp +++ b/src/app/visualization/vistoolpointofintersectionarcs.cpp @@ -33,7 +33,7 @@ //--------------------------------------------------------------------------------------------------------------------- VisToolPointOfIntersectionArcs::VisToolPointOfIntersectionArcs(const VContainer *data, QGraphicsItem *parent) - : VisLine(data, parent), arc1Id(NULL_ID), arc2Id(NULL_ID), crossPoint(CrossArcsPoint::FirstPoint), point(nullptr), + : VisLine(data, parent), arc1Id(NULL_ID), arc2Id(NULL_ID), crossPoint(CrossCirclesPoint::FirstPoint), point(nullptr), arc1Path(nullptr), arc2Path(nullptr) { arc1Path = InitItem(Qt::darkGreen, this); @@ -95,7 +95,7 @@ void VisToolPointOfIntersectionArcs::setArc2Id(const quint32 &value) } //--------------------------------------------------------------------------------------------------------------------- -void VisToolPointOfIntersectionArcs::setCrossPoint(const CrossArcsPoint &value) +void VisToolPointOfIntersectionArcs::setCrossPoint(const CrossCirclesPoint &value) { crossPoint = value; } diff --git a/src/app/visualization/vistoolpointofintersectionarcs.h b/src/app/visualization/vistoolpointofintersectionarcs.h index fb20ecfd2..a9ead8ffe 100644 --- a/src/app/visualization/vistoolpointofintersectionarcs.h +++ b/src/app/visualization/vistoolpointofintersectionarcs.h @@ -44,15 +44,15 @@ public: void setArc1Id(const quint32 &value); void setArc2Id(const quint32 &value); - void setCrossPoint(const CrossArcsPoint &value); + void setCrossPoint(const CrossCirclesPoint &value); virtual int type() const {return Type;} - enum { Type = UserType + static_cast(Vis::ToolPointOfIntersection)}; + enum { Type = UserType + static_cast(Vis::ToolPointOfIntersectionArcs)}; private: Q_DISABLE_COPY(VisToolPointOfIntersectionArcs) quint32 arc1Id; quint32 arc2Id; - CrossArcsPoint crossPoint; + CrossCirclesPoint crossPoint; QGraphicsEllipseItem *point; QGraphicsPathItem *arc1Path; QGraphicsPathItem *arc2Path; diff --git a/src/app/visualization/vistoolpointofintersectioncircles.cpp b/src/app/visualization/vistoolpointofintersectioncircles.cpp new file mode 100644 index 000000000..95451b793 --- /dev/null +++ b/src/app/visualization/vistoolpointofintersectioncircles.cpp @@ -0,0 +1,116 @@ +/************************************************************************ + ** + ** @file vistoolpointofintersectioncircles.cpp + ** @author Roman Telezhynskyi + ** @date 29 5, 2015 + ** + ** @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) 2015 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 "vistoolpointofintersectioncircles.h" +#include "../container/vcontainer.h" +#include "../tools/drawTools/vtoolpointofintersectioncircles.h" +#include "../libs/vgeometry/vpointf.h" + +//--------------------------------------------------------------------------------------------------------------------- +VisToolPointOfIntersectionCircles::VisToolPointOfIntersectionCircles(const VContainer *data, QGraphicsItem *parent) + : VisLine(data, parent), point2Id(NULL_ID), c1Radius(0), c2Radius(0), + crossPoint(CrossCirclesPoint::FirstPoint), point(nullptr), c1Center(nullptr), c2Center(nullptr), c1Path(nullptr), + c2Path(nullptr) +{ + c1Path = InitItem(Qt::darkGreen, this); + c2Path = InitItem(Qt::darkRed, this); + point = InitPoint(mainColor, this); + c1Center = InitPoint(supportColor, this); + c2Center = InitPoint(supportColor, this); +} + +//--------------------------------------------------------------------------------------------------------------------- +VisToolPointOfIntersectionCircles::~VisToolPointOfIntersectionCircles() +{} + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolPointOfIntersectionCircles::RefreshGeometry() +{ + if (point1Id > NULL_ID) + { + const QSharedPointer first = Visualization::data->GeometricObject(point1Id); + DrawPoint(c1Center, first->toQPointF(), supportColor); + + if (point2Id > NULL_ID) + { + const QSharedPointer second = Visualization::data->GeometricObject(point2Id); + DrawPoint(c2Center, second->toQPointF(), supportColor); + + if (c1Radius > 0 && c2Radius > 0) + { + c1Path->setRect(PointRect(c1Radius)); + DrawPoint(c1Path, first->toQPointF(), Qt::darkGreen, Qt::DashLine); + + c2Path->setRect(PointRect(c2Radius)); + DrawPoint(c2Path, second->toQPointF(), Qt::darkRed, Qt::DashLine); + + const QPointF fPoint = VToolPointOfIntersectionCircles::FindPoint(first->toQPointF(), + second->toQPointF(), c1Radius, + c2Radius, crossPoint); + DrawPoint(point, fPoint, mainColor); + } + } + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolPointOfIntersectionCircles::VisualMode(const quint32 &id) +{ + VMainGraphicsScene *scene = qobject_cast(qApp->getCurrentScene()); + SCASSERT(scene != nullptr); + + this->point1Id = id; + Visualization::scenePos = scene->getScenePos(); + RefreshGeometry(); + + AddOnScene(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolPointOfIntersectionCircles::setPoint2Id(const quint32 &value) +{ + point2Id = value; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolPointOfIntersectionCircles::setC1Radius(const QString &value) +{ + c1Radius = FindLength(value); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolPointOfIntersectionCircles::setC2Radius(const QString &value) +{ + c2Radius = FindLength(value); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VisToolPointOfIntersectionCircles::setCrossPoint(const CrossCirclesPoint &value) +{ + crossPoint = value; +} diff --git a/src/app/visualization/vistoolpointofintersectioncircles.h b/src/app/visualization/vistoolpointofintersectioncircles.h new file mode 100644 index 000000000..b6266d59c --- /dev/null +++ b/src/app/visualization/vistoolpointofintersectioncircles.h @@ -0,0 +1,65 @@ +/************************************************************************ + ** + ** @file vistoolpointofintersectioncircles.h + ** @author Roman Telezhynskyi + ** @date 29 5, 2015 + ** + ** @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) 2015 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 VISTOOLPOINTOFINTERSECTIONCIRCLES_H +#define VISTOOLPOINTOFINTERSECTIONCIRCLES_H + +#include "visline.h" +#include "../xml/vpattern.h" + +class VisToolPointOfIntersectionCircles : public VisLine +{ + Q_OBJECT +public: + VisToolPointOfIntersectionCircles(const VContainer *data, QGraphicsItem *parent = 0); + virtual ~VisToolPointOfIntersectionCircles(); + + virtual void RefreshGeometry(); + virtual void VisualMode(const quint32 &id); + + void setPoint2Id(const quint32 &value); + void setC1Radius(const QString &value); + void setC2Radius(const QString &value); + void setCrossPoint(const CrossCirclesPoint &value); + + virtual int type() const {return Type;} + enum { Type = UserType + static_cast(Vis::ToolPointOfIntersectionCircles)}; +private: + Q_DISABLE_COPY(VisToolPointOfIntersectionCircles) + quint32 point2Id; + qreal c1Radius; + qreal c2Radius; + CrossCirclesPoint crossPoint; + QGraphicsEllipseItem *point; + QGraphicsEllipseItem *c1Center; + QGraphicsEllipseItem *c2Center; + QGraphicsEllipseItem *c1Path; + QGraphicsEllipseItem *c2Path; +}; + +#endif // VISTOOLPOINTOFINTERSECTIONCIRCLES_H diff --git a/src/app/visualization/visualization.pri b/src/app/visualization/visualization.pri index 85b167327..b520fb476 100644 --- a/src/app/visualization/visualization.pri +++ b/src/app/visualization/visualization.pri @@ -27,7 +27,8 @@ HEADERS += \ $$PWD/vistoolcutsplinepath.h \ $$PWD/vistoollineintersectaxis.h \ $$PWD/vistoolcurveintersectaxis.h \ - $$PWD/vistoolpointofintersectionarcs.h + $$PWD/vistoolpointofintersectionarcs.h \ + visualization/vistoolpointofintersectioncircles.h SOURCES += \ $$PWD/vgraphicssimpletextitem.cpp \ @@ -55,4 +56,5 @@ SOURCES += \ $$PWD/vistoolcutsplinepath.cpp \ $$PWD/vistoollineintersectaxis.cpp \ $$PWD/vistoolcurveintersectaxis.cpp \ - $$PWD/vistoolpointofintersectionarcs.cpp + $$PWD/vistoolpointofintersectionarcs.cpp \ + visualization/vistoolpointofintersectioncircles.cpp diff --git a/src/app/widgets/vtooloptionspropertybrowser.cpp b/src/app/widgets/vtooloptionspropertybrowser.cpp index f265cbc56..9fb089d98 100644 --- a/src/app/widgets/vtooloptionspropertybrowser.cpp +++ b/src/app/widgets/vtooloptionspropertybrowser.cpp @@ -119,6 +119,9 @@ void VToolOptionsPropertyBrowser::ShowItemOptions(QGraphicsItem *item) case VToolPointOfIntersectionArcs::Type: ShowOptionsToolPointOfIntersectionArcs(item); break; + case VToolPointOfIntersectionCircles::Type: + ShowOptionsToolPointOfIntersectionCircles(item); + break; case VToolShoulderPoint::Type: ShowOptionsToolShoulderPoint(item); break; @@ -209,6 +212,9 @@ void VToolOptionsPropertyBrowser::UpdateOptions() case VToolPointOfIntersectionArcs::Type: UpdateOptionsToolPointOfIntersectionArcs(); break; + case VToolPointOfIntersectionCircles::Type: + UpdateOptionsToolPointOfIntersectionCircles(); + break; case VToolShoulderPoint::Type: UpdateOptionsToolShoulderPoint(); break; @@ -314,6 +320,9 @@ void VToolOptionsPropertyBrowser::userChangedData(VProperty *property) case VToolPointOfIntersectionArcs::Type: ChangeDataToolPointOfIntersectionArcs(prop); break; + case VToolPointOfIntersectionCircles::Type: + ChangeDataToolPointOfIntersectionCircles(prop); + break; case VToolShoulderPoint::Type: ChangeDataToolShoulderPoint(prop); break; @@ -403,7 +412,7 @@ void VToolOptionsPropertyBrowser::AddPropertyCrossPoint(Tool *i, const QString & { VEnumProperty* itemProperty = new VEnumProperty(propertyName); itemProperty->setLiterals(QStringList()<< tr("First point") << tr("Second point")); - itemProperty->setValue(static_cast(i->GetCrossArcsPoint())-1); + itemProperty->setValue(static_cast(i->GetCrossCirclesPoint())-1); AddProperty(itemProperty, VAbstractTool::AttrCrossPoint); } @@ -466,6 +475,40 @@ void VToolOptionsPropertyBrowser::SetPointName(const QString &name) } } + +//--------------------------------------------------------------------------------------------------------------------- +template +void VToolOptionsPropertyBrowser::SetCrossCirclesPoint(const QVariant value) +{ + if (Tool *i = qgraphicsitem_cast(currentItem)) + { + bool ok = false; + const int val = value.toInt(&ok); + + CrossCirclesPoint cross = CrossCirclesPoint::FirstPoint; + if (ok) + { + switch(val) + { + case 0: + cross = CrossCirclesPoint::FirstPoint; + break; + case 1: + cross = CrossCirclesPoint::SecondPoint; + break; + default: + cross = CrossCirclesPoint::FirstPoint; + break; + } + } + i->SetCrossCirclesPoint(cross); + } + else + { + qWarning()<<"Can't cast item"; + } +} + //--------------------------------------------------------------------------------------------------------------------- void VToolOptionsPropertyBrowser::AddProperty(VProperty *property, const QString &id) { @@ -864,26 +907,7 @@ void VToolOptionsPropertyBrowser::ChangeDataToolPointOfIntersectionArcs(VPropert case 28: // VAbstractTool::AttrCrossPoint { const QVariant value = property->data(VProperty::DPC_Data, Qt::EditRole); - bool ok = false; - const int val = value.toInt(&ok); - - CrossArcsPoint cross = CrossArcsPoint::FirstPoint; - if (ok) - { - switch(val) - { - case 0: - cross = CrossArcsPoint::FirstPoint; - break; - case 1: - cross = CrossArcsPoint::SecondPoint; - break; - default: - cross = CrossArcsPoint::FirstPoint; - break; - } - } - i->SetCrossArcsPoint(cross); + SetCrossCirclesPoint(value); break; } default: @@ -892,6 +916,39 @@ void VToolOptionsPropertyBrowser::ChangeDataToolPointOfIntersectionArcs(VPropert } } +//--------------------------------------------------------------------------------------------------------------------- +void VToolOptionsPropertyBrowser::ChangeDataToolPointOfIntersectionCircles(VProperty *property) +{ + SCASSERT(property != nullptr) + + const QVariant value = property->data(VProperty::DPC_Data, Qt::DisplayRole); + const QString id = propertyToId[property]; + + VToolPointOfIntersectionCircles *i = qgraphicsitem_cast(currentItem); + SCASSERT(i != nullptr); + switch (PropertiesList().indexOf(id)) + { + case 0: // VAbstractTool::AttrName + SetPointName(value.toString()); + break; + case 28: // VAbstractTool::AttrCrossPoint + { + const QVariant value = property->data(VProperty::DPC_Data, Qt::EditRole); + SetCrossCirclesPoint(value); + break; + } + case 29: // VAbstractTool::AttrC1Radius + i->SetFirstCircleRadius(value.value()); + break; + case 30: // VAbstractTool::AttrC2Radius + i->SetSecondCircleRadius(value.value()); + break; + default: + qWarning()<<"Unknown property type. id = "<(item); + i->ShowVisualization(true); + formView->setTitle(tr("Tool to make point from intersection two circles")); + + AddPropertyPointName(i, tr("Point label")); + AddPropertyFormula(tr("First circle radius"), i->GetFirstCircleRadius(), VAbstractTool::AttrC1Radius); + AddPropertyFormula(tr("Second circle radius"), i->GetSecondCircleRadius(), VAbstractTool::AttrC2Radius); + AddPropertyCrossPoint(i, tr("Take")); +} + //--------------------------------------------------------------------------------------------------------------------- void VToolOptionsPropertyBrowser::ShowOptionsToolShoulderPoint(QGraphicsItem *item) { @@ -1567,7 +1637,24 @@ void VToolOptionsPropertyBrowser::UpdateOptionsToolPointOfIntersectionArcs() VToolPointOfIntersectionArcs *i = qgraphicsitem_cast(currentItem); idToProperty[VAbstractTool::AttrName]->setValue(i->name()); - idToProperty[VAbstractTool::AttrCrossPoint]->setValue(static_cast(i->GetCrossArcsPoint())-1); + idToProperty[VAbstractTool::AttrCrossPoint]->setValue(static_cast(i->GetCrossCirclesPoint())-1); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolOptionsPropertyBrowser::UpdateOptionsToolPointOfIntersectionCircles() +{ + VToolPointOfIntersectionCircles *i = qgraphicsitem_cast(currentItem); + + idToProperty[VAbstractTool::AttrName]->setValue(i->name()); + idToProperty[VAbstractTool::AttrCrossPoint]->setValue(static_cast(i->GetCrossCirclesPoint())-1); + + QVariant c1Radius; + c1Radius.setValue(i->GetFirstCircleRadius()); + idToProperty[VAbstractTool::AttrC1Radius]->setValue(c1Radius); + + QVariant c2Radius; + c2Radius.setValue(i->GetSecondCircleRadius()); + idToProperty[VAbstractTool::AttrC2Radius]->setValue(c2Radius); } //--------------------------------------------------------------------------------------------------------------------- @@ -1697,6 +1784,8 @@ QStringList VToolOptionsPropertyBrowser::PropertiesList() const << VAbstractTool::AttrKCurve /* 25 */ << VAbstractTool::AttrLineColor /* 26 */ << VAbstractTool::AttrColor /* 27 */ - << VAbstractTool::AttrCrossPoint; /* 28 */ + << VAbstractTool::AttrCrossPoint /* 28 */ + << VAbstractTool::AttrC1Radius /* 29 */ + << VAbstractTool::AttrC2Radius; /* 30 */ return attr; } diff --git a/src/app/widgets/vtooloptionspropertybrowser.h b/src/app/widgets/vtooloptionspropertybrowser.h index f12b9d86f..32854778b 100644 --- a/src/app/widgets/vtooloptionspropertybrowser.h +++ b/src/app/widgets/vtooloptionspropertybrowser.h @@ -68,6 +68,9 @@ private: template void SetPointName(const QString &name); + template + void SetCrossCirclesPoint(const QVariant value); + template void AddPropertyPointName(Tool *i, const QString &propertyName); @@ -100,6 +103,7 @@ private: void ChangeDataToolPointOfContact(VPE::VProperty *property); void ChangeDataToolPointOfIntersection(VPE::VProperty *property); void ChangeDataToolPointOfIntersectionArcs(VPE::VProperty *property); + void ChangeDataToolPointOfIntersectionCircles(VPE::VProperty *property); void ChangeDataToolShoulderPoint(VPE::VProperty *property); void ChangeDataToolSpline(VPE::VProperty *property); void ChangeDataToolSplinePath(VPE::VProperty *property); @@ -122,6 +126,7 @@ private: void ShowOptionsToolPointOfContact(QGraphicsItem *item); void ShowOptionsToolPointOfIntersection(QGraphicsItem *item); void ShowOptionsToolPointOfIntersectionArcs(QGraphicsItem *item); + void ShowOptionsToolPointOfIntersectionCircles(QGraphicsItem *item); void ShowOptionsToolShoulderPoint(QGraphicsItem *item); void ShowOptionsToolSpline(QGraphicsItem *item); void ShowOptionsToolSplinePath(QGraphicsItem *item); @@ -144,6 +149,7 @@ private: void UpdateOptionsToolPointOfContact(); void UpdateOptionsToolPointOfIntersection(); void UpdateOptionsToolPointOfIntersectionArcs(); + void UpdateOptionsToolPointOfIntersectionCircles(); void UpdateOptionsToolShoulderPoint(); void UpdateOptionsToolSpline(); void UpdateOptionsToolSplinePath(); diff --git a/src/app/xml/vpattern.cpp b/src/app/xml/vpattern.cpp index bf920b614..7b912c7f4 100644 --- a/src/app/xml/vpattern.cpp +++ b/src/app/xml/vpattern.cpp @@ -1143,7 +1143,8 @@ void VPattern::ParsePointElement(VMainGraphicsScene *scene, QDomElement &domElem << VToolPointOfIntersection::ToolType << VToolCutSpline::ToolType << VToolCutSplinePath::ToolType << VToolCutArc::ToolType << VToolLineIntersectAxis::ToolType << VToolCurveIntersectAxis::ToolType - << VToolPointOfIntersectionArcs::ToolType; + << VToolPointOfIntersectionArcs::ToolType + << VToolPointOfIntersectionCircles::ToolType; switch (points.indexOf(type)) { case 0: //VToolSinglePoint::ToolType @@ -1640,7 +1641,7 @@ void VPattern::ParsePointElement(VMainGraphicsScene *scene, QDomElement &domElem PointsCommonAttributes(domElement, id, name, mx, my); const quint32 firstArcId = GetParametrUInt(domElement, VAbstractTool::AttrFirstArc, NULL_ID_STR); const quint32 secondArcId = GetParametrUInt(domElement, VAbstractTool::AttrSecondArc, NULL_ID_STR); - const CrossArcsPoint crossPoint = static_cast(GetParametrUInt(domElement, + const CrossCirclesPoint crossPoint = static_cast(GetParametrUInt(domElement, VAbstractTool::AttrCrossPoint, "1")); @@ -1654,6 +1655,37 @@ void VPattern::ParsePointElement(VMainGraphicsScene *scene, QDomElement &domElem throw excep; } break; + case 18: //VToolPointOfIntersectionCircles::ToolType + try + { + PointsCommonAttributes(domElement, id, name, mx, my); + const quint32 c1CenterId = GetParametrUInt(domElement, VAbstractTool::AttrC1Center, NULL_ID_STR); + const quint32 c2CenterId = GetParametrUInt(domElement, VAbstractTool::AttrC2Center, NULL_ID_STR); + const QString c1Radius = GetParametrString(domElement, VAbstractTool::AttrC1Radius); + QString c1R = c1Radius; + const QString c2Radius = GetParametrString(domElement, VAbstractTool::AttrC2Radius); + QString c2R = c2Radius; + const CrossCirclesPoint crossPoint = static_cast(GetParametrUInt(domElement, + VAbstractTool::AttrCrossPoint, + "1")); + + VToolPointOfIntersectionCircles::Create(id, name, c1CenterId, c2CenterId, c1R, c2R, crossPoint, mx, my, + scene, this, data, parse, Source::FromFile); + //Rewrite attribute formula. Need for situation when we have wrong formula. + if (c1R != c1Radius || c2R != c2Radius) + { + SetAttribute(domElement, VAbstractTool::AttrC1Center, c1R); + SetAttribute(domElement, VAbstractTool::AttrC2Center, c2R); + haveLiteChange(); + } + } + catch (const VExceptionBadId &e) + { + VExceptionObjectError excep(tr("Error creating or updating point of intersection circles"), domElement); + excep.AddMoreInformation(e.ErrorMessage()); + throw excep; + } + break; default: qDebug() << "Illegal point type in VDomDocument::ParsePointElement()."; break; diff --git a/src/app/xml/vpattern.h b/src/app/xml/vpattern.h index 04e9b1ba8..35c4acaf7 100644 --- a/src/app/xml/vpattern.h +++ b/src/app/xml/vpattern.h @@ -38,7 +38,7 @@ class VMainGraphicsScene; enum class Document : char { LiteParse, LitePPParse, FullParse }; enum class LabelType : char {NewPatternPiece, NewLabel}; -enum class CrossArcsPoint : char {FirstPoint = 1, SecondPoint = 2}; +enum class CrossCirclesPoint : char {FirstPoint = 1, SecondPoint = 2}; /** * @brief The VPattern class working with pattern file. diff --git a/src/libs/ifc/schema/pattern/v0.1.4.xsd b/src/libs/ifc/schema/pattern/v0.1.4.xsd index 059a82091..c73b2fe63 100644 --- a/src/libs/ifc/schema/pattern/v0.1.4.xsd +++ b/src/libs/ifc/schema/pattern/v0.1.4.xsd @@ -126,6 +126,10 @@ + + + +