Удаление всех объектов и ограничений из чертежа
Скоро буду переходить на SolveSpace
This commit is contained in:
164
Canvas.cpp
164
Canvas.cpp
@@ -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);
|
||||
@@ -735,4 +779,66 @@ 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();
|
||||
}
|
||||
3
Canvas.h
3
Canvas.h
@@ -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();
|
||||
};
|
||||
Reference in New Issue
Block a user