Удаление всех объектов и ограничений из чертежа

Скоро буду переходить на SolveSpace
This commit is contained in:
2025-12-17 18:12:48 +03:00
parent 826b7464b7
commit d261555c88
2 changed files with 138 additions and 29 deletions

View File

@@ -29,40 +29,13 @@ Canvas::Canvas(QWidget* parent)
sys = System();
setMouseTracking(true);
setBackgroundRole(QPalette::Base);
setFocusPolicy(Qt::StrongFocus);
setAutoFillBackground(true);
}
Canvas::~Canvas()
{
// Очистка динамически выделенной памяти
for (double* param : params) {
delete param;
}
for (Point* pt : points) {
delete pt;
}
for (Line* line : lines) {
delete line;
}
// Очистка контейнеров
params.clear();
points.clear();
lines.clear();
parallelPairs.clear();
P2Ppairs.clear();
VERT_pairs.clear();
HORIZ_pairs.clear();
// Очистка временных указателей
if (current_line)
delete current_line;
if (firstPoint)
delete firstPoint;
clearCanvas();
}
// ===================================================================
@@ -661,6 +634,77 @@ void Canvas::paintEvent(QPaintEvent* event)
}
}
void Canvas::keyPressEvent(QKeyEvent* event)
{
switch (event->key()) {
case Qt::Key_Delete:
case Qt::Key_Clear: {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this,
"Очистка canvas",
"Удалить все объекты и ограничения?",
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
clearCanvas();
}
break;
}
case Qt::Key_Escape: {
// Отмена текущего действия
if (mode == Mode::DrawingLine && current_line) {
// Отмена рисования линии
delete current_line;
current_line = nullptr;
// Удаляем созданные точки и параметры
if (points.size() >= 2) {
delete points.back();
points.pop_back();
delete points.back();
points.pop_back();
}
if (params.size() >= 4) {
delete params.back();
params.pop_back();
delete params.back();
params.pop_back();
delete params.back();
params.pop_back();
delete params.back();
params.pop_back();
}
mode = Mode::None;
update();
}
else if (mode != Mode::None) {
// Отмена любого другого режима
mode = Mode::None;
current_line = nullptr;
firstPoint = nullptr;
update();
}
break;
}
case Qt::Key_Z: {
if (event->modifiers() & Qt::ControlModifier) {
// Ctrl+Z - отмена последнего ограничения
if (constraints_count > 0) {
remove_constraint(constraints_count - 1);
constraints_count--;
solve_for_canvas();
}
}
break;
}
default:
QWidget::keyPressEvent(event);
}
}
void Canvas::leaveEvent(QEvent* event)
{
Q_UNUSED(event);
@@ -736,3 +780,65 @@ void Canvas::solve_for_canvas()
after_constraint = false;
update();
}
// ===================================================================
// Очистка всего canvas
// ===================================================================
void Canvas::clearCanvas()
{
// Очистка солвера
sys.clear();
// Очистка динамически выделенной памяти
for (double* param : params) {
delete param;
}
for (Point* pt : points) {
delete pt;
}
for (Line* line : lines) {
delete line;
}
// Очистка контейнеров
params.clear();
points.clear();
lines.clear();
// Очистка контейнеров ограничений
parallelPairs.clear();
P2Ppairs.clear();
VERT_pairs.clear();
HORIZ_pairs.clear();
perpendicularPairs.clear();
// Очистка информации об ограничениях
C_Info.clear();
// Сброс счетчиков
obj_count = 0;
constraints_count = 0;
// Очистка временных указателей
if (current_line) {
delete current_line;
current_line = nullptr;
}
if (firstPoint) {
delete firstPoint;
firstPoint = nullptr;
}
draggedPoint = nullptr;
draggedLine = nullptr;
// Сброс режима
mode = Mode::None;
// Обновление отображения
update();
}

View File

@@ -6,6 +6,7 @@ constexpr auto EPS = 1e-9;
#include <QPointF>
#include <QMessageBox>
#include <QToolTip>
#include <QKeyEvent>
#ifdef _DEBUG
#include <QDebug>
@@ -59,6 +60,7 @@ protected:
void mouseMoveEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void paintEvent(QPaintEvent* event) override;
void keyPressEvent(QKeyEvent* event);
void leaveEvent(QEvent* event) override;
private:
@@ -148,4 +150,5 @@ private:
std::map<int, ConstraintInfo> C_Info;
void solve_for_canvas();
void clearCanvas();
};