Merge branch 'remove_constraint' into Perpendicular
This commit is contained in:
50
Canvas.cpp
50
Canvas.cpp
@@ -78,7 +78,6 @@ void Canvas::changeMode(Mode _mode)
|
|||||||
|
|
||||||
Line* Canvas::findAt(QPointF& pos, qreal tolerance)
|
Line* Canvas::findAt(QPointF& pos, qreal tolerance)
|
||||||
{
|
{
|
||||||
// TODO: реализовать проверку, находится ли точка на линии
|
|
||||||
for (Line* line : lines) {
|
for (Line* line : lines) {
|
||||||
if (line->contains(pos, tolerance)) {
|
if (line->contains(pos, tolerance)) {
|
||||||
return line;
|
return line;
|
||||||
@@ -145,33 +144,39 @@ bool Canvas::areAlreadyPerpendicular(Line* line1, Line* line2)
|
|||||||
// Методы работы с ограничениями
|
// Методы работы с ограничениями
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
|
|
||||||
void Canvas::remove_constraints()
|
// TODO - переделать в bool для отображения статуса выполнения
|
||||||
|
void Canvas::remove_constraint(int tag)
|
||||||
{
|
{
|
||||||
|
auto it = C_Info.find(tag);
|
||||||
|
if (it == C_Info.end()) return;
|
||||||
|
|
||||||
|
ConstraintInfo info = it->second;
|
||||||
|
|
||||||
// Удаляем ограничение из солвера
|
// Удаляем ограничение из солвера
|
||||||
sys.clearByTag(constraints_count - 1);
|
sys.clearByTag(tag);
|
||||||
|
|
||||||
// Удаляем из соответствующих контейнеров в зависимости от типа ограничения
|
// Удаляем из соответствующих контейнеров в зависимости от типа ограничения
|
||||||
switch (lastConstraint.mode) {
|
switch (info.mode) {
|
||||||
case Mode::Horizontal: {
|
case Mode::Horizontal: {
|
||||||
if (auto* pair = std::get_if<PointPair>(&lastConstraint.data)) {
|
if (auto* pair = std::get_if<PointPair>(&info.data)) {
|
||||||
HORIZ_pairs.erase(*pair);
|
HORIZ_pairs.erase(*pair);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Mode::Vertical: {
|
case Mode::Vertical: {
|
||||||
if (auto* pair = std::get_if<PointPair>(&lastConstraint.data)) {
|
if (auto* pair = std::get_if<PointPair>(&info.data)) {
|
||||||
VERT_pairs.erase(*pair);
|
VERT_pairs.erase(*pair);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Mode::Parallel: {
|
case Mode::Parallel: {
|
||||||
if (auto* pair = std::get_if<LinePair>(&lastConstraint.data)) {
|
if (auto* pair = std::get_if<LinePair>(&info.data)) {
|
||||||
parallelPairs.erase(*pair);
|
parallelPairs.erase(*pair);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Mode::Coincedent: {
|
case Mode::Coincedent: {
|
||||||
if (auto* pair = std::get_if<PointPair>(&lastConstraint.data)) {
|
if (auto* pair = std::get_if<PointPair>(&info.data)) {
|
||||||
P2Ppairs.erase(*pair);
|
P2Ppairs.erase(*pair);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -179,10 +184,7 @@ void Canvas::remove_constraints()
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
C_Info.erase(it);
|
||||||
// Сбрасываем информацию о последнем ограничении
|
|
||||||
lastConstraint.mode = Mode::None;
|
|
||||||
constraints_count--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
@@ -249,15 +251,13 @@ void Canvas::mousePressEvent(QMouseEvent* event)
|
|||||||
sys.addConstraintHorizontal(*found, constraints_count++);
|
sys.addConstraintHorizontal(*found, constraints_count++);
|
||||||
auto pair = makeOrderedPair<PointPair>(found->start_ref, found->end_ref);
|
auto pair = makeOrderedPair<PointPair>(found->start_ref, found->end_ref);
|
||||||
HORIZ_pairs.insert(pair);
|
HORIZ_pairs.insert(pair);
|
||||||
lastConstraint.mode = Mode::Horizontal;
|
C_Info[constraints_count - 1] = { Mode::Horizontal, pair };
|
||||||
lastConstraint.data = pair;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sys.addConstraintVertical(*found, constraints_count++);
|
sys.addConstraintVertical(*found, constraints_count++);
|
||||||
auto pair = makeOrderedPair<PointPair>(found->start_ref, found->end_ref);
|
auto pair = makeOrderedPair<PointPair>(found->start_ref, found->end_ref);
|
||||||
VERT_pairs.insert(pair);
|
VERT_pairs.insert(pair);
|
||||||
lastConstraint.mode = Mode::Vertical;
|
C_Info[constraints_count - 1] = { Mode::Vertical, pair };
|
||||||
lastConstraint.data = pair;
|
|
||||||
}
|
}
|
||||||
update();
|
update();
|
||||||
after_constraint = true;
|
after_constraint = true;
|
||||||
@@ -368,8 +368,7 @@ void Canvas::mousePressEvent(QMouseEvent* event)
|
|||||||
auto pair = makeOrderedPair<LinePair>(found, current_line);
|
auto pair = makeOrderedPair<LinePair>(found, current_line);
|
||||||
sys.addConstraintParallel(*found, *current_line, constraints_count++);
|
sys.addConstraintParallel(*found, *current_line, constraints_count++);
|
||||||
parallelPairs.insert(pair);
|
parallelPairs.insert(pair);
|
||||||
lastConstraint.mode = Mode::Parallel;
|
C_Info[constraints_count - 1] = { Mode::Parallel, pair };
|
||||||
lastConstraint.data = pair;
|
|
||||||
|
|
||||||
current_line = nullptr;
|
current_line = nullptr;
|
||||||
mode = Mode::None;
|
mode = Mode::None;
|
||||||
@@ -439,8 +438,7 @@ void Canvas::mousePressEvent(QMouseEvent* event)
|
|||||||
sys.addConstraintP2PCoincident(*clickedPoint, *firstPoint, constraints_count++);
|
sys.addConstraintP2PCoincident(*clickedPoint, *firstPoint, constraints_count++);
|
||||||
auto pair = makeOrderedPair<PointPair>(clickedPoint, firstPoint);
|
auto pair = makeOrderedPair<PointPair>(clickedPoint, firstPoint);
|
||||||
P2Ppairs.insert(pair);
|
P2Ppairs.insert(pair);
|
||||||
lastConstraint.mode = Mode::Coincedent;
|
C_Info[constraints_count - 1] = { Mode::Coincedent, pair };
|
||||||
lastConstraint.data = pair;
|
|
||||||
|
|
||||||
firstPoint = nullptr;
|
firstPoint = nullptr;
|
||||||
mode = Mode::None;
|
mode = Mode::None;
|
||||||
@@ -502,8 +500,15 @@ void Canvas::mouseMoveEvent(QMouseEvent* event)
|
|||||||
if (draggedPoint) {
|
if (draggedPoint) {
|
||||||
QPointF pos = UCS_POSITION - dragOffset;
|
QPointF pos = UCS_POSITION - dragOffset;
|
||||||
|
|
||||||
auto coincidentGroup = getCoincidentGroup(draggedPoint);
|
// TODO
|
||||||
|
for (Point* pair : points) {
|
||||||
|
if (areCoincident(draggedPoint, pair)) {
|
||||||
|
*pair->x = pos.x();
|
||||||
|
*pair->y = pos.y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto coincidentGroup = getCoincidentGroup(draggedPoint);
|
||||||
for (Point* pt : coincidentGroup) {
|
for (Point* pt : coincidentGroup) {
|
||||||
*pt->x = pos.x();
|
*pt->x = pos.x();
|
||||||
*pt->y = pos.y();
|
*pt->y = pos.y();
|
||||||
@@ -605,7 +610,8 @@ void Canvas::paintEvent(QPaintEvent* event)
|
|||||||
// Ошибка решения: удаляем последнее добавленное ограничение
|
// Ошибка решения: удаляем последнее добавленное ограничение
|
||||||
QMessageBox::warning(this, QString("Error!"),
|
QMessageBox::warning(this, QString("Error!"),
|
||||||
QString("Last constraint is unavailable!"));
|
QString("Last constraint is unavailable!"));
|
||||||
remove_constraints();
|
remove_constraint(constraints_count - 1);
|
||||||
|
constraints_count--;
|
||||||
}
|
}
|
||||||
after_constraint = false;
|
after_constraint = false;
|
||||||
}
|
}
|
||||||
|
|||||||
12
Canvas.h
12
Canvas.h
@@ -100,7 +100,7 @@ private:
|
|||||||
// ====================== Методы работы с ограничениями ======================
|
// ====================== Методы работы с ограничениями ======================
|
||||||
|
|
||||||
/// Удалить последние добавленные ограничения при ошибке солвера
|
/// Удалить последние добавленные ограничения при ошибке солвера
|
||||||
void remove_constraints();
|
void remove_constraint(int);
|
||||||
|
|
||||||
// ====================== Данные для перемещения объектов ======================
|
// ====================== Данные для перемещения объектов ======================
|
||||||
|
|
||||||
@@ -142,10 +142,10 @@ private:
|
|||||||
|
|
||||||
/// Структура для хранения информации о последнем добавленном ограничении
|
/// Структура для хранения информации о последнем добавленном ограничении
|
||||||
/// (используется для отката при ошибке солвера)
|
/// (используется для отката при ошибке солвера)
|
||||||
struct LastConstraint {
|
|
||||||
Mode mode{ Mode::None }; ///< Тип последнего ограничения
|
|
||||||
std::variant<LinePair, PointPair> data; ///< Данные ограничения
|
|
||||||
};
|
|
||||||
|
|
||||||
LastConstraint lastConstraint; ///< Информация о последнем добавленном ограничении
|
struct ConstraintInfo {
|
||||||
|
Mode mode;
|
||||||
|
std::variant<LinePair, PointPair> data;
|
||||||
|
};
|
||||||
|
std::map<int, ConstraintInfo> C_Info;
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user