66 lines
1.9 KiB
C++
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 }; // òåã äëÿ íîâûõ îãðàíè÷åíèé
|
|
}; |