|
|
@ -740,6 +740,63 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
const QLineF line(mPreviousPoint, pEndPoint); |
|
|
|
|
|
|
|
mPreviousPoint = pEndPoint; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const QPolygonF eraserPolygon = UBGeometryUtils::lineToPolygon(line, pWidth); |
|
|
|
|
|
|
|
const QRectF eraserBoundingRect = eraserPolygon.boundingRect(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QPainterPath eraserPath; |
|
|
|
|
|
|
|
eraserPath.addPolygon(eraserPolygon); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Get all the items that are intersecting with the eraser path
|
|
|
|
|
|
|
|
QList<QGraphicsItem*> collidItems = items(eraserBoundingRect, Qt::IntersectsItemBoundingRect); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QList<UBGraphicsPolygonItem*> intersectedItems; |
|
|
|
|
|
|
|
QList<QPolygonF> intersectedPolygons; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma omp parallel for |
|
|
|
|
|
|
|
for(int i=0; i<collidItems.size(); i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
UBGraphicsPolygonItem *pi = qgraphicsitem_cast<UBGraphicsPolygonItem*>(collidItems[i]); |
|
|
|
|
|
|
|
if(pi == NULL) |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QPainterPath itemPainterPath; |
|
|
|
|
|
|
|
itemPainterPath.addPolygon(pi->sceneTransform().map(pi->polygon())); |
|
|
|
|
|
|
|
if (eraserPath.contains(itemPainterPath)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// Compele remove item
|
|
|
|
|
|
|
|
intersectedItems << pi; |
|
|
|
|
|
|
|
intersectedPolygons << QPolygonF(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (eraserPath.intersects(itemPainterPath)) |
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
QPainterPath newPath = itemPainterPath.subtracted(eraserPath); |
|
|
|
|
|
|
|
intersectedItems << pi; |
|
|
|
|
|
|
|
intersectedPolygons << newPath.simplified().toFillPolygon(pi->sceneTransform().inverted()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(int i=0; i<intersectedItems.size(); i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (intersectedPolygons[i].empty()) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
removeItem(intersectedItems[i]); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
intersectedItems[i]->setPolygon(intersectedPolygons[i]); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!intersectedItems.empty()) |
|
|
|
|
|
|
|
setModified(true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) |
|
|
|
void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) |
|
|
|
{ |
|
|
|
{ |
|
|
|
const QLineF line(mPreviousPoint, pEndPoint); |
|
|
|
const QLineF line(mPreviousPoint, pEndPoint); |
|
|
@ -810,7 +867,6 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) |
|
|
|
collidingPath.addPolygon(collidingPolygon); |
|
|
|
collidingPath.addPolygon(collidingPolygon); |
|
|
|
|
|
|
|
|
|
|
|
// Then we substract the eraser path to the polygon and we simplify it
|
|
|
|
// Then we substract the eraser path to the polygon and we simplify it
|
|
|
|
/**/ |
|
|
|
|
|
|
|
QTransform polyTransform = collidingPolygonItem->sceneTransform().inverted(); |
|
|
|
QTransform polyTransform = collidingPolygonItem->sceneTransform().inverted(); |
|
|
|
QPointF mTrPrevPoint = polyTransform.map(mPreviousPoint); |
|
|
|
QPointF mTrPrevPoint = polyTransform.map(mPreviousPoint); |
|
|
|
QPointF mTrEndPoint = polyTransform.map(pEndPoint); |
|
|
|
QPointF mTrEndPoint = polyTransform.map(pEndPoint); |
|
|
@ -821,18 +877,18 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) |
|
|
|
QPainterPath trEraser; |
|
|
|
QPainterPath trEraser; |
|
|
|
trEraser.addPolygon(trEraserPolygon); |
|
|
|
trEraser.addPolygon(trEraserPolygon); |
|
|
|
QPainterPath croppedPath = collidingPath.subtracted(trEraser); |
|
|
|
QPainterPath croppedPath = collidingPath.subtracted(trEraser); |
|
|
|
/**/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Original
|
|
|
|
// Original
|
|
|
|
//QPainterPath croppedPath = collidingPath.subtracted(eraserPath);
|
|
|
|
//QPainterPath croppedPath = collidingPath.subtracted(eraserPath);
|
|
|
|
QPainterPath croppedPathSimplified = croppedPath.simplified(); |
|
|
|
QPainterPath croppedPathSimplified = croppedPath.simplified(); |
|
|
|
|
|
|
|
|
|
|
|
/*if (croppedPath == collidingPath)
|
|
|
|
//if (croppedPath == collidingPath)
|
|
|
|
{ |
|
|
|
//{
|
|
|
|
// NOOP
|
|
|
|
// // NOOP
|
|
|
|
toBeRemovedItems << collidingPolygonItem; |
|
|
|
// toBeRemovedItems << collidingPolygonItem;
|
|
|
|
} |
|
|
|
//}
|
|
|
|
else */if (croppedPathSimplified.isEmpty()) |
|
|
|
//else
|
|
|
|
|
|
|
|
if (croppedPathSimplified.isEmpty()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
#pragma omp critical |
|
|
|
#pragma omp critical |
|
|
|
// Put the entire polygon into the remove list if the eraser removes all its visible content
|
|
|
|
// Put the entire polygon into the remove list if the eraser removes all its visible content
|
|
|
@ -948,6 +1004,7 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) |
|
|
|
|
|
|
|
|
|
|
|
mPreviousPoint = pEndPoint; |
|
|
|
mPreviousPoint = pEndPoint; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
void UBGraphicsScene::drawArcTo(const QPointF& pCenterPoint, qreal pSpanAngle) |
|
|
|
void UBGraphicsScene::drawArcTo(const QPointF& pCenterPoint, qreal pSpanAngle) |
|
|
|
{ |
|
|
|
{ |
|
|
|