This repository has been archived on 2026-05-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
DRAwer_2_0/Canvas.h
ParkSuMin eb946e2e6a Фикс с удалением ограничений
А ещё сделали так, чтобы линия не могла быть горизонтальной и вертикальной одновременно
2025-12-15 11:55:32 +03:00

93 lines
3.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include <QWidget>
#include <QMouseEvent>
#include <QPointF>
#include <QMessageBox>
#ifdef _DEBUG
#include <QDebug>
#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<Line*, Line*>;
using PointPair = std::pair<Point*, Point*>;
// ===================================================================
// Основной класс холста
// ===================================================================
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 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;
// ====================== Работа с парами ограничений ======================
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 };
int obj_count{ 0 }; // тег для новых объектов
int constraints_count{ 0 }; // тег для новых ограничений
struct LastConstraint {
Mode mode{ Mode::None };
std::variant<LinePair, PointPair> data;
};
LastConstraint lastConstraint;
};