From f25d3e7f7f83962a9a1cd7c3c5c36ae59166e2b2 Mon Sep 17 00:00:00 2001 From: dismine Date: Tue, 30 Jul 2013 21:46:40 +0300 Subject: [PATCH] Add tool Bisector --- Valentina.pro | 11 +- cursor.qrc | 1 + cursor/bisector_cursor.png | Bin 0 -> 1237 bytes dialogs/dialogbisector.cpp | 144 ++++++++++++++++ dialogs/dialogbisector.h | 50 ++++++ dialogs/dialogbisector.ui | 323 +++++++++++++++++++++++++++++++++++ icon.qrc | 1 + icon/32x32/bisector.png | Bin 0 -> 1056 bytes mainwindow.cpp | 58 +++++++ mainwindow.h | 7 +- mainwindow.ui | 25 ++- tools/vtoolalongline.cpp | 22 +-- tools/vtoolbisector.cpp | 141 +++++++++++++++ tools/vtoolbisector.h | 34 ++++ tools/vtoolendline.cpp | 2 +- tools/vtoollinepoint.cpp | 31 ++++ tools/vtoollinepoint.h | 21 +++ tools/vtoolnormal.cpp | 4 +- tools/vtoolpoint.cpp | 2 +- tools/vtoolpoint.h | 2 +- tools/vtoolshoulderpoint.cpp | 2 +- tools/vtoolsimplepoint.cpp | 2 +- xml/vdomdocument.cpp | 42 +++++ 23 files changed, 902 insertions(+), 23 deletions(-) create mode 100644 cursor/bisector_cursor.png create mode 100644 dialogs/dialogbisector.cpp create mode 100644 dialogs/dialogbisector.h create mode 100644 dialogs/dialogbisector.ui create mode 100644 icon/32x32/bisector.png create mode 100644 tools/vtoolbisector.cpp create mode 100644 tools/vtoolbisector.h create mode 100644 tools/vtoollinepoint.cpp create mode 100644 tools/vtoollinepoint.h diff --git a/Valentina.pro b/Valentina.pro index d38b4392e..bc52781cc 100644 --- a/Valentina.pro +++ b/Valentina.pro @@ -38,7 +38,9 @@ SOURCES += main.cpp\ tools/vtoolshoulderpoint.cpp \ dialogs/dialogshoulderpoint.cpp \ tools/vtoolnormal.cpp \ - dialogs/dialognormal.cpp + dialogs/dialognormal.cpp \ + tools/vtoolbisector.cpp \ + dialogs/dialogbisector.cpp HEADERS += mainwindow.h \ widgets/vmaingraphicsscene.h \ @@ -67,7 +69,9 @@ HEADERS += mainwindow.h \ tools/vtoolshoulderpoint.h \ dialogs/dialogshoulderpoint.h \ tools/vtoolnormal.h \ - dialogs/dialognormal.h + dialogs/dialognormal.h \ + tools/vtoolbisector.h \ + dialogs/dialogbisector.h FORMS += mainwindow.ui \ dialogs/dialogsinglepoint.ui \ @@ -76,7 +80,8 @@ FORMS += mainwindow.ui \ dialogs/dialogline.ui \ dialogs/dialogalongline.ui \ dialogs/dialogshoulderpoint.ui \ - dialogs/dialognormal.ui + dialogs/dialognormal.ui \ + dialogs/dialogbisector.ui RESOURCES += \ icon.qrc \ diff --git a/cursor.qrc b/cursor.qrc index 245b1e052..8a10af051 100644 --- a/cursor.qrc +++ b/cursor.qrc @@ -6,5 +6,6 @@ cursor/alongline_cursor.png cursor/shoulder_cursor.png cursor/normal_cursor.png + cursor/bisector_cursor.png diff --git a/cursor/bisector_cursor.png b/cursor/bisector_cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..228109de7094891fa2fd8f12881aadc2320d2c6a GIT binary patch literal 1237 zcmV;`1SVl&|00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-3J~KA0&(~dgTBB06}y` zSad^gZEa<4bO1wAML|?gQaT`KWG!lNWoICEF)lD5D0OpbZf77#N=G0{P(?=|b~Z98 zEFf`pVQgu1c_2L?IWP*aMOc#n00b3DL_t(Y$HkUUOk7nI#((#{Hw6hLfGDGqKrBI9 z0mVTB6=E`=K*IlxlbX0FXqW^M)L@W}UFyPh)5btrBUmMpXybwfnFR%v1OtU=g#Ixd z6BLkW0H?fp#|7_A2BBqI7(B_z%)RfveCK@MIp;q3Kdra7ciXz9r9~ZT09{>OHwy|1 zq_(zJMCACPg4fj4OaqdamnYHtlarHi#Wes7!vJ7qWkvjczqnj33JVMU#l^*E2L7xw&~YZnP`4)!Is_$bTo0fq?;(QsQ>IrL?p(DQ=oOdPkd5 z3d1lE5yr>I*PZ?0;b9dw+M~@hO_rCJ#pm;hX`1+aJ{lVv4+ea#gapaT%94H49$n#g zDnO;wwsj~JA}J|}Kp=2zbaeD+d3kxTqN3uDeHGkp)bAFEQi}QcdHjC={Oal|DJd!M z03RQi=64E4M6fIi5n*m_j>W}A*4Ni>J7*>)CSnJ_Tea^diD4MqWUwrYk&%%zO-)VL z`}_NEm6Vk1Uvnq0{|0B8=8iLgKp-7Rce~y9S8%$nM}~}23d^!cPEHn&$D`KP)=)~J zX&Q!MV4CJO2~5*O*L4aC3hqtEhK7d7eGZ7GX_1zyuC5lK0cZuD0TP_~13V3!0X_sg z_8wznW3f-a`uh55r=K-Vi~IuO@p!^YsTtr;;0wU{#ybZ52w1jXwf6vMZ9UD#KO6eR zPcI&6dBd+xzuv~#bLY8n^BV1)@9w1Cp&FpQz5VBmjEqZteSMFL$g4mi@G>w2`~*A; zJOwyeJ^|zb3jo1eK~?GXhR3dqhn;}3bI+5L{WzyyYuQOVATF0n0O{%J`P`CwicC@mD7Oa=jTWFlmaq<$AEJ{$OgJ#gM1IP z+brnz%usi6mwh%HNCgb%)A@ZMZFY86rlzK9i;9ZAv1wMo^S}#seRyr{CxI`40Puhv z;9f1A3)BEPzzFcwUM*1wd<47{HHw3Fm9GNf7#k`Pc+xIP7jO;e-0NaVwIhwb15$wJ z?&J1MikcCR0PelOZvfu{Zs4e`^=H6u_XwT{6az2X!CwKc?nQfot*6I+={w*$un`Ml z*~ydIi4({5uPsetupUi(this); + number = 0; + listWidget = ui->listWidget; + labelResultCalculation = ui->labelResultCalculation; + labelDescription = ui->labelDescription; + radioButtonSizeGrowth = ui->radioButtonSizeGrowth; + radioButtonStandartTable = ui->radioButtonStandartTable; + radioButtonIncrements = ui->radioButtonIncrements; + radioButtonLengthLine = ui->radioButtonLengthLine; + lineEditFormula = ui->lineEditFormula; + flagFormula = false; + bOk = ui->buttonBox->button(QDialogButtonBox::Ok); + connect(bOk, &QPushButton::clicked, this, &DialogBisector::DialogAccepted); + flagName = false; + CheckState(); + QPushButton *bCansel = ui->buttonBox->button(QDialogButtonBox::Cancel); + connect(bCansel, &QPushButton::clicked, this, &DialogBisector::DialogRejected); + FillComboBoxPoints(ui->comboBoxFirstPoint); + FillComboBoxPoints(ui->comboBoxSecondPoint); + FillComboBoxPoints(ui->comboBoxThirdPoint); + FillComboBoxTypeLine(ui->comboBoxLineType); + + connect(ui->toolButtonPutHere, &QPushButton::clicked, this, &DialogBisector::PutHere); + connect(ui->listWidget, &QListWidget::itemDoubleClicked, this, &DialogBisector::PutVal); + connect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogBisector::ValChenged); + + ShowBase(); + connect(ui->radioButtonSizeGrowth, &QRadioButton::clicked, this, &DialogBisector::SizeGrowth); + connect(ui->radioButtonStandartTable, &QRadioButton::clicked, this, &DialogBisector::StandartTable); + connect(ui->radioButtonIncrements, &QRadioButton::clicked, this, &DialogBisector::Increments); + connect(ui->radioButtonLengthLine, &QRadioButton::clicked, this, &DialogBisector::LengthLines); + connect(ui->toolButtonEqual, &QPushButton::clicked, this, &DialogBisector::EvalFormula); + connect(ui->lineEditNamePoint, &QLineEdit::textChanged, this, &DialogBisector::NamePointChanged); + connect(ui->lineEditFormula, &QLineEdit::textChanged, this, &DialogBisector::FormulaChanged); +} + +DialogBisector::~DialogBisector(){ + delete ui; +} + +void DialogBisector::ChoosedPoint(qint64 id, Scene::Type type){ + if(type == Scene::Point){ + VPointF point = data->GetPoint(id); + if(number == 0){ + qint32 index = ui->comboBoxFirstPoint->findText(point.name()); + if ( index != -1 ) { // -1 for not found + ui->comboBoxFirstPoint->setCurrentIndex(index); + number++; + return; + } + } + if(number == 1){ + qint32 index = ui->comboBoxSecondPoint->findText(point.name()); + if ( index != -1 ) { // -1 for not found + ui->comboBoxSecondPoint->setCurrentIndex(index); + number++; + return; + } + } + if(number == 2){ + qint32 index = ui->comboBoxThirdPoint->findText(point.name()); + if ( index != -1 ) { // -1 for not found + ui->comboBoxThirdPoint->setCurrentIndex(index); + number = 0; + } + if(!isInitialized){ + this->show(); + } + } + } +} + +QString DialogBisector::getPointName() const{ + return pointName; +} + +void DialogBisector::setPointName(const QString &value){ + pointName = value; + ui->lineEditNamePoint->setText(pointName); +} + +QString DialogBisector::getTypeLine() const{ + return typeLine; +} + +void DialogBisector::setTypeLine(const QString &value){ + typeLine = value; + SetupTypeLine(ui->comboBoxLineType, value); +} + +QString DialogBisector::getFormula() const{ + return formula; +} + +void DialogBisector::setFormula(const QString &value){ + formula = value; + ui->lineEditFormula->setText(formula); +} + +qint64 DialogBisector::getFirstPointId() const{ + return firstPointId; +} + +void DialogBisector::setFirstPointId(const qint64 &value){ + firstPointId = value; + ChangeCurrentData(ui->comboBoxFirstPoint, value); +} + +qint64 DialogBisector::getSecondPointId() const{ + return secondPointId; +} + +void DialogBisector::setSecondPointId(const qint64 &value){ + secondPointId = value; + ChangeCurrentData(ui->comboBoxSecondPoint, value); +} + +qint64 DialogBisector::getThirdPointId() const{ + return thirdPointId; +} + +void DialogBisector::setThirdPointId(const qint64 &value){ + thirdPointId = value; + ChangeCurrentData(ui->comboBoxThirdPoint, value); +} + +void DialogBisector::DialogAccepted(){ + pointName = ui->lineEditNamePoint->text(); + typeLine = GetTypeLine(ui->comboBoxLineType); + formula = ui->lineEditFormula->text(); + qint32 index = ui->comboBoxFirstPoint->currentIndex(); + firstPointId = qvariant_cast(ui->comboBoxFirstPoint->itemData(index)); + index = ui->comboBoxSecondPoint->currentIndex(); + secondPointId = qvariant_cast(ui->comboBoxSecondPoint->itemData(index)); + index = ui->comboBoxThirdPoint->currentIndex(); + thirdPointId = qvariant_cast(ui->comboBoxThirdPoint->itemData(index)); + emit DialogClosed(QDialog::Accepted); +} diff --git a/dialogs/dialogbisector.h b/dialogs/dialogbisector.h new file mode 100644 index 000000000..e2f05d72a --- /dev/null +++ b/dialogs/dialogbisector.h @@ -0,0 +1,50 @@ +#ifndef DIALOGBISECTOR_H +#define DIALOGBISECTOR_H + +#include "dialogtool.h" +#include +#include +#include + +#include "../options.h" +#include "../container/vcontainer.h" +#include "../container/calculator.h" + +namespace Ui { +class DialogBisector; +} + +class DialogBisector : public DialogTool +{ + Q_OBJECT + +public: + explicit DialogBisector(const VContainer *data, QWidget *parent = 0); + ~DialogBisector(); + QString getPointName() const; + void setPointName(const QString &value); + QString getTypeLine() const; + void setTypeLine(const QString &value); + QString getFormula() const; + void setFormula(const QString &value); + qint64 getFirstPointId() const; + void setFirstPointId(const qint64 &value); + qint64 getSecondPointId() const; + void setSecondPointId(const qint64 &value); + qint64 getThirdPointId() const; + void setThirdPointId(const qint64 &value); +public slots: + virtual void ChoosedPoint(qint64 id, Scene::Type type); + virtual void DialogAccepted(); +private: + Ui::DialogBisector *ui; + qint32 number; + QString pointName; + QString typeLine; + QString formula; + qint64 firstPointId; + qint64 secondPointId; + qint64 thirdPointId; +}; + +#endif // DIALOGBISECTOR_H diff --git a/dialogs/dialogbisector.ui b/dialogs/dialogbisector.ui new file mode 100644 index 000000000..f4d6fe3f7 --- /dev/null +++ b/dialogs/dialogbisector.ui @@ -0,0 +1,323 @@ + + + DialogBisector + + + + 0 + 0 + 480 + 485 + + + + Dialog + + + + + + + + + 0 + 0 + + + + Відстань + + + + + + + + 0 + 0 + + + + + + + + ... + + + + :/icon/24x24/equal.png:/icon/24x24/equal.png + + + + 24 + 24 + + + + + + + + + 0 + 0 + + + + + 87 + 0 + + + + _ + + + + + + + + + + + + + + + + 0 + 0 + + + + Ім'я нової точки + + + + + + + + + + ... + + + + :/icon/24x24/putHere.png:/icon/24x24/putHere.png + + + + 24 + 24 + + + + + + + + + + + + + 0 + 0 + + + + Перша точка + + + + + + + + + + + + + + + 0 + 0 + + + + Друга точка + + + + + + + + + + + + + + + 0 + 0 + + + + Третя точка + + + + + + + + + + + + + + Тип лінії + + + + + + + + + + + + + + Вхідні данні + + + + + + + Розмір і зріст + + + true + + + + + + + Стандартна таблиця + + + + + + + Прибавки + + + + + + + true + + + Довжини ліній + + + + + + + false + + + Довжини дуг + + + + + + + false + + + Довжини сплайні + + + + + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + DialogBisector + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DialogBisector + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/icon.qrc b/icon.qrc index b973dc505..726cb42d5 100644 --- a/icon.qrc +++ b/icon.qrc @@ -23,5 +23,6 @@ icon/32x32/along_line.png icon/32x32/shoulder.png icon/32x32/normal.png + icon/32x32/bisector.png diff --git a/icon/32x32/bisector.png b/icon/32x32/bisector.png new file mode 100644 index 0000000000000000000000000000000000000000..39a682dcc278d3a5d7c00a4c724f21050908fb4c GIT binary patch literal 1056 zcmV+*1mF9KP)5To6omv5r6P5r{HrwGd*ITwpR>r3p^7ZaS(mXfBTM{^KB{vKB1D!(o{mgMPDH-WxqQA@2$5Bh?<1)> z{c+ZthsZkh&bz-aWzpmF1R%!&>vMfh|SUuQD zxGIkDkwFGRw-i%TQ=s4P%kx}Wma;4xM*m_QZS<6ya||Dk(m>X!dzR=8d#Gh%SUH;H zcj8L?gx&ZGPvQO9syB?WBC@Tq@iB_1A@yMpg=aKD^hayYjY1ntxX@ROs z|C)i9wB=}-$g64$*Wn&qf+@V+M|38j1@{IA;h=wFzg8Q46`vzOFt7caBt&u zFXPi5#|Pe(QcBu#6h$$oHVjB5sjwui+@*82VatUzS#;+Zp^*HbJj z>&>XO*umt7M!YjMk_hb#8Mxq#MYrg5L9bcGtEvXJ9uG9D`LclQnn(FEF9ym$aj%r;~a?WjXW1w7Rk==j7K&^ zK8frpcrS8&tj$lB>QVX(Rw7g^P?zIyv+0~^EXI9UnQEq&Hy!n0fjn@r`gAAYQao~& zmfwg)2;o05UYoe6Xl}eO<4bI4oUp{VfgjEyfOYL98>jsd2MZJ>e`GwF>TPBXcHjg2 z(nvRiS*qWpiY?M|AIEkrj&UHbXj}M@~obwdrPJh ahyMi`Iw!W5xX`2k0000toolButtonNormal, &QToolButton::clicked, this, &MainWindow::ToolNormal); + connect(ui->toolButtonBisector, &QToolButton::clicked, this, + &MainWindow::ToolBisector); data = new VContainer; CreateManTableIGroup (); @@ -383,6 +386,54 @@ void MainWindow::ClosedDialogNormal(int result){ ArrowTool(); } +void MainWindow::ToolBisector(bool checked){ + if(checked){ + CanselTool(); + tool = Tools::BisectorTool; + QPixmap pixmap(":/cursor/bisector_cursor.png"); + QCursor cur(pixmap, 2, 3); + ui->graphicsView->setCursor(cur); + helpLabel->setText("Виберіть точки."); + dialogBisector = new DialogBisector(data, this); + connect(scene, &VMainGraphicsScene::ChoosedObject, dialogBisector, + &DialogBisector::ChoosedPoint); + connect(dialogBisector, &DialogBisector::DialogClosed, this, + &MainWindow::ClosedDialogBisector); + } else { + ui->toolButtonBisector->setChecked(true); + } +} + +void MainWindow::ClosedDialogBisector(int result){ + if(result == QDialog::Accepted){ + QString formula = dialogBisector->getFormula(); + qint64 firstPointId = dialogBisector->getFirstPointId(); + qint64 secondPointId = dialogBisector->getSecondPointId(); + qint64 thirdPointId = dialogBisector->getThirdPointId(); + QString typeLine = dialogBisector->getTypeLine(); + QString pointName = dialogBisector->getPointName(); + + VPointF firstPoint = data->GetPoint(firstPointId); + VPointF secondPoint = data->GetPoint(secondPointId); + VPointF thirdPoint = data->GetPoint(thirdPointId); + + Calculator cal(data); + QString errorMsg; + qreal result = cal.eval(formula, &errorMsg); + if(errorMsg.isEmpty()){ + QPointF fPoint = VToolBisector::FindPoint(firstPoint, secondPoint, thirdPoint, + result*PrintDPI/25.4); + qint64 id = data->AddPoint(VPointF(fPoint.x(), fPoint.y(), pointName, 5, 10)); + data->AddLine(secondPointId, id); + VToolBisector *point = new VToolBisector(doc, data, id, typeLine, formula, firstPointId, + secondPointId, thirdPointId, Tool::FromGui); + scene->addItem(point); + connect(point, &VToolBisector::ChoosedPoint, scene, &VMainGraphicsScene::ChoosedItem); + } + } + ArrowTool(); +} + void MainWindow::showEvent( QShowEvent *event ){ QMainWindow::showEvent( event ); if( event->spontaneous() ){ @@ -521,6 +572,12 @@ void MainWindow::CanselTool(){ scene->setFocus(Qt::OtherFocusReason); scene->clearSelection(); break; + case Tools::BisectorTool: + delete dialogBisector; + ui->toolButtonBisector->setChecked(false); + scene->setFocus(Qt::OtherFocusReason); + scene->clearSelection(); + break; } } @@ -781,6 +838,7 @@ void MainWindow::SetEnableTool(bool enable){ ui->toolButtonAlongLine->setEnabled(enable); ui->toolButtonShoulderPoint->setEnabled(enable); ui->toolButtonNormal->setEnabled(enable); + ui->toolButtonBisector->setEnabled(enable); } MainWindow::~MainWindow(){ diff --git a/mainwindow.h b/mainwindow.h index 8d2bf154e..473ddd8b5 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -15,6 +15,7 @@ #include "dialogs/dialogshoulderpoint.h" #include "dialogs/dialogendline.h" #include "dialogs/dialognormal.h" +#include "dialogs/dialogbisector.h" #include "tools/vtoolsimplepoint.h" #include "xml/vdomdocument.h" #include "container/vcontainer.h" @@ -32,7 +33,8 @@ namespace Tools{ LineTool, AlongLineTool, ShoulderPointTool, - NormalTool + NormalTool, + BisectorTool }; } @@ -71,6 +73,8 @@ public slots: void ClosedDialogShoulderPoint(int result); void ToolNormal(bool checked); void ClosedDialogNormal(int result); + void ToolBisector(bool checked); + void ClosedDialogBisector(int result); protected: virtual void keyPressEvent ( QKeyEvent * event ); virtual void showEvent( QShowEvent *event ); @@ -88,6 +92,7 @@ private: DialogAlongLine *dialogAlongLine; DialogShoulderPoint *dialogShoulderPoint; DialogNormal *dialogNormal; + DialogBisector *dialogBisector; VDomDocument *doc; VContainer *data; QComboBox *comboBoxDraws; diff --git a/mainwindow.ui b/mainwindow.ui index e76d9979f..74f0fda7e 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -64,7 +64,7 @@ 0 0 - 156 + 154 104 @@ -199,6 +199,29 @@ + + + + false + + + ... + + + + :/icon/32x32/bisector.png:/icon/32x32/bisector.png + + + + 32 + 32 + + + + true + + + diff --git a/tools/vtoolalongline.cpp b/tools/vtoolalongline.cpp index ccc42d9f8..f3164d081 100644 --- a/tools/vtoolalongline.cpp +++ b/tools/vtoolalongline.cpp @@ -50,7 +50,7 @@ void VToolAlongLine::FullUpdateFromFile(){ secondPointId = domElement.attribute("secondPoint", "").toLongLong(); } VPointF point = VAbstractTool::data->GetPoint(id); - RefreshBaseGeometry(name, point.x(), point.y(), mx, my); + RefreshGeometry(name, point.x(), point.y(), mx, my); VPointF firstPoint = VAbstractTool::data->GetPoint(firstPointId); VPointF secondPoint = VAbstractTool::data->GetPoint(secondPointId); mainLine->setLine(QLineF(firstPoint.toQPointF(), secondPoint.toQPointF())); @@ -61,6 +61,16 @@ void VToolAlongLine::FullUpdateFromFile(){ } } +void VToolAlongLine::ChangedActivDraw(const QString newName){ + if(nameActivDraw == newName){ + mainLine->setPen(QPen(Qt::black, widthHairLine)); + VToolPoint::ChangedActivDraw(newName); + } else { + mainLine->setPen(QPen(Qt::gray, widthHairLine)); + VToolPoint::ChangedActivDraw(newName); + } +} + void VToolAlongLine::FullUpdateFromGui(int result){ if(result == QDialog::Accepted){ QDomElement domElement = doc->elementById(QString().setNum(id)); @@ -77,16 +87,6 @@ void VToolAlongLine::FullUpdateFromGui(int result){ dialogAlongLine.clear(); } -void VToolAlongLine::ChangedActivDraw(const QString newName){ - if(nameActivDraw == newName){ - mainLine->setPen(QPen(Qt::black, widthHairLine)); - VToolPoint::ChangedActivDraw(newName); - } else { - mainLine->setPen(QPen(Qt::gray, widthHairLine)); - VToolPoint::ChangedActivDraw(newName); - } -} - void VToolAlongLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ if(!ignoreContextMenuEvent){ QMenu menu; diff --git a/tools/vtoolbisector.cpp b/tools/vtoolbisector.cpp new file mode 100644 index 000000000..0df45ff8f --- /dev/null +++ b/tools/vtoolbisector.cpp @@ -0,0 +1,141 @@ +#include "vtoolbisector.h" +#include + +VToolBisector::VToolBisector(VDomDocument *doc, VContainer *data, const qint64 &id, const QString &typeLine, + const QString &formula, const qint64 &firstPointId, const qint64 &secondPointId, + const qint64 &thirdPointId, Tool::Enum typeCreation, QGraphicsItem *parent): + VToolPoint(doc, data, id, parent){ + this->typeLine = typeLine; + this->formula = formula; + this->firstPointId = firstPointId; + this->secondPointId = secondPointId; + this->thirdPointId = thirdPointId; + + //Лінія, що з'єднує дві точки + VPointF basePoint = data->GetPoint(secondPointId); + VPointF point = data->GetPoint(id); + mainLine = new QGraphicsLineItem(QLineF(basePoint.toQPointF(), point.toQPointF()), this); + mainLine->setPen(QPen(Qt::black, widthHairLine)); + mainLine->setFlag(QGraphicsItem::ItemStacksBehindParent, true); + if(typeLine == "none"){ + mainLine->setVisible(false); + } else { + mainLine->setVisible(true); + } + + if(typeCreation == Tool::FromGui){ + AddToFile(); + } +} + +QPointF VToolBisector::FindPoint(const QPointF &firstPoint, const QPointF &secondPoint, + const QPointF &thirdPoint, const qreal &length){ + QLineF line1(secondPoint, firstPoint); + QLineF line2(secondPoint, thirdPoint); + qreal angle = line1.angleTo(line2); + if(angle>180){ + angle = 360 - angle; + } + line1.setAngle(line1.angle()-angle/2); + line1.setLength(length); + return line1.p2(); +} + +void VToolBisector::FullUpdateFromFile(){ + QString name; + qreal mx, my; + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + name = domElement.attribute("name", ""); + mx = domElement.attribute("mx", "").toDouble()*PrintDPI/25.4; + my = domElement.attribute("my", "").toDouble()*PrintDPI/25.4; + typeLine = domElement.attribute("typeLine", ""); + formula = domElement.attribute("length", ""); + firstPointId = domElement.attribute("firstPoint", "").toLongLong(); + secondPointId = domElement.attribute("secondPoint", "").toLongLong(); + thirdPointId = domElement.attribute("thirdPoint", "").toLongLong(); + } + VPointF point = VAbstractTool::data->GetPoint(id); + RefreshGeometry(name, point.x(), point.y(), mx, my); + VPointF basePoint = VAbstractTool::data->GetPoint(secondPointId); + mainLine->setLine(QLineF(basePoint.toQPointF(), point.toQPointF())); + if(typeLine == "none"){ + mainLine->setVisible(false); + } else { + mainLine->setVisible(true); + } +} + +void VToolBisector::FullUpdateFromGui(int result){ + if(result == QDialog::Accepted){ + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + domElement.setAttribute("name", dialogBisector->getPointName()); + domElement.setAttribute("typeLine", dialogBisector->getTypeLine()); + domElement.setAttribute("length", dialogBisector->getFormula()); + domElement.setAttribute("firstPoint", QString().setNum(dialogBisector->getFirstPointId())); + domElement.setAttribute("secondPoint", QString().setNum(dialogBisector->getSecondPointId())); + domElement.setAttribute("thirdPoint", QString().setNum(dialogBisector->getThirdPointId())); + emit FullUpdateTree(); + } + } + dialogBisector.clear(); +} + +void VToolBisector::ChangedActivDraw(const QString newName){ + if(nameActivDraw == newName){ + mainLine->setPen(QPen(Qt::black, widthHairLine)); + VToolPoint::ChangedActivDraw(newName); + } else { + mainLine->setPen(QPen(Qt::gray, widthHairLine)); + VToolPoint::ChangedActivDraw(newName); + } +} + +void VToolBisector::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ + if(!ignoreContextMenuEvent){ + QMenu menu; + QAction *actionOption = menu.addAction("Властивості"); + QAction *selectedAction = menu.exec(event->screenPos()); + if(selectedAction == actionOption){ + dialogBisector = QSharedPointer(new DialogBisector(VAbstractTool::data)); + + connect(qobject_cast< VMainGraphicsScene * >(this->scene()), &VMainGraphicsScene::ChoosedObject, + dialogBisector.data(), &DialogBisector::ChoosedPoint); + connect(dialogBisector.data(), &DialogBisector::DialogClosed, this, + &VToolBisector::FullUpdateFromGui); + connect(doc, &VDomDocument::FullUpdateFromFile, dialogBisector.data(), + &DialogBisector::UpdateList); + + VPointF p = VAbstractTool::data->GetPoint(id); + + dialogBisector->setTypeLine(typeLine); + dialogBisector->setFormula(formula); + dialogBisector->setFirstPointId(firstPointId); + dialogBisector->setSecondPointId(secondPointId); + dialogBisector->setThirdPointId(thirdPointId); + dialogBisector->setPointName(p.name()); + + dialogBisector->show(); + } + } +} + +void VToolBisector::AddToFile(){ + VPointF point = VAbstractTool::data->GetPoint(id); + QDomElement domElement = doc->createElement("point"); + + AddAttribute(domElement, "id", id); + AddAttribute(domElement, "type", "bisector"); + AddAttribute(domElement, "name", point.name()); + AddAttribute(domElement, "mx", point.mx()/PrintDPI*25.4); + AddAttribute(domElement, "my", point.my()/PrintDPI*25.4); + + AddAttribute(domElement, "typeLine", typeLine); + AddAttribute(domElement, "length", formula); + AddAttribute(domElement, "firstPoint", firstPointId); + AddAttribute(domElement, "secondPoint", secondPointId); + AddAttribute(domElement, "thirdPoint", thirdPointId); + + AddToCalculation(domElement); +} diff --git a/tools/vtoolbisector.h b/tools/vtoolbisector.h new file mode 100644 index 000000000..d2488c2fe --- /dev/null +++ b/tools/vtoolbisector.h @@ -0,0 +1,34 @@ +#ifndef VTOOLBISECTOR_H +#define VTOOLBISECTOR_H + +#include + +#include "vtoolpoint.h" +#include "../dialogs/dialogbisector.h" + +class VToolBisector : public VToolPoint +{ +public: + VToolBisector(VDomDocument *doc, VContainer *data, const qint64 &id, const QString &typeLine, + const QString &formula, const qint64 &firstPointId, const qint64 &secondPointId, + const qint64 &thirdPointId,Tool::Enum typeCreation, QGraphicsItem * parent = 0); + static QPointF FindPoint(const QPointF &firstPoint, const QPointF &secondPoint, + const QPointF &thirdPoint, const qreal& length); +public slots: + virtual void FullUpdateFromFile(); + virtual void FullUpdateFromGui(int result); + virtual void ChangedActivDraw(const QString newName); +protected: + virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); + virtual void AddToFile(); +private: + QString typeLine; + QString formula; + qint64 firstPointId; + qint64 secondPointId; + qint64 thirdPointId; + QGraphicsLineItem *mainLine; + QSharedPointer dialogBisector; +}; + +#endif // VTOOLBISECTOR_H diff --git a/tools/vtoolendline.cpp b/tools/vtoolendline.cpp index b33724792..44ac63fbe 100644 --- a/tools/vtoolendline.cpp +++ b/tools/vtoolendline.cpp @@ -44,7 +44,7 @@ void VToolEndLine::FullUpdateFromFile(){ angle = domElement.attribute("angle", "").toInt(); } VPointF point = VAbstractTool::data->GetPoint(id); - RefreshBaseGeometry(name, point.x(), point.y(), mx, my); + RefreshGeometry(name, point.x(), point.y(), mx, my); VPointF basePoint = VAbstractTool::data->GetPoint(basePointId); mainLine->setLine(QLineF(basePoint.toQPointF(), point.toQPointF())); if(typeLine == "none"){ diff --git a/tools/vtoollinepoint.cpp b/tools/vtoollinepoint.cpp new file mode 100644 index 000000000..b90d2dd80 --- /dev/null +++ b/tools/vtoollinepoint.cpp @@ -0,0 +1,31 @@ +#include "vtoollinepoint.h" + +VToolLinePoint::VToolLinePoint(VDomDocument *doc, VContainer *data, const qint64 &id, const QString &typeLine, + const QString &formula, const qint64 &pointId, const qint32 &angle, + QGraphicsItem *parent):VToolPoint(doc, data, id, parent){ + this->typeLine = typeLine; + this->formula = formula; + this->angle = angle; + + //Лінія, що з'єднує дві точки + VPointF firstPoint = data->GetPoint(pointId); + VPointF point = data->GetPoint(id); + mainLine = new QGraphicsLineItem(QLineF(firstPoint.toQPointF(), point.toQPointF()), this); + mainLine->setPen(QPen(Qt::black, widthHairLine)); + mainLine->setFlag(QGraphicsItem::ItemStacksBehindParent, true); + if(typeLine == "none"){ + mainLine->setVisible(false); + } else { + mainLine->setVisible(true); + } +} + +void VToolLinePoint::ChangedActivDraw(const QString newName){ + if(nameActivDraw == newName){ + mainLine->setPen(QPen(Qt::black, widthHairLine)); + VToolPoint::ChangedActivDraw(newName); + } else { + mainLine->setPen(QPen(Qt::gray, widthHairLine)); + VToolPoint::ChangedActivDraw(newName); + } +} diff --git a/tools/vtoollinepoint.h b/tools/vtoollinepoint.h new file mode 100644 index 000000000..adb565de1 --- /dev/null +++ b/tools/vtoollinepoint.h @@ -0,0 +1,21 @@ +#ifndef VTOOLLINEPOINT_H +#define VTOOLLINEPOINT_H + +#include "vtoolpoint.h" + +class VToolLinePoint : public VToolPoint +{ +public: + VToolLinePoint(VDomDocument *doc, VContainer *data, const qint64 &id, + const QString &typeLine, const QString &formula, + const qint64 &pointId, const qint32 &angle, QGraphicsItem * parent = 0); +public slots: + virtual void ChangedActivDraw(const QString newName); +protected: + QString typeLine; + QString formula; + qint32 angle; + QGraphicsLineItem *mainLine; +}; + +#endif // VTOOLLINEPOINT_H diff --git a/tools/vtoolnormal.cpp b/tools/vtoolnormal.cpp index 8729b51f1..80f96282a 100644 --- a/tools/vtoolnormal.cpp +++ b/tools/vtoolnormal.cpp @@ -53,7 +53,7 @@ void VToolNormal::FullUpdateFromFile(){ angle = domElement.attribute("angle", "").toInt(); } VPointF point = VAbstractTool::data->GetPoint(id); - RefreshBaseGeometry(name, point.x(), point.y(), mx, my); + RefreshGeometry(name, point.x(), point.y(), mx, my); VPointF firstPoint = VAbstractTool::data->GetPoint(firstPointId); mainLine->setLine(QLineF(firstPoint.toQPointF(), point.toQPointF())); if(typeLine == "none"){ @@ -131,7 +131,7 @@ void VToolNormal::AddToFile(){ AddAttribute(domElement, "length", formula); AddAttribute(domElement, "angle", angle); AddAttribute(domElement, "firstPoint", firstPointId); - AddAttribute(domElement, "secondPoint", firstPointId); + AddAttribute(domElement, "secondPoint", secondPointId); AddToCalculation(domElement); } diff --git a/tools/vtoolpoint.cpp b/tools/vtoolpoint.cpp index d3b44a6f8..0d4a92117 100644 --- a/tools/vtoolpoint.cpp +++ b/tools/vtoolpoint.cpp @@ -192,7 +192,7 @@ void VToolPoint::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event ){ QGraphicsItem::mouseReleaseEvent(event); } -void VToolPoint::RefreshBaseGeometry(const QString &name, const qreal &x, const qreal &y, const qreal &mx, +void VToolPoint::RefreshGeometry(const QString &name, const qreal &x, const qreal &y, const qreal &mx, const qreal &my){ QRectF rec = QRectF(x, y, radius*2, radius*2); rec.translate(x-rec.center().x(), y-rec.center().y()); diff --git a/tools/vtoolpoint.h b/tools/vtoolpoint.h index c907b487a..3385d57d5 100644 --- a/tools/vtoolpoint.h +++ b/tools/vtoolpoint.h @@ -23,7 +23,7 @@ protected: VGraphicsSimpleTextItem *namePoint; QGraphicsLineItem *lineName; virtual void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event ); - void RefreshBaseGeometry(const QString &name, const qreal &x, const qreal &y, + void RefreshGeometry(const QString &name, const qreal &x, const qreal &y, const qreal &mx, const qreal &my); virtual void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ); virtual void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ); diff --git a/tools/vtoolshoulderpoint.cpp b/tools/vtoolshoulderpoint.cpp index a8f4d0fc3..d885d5340 100644 --- a/tools/vtoolshoulderpoint.cpp +++ b/tools/vtoolshoulderpoint.cpp @@ -65,7 +65,7 @@ void VToolShoulderPoint::FullUpdateFromFile(){ pShoulder = domElement.attribute("pShoulder", "").toLongLong(); } VPointF point = VAbstractTool::data->GetPoint(id); - RefreshBaseGeometry(name, point.x(), point.y(), mx, my); + RefreshGeometry(name, point.x(), point.y(), mx, my); VPointF p1L = VAbstractTool::data->GetPoint(p1Line); mainLine->setLine(QLineF(p1L.toQPointF(), point.toQPointF())); if(typeLine == "none"){ diff --git a/tools/vtoolsimplepoint.cpp b/tools/vtoolsimplepoint.cpp index 3ac7d9483..d2fc3ab02 100644 --- a/tools/vtoolsimplepoint.cpp +++ b/tools/vtoolsimplepoint.cpp @@ -73,5 +73,5 @@ void VToolSimplePoint::FullUpdateFromFile(){ mx = domElement.attribute("mx", "").toDouble()*PrintDPI/25.4; my = domElement.attribute("my", "").toDouble()*PrintDPI/25.4; } - RefreshBaseGeometry(name, x, y, mx, my); + RefreshGeometry(name, x, y, mx, my); } diff --git a/xml/vdomdocument.cpp b/xml/vdomdocument.cpp index e5061ca67..55f8cfbf9 100644 --- a/xml/vdomdocument.cpp +++ b/xml/vdomdocument.cpp @@ -7,6 +7,7 @@ #include "../tools/vtoolalongline.h" #include "../tools/vtoolshoulderpoint.h" #include "../tools/vtoolnormal.h" +#include "../tools/vtoolbisector.h" #include "../options.h" #include "../container/calculator.h" @@ -529,6 +530,47 @@ void VDomDocument::ParsePointElement(VMainGraphicsScene *scene, const QDomElemen } return; } + if(type == "bisector"){ + if(!domElement.isNull()){ + QString name, typeLine, formula; + qreal mx=5, my=10; + qint64 id, firstPointId, secondPointId, thirdPointId; + if(!domElement.isNull()){ + id = domElement.attribute("id", "").toLongLong(); + name = domElement.attribute("name", ""); + mx = domElement.attribute("mx","").toDouble()*PrintDPI/25.4; + my = domElement.attribute("my","").toDouble()*PrintDPI/25.4; + + typeLine = domElement.attribute("typeLine", ""); + formula = domElement.attribute("length", ""); + firstPointId = domElement.attribute("firstPoint", "").toLongLong(); + secondPointId = domElement.attribute("secondPoint", "").toLongLong(); + thirdPointId = domElement.attribute("thirdPoint", "").toLongLong(); + + VPointF firstPoint = data->GetPoint(firstPointId); + VPointF secondPoint = data->GetPoint(secondPointId); + VPointF thirdPoint = data->GetPoint(thirdPointId); + + Calculator cal(data); + QString errorMsg; + qreal result = cal.eval(formula, &errorMsg); + if(errorMsg.isEmpty()){ + QPointF fPoint = VToolBisector::FindPoint(firstPoint, secondPoint, thirdPoint, + result*PrintDPI/25.4); + data->UpdatePoint(id, VPointF(fPoint.x(), fPoint.y(), name, mx, my)); + data->AddLine(firstPointId, id); + if(parse == Document::FullParse){ + VToolBisector *point = new VToolBisector(this, data, id, typeLine, formula, + firstPointId, secondPointId, thirdPointId, + Tool::FromFile); + scene->addItem(point); + connect(point, &VToolBisector::ChoosedPoint, scene, &VMainGraphicsScene::ChoosedItem); + } + } + } + } + return; + } } void VDomDocument::ParseLineElement(VMainGraphicsScene *scene, const QDomElement &domElement,