Примитивное перемещение линий

Если точнее, то перемещаем их концевые точки
This commit is contained in:
2025-12-08 16:47:12 +03:00
parent 074a8e1ae0
commit a238b11db7
2 changed files with 40 additions and 2 deletions

View File

@@ -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) {

View File

@@ -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 }; // тег для новых ограничений