diff --git a/Valentina.pro b/Valentina.pro index 74ac8fbca..f9b662a95 100644 --- a/Valentina.pro +++ b/Valentina.pro @@ -103,7 +103,10 @@ SOURCES += main.cpp\ dialogs/dialogheight.cpp \ tools/drawTools/vtooltriangle.cpp \ tools/modelingTools/vmodelingtriangle.cpp \ - dialogs/dialogtriangle.cpp + dialogs/dialogtriangle.cpp \ + dialogs/dialogpointofintersection.cpp \ + tools/drawTools/vtoolpointofintersection.cpp \ + tools/modelingTools/vmodelingpointofintersection.cpp HEADERS += mainwindow.h \ widgets/vmaingraphicsscene.h \ @@ -200,7 +203,10 @@ HEADERS += mainwindow.h \ dialogs/dialogheight.h \ tools/drawTools/vtooltriangle.h \ tools/modelingTools/vmodelingtriangle.h \ - dialogs/dialogtriangle.h + dialogs/dialogtriangle.h \ + dialogs/dialogpointofintersection.h \ + tools/drawTools/vtoolpointofintersection.h \ + tools/modelingTools/vmodelingpointofintersection.h FORMS += mainwindow.ui \ dialogs/dialogsinglepoint.ui \ @@ -220,7 +226,8 @@ FORMS += mainwindow.ui \ dialogs/dialogdetail.ui \ tablewindow.ui \ dialogs/dialogheight.ui \ - dialogs/dialogtriangle.ui + dialogs/dialogtriangle.ui \ + dialogs/dialogpointofintersection.ui RESOURCES += \ icon.qrc \ diff --git a/cursor.qrc b/cursor.qrc index a0827a0a2..785c3ddd8 100644 --- a/cursor.qrc +++ b/cursor.qrc @@ -14,5 +14,6 @@ cursor/new_detail_cursor.png cursor/height_cursor.png cursor/triangle_cursor.png + cursor/pointofintersect_cursor.png diff --git a/cursor/pointofintersect_cursor.png b/cursor/pointofintersect_cursor.png new file mode 100644 index 000000000..c01923887 Binary files /dev/null and b/cursor/pointofintersect_cursor.png differ diff --git a/dialogs/dialogpointofintersection.cpp b/dialogs/dialogpointofintersection.cpp new file mode 100644 index 000000000..04f239337 --- /dev/null +++ b/dialogs/dialogpointofintersection.cpp @@ -0,0 +1,98 @@ +#include "dialogpointofintersection.h" +#include "ui_dialogpointofintersection.h" + +DialogPointOfIntersection::DialogPointOfIntersection(const VContainer *data, Draw::Draws mode, QWidget *parent) : + DialogTool(data, mode, parent), ui(new Ui::DialogPointOfIntersection), number(0), pointName(QString()), + firstPointId(0), secondPointId(0){ + ui->setupUi(this); + labelEditNamePoint = ui->labelEditNamePoint; + bOk = ui->buttonBox->button(QDialogButtonBox::Ok); + connect(bOk, &QPushButton::clicked, this, &DialogPointOfIntersection::DialogAccepted); + flagName = false; + CheckState(); + QPushButton *bCansel = ui->buttonBox->button(QDialogButtonBox::Cancel); + connect(bCansel, &QPushButton::clicked, this, &DialogPointOfIntersection::DialogRejected); + FillComboBoxPoints(ui->comboBoxFirstPoint); + FillComboBoxPoints(ui->comboBoxSecondPoint); + connect(ui->lineEditNamePoint, &QLineEdit::textChanged, this, &DialogPointOfIntersection::NamePointChanged); +} + +DialogPointOfIntersection::~DialogPointOfIntersection(){ + delete ui; +} + +qint64 DialogPointOfIntersection::getSecondPointId() const{ + return secondPointId; +} + +void DialogPointOfIntersection::setSecondPointId(const qint64 &value, const qint64 &id){ + secondPointId = value; + setCurrentPointId(ui->comboBoxSecondPoint, secondPointId, value, id); +} + +void DialogPointOfIntersection::ChoosedObject(qint64 id, Scene::Scenes type){ + if(idDetail == 0 && mode == Draw::Modeling){ + if(type == Scene::Detail){ + idDetail = id; + return; + } + } + if(mode == Draw::Modeling){ + if(!CheckObject(id)){ + return; + } + } + if(type == Scene::Point){ + VPointF point; + if(mode == Draw::Calculation){ + point = data->GetPoint(id); + } else { + point = data->GetModelingPoint(id); + } + if(number == 0){ + qint32 index = ui->comboBoxFirstPoint->findText(point.name()); + if ( index != -1 ) { // -1 for not found + ui->comboBoxFirstPoint->setCurrentIndex(index); + number++; + emit ToolTip(tr("Select point horizontally")); + return; + } + } + if(number == 1){ + qint32 index = ui->comboBoxSecondPoint->findText(point.name()); + if ( index != -1 ) { // -1 for not found + ui->comboBoxSecondPoint->setCurrentIndex(index); + number = 0; + emit ToolTip(""); + } + if(!isInitialized){ + this->show(); + } + } + } +} + +void DialogPointOfIntersection::DialogAccepted(){ + pointName = ui->lineEditNamePoint->text(); + firstPointId = getCurrentPointId(ui->comboBoxFirstPoint); + secondPointId = getCurrentPointId(ui->comboBoxSecondPoint); + emit DialogClosed(QDialog::Accepted); +} + +qint64 DialogPointOfIntersection::getFirstPointId() const{ + return firstPointId; +} + +void DialogPointOfIntersection::setFirstPointId(const qint64 &value, const qint64 &id){ + firstPointId = value; + setCurrentPointId(ui->comboBoxFirstPoint, firstPointId, value, id); +} + +QString DialogPointOfIntersection::getPointName() const{ + return pointName; +} + +void DialogPointOfIntersection::setPointName(const QString &value){ + pointName = value; + ui->lineEditNamePoint->setText(pointName); +} diff --git a/dialogs/dialogpointofintersection.h b/dialogs/dialogpointofintersection.h new file mode 100644 index 000000000..7ffb57604 --- /dev/null +++ b/dialogs/dialogpointofintersection.h @@ -0,0 +1,34 @@ +#ifndef DIALOGPOINTOFINTERSECTION_H +#define DIALOGPOINTOFINTERSECTION_H + +#include "dialogtool.h" + +namespace Ui { +class DialogPointOfIntersection; +} + +class DialogPointOfIntersection : public DialogTool{ + Q_OBJECT +public: + DialogPointOfIntersection(const VContainer *data, Draw::Draws mode = Draw::Calculation, + QWidget *parent = 0); + ~DialogPointOfIntersection(); + QString getPointName() const; + void setPointName(const QString &value); + qint64 getFirstPointId() const; + void setFirstPointId(const qint64 &value, const qint64 &id); + qint64 getSecondPointId() const; + void setSecondPointId(const qint64 &value, const qint64 &id); +public slots: + virtual void ChoosedObject(qint64 id, Scene::Scenes type); + virtual void DialogAccepted(); +private: + Q_DISABLE_COPY(DialogPointOfIntersection) + Ui::DialogPointOfIntersection *ui; + qint32 number; + QString pointName; + qint64 firstPointId; + qint64 secondPointId; +}; + +#endif // DIALOGPOINTOFINTERSECTION_H diff --git a/dialogs/dialogpointofintersection.ui b/dialogs/dialogpointofintersection.ui new file mode 100644 index 000000000..303aa8cc0 --- /dev/null +++ b/dialogs/dialogpointofintersection.ui @@ -0,0 +1,169 @@ + + + DialogPointOfIntersection + + + + 0 + 0 + 293 + 180 + + + + Dialog + + + + + + + + + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 159 + 158 + 158 + + + + + + + + Name new point + + + + + + + + + + + + + + + 0 + 0 + + + + Point vertically + + + + + + + First point of angle + + + + + + + + + + + + 0 + 0 + + + + Point horizontally + + + + + + + Second point of angle + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + DialogPointOfIntersection + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DialogPointOfIntersection + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/icon.qrc b/icon.qrc index 520ff398d..66b939f04 100644 --- a/icon.qrc +++ b/icon.qrc @@ -36,5 +36,6 @@ icon/16x16/mirror.png icon/32x32/height.png icon/32x32/triangle.png + icon/32x32/point_of_intersection.png diff --git a/icon/32x32/point_of_intersection.png b/icon/32x32/point_of_intersection.png new file mode 100644 index 000000000..7ab757dde Binary files /dev/null and b/icon/32x32/point_of_intersection.png differ diff --git a/mainwindow.cpp b/mainwindow.cpp index f32f20d3c..40a25f252 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -49,6 +49,7 @@ MainWindow::MainWindow(QWidget *parent) : dialogPointOfContact(QSharedPointer()), dialogDetail(QSharedPointer()), dialogHeight(QSharedPointer()), dialogTriangle(QSharedPointer()), + dialogPointOfIntersection(QSharedPointer()), dialogHistory(0), doc(0), data(0), comboBoxDraws(0), fileName(QString()), changeInFile(false), mode(Draw::Calculation){ ui->setupUi(this); @@ -94,6 +95,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->toolButtonNewDetail, &QToolButton::clicked, this, &MainWindow::ToolDetail); connect(ui->toolButtonHeight, &QToolButton::clicked, this, &MainWindow::ToolHeight); connect(ui->toolButtonTriangle, &QToolButton::clicked, this, &MainWindow::ToolTriangle); + connect(ui->toolButtonPointOfIntersection, &QToolButton::clicked, this, &MainWindow::ToolPointOfIntersection); data = new VContainer; @@ -485,7 +487,7 @@ void MainWindow::ClosedDialogHeight(int result){ void MainWindow::ToolTriangle(bool checked){ SetToolButton(checked, Tool::Triangle, ":/cursor/triangle_cursor.png", tr("Select first point of axis"), - dialogTriangle, &MainWindow::ClosedDialogTriangle); + dialogTriangle, &MainWindow::ClosedDialogTriangle); } void MainWindow::ClosedDialogTriangle(int result){ @@ -500,6 +502,26 @@ void MainWindow::ClosedDialogTriangle(int result){ ArrowTool(); } +void MainWindow::ToolPointOfIntersection(bool checked){ + SetToolButton(checked, Tool::PointOfIntersection, ":/cursor/pointofintersect_cursor.png", + tr("Select point vertically"), + dialogPointOfIntersection, &MainWindow::ClosedDialogPointOfIntersection); +} + +void MainWindow::ClosedDialogPointOfIntersection(int result){ + if(result == QDialog::Accepted){ + if(mode == Draw::Calculation){ + VToolPointOfIntersection::Create(dialogPointOfIntersection, currentScene, doc, data); + } else { + VModelingPointOfIntersection *point = VModelingPointOfIntersection::Create(dialogPointOfIntersection, + doc, data); + AddToolToDetail(point, point->getId(), Tool::PointOfIntersection, + dialogPointOfIntersection->getIdDetail()); + } + } + ArrowTool(); +} + void MainWindow::About(){ QMessageBox::about(this, tr("About Valentina"), tr("Valentina v.0.1.0")); } @@ -744,6 +766,12 @@ void MainWindow::CanselTool(){ currentScene->setFocus(Qt::OtherFocusReason); currentScene->clearSelection(); break; + case Tool::PointOfIntersection: + dialogPointOfIntersection.clear(); + ui->toolButtonPointOfIntersection->setChecked(false); + currentScene->setFocus(Qt::OtherFocusReason); + currentScene->clearSelection(); + break; default: qWarning()<<"Get wrong tool type. Ignore."; break; @@ -986,6 +1014,7 @@ void MainWindow::SetEnableTool(bool enable){ ui->toolButtonNewDetail->setEnabled(enable); ui->toolButtonHeight->setEnabled(enable); ui->toolButtonTriangle->setEnabled(enable); + ui->toolButtonPointOfIntersection->setEnabled(enable); } void MainWindow::MinimumScrollBar(){ diff --git a/mainwindow.h b/mainwindow.h index 2b65763b8..fca2537a4 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -81,6 +81,7 @@ public slots: void ToolDetail(bool checked); void ToolHeight(bool checked); void ToolTriangle(bool checked); + void ToolPointOfIntersection(bool checked); void ClosedDialogEndLine(int result); void ClosedDialogLine(int result); void ClosedDialogAlongLine(int result); @@ -95,6 +96,7 @@ public slots: void ClosedDialogDetail(int result); void ClosedDialogHeight(int result); void ClosedDialogTriangle(int result); + void ClosedDialogPointOfIntersection(int result); void About(); void AboutQt(); void ShowToolTip(const QString &toolTip); @@ -126,27 +128,28 @@ private: VMainGraphicsView *view; bool isInitialized; DialogIncrements *dialogTable; - QSharedPointer dialogEndLine; - QSharedPointer dialogLine; - QSharedPointer dialogAlongLine; - QSharedPointer dialogShoulderPoint; - QSharedPointer dialogNormal; - QSharedPointer dialogBisector; - QSharedPointer dialogLineIntersect; - QSharedPointer dialogSpline; - QSharedPointer dialogArc; - QSharedPointer dialogSplinePath; - QSharedPointer dialogPointOfContact; - QSharedPointer dialogDetail; - QSharedPointer dialogHeight; - QSharedPointer dialogTriangle; + QSharedPointer dialogEndLine; + QSharedPointer dialogLine; + QSharedPointer dialogAlongLine; + QSharedPointer dialogShoulderPoint; + QSharedPointer dialogNormal; + QSharedPointer dialogBisector; + QSharedPointer dialogLineIntersect; + QSharedPointer dialogSpline; + QSharedPointer dialogArc; + QSharedPointer dialogSplinePath; + QSharedPointer dialogPointOfContact; + QSharedPointer dialogDetail; + QSharedPointer dialogHeight; + QSharedPointer dialogTriangle; + QSharedPointer dialogPointOfIntersection; DialogHistory *dialogHistory; VDomDocument *doc; VContainer *data; QComboBox *comboBoxDraws; QString fileName; bool changeInFile; - Draw::Draws mode; + Draw::Draws mode; void ToolBarOption(); void ToolBarDraws(); void CanselTool(); diff --git a/mainwindow.ui b/mainwindow.ui index 920dd684a..2ea6899fd 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -272,6 +272,29 @@ + + + + false + + + ... + + + + :/icon/32x32/point_of_intersection.png:/icon/32x32/point_of_intersection.png + + + + 32 + 32 + + + + true + + + @@ -279,7 +302,7 @@ 0 0 - 100 + 150 58 @@ -355,7 +378,7 @@ 0 0 - 100 + 150 58 @@ -431,7 +454,7 @@ 0 0 - 98 + 150 58 @@ -481,7 +504,7 @@ 0 0 - 98 + 150 58 diff --git a/options.h b/options.h index 71aaa9dfd..5e1a70fab 100644 --- a/options.h +++ b/options.h @@ -57,7 +57,8 @@ enum Tool {ArrowTool, NodeSpline, NodeSplinePath, Height, - Triangle + Triangle, + PointOfIntersection }; Q_DECLARE_FLAGS(Tools, Tool) diff --git a/tools/drawTools/drawtools.h b/tools/drawTools/drawtools.h index 8051d3641..0b07ebc2b 100644 --- a/tools/drawTools/drawtools.h +++ b/tools/drawTools/drawtools.h @@ -36,5 +36,6 @@ #include "vtoolsplinepath.h" #include "vtoolheight.h" #include "vtooltriangle.h" +#include "vtoolpointofintersection.h" #endif // DRAWTOOLS_H diff --git a/tools/drawTools/vtoolline.cpp b/tools/drawTools/vtoolline.cpp index e3fb9e9ac..ced59ed03 100644 --- a/tools/drawTools/vtoolline.cpp +++ b/tools/drawTools/vtoolline.cpp @@ -26,6 +26,7 @@ VToolLine::VToolLine(VDomDocument *doc, VContainer *data, qint64 id, qint64 firs Tool::Sources typeCreation, QGraphicsItem *parent):VDrawTool(doc, data, id), QGraphicsLineItem(parent), firstPoint(firstPoint), secondPoint(secondPoint), dialogLine(QSharedPointer()){ + ignoreFullUpdate = true; //Лінія VPointF first = data->GetPoint(firstPoint); VPointF second = data->GetPoint(secondPoint); diff --git a/tools/drawTools/vtoollineintersect.cpp b/tools/drawTools/vtoollineintersect.cpp index 132013d5a..797ce2c26 100644 --- a/tools/drawTools/vtoollineintersect.cpp +++ b/tools/drawTools/vtoollineintersect.cpp @@ -28,6 +28,7 @@ VToolLineIntersect::VToolLineIntersect(VDomDocument *doc, VContainer *data, cons QGraphicsItem *parent): VToolPoint(doc, data, id, parent), p1Line1(p1Line1), p2Line1(p2Line1), p1Line2(p1Line2), p2Line2(p2Line2), dialogLineIntersect(QSharedPointer()){ + ignoreFullUpdate = true; if(typeCreation == Tool::FromGui){ AddToFile(); } diff --git a/tools/drawTools/vtoolpointofintersection.cpp b/tools/drawTools/vtoolpointofintersection.cpp new file mode 100644 index 000000000..10ef3c214 --- /dev/null +++ b/tools/drawTools/vtoolpointofintersection.cpp @@ -0,0 +1,106 @@ +#include "vtoolpointofintersection.h" + +VToolPointOfIntersection::VToolPointOfIntersection(VDomDocument *doc, VContainer *data, const qint64 &id, + const qint64 &firstPointId, const qint64 &secondPointId, + Tool::Sources typeCreation, QGraphicsItem *parent) + :VToolPoint(doc, data, id, parent), firstPointId(firstPointId), secondPointId(secondPointId), + dialogPointOfIntersection(QSharedPointer()) { + ignoreFullUpdate = true; + if(typeCreation == Tool::FromGui){ + AddToFile(); + } +} + +void VToolPointOfIntersection::setDialog(){ + Q_ASSERT(!dialogPointOfIntersection.isNull()); + VPointF p = VAbstractTool::data.GetPoint(id); + dialogPointOfIntersection->setFirstPointId(firstPointId, id); + dialogPointOfIntersection->setSecondPointId(secondPointId, id); + dialogPointOfIntersection->setPointName(p.name()); +} + +void VToolPointOfIntersection::Create(QSharedPointer &dialog, VMainGraphicsScene *scene, + VDomDocument *doc, VContainer *data){ + qint64 firstPointId = dialog->getFirstPointId(); + qint64 secondPointId = dialog->getSecondPointId(); + QString pointName = dialog->getPointName(); + Create(0, pointName, firstPointId, secondPointId, 5, 10, scene, doc, data, Document::FullParse, Tool::FromGui); +} + +void VToolPointOfIntersection::Create(const qint64 _id, const QString &pointName, const qint64 &firstPointId, + const qint64 &secondPointId, const qreal &mx, const qreal &my, + VMainGraphicsScene *scene, VDomDocument *doc, VContainer *data, + const Document::Documents &parse, Tool::Sources typeCreation){ + VPointF firstPoint = data->GetPoint(firstPointId); + VPointF secondPoint = data->GetPoint(secondPointId); + + QPointF point(firstPoint.x(), secondPoint.y()); + qint64 id = _id; + if(typeCreation == Tool::FromGui){ + id = data->AddPoint(VPointF(point.x(), point.y(), pointName, mx, my)); + } else { + data->UpdatePoint(id, VPointF(point.x(), point.y(), pointName, mx, my)); + if(parse != Document::FullParse){ + doc->UpdateToolData(id, data); + } + } + VDrawTool::AddRecord(id, Tool::Triangle, doc); + if(parse == Document::FullParse){ + VToolPointOfIntersection *point = new VToolPointOfIntersection(doc, data, id, firstPointId, + secondPointId, typeCreation); + scene->addItem(point); + connect(point, &VToolPointOfIntersection::ChoosedTool, scene, &VMainGraphicsScene::ChoosedItem); + connect(point, &VToolPointOfIntersection::RemoveTool, scene, &VMainGraphicsScene::RemoveTool); + connect(scene, &VMainGraphicsScene::NewFactor, point, &VToolPointOfIntersection::SetFactor); + doc->AddTool(id, point); + doc->IncrementReferens(firstPointId); + doc->IncrementReferens(secondPointId); + } +} + +void VToolPointOfIntersection::FullUpdateFromFile(){ + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + firstPointId = domElement.attribute("firstPoint", "").toLongLong(); + secondPointId = domElement.attribute("secondPoint", "").toLongLong(); + } + VToolPoint::RefreshPointGeometry(VDrawTool::data.GetPoint(id)); +} + +void VToolPointOfIntersection::FullUpdateFromGui(int result){ + if(result == QDialog::Accepted){ + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + domElement.setAttribute("name", dialogPointOfIntersection->getPointName()); + domElement.setAttribute("firstPoint", QString().setNum(dialogPointOfIntersection->getFirstPointId())); + domElement.setAttribute("secondPoint", QString().setNum(dialogPointOfIntersection->getSecondPointId())); + emit FullUpdateTree(); + } + } + dialogPointOfIntersection.clear(); +} + +void VToolPointOfIntersection::RemoveReferens(){ + doc->DecrementReferens(firstPointId); + doc->DecrementReferens(secondPointId); +} + +void VToolPointOfIntersection::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ + ContextMenu(dialogPointOfIntersection, this, event); +} + +void VToolPointOfIntersection::AddToFile(){ + VPointF point = VAbstractTool::data.GetPoint(id); + QDomElement domElement = doc->createElement("point"); + + AddAttribute(domElement, "id", id); + AddAttribute(domElement, "type", "pointOfIntersection"); + AddAttribute(domElement, "name", point.name()); + AddAttribute(domElement, "mx", toMM(point.mx())); + AddAttribute(domElement, "my", toMM(point.my())); + + AddAttribute(domElement, "firstPoint", firstPointId); + AddAttribute(domElement, "secondPoint", secondPointId); + + AddToCalculation(domElement); +} diff --git a/tools/drawTools/vtoolpointofintersection.h b/tools/drawTools/vtoolpointofintersection.h new file mode 100644 index 000000000..206ad322f --- /dev/null +++ b/tools/drawTools/vtoolpointofintersection.h @@ -0,0 +1,33 @@ +#ifndef VTOOLPOINTOFINTERSECTION_H +#define VTOOLPOINTOFINTERSECTION_H + +#include "vtoolpoint.h" +#include "dialogs/dialogpointofintersection.h" + +class VToolPointOfIntersection : public VToolPoint{ + Q_OBJECT +public: + VToolPointOfIntersection(VDomDocument *doc, VContainer *data, const qint64 &id, const qint64 &firstPointId, + const qint64 &secondPointId, Tool::Sources typeCreation, QGraphicsItem * parent = 0); + virtual void setDialog(); + static void Create(QSharedPointer &dialog, VMainGraphicsScene *scene, + VDomDocument *doc, VContainer *data); + static void Create(const qint64 _id, const QString &pointName, const qint64 &firstPointId, + const qint64 &secondPointId, const qreal &mx, const qreal &my, + VMainGraphicsScene *scene, VDomDocument *doc, VContainer *data, + const Document::Documents &parse, Tool::Sources typeCreation); +public slots: + virtual void FullUpdateFromFile(); + virtual void FullUpdateFromGui(int result); +protected: + virtual void RemoveReferens(); + virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); + virtual void AddToFile(); +private: + Q_DISABLE_COPY(VToolPointOfIntersection) + qint64 firstPointId; + qint64 secondPointId; + QSharedPointer dialogPointOfIntersection; +}; + +#endif // VTOOLPOINTOFINTERSECTION_H diff --git a/tools/drawTools/vtoolspline.cpp b/tools/drawTools/vtoolspline.cpp index 25efb8ab6..00d3478fb 100644 --- a/tools/drawTools/vtoolspline.cpp +++ b/tools/drawTools/vtoolspline.cpp @@ -28,6 +28,7 @@ VToolSpline::VToolSpline(VDomDocument *doc, VContainer *data, qint64 id, Tool::Sources typeCreation, QGraphicsItem *parent):VDrawTool(doc, data, id), QGraphicsPathItem(parent), dialogSpline(QSharedPointer()), controlPoints(QVector()){ + ignoreFullUpdate = true; VSpline spl = data->GetSpline(id); QPainterPath path; diff --git a/tools/drawTools/vtoolsplinepath.cpp b/tools/drawTools/vtoolsplinepath.cpp index ca9fb7b0d..f13333e62 100644 --- a/tools/drawTools/vtoolsplinepath.cpp +++ b/tools/drawTools/vtoolsplinepath.cpp @@ -27,6 +27,7 @@ VToolSplinePath::VToolSplinePath(VDomDocument *doc, VContainer *data, qint64 id, QGraphicsItem *parent):VDrawTool(doc, data, id), QGraphicsPathItem(parent), dialogSplinePath(QSharedPointer()), controlPoints(QVector()){ + ignoreFullUpdate = true; VSplinePath splPath = data->GetSplinePath(id); QPainterPath path; path.addPath(splPath.GetPath()); diff --git a/tools/drawTools/vtooltriangle.cpp b/tools/drawTools/vtooltriangle.cpp index d19f498b7..79fd2c3d2 100644 --- a/tools/drawTools/vtooltriangle.cpp +++ b/tools/drawTools/vtooltriangle.cpp @@ -5,6 +5,7 @@ VToolTriangle::VToolTriangle(VDomDocument *doc, VContainer *data, const qint64 & const qint64 &secondPointId, Tool::Sources typeCreation, QGraphicsItem *parent) :VToolPoint(doc, data, id, parent), axisP1Id(axisP1Id), axisP2Id(axisP2Id), firstPointId(firstPointId), secondPointId(secondPointId), dialogTriangle(QSharedPointer()) { + ignoreFullUpdate = true; if(typeCreation == Tool::FromGui){ AddToFile(); } @@ -29,7 +30,6 @@ void VToolTriangle::Create(QSharedPointer &dialog, VMainGraphics QString pointName = dialog->getPointName(); Create(0, pointName, axisP1Id, axisP2Id, firstPointId, secondPointId, 5, 10, scene, doc, data, Document::FullParse, Tool::FromGui); - } void VToolTriangle::Create(const qint64 _id, const QString &pointName, const qint64 &axisP1Id, diff --git a/tools/modelingTools/modelingtools.h b/tools/modelingTools/modelingtools.h index bd61fee59..2fbf1dfad 100644 --- a/tools/modelingTools/modelingtools.h +++ b/tools/modelingTools/modelingtools.h @@ -36,5 +36,6 @@ #include "vmodelingsplinepath.h" #include "vmodelingheight.h" #include "vmodelingtriangle.h" +#include "vmodelingpointofintersection.h" #endif // MODELINGTOOLS_H diff --git a/tools/modelingTools/vmodelingline.cpp b/tools/modelingTools/vmodelingline.cpp index b9c03f4ca..ea09c70a7 100644 --- a/tools/modelingTools/vmodelingline.cpp +++ b/tools/modelingTools/vmodelingline.cpp @@ -26,6 +26,7 @@ VModelingLine::VModelingLine(VDomDocument *doc, VContainer *data, qint64 id, qin qint64 secondPoint, Tool::Sources typeCreation, QGraphicsItem *parent): VModelingTool(doc, data, id), QGraphicsLineItem(parent), firstPoint(firstPoint), secondPoint(secondPoint), dialogLine(QSharedPointer()){ + ignoreFullUpdate = true; //Лінія VPointF first = data->GetModelingPoint(firstPoint); VPointF second = data->GetModelingPoint(secondPoint); diff --git a/tools/modelingTools/vmodelinglineintersect.cpp b/tools/modelingTools/vmodelinglineintersect.cpp index 51a45e7d0..0ae7c31a3 100644 --- a/tools/modelingTools/vmodelinglineintersect.cpp +++ b/tools/modelingTools/vmodelinglineintersect.cpp @@ -26,6 +26,7 @@ VModelingLineIntersect::VModelingLineIntersect(VDomDocument *doc, VContainer *da const qint64 &p2Line2, Tool::Sources typeCreation, QGraphicsItem *parent): VModelingPoint(doc, data, id, parent), p1Line1(p1Line1), p2Line1(p2Line1), p1Line2(p1Line2), p2Line2(p2Line2), dialogLineIntersect(QSharedPointer()){ + ignoreFullUpdate = true; if(typeCreation == Tool::FromGui){ AddToFile(); } diff --git a/tools/modelingTools/vmodelingpointofintersection.cpp b/tools/modelingTools/vmodelingpointofintersection.cpp new file mode 100644 index 000000000..70d4db79d --- /dev/null +++ b/tools/modelingTools/vmodelingpointofintersection.cpp @@ -0,0 +1,105 @@ +#include "vmodelingpointofintersection.h" + +VModelingPointOfIntersection::VModelingPointOfIntersection(VDomDocument *doc, VContainer *data, const qint64 &id, + const qint64 &firstPointId, const qint64 &secondPointId, + Tool::Sources typeCreation, QGraphicsItem *parent) + :VModelingPoint(doc, data, id, parent), firstPointId(firstPointId), secondPointId(secondPointId), + dialogPointOfIntersection(QSharedPointer()) { + ignoreFullUpdate = true; + if(typeCreation == Tool::FromGui){ + AddToFile(); + } +} + +void VModelingPointOfIntersection::setDialog(){ + Q_ASSERT(!dialogPointOfIntersection.isNull()); + VPointF p = VAbstractTool::data.GetPoint(id); + dialogPointOfIntersection->setFirstPointId(firstPointId, id); + dialogPointOfIntersection->setSecondPointId(secondPointId, id); + dialogPointOfIntersection->setPointName(p.name()); +} + +VModelingPointOfIntersection *VModelingPointOfIntersection::Create(QSharedPointer &dialog, + VDomDocument *doc, VContainer *data){ + qint64 firstPointId = dialog->getFirstPointId(); + qint64 secondPointId = dialog->getSecondPointId(); + QString pointName = dialog->getPointName(); + return Create(0, pointName, firstPointId, secondPointId, 5, 10, doc, data, Document::FullParse, Tool::FromGui); +} + +VModelingPointOfIntersection *VModelingPointOfIntersection::Create(const qint64 _id, const QString &pointName, + const qint64 &firstPointId, + const qint64 &secondPointId, const qreal &mx, + const qreal &my, VDomDocument *doc, + VContainer *data, + const Document::Documents &parse, + Tool::Sources typeCreation){ + VModelingPointOfIntersection *tool = 0; + VPointF firstPoint = data->GetPoint(firstPointId); + VPointF secondPoint = data->GetPoint(secondPointId); + + QPointF point(firstPoint.x(), secondPoint.y()); + qint64 id = _id; + if(typeCreation == Tool::FromGui){ + id = data->AddPoint(VPointF(point.x(), point.y(), pointName, mx, my)); + } else { + data->UpdatePoint(id, VPointF(point.x(), point.y(), pointName, mx, my)); + if(parse != Document::FullParse){ + doc->UpdateToolData(id, data); + } + } + if(parse == Document::FullParse){ + tool = new VModelingPointOfIntersection(doc, data, id, firstPointId, secondPointId, typeCreation); + doc->AddTool(id, tool); + doc->IncrementReferens(firstPointId); + doc->IncrementReferens(secondPointId); + } + return tool; +} + +void VModelingPointOfIntersection::FullUpdateFromFile(){ + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + firstPointId = domElement.attribute("firstPoint", "").toLongLong(); + secondPointId = domElement.attribute("secondPoint", "").toLongLong(); + } + VModelingPoint::RefreshPointGeometry(VModelingTool::data.GetPoint(id)); +} + +void VModelingPointOfIntersection::FullUpdateFromGui(int result){ + if(result == QDialog::Accepted){ + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + domElement.setAttribute("name", dialogPointOfIntersection->getPointName()); + domElement.setAttribute("firstPoint", QString().setNum(dialogPointOfIntersection->getFirstPointId())); + domElement.setAttribute("secondPoint", QString().setNum(dialogPointOfIntersection->getSecondPointId())); + emit FullUpdateTree(); + } + } + dialogPointOfIntersection.clear(); +} + +void VModelingPointOfIntersection::RemoveReferens(){ + doc->DecrementReferens(firstPointId); + doc->DecrementReferens(secondPointId); +} + +void VModelingPointOfIntersection::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ + ContextMenu(dialogPointOfIntersection, this, event); +} + +void VModelingPointOfIntersection::AddToFile(){ + VPointF point = VAbstractTool::data.GetPoint(id); + QDomElement domElement = doc->createElement("point"); + + AddAttribute(domElement, "id", id); + AddAttribute(domElement, "type", "pointOfIntersection"); + AddAttribute(domElement, "name", point.name()); + AddAttribute(domElement, "mx", toMM(point.mx())); + AddAttribute(domElement, "my", toMM(point.my())); + + AddAttribute(domElement, "firstPoint", firstPointId); + AddAttribute(domElement, "secondPoint", secondPointId); + + AddToModeling(domElement); +} diff --git a/tools/modelingTools/vmodelingpointofintersection.h b/tools/modelingTools/vmodelingpointofintersection.h new file mode 100644 index 000000000..1c4c94397 --- /dev/null +++ b/tools/modelingTools/vmodelingpointofintersection.h @@ -0,0 +1,35 @@ +#ifndef VMODELINGPOINTOFINTERSECTION_H +#define VMODELINGPOINTOFINTERSECTION_H + +#include "vmodelingpoint.h" +#include "dialogs/dialogpointofintersection.h" + +class VModelingPointOfIntersection : public VModelingPoint{ + Q_OBJECT +public: + VModelingPointOfIntersection(VDomDocument *doc, VContainer *data, const qint64 &id, + const qint64 &firstPointId, const qint64 &secondPointId, + Tool::Sources typeCreation, QGraphicsItem * parent = 0); + virtual void setDialog(); + static VModelingPointOfIntersection* Create(QSharedPointer &dialog, VDomDocument *doc, + VContainer *data); + static VModelingPointOfIntersection* Create(const qint64 _id, const QString &pointName, + const qint64 &firstPointId, const qint64 &secondPointId, + const qreal &mx, const qreal &my, VDomDocument *doc, + VContainer *data, const Document::Documents &parse, + Tool::Sources typeCreation); +public slots: + virtual void FullUpdateFromFile(); + virtual void FullUpdateFromGui(int result); +protected: + virtual void RemoveReferens(); + virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); + virtual void AddToFile(); +private: + Q_DISABLE_COPY(VModelingPointOfIntersection) + qint64 firstPointId; + qint64 secondPointId; + QSharedPointer dialogPointOfIntersection; +}; + +#endif // VMODELINGPOINTOFINTERSECTION_H diff --git a/tools/modelingTools/vmodelingspline.cpp b/tools/modelingTools/vmodelingspline.cpp index 17467591b..ccc1a8bb6 100644 --- a/tools/modelingTools/vmodelingspline.cpp +++ b/tools/modelingTools/vmodelingspline.cpp @@ -29,7 +29,7 @@ VModelingSpline::VModelingSpline(VDomDocument *doc, VContainer *data, qint64 id, Tool::Sources typeCreation, QGraphicsItem *parent):VModelingTool(doc, data, id), QGraphicsPathItem(parent), dialogSpline(QSharedPointer()), controlPoints(QVector()){ - + ignoreFullUpdate = true; VSpline spl = data->GetModelingSpline(id); QPainterPath path; path.addPath(spl.GetPath()); diff --git a/tools/modelingTools/vmodelingsplinepath.cpp b/tools/modelingTools/vmodelingsplinepath.cpp index 6756e0d4c..75d4f6c98 100644 --- a/tools/modelingTools/vmodelingsplinepath.cpp +++ b/tools/modelingTools/vmodelingsplinepath.cpp @@ -27,6 +27,7 @@ VModelingSplinePath::VModelingSplinePath(VDomDocument *doc, VContainer *data, qi QGraphicsItem *parent):VModelingTool(doc, data, id), QGraphicsPathItem(parent), dialogSplinePath(QSharedPointer()), controlPoints(QVector()){ + ignoreFullUpdate = true; VSplinePath splPath = data->GetModelingSplinePath(id); QPainterPath path; path.addPath(splPath.GetPath()); diff --git a/tools/modelingTools/vmodelingtriangle.cpp b/tools/modelingTools/vmodelingtriangle.cpp index e2f722a07..feeb7c1c5 100644 --- a/tools/modelingTools/vmodelingtriangle.cpp +++ b/tools/modelingTools/vmodelingtriangle.cpp @@ -32,7 +32,6 @@ VModelingTriangle *VModelingTriangle::Create(QSharedPointer &dia QString pointName = dialog->getPointName(); return Create(0, pointName, axisP1Id, axisP2Id, firstPointId, secondPointId, 5, 10, doc, data, Document::FullParse, Tool::FromGui); - } VModelingTriangle *VModelingTriangle::Create(const qint64 _id, const QString &pointName, diff --git a/xml/vdomdocument.cpp b/xml/vdomdocument.cpp index e4d31e700..7d3cfc2fd 100644 --- a/xml/vdomdocument.cpp +++ b/xml/vdomdocument.cpp @@ -857,6 +857,30 @@ void VDomDocument::ParsePointElement(VMainGraphicsScene *scene, const QDomElemen throw excep; } } + if(type == "pointOfIntersection"){ + try{ + qint64 id = GetParametrId(domElement); + QString name = GetParametrString(domElement, "name"); + qreal mx = toPixel(GetParametrDouble(domElement, "mx")); + qreal my = toPixel(GetParametrDouble(domElement, "my")); + qint64 firstPointId = GetParametrLongLong(domElement, "firstPoint"); + qint64 secondPointId = GetParametrLongLong(domElement, "secondPoint"); + + if(mode == Draw::Calculation){ + VToolPointOfIntersection::Create(id, name, firstPointId, secondPointId, mx, my, scene, this, data, + parse, Tool::FromFile); + } else { + VModelingPointOfIntersection::Create(id, name, firstPointId, secondPointId, mx, my, this, data, + parse, Tool::FromFile); + } + return; + } + catch(const VExceptionBadId &e){ + VExceptionObjectError excep(tr("Error creating or updating point of intersection"), domElement); + excep.AddMoreInformation(e.ErrorMessage()); + throw excep; + } + } } void VDomDocument::ParseLineElement(VMainGraphicsScene *scene, const QDomElement &domElement,