From 104097dfc74cd45f678bf4ef893ba707fe9c483a Mon Sep 17 00:00:00 2001 From: ParkSuMin Date: Mon, 15 Dec 2025 19:37:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=82=D0=B5=D0=B3=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Но как Canvas, а не PlaneGCS --- Canvas.cpp | 41 ++++++++++++++++++++--------------------- Canvas.h | 12 ++++++------ 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Canvas.cpp b/Canvas.cpp index 556dbf6..a0393de 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -78,7 +78,6 @@ void Canvas::changeMode(Mode _mode) Line* Canvas::findAt(QPointF& pos, qreal tolerance) { - // TODO: реализовать проверку, находится ли точка на линии for (Line* line : lines) { if (line->contains(pos, tolerance)) { return line; @@ -140,33 +139,39 @@ bool Canvas::areAlreadyParallel(Line* l1, Line* l2) // Методы работы с ограничениями // =================================================================== -void Canvas::remove_constraints() +// TODO - переделать в bool для отображения статуса выполнения +void Canvas::remove_constraint(int tag) { + auto it = C_Info.find(tag); + if (it == C_Info.end()) return; + + ConstraintInfo info = it->second; + // Удаляем ограничение из солвера - sys.clearByTag(constraints_count - 1); + sys.clearByTag(tag); // Удаляем из соответствующих контейнеров в зависимости от типа ограничения - switch (lastConstraint.mode) { + switch (info.mode) { case Mode::Horizontal: { - if (auto* pair = std::get_if(&lastConstraint.data)) { + if (auto* pair = std::get_if(&info.data)) { HORIZ_pairs.erase(*pair); } break; } case Mode::Vertical: { - if (auto* pair = std::get_if(&lastConstraint.data)) { + if (auto* pair = std::get_if(&info.data)) { VERT_pairs.erase(*pair); } break; } case Mode::Parallel: { - if (auto* pair = std::get_if(&lastConstraint.data)) { + if (auto* pair = std::get_if(&info.data)) { parallelPairs.erase(*pair); } break; } case Mode::Coincedent: { - if (auto* pair = std::get_if(&lastConstraint.data)) { + if (auto* pair = std::get_if(&info.data)) { P2Ppairs.erase(*pair); } break; @@ -174,10 +179,7 @@ void Canvas::remove_constraints() default: break; } - - // Сбрасываем информацию о последнем ограничении - lastConstraint.mode = Mode::None; - constraints_count--; + C_Info.erase(it); } // =================================================================== @@ -244,15 +246,13 @@ void Canvas::mousePressEvent(QMouseEvent* event) sys.addConstraintHorizontal(*found, constraints_count++); auto pair = makeOrderedPair(found->start_ref, found->end_ref); HORIZ_pairs.insert(pair); - lastConstraint.mode = Mode::Horizontal; - lastConstraint.data = pair; + C_Info[constraints_count - 1] = { Mode::Horizontal, pair }; } else { sys.addConstraintVertical(*found, constraints_count++); auto pair = makeOrderedPair(found->start_ref, found->end_ref); VERT_pairs.insert(pair); - lastConstraint.mode = Mode::Vertical; - lastConstraint.data = pair; + C_Info[constraints_count - 1] = { Mode::Vertical, pair }; } update(); after_constraint = true; @@ -363,8 +363,7 @@ void Canvas::mousePressEvent(QMouseEvent* event) auto pair = makeOrderedPair(found, current_line); sys.addConstraintParallel(*found, *current_line, constraints_count++); parallelPairs.insert(pair); - lastConstraint.mode = Mode::Parallel; - lastConstraint.data = pair; + C_Info[constraints_count - 1] = { Mode::Parallel, pair }; current_line = nullptr; mode = Mode::None; @@ -434,8 +433,7 @@ void Canvas::mousePressEvent(QMouseEvent* event) sys.addConstraintP2PCoincident(*clickedPoint, *firstPoint, constraints_count++); auto pair = makeOrderedPair(clickedPoint, firstPoint); P2Ppairs.insert(pair); - lastConstraint.mode = Mode::Coincedent; - lastConstraint.data = pair; + C_Info[constraints_count - 1] = { Mode::Coincedent, pair }; firstPoint = nullptr; mode = Mode::None; @@ -554,7 +552,8 @@ void Canvas::paintEvent(QPaintEvent* event) // Ошибка решения: удаляем последнее добавленное ограничение QMessageBox::warning(this, QString("Error!"), QString("Last constraint is unavailable!")); - remove_constraints(); + remove_constraint(constraints_count - 1); + constraints_count--; } after_constraint = false; } diff --git a/Canvas.h b/Canvas.h index e3b9ba6..b5e1525 100644 --- a/Canvas.h +++ b/Canvas.h @@ -97,7 +97,7 @@ private: // ====================== Методы работы с ограничениями ====================== /// Удалить последние добавленные ограничения при ошибке солвера - void remove_constraints(); + void remove_constraint(int); // ====================== Данные для перемещения объектов ====================== @@ -138,10 +138,10 @@ private: /// Структура для хранения информации о последнем добавленном ограничении /// (используется для отката при ошибке солвера) - struct LastConstraint { - Mode mode{ Mode::None }; ///< Тип последнего ограничения - std::variant data; ///< Данные ограничения - }; - LastConstraint lastConstraint; ///< Информация о последнем добавленном ограничении + struct ConstraintInfo { + Mode mode; + std::variant data; + }; + std::map C_Info; }; \ No newline at end of file