Browse Source

添加晶圆交互功能

yun 2 ngày trước cách đây
mục cha
commit
28d7fa0e20

+ 12 - 0
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/DieItem.cpp

@@ -56,6 +56,14 @@ int DieItem::getCol() const {
     return col;
 }
 
+int DieItem::getMatrixId() const {
+    return matrixId;
+}
+
+int DieItem::getDieIndex() const {
+    return dieIndex;
+}
+
 void DieItem::updateAppearance() {
     // 根据状态设置颜色
     QColor fillColor;
@@ -75,6 +83,10 @@ void DieItem::updateAppearance() {
 
     setPen(QPen(Qt::black, 1));
     setBrush(fillColor);
+    row = m_info.nDieRow;
+    col = m_info.nDieCol;
+    matrixId = m_info.nDieMatrixId;
+    dieIndex = m_info.iDieIndex;
 }
 
 void DieItem::hoverEnterEvent(QGraphicsSceneHoverEvent*) {

+ 3 - 1
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/DieItem.h

@@ -24,6 +24,8 @@ public:
     // 获取单元格的行列号
     int getRow() const;
     int getCol() const;
+    int getMatrixId() const;
+    int getDieIndex() const;
 
     void setSelected(bool selected);
     void setLeftSelected(bool selected);
@@ -36,7 +38,7 @@ protected:
            // void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
 
 private:
-    int row, col;
+    int row, col,matrixId, dieIndex;
     ns_mat::PICK_DIE_STATUS status;
     bool isSelected = false;
     WAFER_MATRIX_POINT_INFO_STRUCT m_info;

+ 1 - 78
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/Wafer.cpp

@@ -203,6 +203,7 @@ void Wafer::initFrom(QWidget* parent) {
     scene = new QGraphicsScene(parent);
     view = new WaferGraphicsView(scene);
     view->resize(width, height);
+    view->setCViewInterface(m_pCViewInterface);
     //获取当前角度
     double angle;
     m_pCViewInterface->GetViewMatrix()->GetWaferTableAngle(angle);
@@ -266,10 +267,6 @@ void Wafer::setWaferInfo(ns_module::CViewInterface* CViewInterface) {
     long result = m_pCViewInterface->GetViewMatrix()->GetDieSize(m_dieLong,m_dieWide);
 
    m_pCViewInterface->GetViewMatrix()->GetWaferSize(m_centerX, m_centerY,m_radius);
-   ImageInfo image;
-   m_pCViewInterface->GetViewMatrix()->GetWaferRefImage(image);
-
-   QPixmap test = convertToPixmap(image);
 
     //这里到时候更新接口时替换真实圆心点的数据
     /*m_dieLong = 10;
@@ -278,77 +275,3 @@ void Wafer::setWaferInfo(ns_module::CViewInterface* CViewInterface) {
     m_centerX = 0;
     m_centerY = 0;
 }
-
-void Wafer::yuv422_to_rgb888(const unsigned char* src, unsigned char* dst, int width, int height)
-{
-    for (int i = 0; i < width * height; i += 2) {
-        unsigned char y0 = src[0];
-        unsigned char u = src[1];
-        unsigned char y1 = src[2];
-        unsigned char v = src[1];
-
-        // 简单反色度插值,适用于 U/V 在相邻像素间共享的情况
-        int r, g, b;
-
-        // YUV to RGB 转换公式
-#define CLIP(x) qBound(0, int(x), 255)
-
-// Pixel 0
-        r = CLIP(y0 + 1.402 * (v - 128));
-        g = CLIP(y0 - 0.344 * (u - 128) - 0.714 * (v - 128));
-        b = CLIP(y0 + 1.772 * (u - 128));
-        *dst++ = r;
-        *dst++ = g;
-        *dst++ = b;
-
-        // Pixel 1
-        r = CLIP(y1 + 1.402 * (v - 128));
-        g = CLIP(y1 - 0.344 * (u - 128) - 0.714 * (v - 128));
-        b = CLIP(y1 + 1.772 * (u - 128));
-        *dst++ = r;
-        *dst++ = g;
-        *dst++ = b;
-
-        src += 4;
-    }
-}
-
-QPixmap Wafer::convertToPixmap(const ImageInfo& imgData)
-{
-    QImage::Format qFormat = QImage::Format_Invalid;
-
-    switch (imgData.format) {
-    case ImageFormat::GRAY8:
-        qFormat = QImage::Format_Grayscale8;
-        break;
-    case ImageFormat::RGB888:
-        qFormat = QImage::Format_RGB888;
-        break;
-    case ImageFormat::ARGB32:
-        qFormat = QImage::Format_ARGB32;
-        break;
-    case ImageFormat::RGB32:
-        qFormat = QImage::Format_RGB32;
-        break;
-    case ImageFormat::YUV422: {
-        // 需要先转换为 RGB888
-        int byteCount = imgData.width * imgData.height * 3;
-        unsigned char* rgbData = new unsigned char[byteCount];
-        yuv422_to_rgb888(imgData.data, rgbData, imgData.width, imgData.height);
-
-        QImage tmp(rgbData, imgData.width, imgData.height, QImage::Format_RGB888);
-        QPixmap pixmap = QPixmap::fromImage(tmp);
-
-        delete[] rgbData;
-        return pixmap;
-    }
-    default:
-        qDebug() << "Unsupported image format!";
-        return QPixmap();
-    }
-
-    QImage qImg(imgData.data, imgData.width, imgData.height,
-        imgData.width * imgData.channel, qFormat);
-
-    return QPixmap::fromImage(qImg);
-}

+ 0 - 2
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/Wafer.h

@@ -34,8 +34,6 @@ public:
 
     QColor getColorByStatus(ns_mat::PICK_DIE_STATUS status);
     void setWaferInfo(ns_module::CViewInterface* CViewInterface);
-    QPixmap convertToPixmap(const ImageInfo& imgData);
-    void yuv422_to_rgb888(const unsigned char* src, unsigned char* dst, int width, int height);
     typedef struct {
         int maxRow;
         int maxCol;

+ 107 - 19
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.cpp

@@ -90,14 +90,20 @@ void WaferGraphicsView::mousePressEvent(QMouseEvent* event) {
         selectedItem.clear();
         QGraphicsItem* item = itemAt(event->pos());
         if (item) {
-            selectedItem = dynamic_cast<DieItem*>(item);
-            selectedItem->setLeftSelected(true);
+            if (typeid(*item) == typeid(DieItem)) {
+                selectedItem = static_cast<DieItem*>(item);
+                selectedItem->setLeftSelected(true);
+                if (event->button() == Qt::MouseEventCreatedDoubleClick) {
+                    m_pCViewInterface->GetViewMatrix()->MoveWaferToPoint(selectedItem->getDieIndex());
+                }
+            }
 
         }
 
         setCursor(Qt::OpenHandCursor);  // 按下时设置为小手
         selecting = true;
         lastPos = event->pos();  // 记录鼠标位置
+
     }
     else if (event->button() == Qt::RightButton) {
         // 开始框选
@@ -163,12 +169,15 @@ void WaferGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
 
             QList<QGraphicsItem*> items = scene()->items(selectedArea, Qt::IntersectsItemShape);
             for (QGraphicsItem* item : items) {
-                DieItem* die = dynamic_cast<DieItem*>(item);
-                if (die) {
-                    // 将 DieItem 添加到 map 中
-                    selectedItemsMap.insert(qMakePair(die->getRow(), die->getCol()), die);
-                    die->setSelected(true); // 设置选中状态
+                if (typeid(*item) == typeid(DieItem)) {
+                    DieItem* die = dynamic_cast<DieItem*>(item);
+                    if (die) {
+                        // 将 DieItem 添加到 map 中
+                        selectedItemsMap.insert(qMakePair(die->getRow(), die->getCol()), die);
+                        die->setSelected(true); // 设置选中状态
+                    }
                 }
+
             }
         }
         if (selectionRect) {
@@ -187,13 +196,13 @@ void WaferGraphicsView::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) {
+            //        qDebug() << "Row:" << selectedItem->getRow() << "Col:" << selectedItem->getCol();
+            //        selectedItem->setLeftSelected(false);
+            //        selectedItem = nullptr;
+            //    }
+            //    });
             if (die) {
                 menu.addAction(tr("move to current location","移动到该位置"), [this, die] {
                     for (auto& item : selectedItemsMap) {
@@ -223,6 +232,7 @@ void WaferGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
 
                     selectedItem = die;
                     selectedItem->setLeftSelected(true);
+                    m_pCViewInterface->GetViewMatrix()->MoveWaferToPoint(die->getDieIndex());
                     });
 
                 // 设置区域边界点菜单
@@ -268,15 +278,15 @@ void WaferGraphicsView::wheelEvent(QWheelEvent* event) {
 
 // 缩略图功能实现
 void WaferGraphicsView::showThumbnail() {
-    // 本地图片路径(根据实际路径修改)
-    QString imagePath = ":/images/test_image/image_1.png";  // 替换为本地图片路径
+    ImageInfo image;
+    m_pCViewInterface->GetViewMatrix()->GetWaferRefImage(image);
+
+    QPixmap thumb = convertToPixmap(image);
 
-    // 加载本地图片
-    QPixmap thumb(imagePath);
 
     if (!thumb.isNull()) {
         // 如果图片加载成功,设置为缩略图
-        thumbnailLabel->setPixmap(thumb.scaled(150, 150, Qt::KeepAspectRatio));
+        thumbnailLabel->setPixmap(thumb.scaled(image.width, image.height, Qt::KeepAspectRatio));
         thumbnailLabel->show();
         thumbnailVisible = true;
     }
@@ -462,4 +472,82 @@ void WaferGraphicsView::drawDieMatrix(const QPointF& center,
     font.setPointSize(6);      // 设置字体大小为 8,可以根据需要调整
     text->setFont(font);       // 应用新的字体
     m_scene->addItem(text);
+}
+
+void WaferGraphicsView::setCViewInterface(ns_module::CViewInterface* CViewInterface) {
+    m_pCViewInterface = CViewInterface;
+}
+
+void WaferGraphicsView::yuv422_to_rgb888(const unsigned char* src, unsigned char* dst, int width, int height)
+{
+    for (int i = 0; i < width * height; i += 2) {
+        unsigned char y0 = src[0];
+        unsigned char u = src[1];
+        unsigned char y1 = src[2];
+        unsigned char v = src[1];
+
+        // 简单反色度插值,适用于 U/V 在相邻像素间共享的情况
+        int r, g, b;
+
+        // YUV to RGB 转换公式
+#define CLIP(x) qBound(0, int(x), 255)
+
+// Pixel 0
+        r = CLIP(y0 + 1.402 * (v - 128));
+        g = CLIP(y0 - 0.344 * (u - 128) - 0.714 * (v - 128));
+        b = CLIP(y0 + 1.772 * (u - 128));
+        *dst++ = r;
+        *dst++ = g;
+        *dst++ = b;
+
+        // Pixel 1
+        r = CLIP(y1 + 1.402 * (v - 128));
+        g = CLIP(y1 - 0.344 * (u - 128) - 0.714 * (v - 128));
+        b = CLIP(y1 + 1.772 * (u - 128));
+        *dst++ = r;
+        *dst++ = g;
+        *dst++ = b;
+
+        src += 4;
+    }
+}
+
+QPixmap WaferGraphicsView::convertToPixmap(const ImageInfo& imgData)
+{
+    QImage::Format qFormat = QImage::Format_Invalid;
+
+    switch (imgData.format) {
+    case ImageFormat::GRAY8:
+        qFormat = QImage::Format_Grayscale8;
+        break;
+    case ImageFormat::RGB888:
+        qFormat = QImage::Format_RGB888;
+        break;
+    case ImageFormat::ARGB32:
+        qFormat = QImage::Format_ARGB32;
+        break;
+    case ImageFormat::RGB32:
+        qFormat = QImage::Format_RGB32;
+        break;
+    case ImageFormat::YUV422: {
+        // 需要先转换为 RGB888
+        int byteCount = imgData.width * imgData.height * 3;
+        unsigned char* rgbData = new unsigned char[byteCount];
+        yuv422_to_rgb888(imgData.data, rgbData, imgData.width, imgData.height);
+
+        QImage tmp(rgbData, imgData.width, imgData.height, QImage::Format_RGB888);
+        QPixmap pixmap = QPixmap::fromImage(tmp);
+
+        delete[] rgbData;
+        return pixmap;
+    }
+    default:
+        qDebug() << "Unsupported image format!";
+        return QPixmap();
+    }
+
+    QImage qImg(imgData.data, imgData.width, imgData.height,
+        imgData.width * imgData.channel, qFormat);
+
+    return QPixmap::fromImage(qImg);
 }

+ 5 - 0
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.h

@@ -19,6 +19,9 @@ public:
     void addDiePoint(const QPointF& diePos,const WAFER_MATRIX_POINT_INFO_STRUCT& dieInfo);
     void drawDieMatrix(const QPointF& center,
         int Width, int Height,int DieMatrixId);
+    void setCViewInterface(ns_module::CViewInterface* CViewInterface);
+    QPixmap convertToPixmap(const ImageInfo& imgData);
+    void yuv422_to_rgb888(const unsigned char* src, unsigned char* dst, int width, int height);
 
 protected:
     void mousePressEvent(QMouseEvent* event) override;
@@ -50,6 +53,8 @@ private:
     QSize m_dieSize;
     QHash<UINT, DieItem*> m_dieItems; // 通过ID快速访问
 
+    ns_module::CViewInterface* m_pCViewInterface;
+
     void showThumbnail();
     void hideThumbnail();