Переглянути джерело

添加晶圆新绘制代码以及修复数据库禁用bug

yun 2 днів тому
батько
коміт
613cd0682e

BIN
Output/bin/x64/configurations.db


+ 101 - 6
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/Wafer.cpp

@@ -90,8 +90,8 @@ void Wafer::UpdataVal(const std::vector<ns_mat::WAFER_MATRIX_POINT_INFO_STRUCT>&
             if (a.nDieRow >= rowMax) rowMax = a.nDieRow;
             if (a.nDieCol >= colsMax) colsMax = a.nDieCol;
             if (a.stPosition.x >= maxx) maxx = a.stPosition.x;
-            if (a.stPosition.y <= maxx) maxx = a.stPosition.y;
-            if (a.stPosition.x >= minx) minx = a.stPosition.x;
+            if (a.stPosition.y >= maxy) maxy = a.stPosition.y;
+            if (a.stPosition.x <= minx) minx = a.stPosition.x;
             if (a.stPosition.x <= miny) miny = a.stPosition.y;
         }
     }
@@ -203,6 +203,9 @@ void Wafer::initFrom(QWidget* parent) {
     scene = new QGraphicsScene(parent);
     view = new WaferGraphicsView(scene);
     view->resize(width, height);
+    //获取当前角度
+    double angle;
+    m_pCViewInterface->GetViewMatrix()->GetWaferTableAngle(angle);
     QPointF center(width / 2.0, height / 2.0);
     QPointF pointf(m_centerX, m_centerY);
     double radius = width / 2 - 10;
@@ -210,16 +213,20 @@ void Wafer::initFrom(QWidget* parent) {
     double radio = m_radius / radius;
     int dieLong = m_dieLong / radio;
     int dieWide = m_dieWide / radio;
+
+    //test 实际使用时需要删除或注释
+    angle = 0.00;
     // 初始化晶圆参数
     view->initWafer(center, // 中心坐标
         radius,              // 半径
-        dieLong, dieWide);          // 固晶点显示尺寸
+        dieLong, dieWide,angle);          // 固晶点显示尺寸
 
 // 添加固晶点
     int currentDieMatrixId = -1;
     double referPointX = 0.0;
     double referPointY = 0.0;
     MaxRow_Col maxRow_Col;
+    double minx, miny,maxx,maxy, widthMatrix, heightMatrix;
     for (int i = 0; i < waferData.size(); ++i) {
         //判断是否属于同一个矩阵
         if (waferData[i].nDieMatrixId != currentDieMatrixId) {
@@ -228,11 +235,21 @@ void Wafer::initFrom(QWidget* parent) {
             referPointX = center.x() + (waferData[i].stPosition.x - m_centerX) / radio;
             referPointY = center.y() - (waferData[i].stPosition.y - m_centerY) / radio;
             maxRow_Col = maxRow_Colmap.value(currentDieMatrixId);
-            view->drawDieMatrix(QPointF(referPointX - dieLong, referPointY - dieWide), (maxRow_Col.maxRow+2) * dieLong, (maxRow_Col.maxCol+2) * dieWide);
+            minx = center.x()+(maxRow_Col.minX - m_centerX) / radio - 20;
+            miny = center.y() - (maxRow_Col.minY - m_centerY) / radio + 20;
+            maxx = center.x() + (maxRow_Col.maxX - m_centerX) / radio + 20;
+            maxy = center.y() - (maxRow_Col.maxY - m_centerY) / radio - 20;
+            widthMatrix = maxx - minx;
+            heightMatrix = miny - maxy;
+            view->drawDieMatrix(QPointF(minx, maxy), widthMatrix, heightMatrix, currentDieMatrixId);
 
         }
         referPointX = center.x() + (waferData[i].stPosition.x - m_centerX) / radio;
         referPointY = center.y() - (waferData[i].stPosition.y - m_centerY) / radio;
+
+        //test
+        //referPointX = i * 5;
+        //referPointY = i * 5;
         view->addDiePoint(QPointF(referPointX, referPointY),waferData[i]);
     }
     scene->setSceneRect(0, 0, view->width(), view->height());
@@ -249,11 +266,89 @@ 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;
-    m_dieWide = 10;
-    m_radius = 200;*/
+    m_dieWide = 10;*/
+    m_radius = 10000;
     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);
+}

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

@@ -8,6 +8,9 @@
 #include "DieItem.h"
 #include <CWaferMatrix.h>
 #include <CViewInterface.h>
+#include "TypeDef.h"
+#include <QImage>
+#include <QPixmap>
 enum OperateMode {
     ModeImage,  // 显示图片
     ModeView    // 显示 view
@@ -31,6 +34,8 @@ 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;

+ 36 - 10
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.cpp

@@ -21,14 +21,14 @@ WaferGraphicsView::WaferGraphicsView(QGraphicsScene* scene, QWidget* parent)
     bottomRightIndex = qMakePair(-1, -1);
 
     setScene(m_scene);
-    //// 禁用并隐藏水平滚动条
-    //setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-    //setHorizontalScrollBar(nullptr);
-
-    //// 禁用并隐藏垂直滚动条
-    //setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-    //setVerticalScrollBar(nullptr);
-    //setDragMode(QGraphicsView::NoDrag);
+    // 禁用并隐藏水平滚动条
+    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    setHorizontalScrollBar(nullptr);
+
+    // 禁用并隐藏垂直滚动条
+    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    setVerticalScrollBar(nullptr);
+    setDragMode(QGraphicsView::NoDrag);
 }
 
 // 事件过滤器用于处理缩略图拖动
@@ -396,7 +396,7 @@ void WaferGraphicsView::setRegion()
 
 
 void WaferGraphicsView::initWafer(const QPointF& center, double radius,
-    int dieWidth, int dieHeight) {
+    int dieWidth, int dieHeight,double angle) {
     m_center = center;
     m_radius = radius;
     m_dieSize = QSize(dieWidth, dieHeight);
@@ -413,6 +413,26 @@ void WaferGraphicsView::initWafer(const QPointF& center, double radius,
     );
     waferCircle->setPen(QPen(Qt::blue, 2));
     m_scene->addItem(waferCircle);
+    double x, y;
+    if (angle == 0.0) {
+        x = m_center.x();
+        y = m_center.y() + radius -5;
+    }
+    else if (angle == 90.0) {
+        x = m_center.x() - radius;
+        y = m_center.y();
+    }
+    else if (angle == 180.0) {
+        x = m_center.x();
+        y = m_center.y() - radius;
+    }
+    else if (angle == 270.0) {
+        x = m_center.x() + radius -5;
+        y = m_center.y();
+    }
+    QGraphicsRectItem* rect = m_scene->addRect(x, y, 5, 5,
+        QPen(Qt::black, 0.5),QBrush(Qt::black));
+
 }
 
 void WaferGraphicsView::addDiePoint(const QPointF& diePos,const WAFER_MATRIX_POINT_INFO_STRUCT& dieInfo) {
@@ -433,7 +453,13 @@ void WaferGraphicsView::addDiePoint(const QPointF& diePos,const WAFER_MATRIX_POI
 }
 
 void WaferGraphicsView::drawDieMatrix(const QPointF& center,
-    int Width, int Height) {
+    int Width, int Height, int DieMatrixId) {
     QGraphicsRectItem* rect = m_scene->addRect(center.x(), center.y(), Width, Height,
         QPen(Qt::blue, 0.5));
+    QGraphicsTextItem* text = new QGraphicsTextItem(QString(tr("DieMatrix%1")).arg(DieMatrixId));
+    text->setPos(center.x(), center.y());
+    QFont font = text->font(); // 获取当前字体
+    font.setPointSize(6);      // 设置字体大小为 8,可以根据需要调整
+    text->setFont(font);       // 应用新的字体
+    m_scene->addItem(text);
 }

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

@@ -15,10 +15,10 @@ class WaferGraphicsView : public QGraphicsView {
 public:
     WaferGraphicsView(QGraphicsScene* scene, QWidget* parent = nullptr);
     void initWafer(const QPointF& center, double radius,
-        int dieWidth, int dieHeight);
+        int dieWidth, int dieHeight,double angle);
     void addDiePoint(const QPointF& diePos,const WAFER_MATRIX_POINT_INFO_STRUCT& dieInfo);
     void drawDieMatrix(const QPointF& center,
-        int Width, int Height);
+        int Width, int Height,int DieMatrixId);
 
 protected:
     void mousePressEvent(QMouseEvent* event) override;

+ 8 - 8
View/die-bonder-ui/OriginalWnd/DbTreeViewManager.cpp

@@ -2326,7 +2326,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<ST_TABLE_CONTROL_DAT
 							}
 							});
 
-                        if (privilege < fieldUserGrade) {
+                        if ((privilege &fieldUserGrade) == 1) {
                             lineEdit->setEnabled(false);
                             btnDefault->setEnabled(false);
                         }
@@ -2409,7 +2409,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<ST_TABLE_CONTROL_DAT
                             }
                             });
 
-                        if (privilege < fieldUserGrade) {
+                        if ((privilege &fieldUserGrade) == 1) {
                             lineEdit1->setEnabled(false);
                             btnDefault->setEnabled(false);
                         }
@@ -2506,7 +2506,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<ST_TABLE_CONTROL_DAT
                             }
                         }
                         });
-                    if (privilege < fieldUserGrade) {
+                    if ((privilege &fieldUserGrade) == 1) {
                         for (QAbstractButton* btn : radioGroup->buttons()) {
                             btn->setEnabled(false);
                         }
@@ -2642,7 +2642,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<ST_TABLE_CONTROL_DAT
                         }
                         });
 
-                    if (privilege < fieldUserGrade) {
+                    if ((privilege &fieldUserGrade) == 1) {
                         checkBox->setEnabled(false);
                         btnDefault->setEnabled(false);
                     }
@@ -2787,7 +2787,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<ST_TABLE_CONTROL_DAT
                         }
                         });
 
-                    if (privilege < fieldUserGrade) {
+                    if ((privilege &fieldUserGrade) == 1) {
                         comboBox->setEnabled(false);
                         btnDefault->setEnabled(false);
                     }
@@ -2860,7 +2860,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<ST_TABLE_CONTROL_DAT
                         }
                         });
 
-                    if (privilege < fieldUserGrade) {
+                    if ((privilege &fieldUserGrade) == 1) {
                         timeEdit->setEnabled(false);
                         btnDefault->setEnabled(false);
                     }
@@ -2996,7 +2996,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<ST_TABLE_CONTROL_DAT
                         }
                         });
 
-                    if (privilege < fieldUserGrade) {
+                    if ((privilege &fieldUserGrade) == 1) {
                         switchBox->setEnabled(false);
                         btnDefault->setEnabled(false);
                     }
@@ -3194,7 +3194,7 @@ void DbTreeViewManager::displayThirdLevelFields(const QList<ST_TABLE_CONTROL_DAT
                         }
                         });
 
-                    if (privilege < fieldUserGrade) {
+                    if ((privilege &fieldUserGrade) == 1) {
                         comboInput->setEnabled(false);
                         btnSet->setEnabled(false);
                         btnGet->setEnabled(false);