WaferProgramPage.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. #include "WaferProgramPage.h"
  2. std::unordered_map<int, bool> WaferProgramPage::idIsUsedMap;
  3. WaferProgramPage::WaferProgramPage(QWidget* parent)
  4. : QWidget(parent)
  5. {
  6. QVBoxLayout* mainLayout = new QVBoxLayout(this);
  7. m_pCProduct = CManageDB::GetInstance()->GetCProduct();
  8. // 从数据库中加载数据
  9. m_pCProduct->LoadDataByDB();
  10. // 创建表格
  11. mergedTable = new QTableWidget(this);
  12. mergedTable->setColumnCount(11); // 11 列,包含 Matrix 和 DieMatrix 的所有字段
  13. mergedTable->setHorizontalHeaderLabels({
  14. "MatrixID", "MatrixRow", "MatrixCol", "LeftTopPoint_Y", "LeftTopPoint_X",
  15. "RightTopPoint_X", "RightTopPoint_Y", "RightBottomPoint_X", "RightBottomPoint_Y",
  16. "DieMatrixId", "NoBondPt"
  17. });
  18. mergedTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
  19. // 创建按钮布局
  20. QHBoxLayout* buttonLayout = new QHBoxLayout();
  21. QPushButton* addRowButton = new QPushButton("Add", this);
  22. QPushButton* deleteRowButton = new QPushButton("Delete", this);
  23. QPushButton* updateButton = new QPushButton("Update", this);
  24. buttonLayout->addWidget(addRowButton);
  25. buttonLayout->addWidget(deleteRowButton);
  26. buttonLayout->addWidget(updateButton);
  27. QString buttonStyle = R"(
  28. QPushButton {
  29. background-color: #f0f0f0;
  30. border: 1px solid #b0b0b0;
  31. border-radius: 4px;
  32. padding: 4px 12px;
  33. }
  34. QPushButton:hover {
  35. background-color: #e0e0ff;
  36. }
  37. QPushButton:pressed {
  38. background-color: #d0d0ff;
  39. }
  40. )";
  41. addRowButton->setStyleSheet(buttonStyle);
  42. deleteRowButton->setStyleSheet(buttonStyle);
  43. updateButton->setStyleSheet(buttonStyle);
  44. // 将控件添加到布局
  45. mainLayout->addWidget(mergedTable);
  46. mainLayout->addLayout(buttonLayout);
  47. setLayout(mainLayout);
  48. // 连接按钮和槽
  49. connect(addRowButton, &QPushButton::clicked, this, &WaferProgramPage::addRow);
  50. connect(deleteRowButton, &QPushButton::clicked, this, &WaferProgramPage::deleteRow);
  51. connect(updateButton, &QPushButton::clicked, this, &WaferProgramPage::updateData);
  52. connect(mergedTable, &QTableWidget::cellChanged, this, &WaferProgramPage::onCellChanged);
  53. connect(mergedTable, &QTableWidget::cellDoubleClicked, this, [=](int row, int column) {
  54. if (column == 9) {
  55. QComboBox* comboBox = createDieMatrixIdComboBox(m_VecWaferMatrix[row].iDieMatrixId, row);
  56. mergedTable->setCellWidget(row, column, comboBox);
  57. comboBox->showPopup(); // 可选:自动展开下拉
  58. // 记录初始值(以防没有变化)
  59. int originalValue = comboBox->currentData().toInt();
  60. // 1. 用户选择后立即还原
  61. connect(comboBox, QOverload<int>::of(&QComboBox::activated), this, [=](int index) {
  62. int selectedId = comboBox->itemData(index).toInt();
  63. m_VecWaferMatrix[row].iDieMatrixId = selectedId;
  64. mergedTable->removeCellWidget(row, column);
  65. mergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
  66. });
  67. // 2. 用户没有选中,仅点击其他地方,触发还原
  68. connect(comboBox, &QComboBox::hidePopup, this, [=]() {
  69. // 如果还在表格里,就还原(防止重复)
  70. if (mergedTable->cellWidget(row, column) == comboBox) {
  71. int selectedId = comboBox->currentData().toInt();
  72. m_VecWaferMatrix[row].iDieMatrixId = selectedId;
  73. mergedTable->removeCellWidget(row, column);
  74. mergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
  75. }
  76. });
  77. }
  78. });
  79. // 初始化表格数据
  80. initMergedData();
  81. }
  82. //QWidget* WaferProgramPage::CreateWaferProgramPage(const CONFIG_BASE_STRUCT& control) {
  83. // return new WaferProgramPage();
  84. //}
  85. //创建下拉列表
  86. QComboBox* WaferProgramPage::createDieMatrixIdComboBox(int defaultId, int row) {
  87. QComboBox* comboBox = new QComboBox(mergedTable);
  88. for (const auto& dieMatrix : m_VecDieMatrixt) {
  89. /*comboBox->addItem(
  90. QString("%1 - %2").arg(dieMatrix.MatrixId).arg(QString::fromStdString(dieMatrix.strModuleName)),
  91. QVariant(dieMatrix.MatrixId)
  92. );*/
  93. comboBox->addItem(QString::number(dieMatrix.MatrixId), QVariant(dieMatrix.MatrixId));
  94. }
  95. int index = comboBox->findData(defaultId);
  96. if (index >= 0)
  97. comboBox->setCurrentIndex(index);
  98. return comboBox;
  99. }
  100. void WaferProgramPage::initMergedData() {
  101. m_isInitializing = true;
  102. SqlOperation& sqlOp = SqlOperation::GetInstance();
  103. QList<QJsonObject> directories;
  104. int userPrivilege = 0;//?
  105. sqlOp.GetDirectories("Dir_Programme", userPrivilege, directories); // 使用相应的表名和权限加载目录
  106. m_VecWaferMatrix = m_pCProduct->GetWaferMatrix();
  107. for (const PROGRAM_WAFER_MATRIX_STRUCT& wafer : m_VecWaferMatrix) {
  108. int row = mergedTable->rowCount();
  109. mergedTable->insertRow(row);
  110. PROGRAM_DIE_MATRIX_STRUCT stDieMatrix;
  111. m_pCProduct->GetDieMatrix(wafer.MatrixId, stDieMatrix);
  112. m_VecDieMatrixt.push_back(stDieMatrix);
  113. // 填充表格数据
  114. mergedTable->setItem(row, 0, new QTableWidgetItem(QString::number(wafer.MatrixId))); // MatrixID
  115. mergedTable->setItem(row, 1, new QTableWidgetItem(QString::number(wafer.MatrixRow))); // MatrixRow
  116. mergedTable->setItem(row, 2, new QTableWidgetItem(QString::number(wafer.MatrixCol))); // MatrixCol
  117. mergedTable->setItem(row, 3, new QTableWidgetItem(QString::number(wafer.LeftTopPoint.y))); // LeftTopPoint_Y
  118. mergedTable->setItem(row, 4, new QTableWidgetItem(QString::number(wafer.LeftTopPoint.x))); // LeftTopPoint_X
  119. mergedTable->setItem(row, 5, new QTableWidgetItem(QString::number(wafer.RightTopPoint.x))); // RightTopPoint_X
  120. mergedTable->setItem(row, 6, new QTableWidgetItem(QString::number(wafer.RightTopPoint.y))); // RightTopPoint_Y
  121. mergedTable->setItem(row, 7, new QTableWidgetItem(QString::number(wafer.RightBottomPoint.x))); // RightBottomPoint_X
  122. mergedTable->setItem(row, 8, new QTableWidgetItem(QString::number(wafer.RightBottomPoint.y))); // RightBottomPoint_Y
  123. mergedTable->setItem(row, 9, new QTableWidgetItem(QString::number(wafer.iDieMatrixId))); // DieMatrixId
  124. // 填充 NoBondPt 数据
  125. QStringList noBondPts;
  126. for (const XY_LONG_STRUCT& pt : wafer.VecNoBondPt) {
  127. noBondPts.append(QString("(%1,%2)").arg(pt.x).arg(pt.y));
  128. }
  129. mergedTable->setItem(row, 10, new QTableWidgetItem(noBondPts.join(" "))); // NoBondPt
  130. }
  131. // 调整列宽和行高
  132. mergedTable->resizeColumnsToContents();
  133. mergedTable->resizeRowsToContents();
  134. m_isInitializing = false;// 开启信号处理
  135. }
  136. void WaferProgramPage::addRow() {
  137. m_isInitializing = true;
  138. idIsUsedMap.clear();
  139. for (const auto& wafer : m_VecWaferMatrix) {
  140. idIsUsedMap[wafer.MatrixId] = true;
  141. }
  142. int row = mergedTable->rowCount();
  143. mergedTable->insertRow(row);
  144. int newId = 1;
  145. bool idUsed = true;
  146. //// 检查当前 MatrixId 是否已存在
  147. //while (idUsed) {
  148. // idUsed = false; // 假设 ID 没有被使用
  149. // // 如果 ID 已存在于 map 中,则说明已被使用
  150. // if (idIsUsedMap.find(newId) != idIsUsedMap.end()) {
  151. // idUsed = true;
  152. // }
  153. // if (idUsed) {
  154. // ++newId; // 如果 ID 被使用,检查下一个 ID
  155. // }
  156. //}
  157. //找出最大的ID值
  158. UINT maxId = 0;
  159. for (PROGRAM_WAFER_MATRIX_STRUCT& bondMatrix : m_VecWaferMatrix)
  160. {
  161. if (bondMatrix.MatrixId > maxId)
  162. {
  163. maxId = bondMatrix.MatrixId;
  164. }
  165. }
  166. newId = ++maxId;
  167. // 为新行添加默认数据
  168. mergedTable->setItem(row, 0, new QTableWidgetItem(QString::number(newId))); // MatrixID 默认值为 0
  169. mergedTable->setItem(row, 1, new QTableWidgetItem("1")); // MatrixRow 默认值为 1
  170. mergedTable->setItem(row, 2, new QTableWidgetItem("1")); // MatrixCol 默认值为 1
  171. mergedTable->setItem(row, 3, new QTableWidgetItem("0")); // LeftTopPoint_Y 默认值为 0
  172. mergedTable->setItem(row, 4, new QTableWidgetItem("0")); // LeftTopPoint_X 默认值为 0
  173. mergedTable->setItem(row, 5, new QTableWidgetItem("0")); // RightTopPoint_X 默认值为 0
  174. mergedTable->setItem(row, 6, new QTableWidgetItem("0")); // RightTopPoint_Y 默认值为 0
  175. mergedTable->setItem(row, 7, new QTableWidgetItem("0")); // RightBottomPoint_X 默认值为 0
  176. mergedTable->setItem(row, 8, new QTableWidgetItem("0")); // RightBottomPoint_Y 默认值为 0
  177. mergedTable->setItem(row, 9, new QTableWidgetItem("0")); // DieMatrixId 默认值为 0
  178. /*QComboBox* comboBox = createDieMatrixIdComboBox(0, row);
  179. mergedTable->setCellWidget(row, 9, comboBox);*/
  180. mergedTable->setItem(row, 10, new QTableWidgetItem("")); // NoBondPt 默认值为空
  181. // 同时更新 PROGRAM_WAFER_MATRIX_STRUCT 数据
  182. PROGRAM_WAFER_MATRIX_STRUCT newMatrix;
  183. newMatrix.MatrixId = newId;
  184. newMatrix.MatrixRow = 1;
  185. newMatrix.MatrixCol = 1;
  186. newMatrix.LeftTopPoint = { 0.0, 0.0 };
  187. newMatrix.RightTopPoint = { 0.0, 0.0 };
  188. newMatrix.RightBottomPoint = { 0.0, 0.0 };
  189. newMatrix.iDieMatrixId = 0;
  190. newMatrix.VecNoBondPt.clear(); // 默认值为空
  191. m_VecWaferMatrix.push_back(newMatrix);
  192. // 将新矩阵添加到数据结构中
  193. //m_pCProduct->AddWaferMatrix(newMatrix, newId);
  194. m_isInitializing = false;
  195. }
  196. void WaferProgramPage::deleteRow() {
  197. int currentRow = mergedTable->currentRow();
  198. if (currentRow >= 0 && currentRow < mergedTable->rowCount()) {
  199. // 获取 MatrixID(假设第0列是 MatrixID)
  200. QTableWidgetItem* idItem = mergedTable->item(currentRow, 0);
  201. if (!idItem) return;
  202. int matrixID = idItem->text().toInt();
  203. // 从 mergedTable 删除行
  204. mergedTable->removeRow(currentRow);
  205. // 从 m_VecWaferMatrix 中移除对应项
  206. auto it = std::remove_if(m_VecWaferMatrix.begin(), m_VecWaferMatrix.end(),
  207. [matrixID](const PROGRAM_WAFER_MATRIX_STRUCT& wafer) {
  208. return wafer.MatrixId == matrixID;
  209. });
  210. if (it != m_VecWaferMatrix.end()) {
  211. m_VecWaferMatrix.erase(it, m_VecWaferMatrix.end());
  212. }
  213. // 同时通知数据管理类删除
  214. //m_pCProduct->DeleteWaferMatrix(matrixID);
  215. }
  216. else {
  217. //QMessageBox::warning(this, "No Row Selected", "Please select a row to delete.");
  218. QMessageBox box(QMessageBox::Warning, "No Row Selected", "Please select a row to delete.");
  219. box.setStyleSheet(R"(
  220. QMessageBox {
  221. background-color: #eeeeee;
  222. color: black;
  223. }
  224. QPushButton {
  225. background-color: #dddddd;
  226. color: black;
  227. }
  228. )");
  229. box.exec();
  230. }
  231. currentRow = -1;
  232. }
  233. void WaferProgramPage::updateData() {
  234. // 1. 清空原模型中的矩阵
  235. auto originalData = m_pCProduct->GetWaferMatrix();
  236. for (const auto& matrix : originalData) {
  237. m_pCProduct->DeleteWaferMatrix(matrix.MatrixId);
  238. }
  239. // 2. 添加当前表格中的数据
  240. for (auto& matrix : m_VecWaferMatrix) {
  241. int newId = matrix.MatrixId;
  242. m_pCProduct->AddWaferMatrix(matrix, newId);
  243. auto originalData1 = m_pCProduct->GetWaferMatrix();
  244. }
  245. //qDebug() << "WaferMatrix 已同步到模型层,共同步:" << m_VecWaferMatrix.size() << "条记录。";
  246. }
  247. void WaferProgramPage::onCellChanged(int row, int column)
  248. {
  249. if (m_isInitializing) return; // 防止初始化时触发
  250. if (row >= m_VecWaferMatrix.size()) return;
  251. QTableWidgetItem* item = mergedTable->item(row, column);
  252. if (!item) return;
  253. QString value = item->text();
  254. PROGRAM_WAFER_MATRIX_STRUCT& wafer = m_VecWaferMatrix[row];
  255. switch (column) {
  256. case 0: wafer.MatrixId = value.toInt(); break;
  257. case 1: wafer.MatrixRow = value.toInt(); break;
  258. case 2: wafer.MatrixCol = value.toInt(); break;
  259. case 3: wafer.LeftTopPoint.y = value.toDouble(); break;
  260. case 4: wafer.LeftTopPoint.x = value.toDouble(); break;
  261. case 5: wafer.RightTopPoint.x = value.toDouble(); break;
  262. case 6: wafer.RightTopPoint.y = value.toDouble(); break;
  263. case 7: wafer.RightBottomPoint.x = value.toDouble(); break;
  264. case 8: wafer.RightBottomPoint.y = value.toDouble(); break;
  265. ////case 9: wafer.iDieMatrixId = value.toInt(); break;
  266. case 10: {
  267. wafer.VecNoBondPt.clear();
  268. QRegularExpression regex(R"(\((\d+),(\d+)\))");
  269. QRegularExpressionMatchIterator i = regex.globalMatch(value);
  270. while (i.hasNext()) {
  271. auto match = i.next();
  272. XY_LONG_STRUCT pt;
  273. pt.x = match.captured(1).toInt();
  274. pt.y = match.captured(2).toInt();
  275. wafer.VecNoBondPt.push_back(pt);
  276. }
  277. break;
  278. }
  279. default: break;
  280. }
  281. }