Примитивное перемещение линий
Если точнее, то перемещаем их концевые точки
This commit is contained in:
35
Canvas.cpp
35
Canvas.cpp
@@ -52,7 +52,15 @@ void Canvas::mousePressEvent(QMouseEvent* event)
|
|||||||
qDebug() << "Scene point in" << scene.x() << scene.y();
|
qDebug() << "Scene point in" << scene.x() << scene.y();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (mode == Mode::DrawingLine) {
|
if (mode == Mode::None){
|
||||||
|
Point* p = findPointAt(scene);
|
||||||
|
if (p) {
|
||||||
|
draggedPoint = p;
|
||||||
|
dragOffset = scene - QPointF(*p->x, *p->y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (mode == Mode::DrawingLine) {
|
||||||
if (!current_line) {
|
if (!current_line) {
|
||||||
current_line = new Line();
|
current_line = new Line();
|
||||||
current_line->set_tag(obj_count);
|
current_line->set_tag(obj_count);
|
||||||
@@ -101,6 +109,7 @@ void Canvas::mousePressEvent(QMouseEvent* event)
|
|||||||
current_line = nullptr;
|
current_line = nullptr;
|
||||||
mode = Mode::None;
|
mode = Mode::None;
|
||||||
obj_count++;
|
obj_count++;
|
||||||
|
after_constraint = true;
|
||||||
}
|
}
|
||||||
update();
|
update();
|
||||||
return;
|
return;
|
||||||
@@ -133,6 +142,7 @@ void Canvas::mousePressEvent(QMouseEvent* event)
|
|||||||
current_line = nullptr;
|
current_line = nullptr;
|
||||||
update();
|
update();
|
||||||
mode = Mode::None;
|
mode = Mode::None;
|
||||||
|
after_constraint = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
@@ -189,11 +199,30 @@ void Canvas::mousePressEvent(QMouseEvent* event)
|
|||||||
sys.addConstraintP2PCoincident(*firstPoint, *clickedPoint, constraints_count++);
|
sys.addConstraintP2PCoincident(*firstPoint, *clickedPoint, constraints_count++);
|
||||||
firstPoint = nullptr;
|
firstPoint = nullptr;
|
||||||
mode = Mode::None;
|
mode = Mode::None;
|
||||||
|
after_constraint = true;
|
||||||
update();
|
update();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Canvas::mouseMoveEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
if (draggedPoint) {
|
||||||
|
QPointF pos = event->pos() - dragOffset;
|
||||||
|
*draggedPoint->x = pos.x();
|
||||||
|
*draggedPoint->y = pos.y();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Canvas::mouseReleaseEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
if (draggedPoint) {
|
||||||
|
draggedPoint = nullptr;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Canvas::paintEvent(QPaintEvent*)
|
void Canvas::paintEvent(QPaintEvent*)
|
||||||
{
|
{
|
||||||
QPainter p(this);
|
QPainter p(this);
|
||||||
@@ -205,10 +234,12 @@ void Canvas::paintEvent(QPaintEvent*)
|
|||||||
if (res == SolveStatus::Success || res == SolveStatus::Converged) {
|
if (res == SolveStatus::Success || res == SolveStatus::Converged) {
|
||||||
sys.applySolution();
|
sys.applySolution();
|
||||||
}
|
}
|
||||||
else {
|
else if (res == SolveStatus::Failed && after_constraint){
|
||||||
|
QMessageBox::warning(this, QString("Error!"), QString("Last constraint is unavailable!"));
|
||||||
sys.removeConstraint(sys.get_last_constraint());
|
sys.removeConstraint(sys.get_last_constraint());
|
||||||
constraints_count--;
|
constraints_count--;
|
||||||
}
|
}
|
||||||
|
after_constraint = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Line* line : lines) {
|
for (Line* line : lines) {
|
||||||
|
|||||||
7
Canvas.h
7
Canvas.h
@@ -41,6 +41,8 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent(QMouseEvent* event) override;
|
void mousePressEvent(QMouseEvent* event) override;
|
||||||
|
void mouseMoveEvent(QMouseEvent* event) override;
|
||||||
|
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||||
void paintEvent(QPaintEvent* event) override;
|
void paintEvent(QPaintEvent* event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -52,6 +54,10 @@ private:
|
|||||||
LinePair makeOrderedPair(Line* l1, Line* l2);
|
LinePair makeOrderedPair(Line* l1, Line* l2);
|
||||||
bool areAlreadyParallel(Line* l1, Line* l2); // проверка на дубликат
|
bool areAlreadyParallel(Line* l1, Line* l2); // проверка на дубликат
|
||||||
|
|
||||||
|
// ====================== Перемещение ======================
|
||||||
|
Point* draggedPoint{ nullptr };
|
||||||
|
QPointF dragOffset;
|
||||||
|
|
||||||
// ====================== Данные сцены ======================
|
// ====================== Данные сцены ======================
|
||||||
System sys; // геометрический солвер
|
System sys; // геометрический солвер
|
||||||
QVector<Line*> lines; // завершённые линии
|
QVector<Line*> lines; // завершённые линии
|
||||||
@@ -63,6 +69,7 @@ private:
|
|||||||
Line* current_line{ nullptr };
|
Line* current_line{ nullptr };
|
||||||
Point* firstPoint{ nullptr };
|
Point* firstPoint{ nullptr };
|
||||||
Mode mode{ Mode::None };
|
Mode mode{ Mode::None };
|
||||||
|
bool after_constraint{ false };
|
||||||
|
|
||||||
int obj_count{ 0 }; // тег для новых объектов
|
int obj_count{ 0 }; // тег для новых объектов
|
||||||
int constraints_count{ 0 }; // тег для новых ограничений
|
int constraints_count{ 0 }; // тег для новых ограничений
|
||||||
|
|||||||
Reference in New Issue
Block a user