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

79 lines
2.7 KiB
C++

#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 mode = false);
// ====================== Параллельность ======================
bool areAlreadyParallel(Line* l1, Line* l2); // проверка на дубликат
// ====================== Перемещение ======================
Point* draggedPoint{ nullptr };
QPointF dragOffset;
// ====================== Данные сцены ======================
System sys; // геометрический солвер
QVector<Line*> lines; // завершённые линии
QVector<Point*> points; // все точки (для удобного доступа)
std::vector<double*> params; // все параметры, передаваемые в солвер
std::set<LinePair> parallelPairs; // уже запараллеленные пары (защита от дублей)
std::set<PointPair> P2Ppairs;
Line* current_line{ nullptr };
Point* firstPoint{ nullptr };
Mode mode{ Mode::None };
bool after_constraint{ false };
int obj_count{ 0 }; // тег для новых объектов
int constraints_count{ 0 }; // тег для новых ограничений
};