|
@@ -1,7 +1,7 @@
|
|
|
#include "WaffleGraphicsView.h"
|
|
|
#include <QDebug>
|
|
|
#include <QScrollBar>
|
|
|
-
|
|
|
+#
|
|
|
WaffleGraphicsView::WaffleGraphicsView(QGraphicsScene* scene, QWidget* parent)
|
|
|
: QGraphicsView(scene, parent), selecting(false), selectionRect(nullptr),
|
|
|
scaleFactor(1.0), isDragging(false), thumbnailLabel(nullptr),
|
|
@@ -52,14 +52,14 @@ bool WaffleGraphicsView::eventFilter(QObject *obj, QEvent *event) {
|
|
|
|
|
|
void WaffleGraphicsView::mousePressEvent(QMouseEvent* event) {
|
|
|
if (event->button() == Qt::LeftButton) {
|
|
|
- // 清空选中的 DieItem
|
|
|
- for (auto& item : selectedItemsMap) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
+ // 清空选中的 WaffleItem
|
|
|
+ for (auto& item : selectedItems) {
|
|
|
+ WaffleItem* die = dynamic_cast<WaffleItem*>(item);
|
|
|
if (die) {
|
|
|
die->setSelected(false); // 取消选中状态
|
|
|
}
|
|
|
}
|
|
|
- selectedItemsMap.clear();
|
|
|
+ selectedItems.clear();
|
|
|
|
|
|
if (topLeftItem && topLeftItem->scene()) {
|
|
|
topLeftItem->setRightSelected(false);
|
|
@@ -70,17 +70,18 @@ void WaffleGraphicsView::mousePressEvent(QMouseEvent* event) {
|
|
|
bottomRightItem->setRightSelected(false);
|
|
|
}
|
|
|
bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
- // 获取点击位置的 DieItem
|
|
|
+
|
|
|
+ // 获取点击位置的 WaffleItem
|
|
|
if (selectedItem && selectedItem->scene()) {
|
|
|
selectedItem->setLeftSelected(false);
|
|
|
}
|
|
|
selectedItem.clear();
|
|
|
QGraphicsItem* item = itemAt(event->pos());
|
|
|
if (item) {
|
|
|
- selectedItem = dynamic_cast<DieItem*>(item);
|
|
|
- selectedItem->setLeftSelected(true);
|
|
|
+ if (typeid(*item) == typeid(WaffleItem)) {
|
|
|
+ selectedItem = static_cast<WaffleItem*>(item);
|
|
|
+ selectedItem->setLeftSelected(true);
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -140,8 +141,7 @@ void WaffleGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
bottomRightItem->setRightSelected(false);
|
|
|
}
|
|
|
bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
+
|
|
|
QRectF selectedArea = selectionRect->rect();
|
|
|
scene()->removeItem(selectionRect);
|
|
|
delete selectionRect;
|
|
@@ -149,10 +149,10 @@ void WaffleGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
|
|
|
QList<QGraphicsItem*> items = scene()->items(selectedArea, Qt::IntersectsItemShape);
|
|
|
for (QGraphicsItem* item : items) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
+ WaffleItem* die = dynamic_cast<WaffleItem*>(item);
|
|
|
if (die) {
|
|
|
- // 将 DieItem 添加到 map 中
|
|
|
- selectedItemsMap.insert(qMakePair(die->getRow(), die->getCol()), die);
|
|
|
+ // 将 WaffleItem 添加到 map 中
|
|
|
+ selectedItems.append(die);
|
|
|
die->setSelected(true); // 设置选中状态
|
|
|
}
|
|
|
}
|
|
@@ -165,7 +165,7 @@ void WaffleGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
// 如果没有进行拖动,则弹出右键菜单
|
|
|
if (!isDragging) {
|
|
|
QGraphicsItem* item = itemAt(event->pos());
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
+ WaffleItem* die = dynamic_cast<WaffleItem*>(item);
|
|
|
QMenu menu;
|
|
|
QAction* showThumb = menu.addAction(thumbnailVisible ? tr("Hide thumbnails", "隐藏缩略图") : tr("Show thumbnails", "显示缩略图"));
|
|
|
|
|
@@ -173,23 +173,21 @@ void WaffleGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
connect(showThumb, &QAction::triggered, [this]{
|
|
|
thumbnailVisible ? hideThumbnail() : showThumbnail();
|
|
|
});
|
|
|
- menu.addAction(tr("Send Location", "发送位置"), [this] {
|
|
|
- if (selectedItem) {
|
|
|
- qDebug() << "Row:" << selectedItem->getRow() << "Col:" << selectedItem->getCol();
|
|
|
- selectedItem->setLeftSelected(false);
|
|
|
- selectedItem = nullptr;
|
|
|
- }
|
|
|
- });
|
|
|
+ //menu.addAction(tr("Send Location", "发送位置"), [this] {
|
|
|
+ // if (selectedItem) {
|
|
|
+ // selectedItem->setLeftSelected(false);
|
|
|
+ // selectedItem = nullptr;
|
|
|
+ // }
|
|
|
+ //});
|
|
|
if (die) {
|
|
|
menu.addAction(tr("move to current location","移动到该位置"), [this, die] {
|
|
|
- for (auto& item : selectedItemsMap) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
+ for (auto& item : selectedItems) {
|
|
|
+ WaffleItem* die = dynamic_cast<WaffleItem*>(item);
|
|
|
if (die) {
|
|
|
die->setSelected(false);
|
|
|
}
|
|
|
}
|
|
|
- selectedItemsMap.clear();
|
|
|
-
|
|
|
+ selectedItems.clear();
|
|
|
if (topLeftItem && topLeftItem->scene()) {
|
|
|
topLeftItem->setRightSelected(false);
|
|
|
}
|
|
@@ -199,8 +197,7 @@ void WaffleGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
bottomRightItem->setRightSelected(false);
|
|
|
}
|
|
|
bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
+
|
|
|
|
|
|
if (selectedItem && selectedItem->scene()) {
|
|
|
selectedItem->setLeftSelected(false);
|
|
@@ -209,29 +206,37 @@ void WaffleGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
|
|
|
|
|
|
selectedItem = die;
|
|
|
selectedItem->setLeftSelected(true);
|
|
|
+ m_pCViewInterface->GetViewMatrix()->MoveWafflePackToPoint(die->getPoint().iDieIndex);
|
|
|
+ qDebug() << "move to point" << die->getPoint().iDieIndex;
|
|
|
});
|
|
|
|
|
|
// 设置区域边界点菜单
|
|
|
menu.addAction(tr("set Top left point","设为左上点"), [this, die] {
|
|
|
+
|
|
|
if (topLeftItem && topLeftItem->scene()) {
|
|
|
topLeftItem->setRightSelected(false);
|
|
|
}
|
|
|
topLeftItem.clear();
|
|
|
topLeftItem = die;
|
|
|
topLeftItem->setRightSelected(true);
|
|
|
- topLeftIndex = qMakePair(die->getRow(), die->getCol());
|
|
|
- if (bottomRightIndex.first >= 0) checkAndCreateRegion();
|
|
|
+ if (bottomRightItem && bottomRightItem->scene()){
|
|
|
+ if (bottomRightItem->getPoint().nPackMatrixId == topLeftItem->getPoint().nPackMatrixId && bottomRightItem->getPoint().nDieMatrixId == topLeftItem->getPoint().nDieMatrixId)
|
|
|
+ checkAndCreateRegion();
|
|
|
+ }
|
|
|
});
|
|
|
|
|
|
menu.addAction(tr("set bottom right point","设为右下点"), [this, die] {
|
|
|
+
|
|
|
if (bottomRightItem && bottomRightItem->scene()) {
|
|
|
bottomRightItem->setRightSelected(false);
|
|
|
}
|
|
|
bottomRightItem.clear();
|
|
|
bottomRightItem = die;
|
|
|
bottomRightItem->setRightSelected(true);
|
|
|
- bottomRightIndex = qMakePair(die->getRow(), die->getCol());
|
|
|
- if (topLeftIndex.first >= 0) checkAndCreateRegion();
|
|
|
+ if (topLeftItem && topLeftItem->scene()) {
|
|
|
+ if (bottomRightItem->getPoint().nPackMatrixId == topLeftItem->getPoint().nPackMatrixId && bottomRightItem->getPoint().nDieMatrixId == topLeftItem->getPoint().nDieMatrixId)
|
|
|
+ checkAndCreateRegion();
|
|
|
+ }
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -254,11 +259,11 @@ void WaffleGraphicsView::wheelEvent(QWheelEvent* event) {
|
|
|
|
|
|
// 缩略图功能实现
|
|
|
void WaffleGraphicsView::showThumbnail() {
|
|
|
- // 本地图片路径(根据实际路径修改)
|
|
|
- QString imagePath = ":/images/test_image/image_1.png"; // 替换为本地图片路径
|
|
|
|
|
|
- // 加载本地图片
|
|
|
- QPixmap thumb(imagePath);
|
|
|
+ ImageInfo image;
|
|
|
+ m_pCViewInterface->GetViewMatrix()->GetWafflePackRefImage(image);
|
|
|
+
|
|
|
+ QPixmap thumb = convertToPixmap(image);
|
|
|
|
|
|
if (!thumb.isNull()) {
|
|
|
// 如果图片加载成功,设置为缩略图
|
|
@@ -281,54 +286,46 @@ void WaffleGraphicsView::hideThumbnail() {
|
|
|
}
|
|
|
void WaffleGraphicsView::checkAndCreateRegion()
|
|
|
{
|
|
|
- // 仅当两个点都有效时处理
|
|
|
- if (topLeftIndex.first < 0 || bottomRightIndex.first < 0) return;
|
|
|
-
|
|
|
+
|
|
|
// 确定行列范围
|
|
|
- int startRow = qMin(topLeftIndex.first, bottomRightIndex.first);
|
|
|
- int endRow = qMax(topLeftIndex.first, bottomRightIndex.first);
|
|
|
- int startCol = qMin(topLeftIndex.second, bottomRightIndex.second);
|
|
|
- int endCol = qMax(topLeftIndex.second, bottomRightIndex.second);
|
|
|
+ int startRow = topLeftItem->getPoint().nDieRow;
|
|
|
+ int endRow = bottomRightItem->getPoint().nDieRow;
|
|
|
+ int startCol = topLeftItem->getPoint().nDieCol;
|
|
|
+ int endCol = bottomRightItem->getPoint().nDieCol;
|
|
|
|
|
|
// 遍历场景中的所有项
|
|
|
foreach (QGraphicsItem* item, scene()->items()) {
|
|
|
- if (DieItem* die = dynamic_cast<DieItem*>(item)) {
|
|
|
- int row = die->getRow();
|
|
|
- int col = die->getCol();
|
|
|
+ if (WaffleItem* die = dynamic_cast<WaffleItem*>(item)) {
|
|
|
|
|
|
// 判断是否在区域内
|
|
|
- if (row >= startRow && row <= endRow &&
|
|
|
- col >= startCol && col <= endCol) {
|
|
|
-
|
|
|
- // 更新选中状态
|
|
|
- die->setSelected(true);
|
|
|
- selectedItemsMap.insert(qMakePair(row, col), die);
|
|
|
+ if (die->getPoint().nDieMatrixId == topLeftItem->getPoint().nDieMatrixId && die->getPoint().nPackMatrixId == topLeftItem->getPoint().nPackMatrixId) {
|
|
|
+ if (die->getPoint().nDieRow >= startRow && die->getPoint().nDieRow <= endRow && die->getPoint().nDieCol >= startCol && die->getPoint().nDieCol <= endCol) {
|
|
|
+ // 更新选中状态
|
|
|
+ die->setSelected(true);
|
|
|
+ selectedItems.append(die);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 重置索引点
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
+
|
|
|
|
|
|
}
|
|
|
|
|
|
void WaffleGraphicsView::clearRegion()
|
|
|
{
|
|
|
- // 清空选中的 DieItem
|
|
|
- for (auto& item : selectedItemsMap) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
+ // 清空选中的 WaffleItem
|
|
|
+ for (auto& item : selectedItems) {
|
|
|
+ WaffleItem* die = dynamic_cast<WaffleItem*>(item);
|
|
|
if (die) {
|
|
|
die->setSelected(false); // 取消选中状态
|
|
|
}
|
|
|
}
|
|
|
- selectedItemsMap.clear();
|
|
|
+ selectedItems.clear();
|
|
|
|
|
|
if (selectedItem && selectedItem->scene()) {
|
|
|
selectedItem->setLeftSelected(false);
|
|
|
}
|
|
|
- selectedItem.clear();
|
|
|
-
|
|
|
if (topLeftItem && topLeftItem->scene()) {
|
|
|
topLeftItem->setRightSelected(false);
|
|
|
}
|
|
@@ -338,6 +335,8 @@ void WaffleGraphicsView::clearRegion()
|
|
|
bottomRightItem->setRightSelected(false);
|
|
|
}
|
|
|
bottomRightItem.clear();
|
|
|
+ selectedItem.clear();
|
|
|
+ bottomRightItem.clear();
|
|
|
topLeftIndex = qMakePair(-1, -1);
|
|
|
bottomRightIndex = qMakePair(-1, -1);
|
|
|
|
|
@@ -347,24 +346,39 @@ void WaffleGraphicsView::clearRegion()
|
|
|
}
|
|
|
void WaffleGraphicsView::setRegion()
|
|
|
{
|
|
|
- for (auto it = selectedItemsMap.begin(); it != selectedItemsMap.end(); ++it) {
|
|
|
- QPair<int, int> key = it.key(); // 获取当前元素的 key
|
|
|
- qDebug() << "Row:" << key.first << ", Col:" << key.second;
|
|
|
+ int maxRow = 1;
|
|
|
+ int maxCol = 1;
|
|
|
+ int minRow = 1;
|
|
|
+ int minCol = 1;
|
|
|
+ WaffleItem* dieItem;
|
|
|
+ for (auto it = selectedItems.begin(); it != selectedItems.end(); ++it) {
|
|
|
+ dieItem = dynamic_cast<WaffleItem*>(*it);
|
|
|
+ if (dieItem) {
|
|
|
+ if (dieItem->getPoint().nDieRow > maxRow)
|
|
|
+ maxRow = dieItem->getPoint().nDieRow;
|
|
|
+ if (dieItem->getPoint().nDieCol > maxCol)
|
|
|
+ maxCol = dieItem->getPoint().nDieCol;
|
|
|
+ if (dieItem->getPoint().nDieRow < minRow)
|
|
|
+ minRow = dieItem->getPoint().nDieRow;
|
|
|
+ if (dieItem->getPoint().nDieRow < minCol)
|
|
|
+ minCol = dieItem->getPoint().nDieCol;
|
|
|
+ }
|
|
|
}
|
|
|
+ m_pCViewInterface->GetViewMatrix()->SetWafflePackRectBorder(dieItem->getPoint().nPackMatrixId, dieItem->getPoint().nDieMatrixId, minRow, minCol, maxRow, maxCol);
|
|
|
+ qDebug() << dieItem->getPoint().nPackMatrixId << " " << dieItem->getPoint().nDieMatrixId << " " << minRow << " " << minCol << " " << maxRow << " " << maxCol;
|
|
|
|
|
|
- // 清空选中的 DieItem
|
|
|
- for (auto& item : selectedItemsMap) {
|
|
|
- DieItem* die = dynamic_cast<DieItem*>(item);
|
|
|
+ // 清空选中的 WaffleItem
|
|
|
+ for (auto& item : selectedItems) {
|
|
|
+ WaffleItem* die = dynamic_cast<WaffleItem*>(item);
|
|
|
if (die) {
|
|
|
die->setSelected(false); // 取消选中状态
|
|
|
}
|
|
|
}
|
|
|
- selectedItemsMap.clear();
|
|
|
+ selectedItems.clear();
|
|
|
|
|
|
if (selectedItem && selectedItem->scene()) {
|
|
|
selectedItem->setLeftSelected(false);
|
|
|
}
|
|
|
- selectedItem.clear();
|
|
|
|
|
|
if (topLeftItem && topLeftItem->scene()) {
|
|
|
topLeftItem->setRightSelected(false);
|
|
@@ -375,8 +389,7 @@ void WaffleGraphicsView::setRegion()
|
|
|
bottomRightItem->setRightSelected(false);
|
|
|
}
|
|
|
bottomRightItem.clear();
|
|
|
- topLeftIndex = qMakePair(-1, -1);
|
|
|
- bottomRightIndex = qMakePair(-1, -1);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
void WaffleGraphicsView::setCViewInterface(ns_module::CViewInterface* CViewInterface) {
|
|
@@ -456,30 +469,32 @@ QPixmap WaffleGraphicsView::convertToPixmap(const ImageInfo& imgData)
|
|
|
return QPixmap::fromImage(qImg);
|
|
|
}
|
|
|
|
|
|
-WaffleItem::WaffleItem(ns_mat::WAFFLE_MATRIX_POINT_STRUCT point, QGraphicsItem* parent)
|
|
|
- : QGraphicsRectItem(parent), point(point) {
|
|
|
+WaffleItem::WaffleItem(ns_mat::WAFFLE_MATRIX_POINT_STRUCT point, double penSize, QGraphicsItem* parent)
|
|
|
+ : QGraphicsRectItem(parent), point(point), penSize(penSize){
|
|
|
setBrush(getColorByStatus());
|
|
|
- setPen(QPen(QColor(0, 0, 0), 1));
|
|
|
+ setPen(QPen(QColor(0, 0, 0), penSize));
|
|
|
}
|
|
|
|
|
|
void WaffleItem::setSelected(bool selected) {
|
|
|
if (selected) {
|
|
|
- setPen(QPen(Qt::red, 1));
|
|
|
+ setPen(QPen(Qt::red, penSize*2));
|
|
|
}
|
|
|
else {
|
|
|
- setPen(QPen(Qt::black, 1)); // 未选中时恢复为黑色边框
|
|
|
+ setPen(QPen(Qt::black, penSize)); // 未选中时恢复为黑色边框
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void WaffleItem::setLeftSelected(bool selected) {
|
|
|
if (selected) {
|
|
|
- setPen(QPen(Qt::green, 1));
|
|
|
+ setPen(QPen(Qt::green, penSize*2));
|
|
|
}
|
|
|
else {
|
|
|
- setPen(QPen(Qt::black, 1)); // 未选中时恢复为黑色边框
|
|
|
+ setPen(QPen(Qt::black, penSize)); // 未选中时恢复为黑色边框
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ns_mat::WAFFLE_MATRIX_POINT_STRUCT WaffleItem::getPoint() {
|
|
|
+ return point;
|
|
|
+}
|
|
|
|
|
|
void WaffleItem::hoverEnterEvent(QGraphicsSceneHoverEvent*) {
|
|
|
setZValue(1); // 悬停时提升Z值
|
|
@@ -502,3 +517,13 @@ QColor WaffleItem::getColorByStatus() {
|
|
|
default: return QColor(0, 0, 0); // 默认黑色
|
|
|
}
|
|
|
}
|
|
|
+void WaffleItem::setRightSelected(bool selected) {
|
|
|
+ if (selected) {
|
|
|
+ setPen(QPen(QColor("#00F5FF"), penSize*2));
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ setPen(QPen(Qt::black, penSize)); // 未选中时恢复为黑色边框
|
|
|
+ }
|
|
|
+ // qDebug() << "DieItem clicked: Row:" << row << "Col:" << col;
|
|
|
+
|
|
|
+}
|