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 000000000..228109de7
Binary files /dev/null and b/cursor/bisector_cursor.png differ
diff --git a/dialogs/dialogbisector.cpp b/dialogs/dialogbisector.cpp
new file mode 100644
index 000000000..65ed24215
--- /dev/null
+++ b/dialogs/dialogbisector.cpp
@@ -0,0 +1,144 @@
+#include "dialogbisector.h"
+#include "ui_dialogbisector.h"
+
+DialogBisector::DialogBisector(const VContainer *data, QWidget *parent) :
+ DialogTool(data, parent), ui(new Ui::DialogBisector)
+{
+ ui->setupUi(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 000000000..39a682dcc
Binary files /dev/null and b/icon/32x32/bisector.png differ
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 15b8d18e7..6676eec4a 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -16,6 +16,7 @@
#include "tools/vtoolalongline.h"
#include "tools/vtoolshoulderpoint.h"
#include "tools/vtoolnormal.h"
+#include "tools/vtoolbisector.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow)
@@ -55,6 +56,8 @@ MainWindow::MainWindow(QWidget *parent) :
&MainWindow::ToolShoulderPoint);
connect(ui->toolButtonNormal, &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,