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 5c0e04df5b Make parallel lines
And make TODO for P2P
2025-12-07 15:54:59 +03:00

66 lines
1.9 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
};
// Óäîáíûé òèï äëÿ õðàíåíèÿ ïàðû ïàðàëëåëüíûõ ëèíèé (ïîðÿäîê íå âàæåí)
using LinePair = std::pair<Line*, Line*>;
// ===================================================================
// Îñíîâíîé êëàññ õîëñòà
// ===================================================================
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 paintEvent(QPaintEvent* event) override;
private:
// ====================== Ïîèñê è âûáîð ======================
Line* findAt(QPointF&); // èùåò ëèíèþ ïîä êóðñîðîì
// ====================== Ïàðàëëåëüíîñòü ======================
LinePair makeOrderedPair(Line* l1, Line* l2);
bool areAlreadyParallel(Line* l1, Line* l2); // ïðîâåðêà íà äóáëèêàò
// ====================== Äàííûå ñöåíû ======================
System sys; // ãåîìåòðè÷åñêèé ñîëâåð
QVector<Line*> lines; // çàâåðø¸ííûå ëèíèè
QVector<Point> points; // âñå òî÷êè (äëÿ óäîáíîãî äîñòóïà)
std::vector<double*> params; // âñå ïàðàìåòðû, ïåðåäàâàåìûå â ñîëâåð
std::set<LinePair> parallelPairs; // óæå çàïàðàëëåëåííûå ïàðû (çàùèòà îò äóáëåé)
Line* current_line{ nullptr };
Mode mode{ Mode::None };
int obj_count{ 0 }; // òåã äëÿ íîâûõ îáúåêòîâ
int constraints_count{ 0 }; // òåã äëÿ íîâûõ îãðàíè÷åíèé
};