Merge branch 'remove_constraint' into Perpendicular

This commit is contained in:
2025-12-15 20:44:32 +03:00
2 changed files with 34 additions and 28 deletions

View File

@@ -78,7 +78,6 @@ void Canvas::changeMode(Mode _mode)
Line* Canvas::findAt(QPointF& pos, qreal tolerance) Line* Canvas::findAt(QPointF& pos, qreal tolerance)
{ {
// TODO: реализовать проверку, находится ли точка на линии
for (Line* line : lines) { for (Line* line : lines) {
if (line->contains(pos, tolerance)) { if (line->contains(pos, tolerance)) {
return line; return line;
@@ -145,33 +144,39 @@ bool Canvas::areAlreadyPerpendicular(Line* line1, Line* line2)
// Методы работы с ограничениями // Методы работы с ограничениями
// =================================================================== // ===================================================================
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: { case Mode::Horizontal: {
if (auto* pair = std::get_if<PointPair>(&lastConstraint.data)) { if (auto* pair = std::get_if<PointPair>(&info.data)) {
HORIZ_pairs.erase(*pair); HORIZ_pairs.erase(*pair);
} }
break; break;
} }
case Mode::Vertical: { case Mode::Vertical: {
if (auto* pair = std::get_if<PointPair>(&lastConstraint.data)) { if (auto* pair = std::get_if<PointPair>(&info.data)) {
VERT_pairs.erase(*pair); VERT_pairs.erase(*pair);
} }
break; break;
} }
case Mode::Parallel: { case Mode::Parallel: {
if (auto* pair = std::get_if<LinePair>(&lastConstraint.data)) { if (auto* pair = std::get_if<LinePair>(&info.data)) {
parallelPairs.erase(*pair); parallelPairs.erase(*pair);
} }
break; break;
} }
case Mode::Coincedent: { case Mode::Coincedent: {
if (auto* pair = std::get_if<PointPair>(&lastConstraint.data)) { if (auto* pair = std::get_if<PointPair>(&info.data)) {
P2Ppairs.erase(*pair); P2Ppairs.erase(*pair);
} }
break; break;
@@ -179,10 +184,7 @@ void Canvas::remove_constraints()
default: default:
break; break;
} }
C_Info.erase(it);
// Сбрасываем информацию о последнем ограничении
lastConstraint.mode = Mode::None;
constraints_count--;
} }
// =================================================================== // ===================================================================
@@ -249,15 +251,13 @@ void Canvas::mousePressEvent(QMouseEvent* event)
sys.addConstraintHorizontal(*found, constraints_count++); sys.addConstraintHorizontal(*found, constraints_count++);
auto pair = makeOrderedPair<PointPair>(found->start_ref, found->end_ref); auto pair = makeOrderedPair<PointPair>(found->start_ref, found->end_ref);
HORIZ_pairs.insert(pair); HORIZ_pairs.insert(pair);
lastConstraint.mode = Mode::Horizontal; C_Info[constraints_count - 1] = { Mode::Horizontal, pair };
lastConstraint.data = pair;
} }
else { else {
sys.addConstraintVertical(*found, constraints_count++); sys.addConstraintVertical(*found, constraints_count++);
auto pair = makeOrderedPair<PointPair>(found->start_ref, found->end_ref); auto pair = makeOrderedPair<PointPair>(found->start_ref, found->end_ref);
VERT_pairs.insert(pair); VERT_pairs.insert(pair);
lastConstraint.mode = Mode::Vertical; C_Info[constraints_count - 1] = { Mode::Vertical, pair };
lastConstraint.data = pair;
} }
update(); update();
after_constraint = true; after_constraint = true;
@@ -368,8 +368,7 @@ void Canvas::mousePressEvent(QMouseEvent* event)
auto pair = makeOrderedPair<LinePair>(found, current_line); auto pair = makeOrderedPair<LinePair>(found, current_line);
sys.addConstraintParallel(*found, *current_line, constraints_count++); sys.addConstraintParallel(*found, *current_line, constraints_count++);
parallelPairs.insert(pair); parallelPairs.insert(pair);
lastConstraint.mode = Mode::Parallel; C_Info[constraints_count - 1] = { Mode::Parallel, pair };
lastConstraint.data = pair;
current_line = nullptr; current_line = nullptr;
mode = Mode::None; mode = Mode::None;
@@ -439,8 +438,7 @@ void Canvas::mousePressEvent(QMouseEvent* event)
sys.addConstraintP2PCoincident(*clickedPoint, *firstPoint, constraints_count++); sys.addConstraintP2PCoincident(*clickedPoint, *firstPoint, constraints_count++);
auto pair = makeOrderedPair<PointPair>(clickedPoint, firstPoint); auto pair = makeOrderedPair<PointPair>(clickedPoint, firstPoint);
P2Ppairs.insert(pair); P2Ppairs.insert(pair);
lastConstraint.mode = Mode::Coincedent; C_Info[constraints_count - 1] = { Mode::Coincedent, pair };
lastConstraint.data = pair;
firstPoint = nullptr; firstPoint = nullptr;
mode = Mode::None; mode = Mode::None;
@@ -502,8 +500,15 @@ void Canvas::mouseMoveEvent(QMouseEvent* event)
if (draggedPoint) { if (draggedPoint) {
QPointF pos = UCS_POSITION - dragOffset; QPointF pos = UCS_POSITION - dragOffset;
auto coincidentGroup = getCoincidentGroup(draggedPoint); // TODO
for (Point* pair : points) {
if (areCoincident(draggedPoint, pair)) {
*pair->x = pos.x();
*pair->y = pos.y();
}
}
auto coincidentGroup = getCoincidentGroup(draggedPoint);
for (Point* pt : coincidentGroup) { for (Point* pt : coincidentGroup) {
*pt->x = pos.x(); *pt->x = pos.x();
*pt->y = pos.y(); *pt->y = pos.y();
@@ -605,7 +610,8 @@ void Canvas::paintEvent(QPaintEvent* event)
// Ошибка решения: удаляем последнее добавленное ограничение // Ошибка решения: удаляем последнее добавленное ограничение
QMessageBox::warning(this, QString("Error!"), QMessageBox::warning(this, QString("Error!"),
QString("Last constraint is unavailable!")); QString("Last constraint is unavailable!"));
remove_constraints(); remove_constraint(constraints_count - 1);
constraints_count--;
} }
after_constraint = false; after_constraint = false;
} }

View File

@@ -100,7 +100,7 @@ private:
// ====================== Методы работы с ограничениями ====================== // ====================== Методы работы с ограничениями ======================
/// Удалить последние добавленные ограничения при ошибке солвера /// Удалить последние добавленные ограничения при ошибке солвера
void remove_constraints(); void remove_constraint(int);
// ====================== Данные для перемещения объектов ====================== // ====================== Данные для перемещения объектов ======================
@@ -142,10 +142,10 @@ private:
/// Структура для хранения информации о последнем добавленном ограничении /// Структура для хранения информации о последнем добавленном ограничении
/// (используется для отката при ошибке солвера) /// (используется для отката при ошибке солвера)
struct LastConstraint {
Mode mode{ Mode::None }; ///< Тип последнего ограничения
std::variant<LinePair, PointPair> data; ///< Данные ограничения
};
LastConstraint lastConstraint; ///< Информация о последнем добавленном ограничении struct ConstraintInfo {
Mode mode;
std::variant<LinePair, PointPair> data;
};
std::map<int, ConstraintInfo> C_Info;
}; };