瀏覽代碼

编程页面

lsw 1 月之前
父節點
當前提交
985e1b0d49

+ 2 - 0
View/die-bonder-ui/SBTdie-bonder-ui.vcxproj

@@ -267,9 +267,11 @@
     <ClCompile Include="Src\SystemInfoPage\PageWnd\AddUserAccountWnd.cpp" />
     <ClCompile Include="Src\SystemInfoPage\PageWnd\LanguageSwitchWnd.cpp" />
     <ClCompile Include="Src\SystemInfoPage\SystemInfoPage.cpp" />
+    <ClCompile Include="Src\WaferProgramPage.cpp" />
     <ClCompile Include="Src\WaffleProgramPage.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <QtMoc Include="Src\WaferProgramPage.h" />
     <QtMoc Include="Src\WaffleProgramPage.h" />
     <QtMoc Include="Src\SystemInfoPage\PageWnd\LanguageSwitchWnd.h" />
     <QtMoc Include="Src\SystemInfoPage\PageWnd\AddUserAccountWnd.h" />

+ 7 - 0
View/die-bonder-ui/SBTdie-bonder-ui.vcxproj.filters

@@ -306,6 +306,9 @@
     <ClCompile Include="Src\WaffleProgramPage.cpp">
       <Filter>Source Files\Src</Filter>
     </ClCompile>
+    <ClCompile Include="Src\WaferProgramPage.cpp">
+      <Filter>Source Files\Src</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <QtMoc Include="ImageWidget.h">
@@ -434,6 +437,10 @@
     <QtMoc Include="OriginalWnd\TreeViewManager\JCustomLabelControls.h">
       <Filter>Header Files\OriginalWnd\TreeViewManager</Filter>
     </QtMoc>
+  </ItemGroup>
+    <QtMoc Include="Src\WaferProgramPage.h">
+      <Filter>Source Files\Src</Filter>
+    </QtMoc>
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="debug\moc_predefs.h.cbt">

+ 2 - 1
View/die-bonder-ui/Src/ProgrammPage.cpp

@@ -44,6 +44,7 @@ ProgrammPage::ProgrammPage(QWidget *parent)
 	ui.tab->setStyleSheet("background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #F1F4FD, stop: 1 #E5E4F6)");
 
 	m_pWaffleProgrammPage = new WaffleProgramPage(this);
+	m_WaferProgramPage = new WaferProgramPage(this);
 	m_manageDB = CManageDB::GetInstance();
 
 	initPage();
@@ -947,6 +948,6 @@ void ProgrammPage::initPage()
 	UpdatePageParam();
 
 	ui.verticalLayoutWaffleMatrix->addWidget(m_pWaffleProgrammPage);
-
+	ui.verticalLayoutWaferMatrix->addWidget(m_WaferProgramPage);
 
 }

+ 2 - 0
View/die-bonder-ui/Src/ProgrammPage.h

@@ -4,6 +4,7 @@
 #include "ui_ProgrammPage.h"
 #include "CViewInterface.h"
 #include "WaffleProgramPage.h"
+#include <View/die-bonder-ui/Src/WaferProgramPage.h>
 
 class ProgrammPage : public QWidget
 {
@@ -69,6 +70,7 @@ private:
 	int m_curPtIndex = 0;
 
 	WaffleProgramPage* m_pWaffleProgrammPage = nullptr;
+	WaferProgramPage* m_WaferProgramPage = nullptr;
 
 	
 };

+ 335 - 0
View/die-bonder-ui/Src/WaferProgramPage.cpp

@@ -0,0 +1,335 @@
+#include "WaferProgramPage.h"
+
+std::unordered_map<int, bool> WaferProgramPage::idIsUsedMap;
+
+WaferProgramPage::WaferProgramPage(QWidget* parent)
+    : QWidget(parent)
+{
+    QVBoxLayout* mainLayout = new QVBoxLayout(this);
+
+    m_pCProduct = CManageDB::GetInstance()->GetCProduct();
+    // 从数据库中加载数据
+    m_pCProduct->LoadDataByDB();
+
+    // 创建表格
+    mergedTable = new QTableWidget(this);
+    mergedTable->setColumnCount(11); // 11 列,包含 Matrix 和 DieMatrix 的所有字段
+    mergedTable->setHorizontalHeaderLabels({
+        "MatrixID", "MatrixRow", "MatrixCol", "LeftTopPoint_Y", "LeftTopPoint_X",
+        "RightTopPoint_X", "RightTopPoint_Y", "RightBottomPoint_X", "RightBottomPoint_Y",
+        "DieMatrixId", "NoBondPt"
+        });
+
+    mergedTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+
+    // 创建按钮布局
+    QHBoxLayout* buttonLayout = new QHBoxLayout();
+    QPushButton* addRowButton = new QPushButton("Add", this);
+    QPushButton* deleteRowButton = new QPushButton("Delete", this);
+    QPushButton* updateButton = new QPushButton("Update", this);
+
+    buttonLayout->addWidget(addRowButton);
+    buttonLayout->addWidget(deleteRowButton);
+    buttonLayout->addWidget(updateButton);
+    QString buttonStyle = R"(
+    QPushButton {
+            background-color: #f0f0f0;
+            border: 1px solid #b0b0b0;
+            border-radius: 4px;
+            padding: 4px 12px;
+        }
+        QPushButton:hover {
+            background-color: #e0e0ff;
+        }
+        QPushButton:pressed {
+            background-color: #d0d0ff;
+        }
+    )";
+
+    addRowButton->setStyleSheet(buttonStyle);
+    deleteRowButton->setStyleSheet(buttonStyle);
+    updateButton->setStyleSheet(buttonStyle);
+    // 将控件添加到布局
+    mainLayout->addWidget(mergedTable);
+    mainLayout->addLayout(buttonLayout);
+    setLayout(mainLayout);
+
+    // 连接按钮和槽
+    connect(addRowButton, &QPushButton::clicked, this, &WaferProgramPage::addRow);
+    connect(deleteRowButton, &QPushButton::clicked, this, &WaferProgramPage::deleteRow);
+    connect(updateButton, &QPushButton::clicked, this, &WaferProgramPage::updateData);
+    connect(mergedTable, &QTableWidget::cellChanged, this, &WaferProgramPage::onCellChanged);
+    connect(mergedTable, &QTableWidget::cellDoubleClicked, this, [=](int row, int column) {
+        if (column == 9) {
+            QComboBox* comboBox = createDieMatrixIdComboBox(m_VecWaferMatrix[row].iDieMatrixId, row);
+            mergedTable->setCellWidget(row, column, comboBox);
+            comboBox->showPopup(); // 可选:自动展开下拉
+
+            // 记录初始值(以防没有变化)
+            int originalValue = comboBox->currentData().toInt();
+
+            // 1. 用户选择后立即还原
+            connect(comboBox, QOverload<int>::of(&QComboBox::activated), this, [=](int index) {
+                int selectedId = comboBox->itemData(index).toInt();
+                m_VecWaferMatrix[row].iDieMatrixId = selectedId;
+
+                mergedTable->removeCellWidget(row, column);
+                mergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
+                });
+
+            // 2. 用户没有选中,仅点击其他地方,触发还原
+            connect(comboBox, &QComboBox::hidePopup, this, [=]() {
+                // 如果还在表格里,就还原(防止重复)
+                if (mergedTable->cellWidget(row, column) == comboBox) {
+                    int selectedId = comboBox->currentData().toInt();
+                    m_VecWaferMatrix[row].iDieMatrixId = selectedId;
+
+                    mergedTable->removeCellWidget(row, column);
+                    mergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
+                }
+                });
+        }
+        });
+
+    // 初始化表格数据
+    initMergedData();
+}
+
+//QWidget* WaferProgramPage::CreateWaferProgramPage(const CONFIG_BASE_STRUCT& control) {
+//    return new WaferProgramPage();
+//}
+
+//创建下拉列表
+QComboBox* WaferProgramPage::createDieMatrixIdComboBox(int defaultId, int row) {
+    QComboBox* comboBox = new QComboBox(mergedTable);
+
+    for (const auto& dieMatrix : m_VecDieMatrixt) {
+        /*comboBox->addItem(
+            QString("%1 - %2").arg(dieMatrix.MatrixId).arg(QString::fromStdString(dieMatrix.strModuleName)),
+            QVariant(dieMatrix.MatrixId)
+        );*/
+        comboBox->addItem(QString::number(dieMatrix.MatrixId), QVariant(dieMatrix.MatrixId));
+    }
+
+    int index = comboBox->findData(defaultId);
+    if (index >= 0)
+        comboBox->setCurrentIndex(index);
+
+    return comboBox;
+}
+
+
+void WaferProgramPage::initMergedData() {
+    m_isInitializing = true;
+
+    SqlOperation& sqlOp = SqlOperation::GetInstance();
+    QList<QJsonObject> directories;
+    int userPrivilege = 0;//?
+    sqlOp.GetDirectories("Dir_Programme", userPrivilege, directories); // 使用相应的表名和权限加载目录
+    m_VecWaferMatrix = m_pCProduct->GetWaferMatrix();
+
+    for (const PROGRAM_WAFER_MATRIX_STRUCT& wafer : m_VecWaferMatrix) {
+        int row = mergedTable->rowCount();
+        mergedTable->insertRow(row);
+        PROGRAM_DIE_MATRIX_STRUCT stDieMatrix;
+        m_pCProduct->GetDieMatrix(wafer.MatrixId, stDieMatrix);
+        m_VecDieMatrixt.push_back(stDieMatrix);
+
+        // 填充表格数据
+        mergedTable->setItem(row, 0, new QTableWidgetItem(QString::number(wafer.MatrixId))); // MatrixID
+        mergedTable->setItem(row, 1, new QTableWidgetItem(QString::number(wafer.MatrixRow))); // MatrixRow
+        mergedTable->setItem(row, 2, new QTableWidgetItem(QString::number(wafer.MatrixCol))); // MatrixCol
+        mergedTable->setItem(row, 3, new QTableWidgetItem(QString::number(wafer.LeftTopPoint.y))); // LeftTopPoint_Y
+        mergedTable->setItem(row, 4, new QTableWidgetItem(QString::number(wafer.LeftTopPoint.x))); // LeftTopPoint_X
+        mergedTable->setItem(row, 5, new QTableWidgetItem(QString::number(wafer.RightTopPoint.x))); // RightTopPoint_X
+        mergedTable->setItem(row, 6, new QTableWidgetItem(QString::number(wafer.RightTopPoint.y))); // RightTopPoint_Y
+        mergedTable->setItem(row, 7, new QTableWidgetItem(QString::number(wafer.RightBottomPoint.x))); // RightBottomPoint_X
+        mergedTable->setItem(row, 8, new QTableWidgetItem(QString::number(wafer.RightBottomPoint.y))); // RightBottomPoint_Y
+        mergedTable->setItem(row, 9, new QTableWidgetItem(QString::number(wafer.iDieMatrixId))); // DieMatrixId
+
+        // 填充 NoBondPt 数据
+        QStringList noBondPts;
+        for (const XY_LONG_STRUCT& pt : wafer.VecNoBondPt) {
+            noBondPts.append(QString("(%1,%2)").arg(pt.x).arg(pt.y));
+        }
+        mergedTable->setItem(row, 10, new QTableWidgetItem(noBondPts.join(" "))); // NoBondPt
+    }
+
+    // 调整列宽和行高
+    mergedTable->resizeColumnsToContents();
+    mergedTable->resizeRowsToContents();
+
+    m_isInitializing = false;// 开启信号处理
+}
+
+
+void WaferProgramPage::addRow() {
+    m_isInitializing = true;
+    idIsUsedMap.clear();
+    for (const auto& wafer : m_VecWaferMatrix) {
+        idIsUsedMap[wafer.MatrixId] = true;
+    }
+    int row = mergedTable->rowCount();
+    mergedTable->insertRow(row);
+
+    int newId = 1;
+    bool idUsed = true;
+
+    //// 检查当前 MatrixId 是否已存在
+    //while (idUsed) {
+    //    idUsed = false;  // 假设 ID 没有被使用
+
+    //    // 如果 ID 已存在于 map 中,则说明已被使用
+    //    if (idIsUsedMap.find(newId) != idIsUsedMap.end()) {
+    //        idUsed = true;
+    //    }
+
+    //    if (idUsed) {
+    //        ++newId; // 如果 ID 被使用,检查下一个 ID
+    //    }
+    //}
+    //找出最大的ID值
+    UINT maxId = 0;
+    for (PROGRAM_WAFER_MATRIX_STRUCT& bondMatrix : m_VecWaferMatrix)
+    {
+        if (bondMatrix.MatrixId > maxId)
+        {
+            maxId = bondMatrix.MatrixId;
+        }
+    }
+    newId = ++maxId;
+
+    // 为新行添加默认数据
+    mergedTable->setItem(row, 0, new QTableWidgetItem(QString::number(newId))); // MatrixID 默认值为 0
+    mergedTable->setItem(row, 1, new QTableWidgetItem("1")); // MatrixRow 默认值为 1
+    mergedTable->setItem(row, 2, new QTableWidgetItem("1")); // MatrixCol 默认值为 1
+    mergedTable->setItem(row, 3, new QTableWidgetItem("0")); // LeftTopPoint_Y 默认值为 0
+    mergedTable->setItem(row, 4, new QTableWidgetItem("0")); // LeftTopPoint_X 默认值为 0
+    mergedTable->setItem(row, 5, new QTableWidgetItem("0")); // RightTopPoint_X 默认值为 0
+    mergedTable->setItem(row, 6, new QTableWidgetItem("0")); // RightTopPoint_Y 默认值为 0
+    mergedTable->setItem(row, 7, new QTableWidgetItem("0")); // RightBottomPoint_X 默认值为 0
+    mergedTable->setItem(row, 8, new QTableWidgetItem("0")); // RightBottomPoint_Y 默认值为 0
+    mergedTable->setItem(row, 9, new QTableWidgetItem("0")); // DieMatrixId 默认值为 0
+    /*QComboBox* comboBox = createDieMatrixIdComboBox(0, row);
+    mergedTable->setCellWidget(row, 9, comboBox);*/
+
+    mergedTable->setItem(row, 10, new QTableWidgetItem("")); // NoBondPt 默认值为空
+
+    // 同时更新 PROGRAM_WAFER_MATRIX_STRUCT 数据
+    PROGRAM_WAFER_MATRIX_STRUCT newMatrix;
+    newMatrix.MatrixId = newId;
+    newMatrix.MatrixRow = 1;
+    newMatrix.MatrixCol = 1;
+    newMatrix.LeftTopPoint = { 0.0, 0.0 };
+    newMatrix.RightTopPoint = { 0.0, 0.0 };
+    newMatrix.RightBottomPoint = { 0.0, 0.0 };
+    newMatrix.iDieMatrixId = 0;
+    newMatrix.VecNoBondPt.clear();  // 默认值为空
+
+    m_VecWaferMatrix.push_back(newMatrix);
+    // 将新矩阵添加到数据结构中
+    //m_pCProduct->AddWaferMatrix(newMatrix, newId);
+    m_isInitializing = false;
+}
+
+void WaferProgramPage::deleteRow() {
+    int currentRow = mergedTable->currentRow();
+
+    if (currentRow >= 0 && currentRow < mergedTable->rowCount()) {
+        // 获取 MatrixID(假设第0列是 MatrixID)
+        QTableWidgetItem* idItem = mergedTable->item(currentRow, 0);
+        if (!idItem) return;
+
+        int matrixID = idItem->text().toInt();
+
+        // 从 mergedTable 删除行
+        mergedTable->removeRow(currentRow);
+
+        // 从 m_VecWaferMatrix 中移除对应项
+        auto it = std::remove_if(m_VecWaferMatrix.begin(), m_VecWaferMatrix.end(),
+            [matrixID](const PROGRAM_WAFER_MATRIX_STRUCT& wafer) {
+                return wafer.MatrixId == matrixID;
+            });
+        if (it != m_VecWaferMatrix.end()) {
+            m_VecWaferMatrix.erase(it, m_VecWaferMatrix.end());
+        }
+
+        // 同时通知数据管理类删除
+        //m_pCProduct->DeleteWaferMatrix(matrixID);
+
+    }
+    else {
+        //QMessageBox::warning(this, "No Row Selected", "Please select a row to delete.");
+        QMessageBox box(QMessageBox::Warning, "No Row Selected", "Please select a row to delete.");
+        box.setStyleSheet(R"(
+            QMessageBox {
+                background-color: #eeeeee;
+                color: black;
+            }
+            QPushButton {
+                background-color: #dddddd;
+                color: black;
+            }
+        )");
+        box.exec();
+    }
+    currentRow = -1;
+}
+
+void WaferProgramPage::updateData() {
+    // 1. 清空原模型中的矩阵
+    auto originalData = m_pCProduct->GetWaferMatrix();
+    for (const auto& matrix : originalData) {
+        m_pCProduct->DeleteWaferMatrix(matrix.MatrixId);
+    }
+
+    // 2. 添加当前表格中的数据
+    for (auto& matrix : m_VecWaferMatrix) {
+        int newId = matrix.MatrixId;
+        m_pCProduct->AddWaferMatrix(matrix, newId);
+        auto originalData1 = m_pCProduct->GetWaferMatrix();
+    }
+
+    //qDebug() << "WaferMatrix 已同步到模型层,共同步:" << m_VecWaferMatrix.size() << "条记录。";
+}
+
+
+void WaferProgramPage::onCellChanged(int row, int column)
+{
+    if (m_isInitializing) return; // 防止初始化时触发
+    if (row >= m_VecWaferMatrix.size()) return;
+
+    QTableWidgetItem* item = mergedTable->item(row, column);
+    if (!item) return;
+
+    QString value = item->text();
+    PROGRAM_WAFER_MATRIX_STRUCT& wafer = m_VecWaferMatrix[row];
+
+    switch (column) {
+    case 0: wafer.MatrixId = value.toInt(); break;
+    case 1: wafer.MatrixRow = value.toInt(); break;
+    case 2: wafer.MatrixCol = value.toInt(); break;
+    case 3: wafer.LeftTopPoint.y = value.toDouble(); break;
+    case 4: wafer.LeftTopPoint.x = value.toDouble(); break;
+    case 5: wafer.RightTopPoint.x = value.toDouble(); break;
+    case 6: wafer.RightTopPoint.y = value.toDouble(); break;
+    case 7: wafer.RightBottomPoint.x = value.toDouble(); break;
+    case 8: wafer.RightBottomPoint.y = value.toDouble(); break;
+        ////case 9: wafer.iDieMatrixId = value.toInt(); break;
+
+    case 10: {
+        wafer.VecNoBondPt.clear();
+        QRegularExpression regex(R"(\((\d+),(\d+)\))");
+        QRegularExpressionMatchIterator i = regex.globalMatch(value);
+        while (i.hasNext()) {
+            auto match = i.next();
+            XY_LONG_STRUCT pt;
+            pt.x = match.captured(1).toInt();
+            pt.y = match.captured(2).toInt();
+            wafer.VecNoBondPt.push_back(pt);
+        }
+        break;
+    }
+    default: break;
+    }
+}

+ 55 - 0
View/die-bonder-ui/Src/WaferProgramPage.h

@@ -0,0 +1,55 @@
+#ifndef WAFER_PROGRAM_PAGE_H
+#define WAFER_PROGRAM_PAGE_H
+
+#include "Src/Sql/SqlOperation.h"
+#include <QWidget>
+#include <QFileDialog>
+#include <QTextStream>
+#include <QHeaderView>
+#include <QTableWidget>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QSqlQuery>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QMessageBox>
+#include <unordered_map>
+#include <QtWidgets/qcombobox.h>
+
+class WaferProgramPage : public QWidget {
+    Q_OBJECT
+
+public:
+    explicit WaferProgramPage(QWidget* parent = nullptr);
+
+    static QWidget* CreateWaferProgramPage();
+
+    QComboBox* createDieMatrixIdComboBox(int defaultId, int row);
+
+private slots:
+    void addRow();
+
+    void deleteRow();
+
+    void updateData();
+
+    void onCellChanged(int row, int column);
+
+private:
+    // 初始化合并后的数据(多表)
+    void initMergedData();
+
+
+private:
+    QTableWidget* mergedTable;
+    CONFIG_BASE_STRUCT controlConfig;
+    CProduct* m_pCProduct = nullptr;//CManageDB::GetInstance()->GetCProduct();
+    std::vector<PROGRAM_WAFER_MATRIX_STRUCT> m_VecWaferMatrix;
+    std::vector<PROGRAM_DIE_MATRIX_STRUCT> m_VecDieMatrixt;
+
+    static std::unordered_map<int, bool> idIsUsedMap;
+    bool m_isInitializing = false;
+};
+
+#endif // WAFER_PROGRAM_PAGE_H