lsw vor 1 Tag
Ursprung
Commit
30cef7d6d0

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

@@ -245,6 +245,7 @@
     <ClCompile Include="Src\common\JMessageTip.cpp" />
     <ClCompile Include="Src\common\JQCommon.cpp" />
     <ClCompile Include="Src\common\JUserAccountsData.cpp" />
+    <ClCompile Include="Src\MatrixDialogs\NoBondPtEditDialog.cpp" />
     <ClCompile Include="Src\ProgrammPage.cpp" />
     <ClCompile Include="Src\RewriteControl\ControlOperationPage.cpp">
       <DynamicSource Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">input</DynamicSource>
@@ -306,6 +307,7 @@
     <QtMoc Include="Src\RewriteControl\Controls\DoubleSpinBox.h" />
     <QtMoc Include="Src\RewriteControl\Controls\SpinBox.h" />
     <QtMoc Include="Src\ProgrammPage.h" />
+    <QtMoc Include="Src\MatrixDialogs\NoBondPtEditDialog.h" />
     <ClInclude Include="Src\Sql\GetUiConfigFormDB.h" />
     <ClInclude Include="Src\Sql\SqlOperation.h" />
     <QtMoc Include="Src\CameraBind.h" />

+ 9 - 2
View/die-bonder-ui/SBTdie-bonder-ui.vcxproj.filters

@@ -145,6 +145,9 @@
     <Filter Include="Source Files\Src\Res\qss">
       <UniqueIdentifier>{4ca1f675-60a2-4484-bb81-922a908ce85e}</UniqueIdentifier>
     </Filter>
+    <Filter Include="Source Files\Src\MatrixDialogs">
+      <UniqueIdentifier>{7775c979-a512-43b3-924f-c18e89118da1}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="ImageWidget.cpp">
@@ -309,6 +312,9 @@
     <ClCompile Include="Src\WaferProgramPage.cpp">
       <Filter>Source Files\Src</Filter>
     </ClCompile>
+    <ClCompile Include="Src\MatrixDialogs\NoBondPtEditDialog.cpp">
+      <Filter>Source Files\Src\MatrixDialogs</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <QtMoc Include="ImageWidget.h">
@@ -440,6 +446,9 @@
     <QtMoc Include="Src\WaferProgramPage.h">
       <Filter>Source Files\Src</Filter>
     </QtMoc>
+    <QtMoc Include="Src\MatrixDialogs\NoBondPtEditDialog.h">
+      <Filter>Source Files\Src\MatrixDialogs</Filter>
+    </QtMoc>
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="debug\moc_predefs.h.cbt">
@@ -817,8 +826,6 @@
     </None>
     <None Include="dark.qss" />
     <None Include="dark.qss" />
-    <None Include="dark.qss" />
-    <None Include="dark.qss" />
     <None Include="dark.qss">
       <Filter>Resource Files</Filter>
     </None>

+ 76 - 207
View/die-bonder-ui/Src/WaferProgramPage.cpp

@@ -1,6 +1,6 @@
 #include "WaferProgramPage.h"
 
-std::unordered_map<int, bool> WaferProgramPage::idIsUsedMap;
+std::unordered_map<int, bool> WaferProgramPage::m_IdIsUsedMap;
 
 WaferProgramPage::WaferProgramPage(QWidget* parent)
     : QWidget(parent)
@@ -12,15 +12,15 @@ WaferProgramPage::WaferProgramPage(QWidget* parent)
     m_pCProduct->LoadDataByDB();
 
     // 创建表格
-    mergedTable = new QTableWidget(this);
-    mergedTable->setColumnCount(11); // 11 列,包含 Matrix 和 DieMatrix 的所有字段
-    mergedTable->setHorizontalHeaderLabels({
+    m_MergedTable = new QTableWidget(this);
+    m_MergedTable->setColumnCount(11); // 11 列,包含 Matrix 和 DieMatrix 的所有字段
+    m_MergedTable->setHorizontalHeaderLabels({
         "MatrixID", "MatrixRow", "MatrixCol", "LeftTopPoint_Y", "LeftTopPoint_X",
         "RightTopPoint_X", "RightTopPoint_Y", "RightBottomPoint_X", "RightBottomPoint_Y",
         "DieMatrixId", "NoBondPt"
         });
 
-    mergedTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+    m_MergedTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
 
     // 创建按钮布局
     QHBoxLayout* buttonLayout = new QHBoxLayout();
@@ -50,7 +50,7 @@ WaferProgramPage::WaferProgramPage(QWidget* parent)
     deleteRowButton->setStyleSheet(buttonStyle);
     updateButton->setStyleSheet(buttonStyle);
     // 将控件添加到布局
-    mainLayout->addWidget(mergedTable);
+    mainLayout->addWidget(m_MergedTable);
     mainLayout->addLayout(buttonLayout);
     setLayout(mainLayout);
 
@@ -58,11 +58,11 @@ WaferProgramPage::WaferProgramPage(QWidget* parent)
     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) {
+    connect(m_MergedTable, &QTableWidget::cellChanged, this, &WaferProgramPage::onCellChanged);
+    connect(m_MergedTable, &QTableWidget::cellDoubleClicked, this, [=](int row, int column) {
         if (column == 9) {
-            QComboBox* comboBox = createDieMatrixIdComboBox(m_VecWaferMatrix[row].iDieMatrixId, row);
-            mergedTable->setCellWidget(row, column, comboBox);
+            QComboBox* comboBox = createDieMatrixIdComboBox(m_vecWaferMatrix[row].iDieMatrixId, row);
+            m_MergedTable->setCellWidget(row, column, comboBox);
             comboBox->showPopup(); // 可选:自动展开下拉
 
             // 记录初始值(以防没有变化)
@@ -71,28 +71,28 @@ WaferProgramPage::WaferProgramPage(QWidget* parent)
             // 1. 用户选择后立即还原
             connect(comboBox, QOverload<int>::of(&QComboBox::activated), this, [=](int index) {
                 int selectedId = comboBox->itemData(index).toInt();
-                m_VecWaferMatrix[row].iDieMatrixId = selectedId;
+                m_vecWaferMatrix[row].iDieMatrixId = selectedId;
 
-                mergedTable->removeCellWidget(row, column);
-                mergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
+                m_MergedTable->removeCellWidget(row, column);
+                m_MergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
                 });
 
             // 2. 用户没有选中,仅点击其他地方,触发还原
             connect(comboBox, &QComboBox::hidePopup, this, [=]() {
                 // 如果还在表格里,就还原(防止重复)
-                if (mergedTable->cellWidget(row, column) == comboBox) {
+                if (m_MergedTable->cellWidget(row, column) == comboBox) {
                     int selectedId = comboBox->currentData().toInt();
-                    m_VecWaferMatrix[row].iDieMatrixId = selectedId;
+                    m_vecWaferMatrix[row].iDieMatrixId = selectedId;
 
-                    mergedTable->removeCellWidget(row, column);
-                    mergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
+                    m_MergedTable->removeCellWidget(row, column);
+                    m_MergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
                 }
                 });
         }
         });
-    connect(mergedTable, &QTableWidget::cellDoubleClicked, this, [=](int row, int column) {
+    connect(m_MergedTable, &QTableWidget::cellDoubleClicked, this, [=](int row, int column) {
         if (column == 10) { // NoBondPt 列
-            const auto& wafer = m_VecWaferMatrix[row];
+            const auto& wafer = m_vecWaferMatrix[row];
 
             NoBondPtEditDialog dlg(wafer.MatrixRow, wafer.MatrixCol, wafer.VecNoBondPt, this);
             if (dlg.exec() == QDialog::Accepted) {
@@ -100,9 +100,9 @@ WaferProgramPage::WaferProgramPage(QWidget* parent)
                 QVector<XY_LONG_STRUCT> selected = dlg.getSelectedPoints();
 
                 // 更新数据结构
-                m_VecWaferMatrix[row].VecNoBondPt.clear();
+                m_vecWaferMatrix[row].VecNoBondPt.clear();
                 for (const auto& pt : selected) {
-                    m_VecWaferMatrix[row].VecNoBondPt.push_back(pt);
+                    m_vecWaferMatrix[row].VecNoBondPt.push_back(pt);
                 }
 
                 // 转换为字符串填入表格
@@ -110,7 +110,7 @@ WaferProgramPage::WaferProgramPage(QWidget* parent)
                 for (const auto& pt : selected) {
                     ptList << QString("(%1,%2)").arg(pt.x).arg(pt.y);
                 }
-                mergedTable->setItem(row, column, new QTableWidgetItem(ptList.join(" ")));
+                m_MergedTable->setItem(row, column, new QTableWidgetItem(ptList.join(" ")));
             }
         }
         });
@@ -126,7 +126,7 @@ WaferProgramPage::WaferProgramPage(QWidget* parent)
 
 //创建下拉列表
 QComboBox* WaferProgramPage::createDieMatrixIdComboBox(int defaultId, int row) {
-    QComboBox* comboBox = new QComboBox(mergedTable);
+    QComboBox* comboBox = new QComboBox(m_MergedTable);
 
     // 设置样式,确保在暗色模式下也是白底黑字
     comboBox->setStyleSheet(R"(
@@ -144,7 +144,7 @@ QComboBox* WaferProgramPage::createDieMatrixIdComboBox(int defaultId, int row) {
             selection-color: black;
         }
     )");
-    for (const auto& dieMatrix : m_VecDieMatrixt) {
+    for (const auto& dieMatrix : m_vecDieMatrixt) {
         /*comboBox->addItem(
             QString("%1 - %2").arg(dieMatrix.MatrixId).arg(QString::fromStdString(dieMatrix.strModuleName)),
             QVariant(dieMatrix.MatrixId)
@@ -167,38 +167,38 @@ void WaferProgramPage::initMergedData() {
     QList<QJsonObject> directories;
     int userPrivilege = 0;//?
     sqlOp.GetDirectories("Dir_Programme", userPrivilege, directories); // 使用相应的表名和权限加载目录
-    m_VecWaferMatrix = m_pCProduct->GetWaferMatrix();
+    m_vecWaferMatrix = m_pCProduct->GetWaferMatrix();
 
-    for (const PROGRAM_WAFER_MATRIX_STRUCT& wafer : m_VecWaferMatrix) {
-        int row = mergedTable->rowCount();
-        mergedTable->insertRow(row);
+    for (const PROGRAM_WAFER_MATRIX_STRUCT& wafer : m_vecWaferMatrix) {
+        int row = m_MergedTable->rowCount();
+        m_MergedTable->insertRow(row);
         PROGRAM_DIE_MATRIX_STRUCT stDieMatrix;
         m_pCProduct->GetDieMatrix(wafer.MatrixId, stDieMatrix);
-        m_VecDieMatrixt.push_back(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
+        m_MergedTable->setItem(row, 0, new QTableWidgetItem(QString::number(wafer.MatrixId))); // MatrixID
+        m_MergedTable->setItem(row, 1, new QTableWidgetItem(QString::number(wafer.MatrixRow))); // MatrixRow
+        m_MergedTable->setItem(row, 2, new QTableWidgetItem(QString::number(wafer.MatrixCol))); // MatrixCol
+        m_MergedTable->setItem(row, 3, new QTableWidgetItem(QString::number(wafer.LeftTopPoint.y))); // LeftTopPoint_Y
+        m_MergedTable->setItem(row, 4, new QTableWidgetItem(QString::number(wafer.LeftTopPoint.x))); // LeftTopPoint_X
+        m_MergedTable->setItem(row, 5, new QTableWidgetItem(QString::number(wafer.RightTopPoint.x))); // RightTopPoint_X
+        m_MergedTable->setItem(row, 6, new QTableWidgetItem(QString::number(wafer.RightTopPoint.y))); // RightTopPoint_Y
+        m_MergedTable->setItem(row, 7, new QTableWidgetItem(QString::number(wafer.RightBottomPoint.x))); // RightBottomPoint_X
+        m_MergedTable->setItem(row, 8, new QTableWidgetItem(QString::number(wafer.RightBottomPoint.y))); // RightBottomPoint_Y
+        m_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
+        m_MergedTable->setItem(row, 10, new QTableWidgetItem(noBondPts.join(" "))); // NoBondPt
     }
 
     // 调整列宽和行高
-    mergedTable->resizeColumnsToContents();
-    mergedTable->resizeRowsToContents();
+    m_MergedTable->resizeColumnsToContents();
+    m_MergedTable->resizeRowsToContents();
 
     m_isInitializing = false;// 开启信号处理
 }
@@ -206,12 +206,12 @@ void WaferProgramPage::initMergedData() {
 
 void WaferProgramPage::addRow() {
     m_isInitializing = true;
-    idIsUsedMap.clear();
-    for (const auto& wafer : m_VecWaferMatrix) {
-        idIsUsedMap[wafer.MatrixId] = true;
+    m_IdIsUsedMap.clear();
+    for (const auto& wafer : m_vecWaferMatrix) {
+        m_IdIsUsedMap[wafer.MatrixId] = true;
     }
-    int row = mergedTable->rowCount();
-    mergedTable->insertRow(row);
+    int row = m_MergedTable->rowCount();
+    m_MergedTable->insertRow(row);
 
     int newId = 1;
     bool idUsed = true;
@@ -221,7 +221,7 @@ void WaferProgramPage::addRow() {
     //    idUsed = false;  // 假设 ID 没有被使用
 
     //    // 如果 ID 已存在于 map 中,则说明已被使用
-    //    if (idIsUsedMap.find(newId) != idIsUsedMap.end()) {
+    //    if (m_IdIsUsedMap.find(newId) != m_IdIsUsedMap.end()) {
     //        idUsed = true;
     //    }
 
@@ -231,7 +231,7 @@ void WaferProgramPage::addRow() {
     //}
     //找出最大的ID值
     UINT maxId = 0;
-    for (PROGRAM_WAFER_MATRIX_STRUCT& bondMatrix : m_VecWaferMatrix)
+    for (PROGRAM_WAFER_MATRIX_STRUCT& bondMatrix : m_vecWaferMatrix)
     {
         if (bondMatrix.MatrixId > maxId)
         {
@@ -241,20 +241,20 @@ void WaferProgramPage::addRow() {
     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
+    m_MergedTable->setItem(row, 0, new QTableWidgetItem(QString::number(newId))); // MatrixID 默认值为 0
+    m_MergedTable->setItem(row, 1, new QTableWidgetItem("1")); // MatrixRow 默认值为 1
+    m_MergedTable->setItem(row, 2, new QTableWidgetItem("1")); // MatrixCol 默认值为 1
+    m_MergedTable->setItem(row, 3, new QTableWidgetItem("0")); // LeftTopPoint_Y 默认值为 0
+    m_MergedTable->setItem(row, 4, new QTableWidgetItem("0")); // LeftTopPoint_X 默认值为 0
+    m_MergedTable->setItem(row, 5, new QTableWidgetItem("0")); // RightTopPoint_X 默认值为 0
+    m_MergedTable->setItem(row, 6, new QTableWidgetItem("0")); // RightTopPoint_Y 默认值为 0
+    m_MergedTable->setItem(row, 7, new QTableWidgetItem("0")); // RightBottomPoint_X 默认值为 0
+    m_MergedTable->setItem(row, 8, new QTableWidgetItem("0")); // RightBottomPoint_Y 默认值为 0
+    m_MergedTable->setItem(row, 9, new QTableWidgetItem("0")); // DieMatrixId 默认值为 0
     /*QComboBox* comboBox = createDieMatrixIdComboBox(0, row);
-    mergedTable->setCellWidget(row, 9, comboBox);*/
+    m_MergedTable->setCellWidget(row, 9, comboBox);*/
 
-    mergedTable->setItem(row, 10, new QTableWidgetItem("")); // NoBondPt 默认值为空
+    m_MergedTable->setItem(row, 10, new QTableWidgetItem("")); // NoBondPt 默认值为空
 
     // 同时更新 PROGRAM_WAFER_MATRIX_STRUCT 数据
     PROGRAM_WAFER_MATRIX_STRUCT newMatrix;
@@ -267,32 +267,32 @@ void WaferProgramPage::addRow() {
     newMatrix.iDieMatrixId = 0;
     newMatrix.VecNoBondPt.clear();  // 默认值为空
 
-    m_VecWaferMatrix.push_back(newMatrix);
+    m_vecWaferMatrix.push_back(newMatrix);
     // 将新矩阵添加到数据结构中
     //m_pCProduct->AddWaferMatrix(newMatrix, newId);
     m_isInitializing = false;
 }
 
 void WaferProgramPage::deleteRow() {
-    int currentRow = mergedTable->currentRow();
+    int currentRow = m_MergedTable->currentRow();
 
-    if (currentRow >= 0 && currentRow < mergedTable->rowCount()) {
+    if (currentRow >= 0 && currentRow < m_MergedTable->rowCount()) {
         // 获取 MatrixID(假设第0列是 MatrixID)
-        QTableWidgetItem* idItem = mergedTable->item(currentRow, 0);
+        QTableWidgetItem* idItem = m_MergedTable->item(currentRow, 0);
         if (!idItem) return;
 
         int matrixID = idItem->text().toInt();
 
-        // 从 mergedTable 删除行
-        mergedTable->removeRow(currentRow);
+        // 从 m_MergedTable 删除行
+        m_MergedTable->removeRow(currentRow);
 
-        // 从 m_VecWaferMatrix 中移除对应项
-        auto it = std::remove_if(m_VecWaferMatrix.begin(), m_VecWaferMatrix.end(),
+        // 从 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());
+        if (it != m_vecWaferMatrix.end()) {
+            m_vecWaferMatrix.erase(it, m_vecWaferMatrix.end());
         }
 
         // 同时通知数据管理类删除
@@ -325,26 +325,26 @@ void WaferProgramPage::updateData() {
     }
 
     // 2. 添加当前表格中的数据
-    for (auto& matrix : m_VecWaferMatrix) {
+    for (auto& matrix : m_vecWaferMatrix) {
         int newId = matrix.MatrixId;
         m_pCProduct->AddWaferMatrix(matrix, newId);
         auto originalData1 = m_pCProduct->GetWaferMatrix();
     }
 
-    //qDebug() << "WaferMatrix 已同步到模型层,共同步:" << m_VecWaferMatrix.size() << "条记录。";
+    //qDebug() << "WaferMatrix 已同步到模型层,共同步:" << m_vecWaferMatrix.size() << "条记录。";
 }
 
 
 void WaferProgramPage::onCellChanged(int row, int column)
 {
     if (m_isInitializing) return; // 防止初始化时触发
-    if (row >= m_VecWaferMatrix.size()) return;
+    if (row >= m_vecWaferMatrix.size()) return;
 
-    QTableWidgetItem* item = mergedTable->item(row, column);
+    QTableWidgetItem* item = m_MergedTable->item(row, column);
     if (!item) return;
 
     QString value = item->text();
-    PROGRAM_WAFER_MATRIX_STRUCT& wafer = m_VecWaferMatrix[row];
+    PROGRAM_WAFER_MATRIX_STRUCT& wafer = m_vecWaferMatrix[row];
 
     switch (column) {
     case 0: wafer.MatrixId = value.toInt(); break;
@@ -374,134 +374,3 @@ void WaferProgramPage::onCellChanged(int row, int column)
     default: break;
     }
 }
-
-
-// 构造函数实现
-NoBondPtEditDialog::NoBondPtEditDialog(int rows, int cols, const std::vector<XY_LONG_STRUCT>& selectedPts, QWidget* parent)
-    : QDialog(parent)
-{
-    this->setStyleSheet(R"(
-        QDialog {
-            background-color: #f0f0f0;
-            color: black;
-        }
-        QPushButton {
-            background-color: white;
-            color: black;
-            border: 1px solid gray;
-            border-radius: 4px;
-        }
-        QPushButton:hover {
-            background-color: #e0e0e0;
-        }
-    )");
-
-    QVBoxLayout* mainLayout = new QVBoxLayout(this);
-    QGridLayout* gridLayout = new QGridLayout();
-
-    // 初始化已选点集合
-    for (const auto& pt : selectedPts) {
-        selectedSet.insert({ pt.x, pt.y });
-    }
-
-    for (int r = 0; r < rows; ++r) {
-        for (int c = 0; c < cols; ++c) {
-            QPushButton* btn = new QPushButton(QString("%1,%2").arg(r).arg(c));
-            btn->setFixedSize(40, 30);
-
-            QPair<int, int> pos(r, c);
-            buttonMap[btn] = pos;
-
-            bool selected = selectedSet.contains(pos);
-            btn->setStyleSheet(selected ? "background-color: gray;" : "background-color: lightgreen;");
-
-            connect(btn, &QPushButton::clicked, this, [=]() {
-                if (selectedSet.contains(pos)) {
-                    selectedSet.remove(pos);
-                    btn->setStyleSheet("background-color: lightgreen;");
-                }
-                else {
-                    selectedSet.insert(pos);
-                    btn->setStyleSheet("background-color: gray;");
-                }
-                });
-
-            gridLayout->addWidget(btn, r, c);
-        }
-    }
-
-    mainLayout->addLayout(gridLayout);
-
-    // 底部按钮
-    QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
-    connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
-    connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
-    mainLayout->addWidget(buttons);
-}
-
-// 获取选中的点
-QVector<XY_LONG_STRUCT> NoBondPtEditDialog::getSelectedPoints() const {
-    QVector<XY_LONG_STRUCT> result;
-    for (const auto& pos : selectedSet) {
-        XY_LONG_STRUCT pt;
-        pt.x = pos.first;
-        pt.y = pos.second;
-        result.append(pt);
-    }
-    return result;
-}
-
-void NoBondPtEditDialog::mousePressEvent(QMouseEvent* event) {
-    if (event->button() == Qt::LeftButton || event->button() == Qt::RightButton) {
-        dragStart = event->pos();
-        dragButton = event->button();  // 记录当前拖动按钮
-
-        if (!rubberBand)
-            rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
-        rubberBand->setGeometry(QRect(dragStart, QSize()));
-        rubberBand->show();
-        isDragging = true;
-    }
-}
-
-
-void NoBondPtEditDialog::mouseMoveEvent(QMouseEvent* event) {
-    if (isDragging && rubberBand) {
-        rubberBand->setGeometry(QRect(dragStart, event->pos()).normalized());
-    }
-}
-
-void NoBondPtEditDialog::mouseReleaseEvent(QMouseEvent* event) {
-    if (!rubberBand || !isDragging || event->button() != dragButton) return;
-
-    rubberBand->hide();
-    QRect selectionRect = rubberBand->geometry();
-
-    for (auto it = buttonMap.begin(); it != buttonMap.end(); ++it) {
-        QPushButton* btn = it.key();
-        QPair<int, int> pos = it.value();
-
-        if (btn->geometry().intersects(selectionRect)) {
-            if (dragButton == Qt::LeftButton) {
-                // toggle:如果选中就取消,否则加入
-                if (selectedSet.contains(pos)) {
-                    selectedSet.remove(pos);
-                    btn->setStyleSheet("background-color: lightgreen;");
-                }
-                else {
-                    selectedSet.insert(pos);
-                    btn->setStyleSheet("background-color: gray;");
-                }
-            }
-            else if (dragButton == Qt::RightButton) {
-                // 强制取消
-                selectedSet.remove(pos);
-                btn->setStyleSheet("background-color: lightgreen;");
-            }
-        }
-    }
-
-    isDragging = false;
-    dragButton = Qt::NoButton;
-}
-

+ 6 - 32
View/die-bonder-ui/Src/WaferProgramPage.h

@@ -17,10 +17,7 @@
 #include <unordered_map>
 #include <QtWidgets/qcombobox.h>
 
-#include <QGridLayout>
-#include <QDialogButtonBox>
-#include <QMouseEvent>
-#include <QRubberBand>
+#include <View/die-bonder-ui/Src/MatrixDialogs/NoBondPtEditDialog.h>
 
 
 class WaferProgramPage : public QWidget {
@@ -29,8 +26,6 @@ class WaferProgramPage : public QWidget {
 public:
     explicit WaferProgramPage(QWidget* parent = nullptr);
 
-    static QWidget* CreateWaferProgramPage();
-
     QComboBox* createDieMatrixIdComboBox(int defaultId, int row);
 
 private slots:
@@ -48,34 +43,13 @@ private:
 
 
 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;
+    QTableWidget* m_MergedTable = nullptr;
+    CProduct* m_pCProduct = nullptr;
+    std::vector<PROGRAM_WAFER_MATRIX_STRUCT> m_vecWaferMatrix;
+    std::vector<PROGRAM_DIE_MATRIX_STRUCT> m_vecDieMatrixt;
 
-    static std::unordered_map<int, bool> idIsUsedMap;
+    static std::unordered_map<int, bool> m_IdIsUsedMap;
     bool m_isInitializing = false;
 };
 
-class NoBondPtEditDialog : public QDialog {
-    Q_OBJECT
-public:
-    NoBondPtEditDialog(int rows, int cols, const std::vector<XY_LONG_STRUCT>& selectedPts, QWidget* parent = nullptr);
-    QVector<XY_LONG_STRUCT> getSelectedPoints() const;
-
-protected:
-    void mousePressEvent(QMouseEvent* event) override;
-    void mouseMoveEvent(QMouseEvent* event) override;
-    void mouseReleaseEvent(QMouseEvent* event) override;
-
-private:
-    QSet<QPair<int, int>> selectedSet; 
-    Qt::MouseButton dragButton = Qt::NoButton;
-    QMap<QPushButton*, QPair<int, int>> buttonMap;
-    QRubberBand* rubberBand = nullptr;
-    QPoint dragStart;
-    bool isDragging = false;
-};
-
 #endif // WAFER_PROGRAM_PAGE_H

+ 49 - 0
View/die-bonder-ui/Src/WaffleProgramPage.cpp

@@ -4,6 +4,7 @@
 #include "Src/RewriteControl/Controls/SpinBox.h"
 #include "Src/RewriteControl/Controls/DoubleSpinBox.h"
 #include <QLabel>
+#include <View/die-bonder-ui/Src/MatrixDialogs/NoBondPtEditDialog.h>
 
 
 WaffleProgramPage::WaffleProgramPage(QWidget* parent)
@@ -143,6 +144,18 @@ void WaffleProgramPage::AddMatrixPage(int vectorIndex, PROGRAM_WAFFLE_MATRIX_STR
 
 	QLineEdit* lineEditNoBondPts = new QLineEdit(this);
 	lineEditNoBondPts->setObjectName(QString::fromUtf8("lineEditNoBondPts"));
+
+
+	lineEditNoBondPts->setReadOnly(true);
+	lineEditNoBondPts->setCursor(Qt::PointingHandCursor);
+	lineEditNoBondPts->setProperty("vectorIndex", vectorIndex);  // 存储索引
+	lineEditNoBondPts->installEventFilter(this);
+
+
+	/*connect(lineEditNoBondPts, &QLineEdit::selectionChanged, this, [=]() {
+		this->onNoBondPtsClicked(lineEditNoBondPts, vectorIndex);
+
+		});*/
 	subGridLayout->addWidget(lineEditNoBondPts, 7, 1, 1, 2);
 	vecControls.push_back(lineEditNoBondPts);
 
@@ -211,6 +224,35 @@ void WaffleProgramPage::AddMatrixPage(int vectorIndex, PROGRAM_WAFFLE_MATRIX_STR
 
 }
 
+bool WaffleProgramPage::eventFilter(QObject* obj, QEvent* event) {
+	if (event->type() == QEvent::MouseButtonPress) {
+		auto* lineEdit = qobject_cast<QLineEdit*>(obj);
+		if (lineEdit) {
+			int index = lineEdit->property("vectorIndex").toInt();
+			onNoBondPtsClicked(lineEdit, index);
+			return true; // 拦截事件
+		}
+	}
+	return QWidget::eventFilter(obj, event);
+}
+
+void WaffleProgramPage::onNoBondPtsClicked(QLineEdit* lineEdit, int index) {
+	if (index < 0 || index >= m_vecWaffleMatrix.size()) return;
+
+	const auto& waffle = m_vecWaffleMatrix[index];
+	NoBondPtEditDialog dlg(waffle.PackRow, waffle.PackCol, waffle.VecNoBondDie, this);
+
+	if (dlg.exec() == QDialog::Accepted) {
+		QVector<XY_LONG_STRUCT> selected = dlg.getSelectedPoints();
+		m_vecWaffleMatrix[index].VecNoBondDie = std::vector<XY_LONG_STRUCT>(selected.begin(), selected.end());
+
+		QStringList ptList;
+		for (const auto& pt : selected)
+			ptList << QString("(%1,%2)").arg(pt.x).arg(pt.y);
+		lineEdit->setText(ptList.join(" "));
+	}
+}
+
 void WaffleProgramPage::AddSubMatrixPage(int subVectorIndex, PROGRAM_DIE_MATRIX_STRUCT subMatrix, QGridLayout* layout)
 {
 	QVector<QObject*> vecControls;
@@ -306,6 +348,13 @@ void WaffleProgramPage::AddSubMatrixPage(int subVectorIndex, PROGRAM_DIE_MATRIX_
 
 	QLineEdit* lineEditNoBondPts = new QLineEdit(this);
 	lineEditNoBondPts->setObjectName(QString::fromUtf8("lineEditNoBondPts"));
+
+
+	lineEditNoBondPts->setReadOnly(true);
+	lineEditNoBondPts->setCursor(Qt::PointingHandCursor);
+	lineEditNoBondPts->setProperty("subVectorIndex", subVectorIndex);  // 存储索引
+	lineEditNoBondPts->installEventFilter(this);
+
 	subGridLayout->addWidget(lineEditNoBondPts, 7, 1, 1, 2);
 	vecControls.push_back(lineEditNoBondPts);
 

+ 5 - 0
View/die-bonder-ui/Src/WaffleProgramPage.h

@@ -34,6 +34,11 @@ private:
 
 	void initPage();
 
+	bool eventFilter(QObject* obj, QEvent* event) override;
+
+private slots:
+	void onNoBondPtsClicked(QLineEdit* lineEdit, int waffleIndex);
+
 private:
 	Ui::WaffleProgramPageClass ui;