Улучшение читабельности кода

This commit is contained in:
2025-12-15 12:07:31 +03:00
parent cc6dfbc4a2
commit e2ce3a0e48
2 changed files with 650 additions and 526 deletions

120
Canvas.h
View File

@@ -14,18 +14,25 @@
#include "GCS/GCS.h"
using namespace GCS;
// ===================================================================
// Типы и перечисления
// ===================================================================
/// Режимы работы с холстом
enum class Mode : int
{
None = 0,
DrawingLine = 1,
Parallel = 2,
Coincedent = 3,
Horizontal = 4,
Vertical = 5
None = 0, ///< Режим отсутствия действия
DrawingLine = 1, ///< Режим рисования линии
Parallel = 2, ///< Режим задания параллельности
Coincedent = 3, ///< Режим задания совпадения точек
Horizontal = 4, ///< Режим задания горизонтальности
Vertical = 5 ///< Режим задания вертикальности
};
// Удобный тип для хранения пары параллельных линий (порядок не важен)
/// Удобный тип для хранения пары параллельных линий (порядок не важен)
using LinePair = std::pair<Line*, Line*>;
/// Удобный тип для хранения пары точек (порядок не важен)
using PointPair = std::pair<Point*, Point*>;
// ===================================================================
@@ -40,54 +47,89 @@ public:
explicit Canvas(QWidget* parent = nullptr);
~Canvas() override;
/// Изменить текущий режим работы
void changeMode(Mode newMode);
protected:
// Обработчики событий Qt
void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void paintEvent(QPaintEvent* event) override;
private:
// ====================== Поиск и выбор ======================
Line* findAt(QPointF&); // ищет линию под курсором
Point* findPointAt(QPointF, qreal tolerance = 5.0);
bool areCoincident(Point*, Point*);
bool areHorizontalVertical(Point*, Point*, bool);
bool isLineHorizontal(Line* line); // проверяет, горизонтальна ли линия
bool isLineVertical(Line* line); // проверяет, вертикальна ли линия
// ====================== Параллельность ======================
bool areAlreadyParallel(Line* l1, Line* l2); // проверка на дубликат
// ====================== Методы поиска и выбора ======================
// ====================== Перемещение ======================
Point* draggedPoint{ nullptr };
Line* draggedLine{ nullptr };
QPointF dragOffset;
/// Найти линию под указанной позицией
Line* findAt(QPointF& position);
// ====================== Работа с парами ограничений ======================
/// Найти точку в указанной позиции с заданной точностью
Point* findPointAt(QPointF position, qreal tolerance = 5.0);
/// Проверить, совпадают ли две точки (ограничение P2P)
bool areCoincident(Point* point1, Point* point2);
/// Проверить горизонтальность или вертикальность между двумя точками
/// @param mode: false - горизонтальность, true - вертикальность
bool areHorizontalVertical(Point* point1, Point* point2, bool mode);
/// Проверить, является ли линия горизонтальной
bool isLineHorizontal(Line* line);
/// Проверить, является ли линия вертикальной
bool isLineVertical(Line* line);
/// Проверить, являются ли две линии уже параллельными (дубликат ограничения)
bool areAlreadyParallel(Line* line1, Line* line2);
// ====================== Методы работы с ограничениями ======================
/// Удалить последние добавленные ограничения при ошибке солвера
void remove_constraints();
// ====================== Данные сцены ======================
System sys; // геометрический солвер
QVector<Line*> lines; // завершённые линии
QVector<Point*> points; // все точки (для удобного доступа)
std::vector<double*> params; // все параметры, передаваемые в солвер
std::set<LinePair> parallelPairs; // уже запараллеленные пары (защита от дублей)
std::set<PointPair> P2Ppairs;
std::set<PointPair> HORIZ_pairs;
std::set<PointPair> VERT_pairs;
// ====================== Данные для перемещения объектов ======================
Line* current_line{ nullptr };
Point* firstPoint{ nullptr };
Mode mode{ Mode::None };
bool after_constraint{ false };
Point* draggedPoint{ nullptr }; ///< Точка, которую перемещают
Line* draggedLine{ nullptr }; ///< Линия, которую перемещают
QPointF dragOffset; ///< Смещение при начале перемещения
int obj_count{ 0 }; // тег для новых объектов
int constraints_count{ 0 }; // тег для новых ограничений
// ====================== Данные геометрической системы ======================
System sys; ///< Геометрический солвер
QVector<Line*> lines; ///< Завершённые линии
QVector<Point*> points; ///< Все точки сцены
std::vector<double*> params; ///< Все параметры, передаваемые в солвер
// ====================== Коллекции ограничений ======================
std::set<LinePair> parallelPairs; ///< Пары параллельных линий
std::set<PointPair> P2Ppairs; ///< Пары совпадающих точек
std::set<PointPair> HORIZ_pairs; ///< Пары точек горизонтальных линий
std::set<PointPair> VERT_pairs; ///< Пары точек вертикальных линий
// ====================== Временные данные для режимов ======================
Line* current_line{ nullptr }; ///< Текущая линия в режимах рисования/параллельности
Point* firstPoint{ nullptr }; ///< Первая точка в режиме совпадения
Mode mode{ Mode::None }; ///< Текущий режим работы
// ====================== Флаги состояния ======================
bool after_constraint{ false }; ///< Флаг, что только что добавлено ограничение
// ====================== Счётчики ======================
int obj_count{ 0 }; ///< Счётчик объектов (для тегов)
int constraints_count{ 0 }; ///< Счётчик ограничений (для тегов)
// ====================== Информация о последнем ограничении ======================
/// Структура для хранения информации о последнем добавленном ограничении
/// (используется для отката при ошибке солвера)
struct LastConstraint {
Mode mode{ Mode::None };
std::variant<LinePair, PointPair> data;
Mode mode{ Mode::None }; ///< Тип последнего ограничения
std::variant<LinePair, PointPair> data; ///< Данные ограничения
};
LastConstraint lastConstraint;
LastConstraint lastConstraint; ///< Информация о последнем добавленном ограничении
};