#pragma once #include #include #include #include #ifdef _DEBUG #include #endif // GCS — геометрический солвер из FreeCAD #include "GCS/Geo.h" #include "GCS/GCS.h" using namespace GCS; enum class Mode : int { None = 0, DrawingLine = 1, Parallel = 2, Coincedent = 3, Horizontal = 4, Vertical = 5 }; // Удобный тип для хранения пары параллельных линий (порядок не важен) using LinePair = std::pair; using PointPair = std::pair; // =================================================================== // Основной класс холста // =================================================================== class Canvas : public QWidget { Q_OBJECT public: explicit Canvas(QWidget* parent = nullptr); ~Canvas() override; void changeMode(Mode newMode); protected: 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 mode = false); // ====================== Параллельность ====================== bool areAlreadyParallel(Line* l1, Line* l2); // проверка на дубликат // ====================== Перемещение ====================== Point* draggedPoint{ nullptr }; QPointF dragOffset; // ====================== Данные сцены ====================== System sys; // геометрический солвер QVector lines; // завершённые линии QVector points; // все точки (для удобного доступа) std::vector params; // все параметры, передаваемые в солвер std::set parallelPairs; // уже запараллеленные пары (защита от дублей) std::set P2Ppairs; Line* current_line{ nullptr }; Point* firstPoint{ nullptr }; Mode mode{ Mode::None }; bool after_constraint{ false }; int obj_count{ 0 }; // тег для новых объектов int constraints_count{ 0 }; // тег для новых ограничений };