Selaa lähdekoodia

添加重新绘制的晶圆逻辑

yun 3 päivää sitten
vanhempi
sitoutus
73e9c2842e

+ 1 - 0
View/die-bonder-ui/CameraMaterialGroupWnd/CameraImage/CameraImageHandler.cpp

@@ -108,6 +108,7 @@ QString CameraImageHandler::CreateMaterialType(MATERIAL_TYPE materialType)
                 std::vector<ns_mat::WAFER_MATRIX_POINT_INFO_STRUCT> veWafer;
                 m_pCViewInterface->GetViewMatrix()->GetWaferAllPointInfo(veWafer);
                 m_pWafer->UpdataVal(veWafer);
+                m_pWafer->setWaferInfo(m_pCViewInterface);
             }
             else
             {

+ 31 - 7
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/DieItem.cpp

@@ -1,13 +1,6 @@
 #include "DieItem.h"
 
-DieItem::DieItem(int row, int col, ns_mat::PICK_DIE_STATUS status, qreal size, QGraphicsItem* parent)
-    : QGraphicsRectItem(parent), row(row), col(col), status(status) {
-    setRect(0, 0, size, size); // 设置单元格大小
-    setBrush(getColorByStatus(status));
 
-    // 设置边框(Pen)
-    setPen(QPen(QColor(0, 0, 0), 0.5)); // 黑色边框,宽度为0.5
-}
 
 void DieItem::setSelected(bool selected) {
     if (selected) {
@@ -63,3 +56,34 @@ int DieItem::getCol() const {
     return col;
 }
 
+void DieItem::updateAppearance() {
+    // 根据状态设置颜色
+    QColor fillColor;
+    if (m_info.bDisable) {
+        fillColor = Qt::darkGray;
+    }
+    else {
+        switch (m_info.eStatus) {
+        case ns_mat::PICK_DIE_STATUS::DIE_EXIST: fillColor = Qt::green; break; //绿色
+        case ns_mat::PICK_DIE_STATUS::NO_EXIST:  fillColor = QColor(200, 200, 200); break;// 浅灰
+        case ns_mat::PICK_DIE_STATUS::PICK_ING : fillColor = QColor(255, 255, 0);// 黄色
+        case ns_mat::PICK_DIE_STATUS::SKIP_DIE : fillColor = QColor(128, 128, 128); // 深灰
+        case ns_mat::PICK_DIE_STATUS::EDGE_DIE: fillColor = QColor(255, 165, 0); // 橙色
+        default:            fillColor = Qt::gray; break;
+        }
+    }
+
+    setPen(QPen(Qt::black, 1));
+    setBrush(fillColor);
+}
+
+void DieItem::hoverEnterEvent(QGraphicsSceneHoverEvent*) {
+    setZValue(1); // 悬停时提升Z值
+    update();
+}
+
+void DieItem::hoverLeaveEvent(QGraphicsSceneHoverEvent*) {
+    setZValue(0);
+    update();
+}
+

+ 14 - 5
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/DieItem.h

@@ -8,13 +8,19 @@
 #include <QMenu>
 #include <QGraphicsSceneContextMenuEvent>
 #include "CMatrixCommon.h"
-
-
+#include <CWaferMatrix.h>
+#include <CViewInterface.h>
 // 自定义矩形代表晶圆单元格
 class DieItem : public QObject, public QGraphicsRectItem {
 public:
-    DieItem(int row, int col, ns_mat::PICK_DIE_STATUS status, qreal size, QGraphicsItem* parent = nullptr);
-
+    //DieItem(const WAFER_MATRIX_POINT_INFO_STRUCT& infomation, QGraphicsItem* parent = nullptr);
+    DieItem(const WAFER_MATRIX_POINT_INFO_STRUCT& info, QGraphicsItem* parent = nullptr)
+        : QGraphicsRectItem(parent), m_info(info) {
+        // 设置初始样式
+        updateAppearance();
+        // 启用悬停事件
+        setAcceptHoverEvents(true);
+    }
     // 获取单元格的行列号
     int getRow() const;
     int getCol() const;
@@ -22,8 +28,10 @@ public:
     void setSelected(bool selected);
     void setLeftSelected(bool selected);
     void setRightSelected(bool selected);
-
+    void updateAppearance();
 protected:
+    void hoverEnterEvent(QGraphicsSceneHoverEvent*) override;
+    void hoverLeaveEvent(QGraphicsSceneHoverEvent*) override;
            // void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
            // void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
 
@@ -31,6 +39,7 @@ private:
     int row, col;
     ns_mat::PICK_DIE_STATUS status;
     bool isSelected = false;
+    WAFER_MATRIX_POINT_INFO_STRUCT m_info;
 
     // 获取单元格状态颜色
     QColor getColorByStatus(ns_mat::PICK_DIE_STATUS status);

+ 100 - 21
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/Wafer.cpp

@@ -12,6 +12,7 @@ Wafer::Wafer(int flag, QWidget *parent) : QWidget(parent) {
 
 void Wafer::UpdataGenerateTestData()
 {
+    /*
     Flag = 0;
     rows = 51;
     cols = 51;
@@ -59,21 +60,44 @@ void Wafer::UpdataGenerateTestData()
             waferData.append(point);
         }
     }
+    */
 }
 
 void Wafer::UpdataVal(const std::vector<ns_mat::WAFER_MATRIX_POINT_INFO_STRUCT>& veWafer)
 {
+    int currentDieMatrixId = veWafer[0].nDieMatrixId;
+    int rowMax = veWafer[0].nDieRow;
+    int colsMax = veWafer[0].nDieCol;
+    double minx = veWafer[0].stPosition.x;
+    double miny = veWafer[0].stPosition.y;
+    double maxx = veWafer[0].stPosition.x;
+    double maxy = veWafer[0].stPosition.y;
     for (const auto a : veWafer)
     {
         waferData.append(a);
+        qDebug() << a.stPosition.x << "     " << a.stPosition.y;
+        if (a.nDieMatrixId != currentDieMatrixId) {
+            maxRow_Colmap.insert(currentDieMatrixId, { rowMax ,colsMax,minx,miny,maxx,maxy });
+            currentDieMatrixId = a.nDieMatrixId;
+            rowMax = a.nDieRow;
+            colsMax = a.nDieCol;
+            minx = a.stPosition.x;
+            maxx = a.stPosition.x;
+            miny = a.stPosition.y;
+            maxy = a.stPosition.y;
+        }
+        else {
+            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.x <= miny) miny = a.stPosition.y;
+        }
     }
+    maxRow_Colmap.insert(currentDieMatrixId, { rowMax ,colsMax,minx,miny,maxx,maxy });
+
 
-    rows = 0;
-    cols = 0;
-    for (const auto& point : waferData) {
-        if (point.nDieRow >= rows) rows = point.nDieRow + 1;
-        if (point.nDieCol >= cols) cols = point.nDieCol + 1;
-    }
 }
 
 QColor Wafer::getColorByStatus(ns_mat::PICK_DIE_STATUS status) {
@@ -88,7 +112,7 @@ QColor Wafer::getColorByStatus(ns_mat::PICK_DIE_STATUS status) {
 }
 
 void Wafer::paintInitFrom(QWidget *parent) {
-
+    /*
     // 获取当前窗口的宽高
     int width = parent->width();
     int height = parent->height();
@@ -152,29 +176,84 @@ void Wafer::paintInitFrom(QWidget *parent) {
     painter.setBrush(Qt::black);
     painter.drawEllipse(centerX - 3, centerY - 3, 6, 6);
     painter.end(); // 结束绘制
+    */
 }
 
-void Wafer::initFrom(QWidget *parent) {
-    scene = new QGraphicsScene(parent);
-    view = new WaferGraphicsView(scene);
+void Wafer::initFrom(QWidget* parent) {
+    //scene = new QGraphicsScene(parent);
+    //view = new WaferGraphicsView(scene);
 
-    // 获取当前窗口的宽高
-    int width = parent->width();
-    int height = parent->height();
+    //// 获取当前窗口的宽高
+    double width = parent->width();
+    double height = parent->height();
 
-    // 根据行列数计算每个晶圆点的大小,选择小的边来决定
-    int cellSize = qMin(width, height) / qMax(rows, cols); // 固定大小为正方形,按最小边计算
+    //// 根据行列数计算每个晶圆点的大小,选择小的边来决定
+    //int cellSize = qMin(width, height) / qMax(rows, cols); // 固定大小为正方形,按最小边计算
 
-    for (int i = 0; i < waferData.size(); ++i) {
-        DieItem* die = new DieItem(waferData[i].nDieRow, waferData[i].nDieCol, waferData[i].eStatus, cellSize);
-        die->setPos(waferData[i].nDieCol * cellSize, waferData[i].nDieRow * cellSize);
-        scene->addItem(die);
-    }
+    //for (int i = 0; i < waferData.size(); ++i) {
+    //    DieItem* die = new DieItem(waferData[i].nDieRow, waferData[i].nDieCol, waferData[i].eStatus, cellSize);
+    //    die->setPos(waferData[i].nDieCol * cellSize, waferData[i].nDieRow * cellSize);
+    //    scene->addItem(die);
+    //}
+
+    //view->setSceneRect(scene->itemsBoundingRect());
+    //view->resize(width, height);
 
-    view->setSceneRect(scene->itemsBoundingRect());
+    // 创建视图
+    scene = new QGraphicsScene(parent);
+    view = new WaferGraphicsView(scene);
     view->resize(width, height);
+    QPointF center(width / 2.0, height / 2.0);
+    QPointF pointf(m_centerX, m_centerY);
+    double radius = width / 2 - 10;
+    //比例
+    double radio = m_radius / radius;
+    int dieLong = m_dieLong / radio;
+    int dieWide = m_dieWide / radio;
+    // 初始化晶圆参数
+    view->initWafer(center, // 中心坐标
+        radius,              // 半径
+        dieLong, dieWide);          // 固晶点显示尺寸
+
+// 添加固晶点
+    int currentDieMatrixId = -1;
+    double referPointX = 0.0;
+    double referPointY = 0.0;
+    MaxRow_Col maxRow_Col;
+    for (int i = 0; i < waferData.size(); ++i) {
+        //判断是否属于同一个矩阵
+        if (waferData[i].nDieMatrixId != currentDieMatrixId) {
+            //重新画矩阵框然后配置新的参考点
+            currentDieMatrixId = waferData[i].nDieMatrixId;
+            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);
+
+        }
+        referPointX = center.x() + (waferData[i].stPosition.x - m_centerX) / radio;
+        referPointY = center.y() - (waferData[i].stPosition.y - m_centerY) / radio;
+        view->addDiePoint(QPointF(referPointX, referPointY),waferData[i]);
+    }
+    scene->setSceneRect(0, 0, view->width(), view->height());
+    
+    
 }
 
 QPixmap Wafer::getGlobalPixmap() const {
     return globalPixmap;
 }
+
+void Wafer::setWaferInfo(ns_module::CViewInterface* CViewInterface) {
+    m_pCViewInterface = CViewInterface;
+    long result = m_pCViewInterface->GetViewMatrix()->GetDieSize(m_dieLong,m_dieWide);
+
+   m_pCViewInterface->GetViewMatrix()->GetWaferSize(m_centerX, m_centerY,m_radius);
+
+    //这里到时候更新接口时替换真实圆心点的数据
+    /*m_dieLong = 10;
+    m_dieWide = 10;
+    m_radius = 200;*/
+    m_centerX = 0;
+    m_centerY = 0;
+}

+ 20 - 4
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/Wafer.h

@@ -7,7 +7,7 @@
 #include "WaferGraphicsView.h"
 #include "DieItem.h"
 #include <CWaferMatrix.h>
-
+#include <CViewInterface.h>
 enum OperateMode {
     ModeImage,  // 显示图片
     ModeView    // 显示 view
@@ -30,6 +30,15 @@ public:
     QPixmap getGlobalPixmap() const;
 
     QColor getColorByStatus(ns_mat::PICK_DIE_STATUS status);
+    void setWaferInfo(ns_module::CViewInterface* CViewInterface);
+    typedef struct {
+        int maxRow;
+        int maxCol;
+        double minX;
+        double minY;
+        double maxX;
+        double maxY;
+    }MaxRow_Col;
 
 signals:
     void sendCoordinates(int x, int y);
@@ -37,11 +46,18 @@ signals:
 private:
     int Flag;
     QVector<ns_mat::WAFER_MATRIX_POINT_INFO_STRUCT> waferData;
-    int rows, cols;
-    int centerX, centerY;
-    qreal radius;
+    //int rows, cols;
+    int m_dieLong;
+    int m_dieWide;
+    double m_centerX, m_centerY;
+
+    double m_radius;
+    /**接口指针
+ */
+    ns_module::CViewInterface* m_pCViewInterface;
     QMenu *contextMenu = nullptr;
     QPixmap globalPixmap;
+    QMap<UINT, MaxRow_Col> maxRow_Colmap;
 public:
     QGraphicsScene* scene = nullptr;
     WaferGraphicsView* view = nullptr;

+ 55 - 1
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.cpp

@@ -3,7 +3,7 @@
 #include <QScrollBar>
 
 WaferGraphicsView::WaferGraphicsView(QGraphicsScene* scene, QWidget* parent)
-    : QGraphicsView(scene, parent), selecting(false), selectionRect(nullptr),
+    : QGraphicsView(scene, parent), selecting(false), selectionRect(nullptr), m_scene(scene),
     scaleFactor(1.0), isDragging(false), thumbnailLabel(nullptr),
     thumbnailVisible(false) {
     setRenderHint(QPainter::Antialiasing);
@@ -19,6 +19,16 @@ WaferGraphicsView::WaferGraphicsView(QGraphicsScene* scene, QWidget* parent)
 
     topLeftIndex = qMakePair(-1, -1);
     bottomRightIndex = qMakePair(-1, -1);
+
+    setScene(m_scene);
+    //// 禁用并隐藏水平滚动条
+    //setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    //setHorizontalScrollBar(nullptr);
+
+    //// 禁用并隐藏垂直滚动条
+    //setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    //setVerticalScrollBar(nullptr);
+    //setDragMode(QGraphicsView::NoDrag);
 }
 
 // 事件过滤器用于处理缩略图拖动
@@ -382,4 +392,48 @@ void WaferGraphicsView::setRegion()
     bottomRightItem.clear();
     topLeftIndex = qMakePair(-1, -1);
     bottomRightIndex = qMakePair(-1, -1);
+}
+
+
+void WaferGraphicsView::initWafer(const QPointF& center, double radius,
+    int dieWidth, int dieHeight) {
+    m_center = center;
+    m_radius = radius;
+    m_dieSize = QSize(dieWidth, dieHeight);
+
+    // 清空场景
+    m_scene->clear();
+    qDebug() << "Center:" << m_center << "Radius:" << m_radius;
+    // 绘制晶圆外圆
+    QGraphicsEllipseItem* waferCircle = new QGraphicsEllipseItem(
+        m_center.x() - radius,
+        m_center.y() - radius,
+        (radius) * 2,
+        (radius) * 2
+    );
+    waferCircle->setPen(QPen(Qt::blue, 2));
+    m_scene->addItem(waferCircle);
+}
+
+void WaferGraphicsView::addDiePoint(const QPointF& diePos,const WAFER_MATRIX_POINT_INFO_STRUCT& dieInfo) {
+
+    // 创建图形项
+    DieItem* dieItem = new DieItem(dieInfo);
+    //QPointF diePosUpdate(diePos.x() + dieInfo.nDieRow * m_dieSize.width(), diePos.y() + dieInfo.nDieCol * m_dieSize.height());
+
+    dieItem->setRect(
+        diePos.x() - m_dieSize.width() / 2,
+        diePos.y() - m_dieSize.height() / 2,
+        m_dieSize.width(),
+        m_dieSize.height()
+    );
+    // 存储映射关系
+    m_dieItems.insert(dieInfo.iDieIndex, dieItem);
+    m_scene->addItem(dieItem);
+}
+
+void WaferGraphicsView::drawDieMatrix(const QPointF& center,
+    int Width, int Height) {
+    QGraphicsRectItem* rect = m_scene->addRect(center.x(), center.y(), Width, Height,
+        QPen(Qt::blue, 0.5));
 }

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

@@ -8,13 +8,17 @@
 #include "DieItem.h"
 #include <QLabel>
 #include <QPointer>
-
+#include <CViewInterface.h>
 class WaferGraphicsView : public QGraphicsView {
     Q_OBJECT
 
 public:
     WaferGraphicsView(QGraphicsScene* scene, QWidget* parent = nullptr);
-
+    void initWafer(const QPointF& center, double radius,
+        int dieWidth, int dieHeight);
+    void addDiePoint(const QPointF& diePos,const WAFER_MATRIX_POINT_INFO_STRUCT& dieInfo);
+    void drawDieMatrix(const QPointF& center,
+        int Width, int Height);
 
 protected:
     void mousePressEvent(QMouseEvent* event) override;
@@ -40,6 +44,12 @@ private:
     QPointer<DieItem> topLeftItem;
     QPointer<DieItem> bottomRightItem;
 
+    QGraphicsScene* m_scene;
+    QPointF m_center;
+    double m_radius;
+    QSize m_dieSize;
+    QHash<UINT, DieItem*> m_dieItems; // 通过ID快速访问
+
     void showThumbnail();
     void hideThumbnail();
 

+ 2 - 1
View/die-bonder-ui/CameraMaterialGroupWnd/MaterialWindow/Waffle.cpp

@@ -168,7 +168,7 @@ void Waffle::paintInitFrom(QWidget *parent) {
 void Waffle::initFrom(QWidget *parent) {
     scene = new QGraphicsScene(parent);
     view = new WaffleGraphicsView(scene);
-
+    /*
     // 获取当前窗口的宽高
     int width = parent->width();
     int height = parent->height();
@@ -184,6 +184,7 @@ void Waffle::initFrom(QWidget *parent) {
 
     view->setSceneRect(scene->itemsBoundingRect());
     view->resize(width, height);
+    */
 }
 QPixmap Waffle::getGlobalPixmap() const {
     return globalPixmap;

+ 1 - 0
View/die-bonder-ui/OriginalWnd/MainAndSecondaryCamerasWnd.cpp

@@ -105,6 +105,7 @@ void MainAndSecondaryCamerasWnd::InitPage()
             }
             else
             {
+                m_pMainCameraBind->m_vecCamera[i].eType = MATERIAL_WAFER;
                 manager = new CameraImageHandler(num, m_pMainCameraBind->m_vecCamera[i]);
             }
 

+ 11 - 5
View/die-bonder-ui/Src/RewriteControl/LightJoystickSwitchPage.cpp

@@ -518,7 +518,7 @@ EN_LIGHT_INDEX LightJoystickSwitchPage::MatchSelectedLightIndex(QLineEdit* lineE
 }
 
 void LightJoystickSwitchPage::resizeSingleUI() {
-    //ui->resize(265, 240)
+    
     ui->switchTabWidget->setGeometry(QRect(0, 0, 265, 240));
  
     ui->GreenLightTab->setGeometry(QRect(0, 0, 60, 32));
@@ -549,15 +549,21 @@ void LightJoystickSwitchPage::resizeSingleUI() {
     ui->DotLightverticalSlider->setGeometry(QRect(10, 12, 18, 56));
     ui->DotLightlabel->setGeometry(QRect(32, 22, 19, 34));
 
+    ui->groupBox_2->setGeometry(QRect(0, 0, 250, 131));
+    ui->xCheckBox->setGeometry(QRect(0, 0, 30, 30));
+    ui->xLineEdit->setGeometry(QRect(31, 0, 50, 30));
+
+    ui->rCheckBox->setGeometry(QRect(0, 0, 30, 30));
+    ui->rLineEdit->setGeometry(QRect(31, 0, 50, 30));
+
+    ui->xLayout->setGeometry(QRect(30, 0, 90, 30));
     ui->groupBox->setGeometry(QRect(0, 100, 141, 111));
     ui->left_Button->setGeometry(QRect(10, 40, 41, 31));
     ui->right_Button->setGeometry(QRect(90, 40, 41, 31));
     ui->up_Button->setGeometry(QRect(50, 10, 41, 31));
     ui->down_Button->setGeometry(QRect(50, 70, 41, 31));
-    //ui->move_Button->setGeometry(QRect(170, 130, 60, 23));
-    //ui->JTabShowLableLoop->setGeometry(QRect(10, 50, 200, 41));
-    //ui->moveTo_Button->setGeometry(QRect(170, 170, 60, 23));
-    //ui->valLineEdit->setGeometry(QRect(160, 100, 71, 21));
+
+
 }