Compare commits
1 Commits
master
...
Circle_con
| Author | SHA1 | Date | |
|---|---|---|---|
| c0394cdf89 |
@@ -221,6 +221,7 @@ private:
|
|||||||
|
|
||||||
// ====================== Данные для перемещения объектов ======================
|
// ====================== Данные для перемещения объектов ======================
|
||||||
Point* draggedPoint{ nullptr }; ///< Точка, которую перемещают
|
Point* draggedPoint{ nullptr }; ///< Точка, которую перемещают
|
||||||
|
Line* draggedLine{ nullptr }; ///< Линия, которую перемещают
|
||||||
Curve* draggedCurve { nullptr };
|
Curve* draggedCurve { nullptr };
|
||||||
QPointF dragOffset; ///< Смещение при начале перемещения
|
QPointF dragOffset; ///< Смещение при начале перемещения
|
||||||
|
|
||||||
@@ -241,7 +242,7 @@ private:
|
|||||||
// ====================== Временные данные для режимов ======================
|
// ====================== Временные данные для режимов ======================
|
||||||
Line* current_line{ nullptr }; ///< Текущая линия в режимах рисования/параллельности
|
Line* current_line{ nullptr }; ///< Текущая линия в режимах рисования/параллельности
|
||||||
Circle* current_circle{ nullptr };
|
Circle* current_circle{ nullptr };
|
||||||
Curve* current_curve { nullptr }; ///< Используется при выборе ещё неизвестной системе кривой
|
Curve* current_curve { nullptr };
|
||||||
Point* firstPoint{ nullptr }; ///< Первая точка в режиме совпадения
|
Point* firstPoint{ nullptr }; ///< Первая точка в режиме совпадения
|
||||||
Mode mode{ Mode::None }; ///< Текущий режим работы
|
Mode mode{ Mode::None }; ///< Текущий режим работы
|
||||||
|
|
||||||
|
|||||||
108
src/Canvas.cpp
108
src/Canvas.cpp
@@ -1,7 +1,6 @@
|
|||||||
#include "Canvas.h"
|
#include "Canvas.h"
|
||||||
|
|
||||||
std::set<Point*> groups;
|
std::set<Point*> groups;
|
||||||
static QPointF scene;
|
|
||||||
|
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
// Вспомогательные функции
|
// Вспомогательные функции
|
||||||
@@ -284,18 +283,6 @@ void Canvas::mousePressEvent(QMouseEvent* event)
|
|||||||
|
|
||||||
void Canvas::mouseMoveEvent(QMouseEvent* event)
|
void Canvas::mouseMoveEvent(QMouseEvent* event)
|
||||||
{
|
{
|
||||||
if (current_line) {
|
|
||||||
scene = UCS_POSITION;
|
|
||||||
update();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current_circle) {
|
|
||||||
scene = UCS_POSITION;
|
|
||||||
update();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ====================== Перемещение точки ======================
|
// ====================== Перемещение точки ======================
|
||||||
if (draggedPoint) {
|
if (draggedPoint) {
|
||||||
QPointF pos = UCS_POSITION - dragOffset;
|
QPointF pos = UCS_POSITION - dragOffset;
|
||||||
@@ -397,86 +384,69 @@ void Canvas::paintEvent(QPaintEvent* event)
|
|||||||
|
|
||||||
QPainter p(this);
|
QPainter p(this);
|
||||||
p.setRenderHint(QPainter::Antialiasing, true);
|
p.setRenderHint(QPainter::Antialiasing, true);
|
||||||
|
|
||||||
// Центрирование и масштабирование координат
|
|
||||||
p.translate(width() / 2.0, height() / 2.0);
|
p.translate(width() / 2.0, height() / 2.0);
|
||||||
p.scale(scaleFactor, -scaleFactor);
|
p.scale(scaleFactor, -scaleFactor);
|
||||||
|
|
||||||
// Оси координат (красные, всегда рисуются первыми)
|
|
||||||
p.setPen(Qt::red);
|
p.setPen(Qt::red);
|
||||||
p.drawLine(-5, 0, 5, 0);
|
p.drawLine(-5, 0, 5, 0);
|
||||||
p.drawLine(0, -5, 0, 5);
|
p.drawLine(0, -5, 0, 5);
|
||||||
|
|
||||||
// ====================== Отрисовка всех кривых ======================
|
// ====================== Отрисовка линий ======================
|
||||||
|
|
||||||
for (Curve* curve : curves) {
|
for (Curve* curve : curves) {
|
||||||
if (Line* line = CURVE_AS_LINE(curve)) {
|
if (Line* line = CURVE_AS_LINE(curve)) {
|
||||||
// Выделение линии в режиме Parallel
|
|
||||||
bool isSelected = (mode == Mode::Parallel && line == current_line);
|
bool isSelected = (mode == Mode::Parallel && line == current_line);
|
||||||
|
|
||||||
|
// Настройка пера для линии
|
||||||
QPen linePen = isSelected ? QPen(Qt::red, 4) : QPen(Qt::black, 2);
|
QPen linePen = isSelected ? QPen(Qt::red, 4) : QPen(Qt::black, 2);
|
||||||
p.setPen(linePen);
|
p.setPen(linePen);
|
||||||
|
|
||||||
// Сама линия
|
// Рисуем линию
|
||||||
p.drawLine(QPointF(*line->p1.x, *line->p1.y),
|
p.drawLine(
|
||||||
QPointF(*line->p2.x, *line->p2.y));
|
QPointF(*line->p1.x, *line->p1.y),
|
||||||
|
QPointF(*line->p2.x, *line->p2.y)
|
||||||
|
);
|
||||||
|
|
||||||
// Конечные точки линии
|
// Рисуем конечные точки линии
|
||||||
QBrush pointBrush = isSelected ? QBrush(Qt::red) : QBrush(Qt::darkBlue);
|
QBrush pointBrush = isSelected ? QBrush(Qt::red) : QBrush(Qt::darkBlue);
|
||||||
p.setBrush(pointBrush);
|
p.setBrush(pointBrush);
|
||||||
p.setPen(Qt::NoPen);
|
p.setPen(Qt::NoPen);
|
||||||
|
|
||||||
p.drawEllipse(QPointF(*line->p1.x, *line->p1.y), 5, 5);
|
p.drawEllipse(QPointF(*line->p1.x, *line->p1.y), 5, 5);
|
||||||
p.drawEllipse(QPointF(*line->p2.x, *line->p2.y), 5, 5);
|
p.drawEllipse(QPointF(*line->p2.x, *line->p2.y), 5, 5);
|
||||||
}
|
}
|
||||||
else if (Circle* circle = CURVE_AS_CIRCLE(curve)) {
|
else if (Circle* circle = CURVE_AS_CIRCLE(curve)) {
|
||||||
// Контур окружности
|
|
||||||
p.setPen(QPen(Qt::black, 2));
|
p.setPen(QPen(Qt::black, 2));
|
||||||
p.setBrush(Qt::NoBrush);
|
p.setBrush(Qt::NoBrush);
|
||||||
|
|
||||||
p.drawEllipse(QPointF(*circle->center.x, *circle->center.y),
|
p.drawEllipse(QPointF(*circle->center.x, *circle->center.y),
|
||||||
*circle->rad, *circle->rad);
|
*circle->rad, *circle->rad);
|
||||||
|
|
||||||
// Точка центра
|
|
||||||
p.setBrush(QBrush(Qt::darkBlue));
|
p.setBrush(QBrush(Qt::darkBlue));
|
||||||
p.setPen(Qt::NoPen);
|
p.setPen(Qt::NoPen);
|
||||||
p.drawEllipse(QPointF(*circle->center.x, *circle->center.y), 5, 5);
|
p.drawEllipse(QPointF(*circle->center.x, *circle->center.y), 5, 5);
|
||||||
|
p.setBrush(Qt::NoBrush);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================== Подсветка выбранной точки (режим Coincedent) ======================
|
// ====================== Подсветка выбранной точки (режим Coincedent) ======================
|
||||||
if (mode == Mode::Coincedent && firstPoint) {
|
if (mode == Mode::Coincedent && firstPoint) {
|
||||||
QPointF pt(*firstPoint->x, *firstPoint->y);
|
QPointF pt(*firstPoint->x, *firstPoint->y);
|
||||||
|
|
||||||
p.setPen(Qt::NoPen);
|
p.setPen(Qt::NoPen);
|
||||||
p.setBrush(Qt::red);
|
p.setBrush(Qt::red);
|
||||||
p.drawEllipse(pt, 12, 12);
|
p.drawEllipse(pt, 12, 12);
|
||||||
|
|
||||||
p.setBrush(Qt::white);
|
p.setBrush(Qt::white);
|
||||||
p.drawEllipse(pt, 8, 8);
|
p.drawEllipse(pt, 8, 8);
|
||||||
|
|
||||||
p.setBrush(Qt::red);
|
p.setBrush(Qt::red);
|
||||||
p.drawEllipse(pt, 4, 4);
|
p.drawEllipse(pt, 4, 4); // маленький центр
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================== Отрисовка текущей линии (режим DrawingLine) ======================
|
// ====================== Отрисовка текущей линии (режим DrawingLine) ======================
|
||||||
if (current_line && mode == Mode::DrawingLine) {
|
if (current_line && mode == Mode::DrawingLine) {
|
||||||
p.setPen(Qt::NoPen);
|
// Рисуем начальную точку текущей линии
|
||||||
p.setBrush(Qt::blue);
|
p.setBrush(Qt::blue);
|
||||||
|
p.setPen(Qt::NoPen);
|
||||||
p.drawEllipse(QPointF(*current_line->p1.x, *current_line->p1.y), 6, 6);
|
p.drawEllipse(QPointF(*current_line->p1.x, *current_line->p1.y), 6, 6);
|
||||||
|
|
||||||
p.setPen(Qt::DashLine);
|
|
||||||
p.setBrush(Qt::NoBrush);
|
|
||||||
p.drawLine(QPointF(*current_line->p1.x, *current_line->p1.y), scene);
|
|
||||||
}
|
|
||||||
// ====================== Отрисовка текущей окружности (режим DrawingCircle) ======================
|
|
||||||
else if (current_circle && mode == Mode::DrawingCircle) {
|
|
||||||
QPointF center(*current_circle->center.x, *current_circle->center.y);
|
|
||||||
double current_radius = dist_P2P(center, scene);
|
|
||||||
|
|
||||||
p.setPen(Qt::NoPen);
|
|
||||||
p.setBrush(Qt::blue);
|
|
||||||
p.drawEllipse(center, 5, 5);
|
|
||||||
|
|
||||||
p.setPen(QPen(Qt::black, 1, Qt::DashLine));
|
|
||||||
p.setBrush(Qt::NoBrush);
|
|
||||||
p.drawEllipse(center, current_radius, current_radius);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -570,31 +540,19 @@ void Canvas::leaveEvent(QEvent* event)
|
|||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
void Canvas::showObjectTag(QPointF pos)
|
void Canvas::showObjectTag(QPointF pos)
|
||||||
{
|
{
|
||||||
QPointF l = screenToLogical(pos);
|
//QPointF l = screenToLogical(pos);
|
||||||
Curve* curveUnderCursor = findAt(l, 1.0);
|
//Line* lineUnderCursor = findAt(l, 1.0);
|
||||||
if (Line* line = CURVE_AS_LINE(curveUnderCursor)) {
|
//if (lineUnderCursor && lineUnderCursor != draggedLine) {
|
||||||
if (line != draggedCurve) {
|
// QPointF p1(*lineUnderCursor->p1.x, *lineUnderCursor->p1.y);
|
||||||
QPointF p1(*line->p1.x, *line->p1.y);
|
// QPointF p2(*lineUnderCursor->p2.x, *lineUnderCursor->p2.y);
|
||||||
QPointF p2(*line->p2.x, *line->p2.y);
|
// QLineF info_line(p1, p2);
|
||||||
QLineF info_line(p1, p2);
|
// QString Text = QString("Line %1\nLength = %2mm")
|
||||||
QString Text = QString("Line %1\nLength = %2mm")
|
// .arg(lineUnderCursor->get_tag() + 1)
|
||||||
.arg(line->get_tag() + 1)
|
// .arg(info_line.length());
|
||||||
.arg(info_line.length());
|
// QToolTip::showText(mapToGlobal(pos.toPoint()), Text, this);
|
||||||
QToolTip::showText(mapToGlobal(pos.toPoint()), Text, this);
|
//}
|
||||||
}
|
//else
|
||||||
}
|
// QToolTip::hideText();
|
||||||
else if (Circle* circle = CURVE_AS_CIRCLE(curveUnderCursor)) {
|
|
||||||
if (circle != draggedCurve) {
|
|
||||||
QPointF center(*circle->center.x, *circle->center.y);
|
|
||||||
double current_radius = *circle->rad;
|
|
||||||
QString Text = QString("Circle %1\nRadius = %2mm")
|
|
||||||
.arg(circle->get_tag() + 1)
|
|
||||||
.arg(current_radius);
|
|
||||||
QToolTip::showText(mapToGlobal(pos.toPoint()), Text, this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
QToolTip::hideText();
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -728,7 +686,7 @@ void Canvas::clearCanvas()
|
|||||||
}
|
}
|
||||||
|
|
||||||
draggedPoint = nullptr;
|
draggedPoint = nullptr;
|
||||||
draggedCurve = nullptr;
|
draggedLine = nullptr;
|
||||||
|
|
||||||
// Сброс режима
|
// Сброс режима
|
||||||
mode = Mode::None;
|
mode = Mode::None;
|
||||||
@@ -773,7 +731,7 @@ void Canvas::ON_NONE(QPointF* scene)
|
|||||||
|
|
||||||
void Canvas::ON_LINE(QPointF* pos)
|
void Canvas::ON_LINE(QPointF* pos)
|
||||||
{
|
{
|
||||||
scene = *pos;
|
QPointF scene = *pos;
|
||||||
|
|
||||||
if (!current_line) {
|
if (!current_line) {
|
||||||
// Первый клик: создаем новую линию
|
// Первый клик: создаем новую линию
|
||||||
@@ -846,7 +804,7 @@ void Canvas::ON_LINE(QPointF* pos)
|
|||||||
}
|
}
|
||||||
void Canvas::ON_CIRCLE(QPointF* pos)
|
void Canvas::ON_CIRCLE(QPointF* pos)
|
||||||
{
|
{
|
||||||
scene = *pos;
|
QPointF scene = *pos;
|
||||||
if (!current_circle) {
|
if (!current_circle) {
|
||||||
current_circle = new Circle();
|
current_circle = new Circle();
|
||||||
// Создаем координаты для центра окружности
|
// Создаем координаты для центра окружности
|
||||||
@@ -868,8 +826,8 @@ void Canvas::ON_CIRCLE(QPointF* pos)
|
|||||||
current_circle->rad = r;
|
current_circle->rad = r;
|
||||||
|
|
||||||
params.push_back(r);
|
params.push_back(r);
|
||||||
current_circle->set_tag(obj_count++);
|
|
||||||
curves.append(current_circle);
|
curves.append(current_circle);
|
||||||
|
current_circle->set_tag(obj_count++);
|
||||||
current_circle = nullptr;
|
current_circle = nullptr;
|
||||||
mode = Mode::None;
|
mode = Mode::None;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user