From 9a02d1a654248e60b0bbf3bf9d0632918fdeb47c Mon Sep 17 00:00:00 2001 From: thomas_lucky13 Date: Thu, 30 Jun 2022 00:42:41 +0400 Subject: [PATCH] new Line erase --- src/domain/UBGraphicsLineItem.cpp | 16 ++++++++-- src/domain/UBGraphicsLineItem.h | 20 +++++++------ src/domain/UBGraphicsScene.cpp | 50 +++++++++++++++++++++++++++---- 3 files changed, 70 insertions(+), 16 deletions(-) diff --git a/src/domain/UBGraphicsLineItem.cpp b/src/domain/UBGraphicsLineItem.cpp index e1d46cae..881bcb18 100644 --- a/src/domain/UBGraphicsLineItem.cpp +++ b/src/domain/UBGraphicsLineItem.cpp @@ -6,7 +6,6 @@ #include "core/memcheck.h" -#include UBGraphicsLineItem::UBGraphicsLineItem (QGraphicsItem * parent) : QGraphicsLineItem(parent) @@ -20,7 +19,6 @@ UBGraphicsLineItem::UBGraphicsLineItem (QGraphicsItem * parent) initialize(); } - UBGraphicsLineItem::UBGraphicsLineItem (const QLineF & line, QGraphicsItem * parent) : QGraphicsLineItem(line, parent) , mOriginalWidth(-1) @@ -144,6 +142,20 @@ Qt::PenStyle UBGraphicsLineItem::style() const return QGraphicsLineItem::pen().style(); } +QList UBGraphicsLineItem::linePoints() +{ + QList points = QList(); + qreal incr = 1/line().length(); + if (incr<0) incr*=-1; + if (incr>0) + { + for (qreal t = 0; t <= 1; t+=incr) + { + points.push_back(line().pointAt(t)); + } + } + return points; +} UBItem* UBGraphicsLineItem::deepCopy() const { diff --git a/src/domain/UBGraphicsLineItem.h b/src/domain/UBGraphicsLineItem.h index f21c1039..535ef143 100644 --- a/src/domain/UBGraphicsLineItem.h +++ b/src/domain/UBGraphicsLineItem.h @@ -37,23 +37,23 @@ class UBGraphicsLineItem : public QGraphicsLineItem, public UBItem virtual UBGraphicsScene* scene(); - inline void subtract(UBGraphicsLineItem *pi) + inline void subtract(UBGraphicsLineItem *li) { - //if (boundingRect().intersects(pi->boundingRect())) - //{ - //QLineF subtractedLine = line().substracted(pi->line()); + /*if (boundingRect().intersects(li->boundingRect())) + { + QLineF subtractedLine = line().substracted(li->line()); - /*if (line() != subtractedLine) + if (line() != subtractedLine) { mIsNominalLine = false; QGraphicsLineItem::setLine(subtractedLine); - }*/ - //} + } + }*/ } - inline void subtractIntersecting(UBGraphicsLineItem *pi) + inline void subtractIntersecting(UBGraphicsLineItem *li) { - /*QLineF subtractedLine = line();.substracted(pi->line()) + /*QLineF subtractedLine = line().substracted(li->line()); if (line() != subtractedLine) { mIsNominalLine = false; @@ -84,6 +84,8 @@ class UBGraphicsLineItem : public QGraphicsLineItem, public UBItem void setNominalLine(bool isNominalLine) { mIsNominalLine = isNominalLine; } + QList linePoints(); + QColor colorOnDarkBackground() const { return mColorOnDarkBackground; diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 5ced9f53..ac3cbfdc 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -1047,13 +1047,15 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) typedef QList POLYGONSLIST; QList intersectedPolygons; + QList intersectedLineItems; + #pragma omp parallel for for(int i=0; i(collidItems[i]); - if(pi == NULL) - continue; - + UBGraphicsLineItem *li = qgraphicsitem_cast(collidItems[i]); + if(pi != NULL) + { QPainterPath itemPainterPath; itemPainterPath.addPolygon(pi->sceneTransform().map(pi->polygon())); @@ -1076,6 +1078,23 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) intersectedPolygons << newPath.simplified().toFillPolygons(pi->sceneTransform().inverted()); } } + } else if (li != NULL) + { + QPainterPath itemPainterPath; + QList linePoints = li->linePoints(); + for (int i=0; i < linePoints.count(); ++i) + { + itemPainterPath.addEllipse(linePoints[i], 1, 1); + } + if (eraserPath.contains(itemPainterPath) || eraserPath.intersects(itemPainterPath)) + { + #pragma omp critical + { + // Compete remove item + intersectedLineItems << li; + } + } + } } for(int i=0; isetTransform(t); } - if (!intersectedItems.empty()) + for (int i=0; isetTransform(t); + } + } + + if (!intersectedItems.empty() || !intersectedLineItems.empty()) setModified(true); } @@ -1552,7 +1585,7 @@ void UBGraphicsScene::clearContent(clearCase pCase) ? qgraphicsitem_cast(item->parentItem()) : 0; UBGraphicsItemDelegate *curDelegate = UBGraphicsItem::Delegate(item); - if (!curDelegate) { + if (!curDelegate && item->type() != UBGraphicsLineItem::Type) { continue; } @@ -1560,6 +1593,12 @@ void UBGraphicsScene::clearContent(clearCase pCase) bool isStrokesGroup = item->type() == UBGraphicsStrokesGroup::Type; bool shouldDelete = false; + if(item->type()==UBGraphicsLineItem::Type) + { + removedItems << item; + this->removeItem(item); + } else + { switch (static_cast(pCase)) { case clearAnnotations : shouldDelete = isStrokesGroup; @@ -1571,6 +1610,7 @@ void UBGraphicsScene::clearContent(clearCase pCase) shouldDelete = !isGroup && !isBackgroundObject(item); break; } + } if(shouldDelete) { if (itemGroup) {