项目启动只加载最新批次,其他

This commit is contained in:
chenchaohong 2024-12-06 16:23:15 +08:00
parent 9adfea89d3
commit 904e91a903
6 changed files with 318 additions and 324 deletions

View File

@ -43,7 +43,7 @@ DefectViewCustom::DefectViewCustom(QWidget* parent) {
}
void DefectViewCustom::load(QString filePath, int defectId, bool isValid, double x, double y, QString jobLayer, QPixmap& samplePxmp, int defectType, int rowHeight, bool containSample) {
void DefectViewCustom::load(QString filePath, int defectId, bool isValid, double x, double y, int defectType, int rowHeight, struct BoardDetail& boardDetail) {
this->setFixedHeight(rowHeight);
m_isValidBtn.setGeometry(this->geometry());
//加载扫描图
@ -54,10 +54,12 @@ void DefectViewCustom::load(QString filePath, int defectId, bool isValid, double
m_scanPxmpItem.setPixmap(*scanPxmp);
m_scanPxmpItem.setPos(0, 0);
if (containSample) {
if (boardDetail.hasCam) {
//加载参考图
double pixSize = 15.937359904903442;
double xx = x / pixSize;
QPixmap samplePxmp;
QPixmapCache::find(boardDetail.jobLayer, &samplePxmp);
double yy = samplePxmp.height() - y / pixSize;
QPixmap copy = samplePxmp.copy(QRect(xx - width / 2, yy - height / 2, width, height));
copy = copy.scaled(200, 200, Qt::KeepAspectRatio);

View File

@ -28,7 +28,7 @@ private:
public:
DefectViewCustom(QWidget* parent = nullptr);
void load(QString filePath, int defectId, bool isValid, double x, double y, QString jobLayer, QPixmap& samplePxmp, int defectType, int rowHeight, bool containSample);
void load(QString filePath, int defectId, bool isValid, double x, double y, int defectType, int rowHeight, struct BoardDetail& boardDetail);
void hideCam(int state);
void wheelEvent(QWheelEvent* e) override;
void mouseMoveEvent(QMouseEvent* event) override;

View File

@ -19,17 +19,23 @@
#include "QtConcurrent/qtconcurrentrun.h"
#include "QFutureWatcher"
#include "DefectViewCustom.h"
#include "QTimer"
#include <qstringlist.h>
PreVerifyWidget::PreVerifyWidget(QWidget* parent) {
QImageReader::setAllocationLimit(0);
QPixmapCache::setCacheLimit(8 * 1024 * 1024);
m_boardItemList = new QList<QTreeWidgetItem*>();
setUi();
setConnection();
readDefectTypesDesc();
load();
filter();
loadDate();
loadTreeWgt();
m_treeWgt.setExpandsOnDoubleClick(true);
m_treeWgt.setAutoExpandDelay(0);
m_showDefectCountCmb.setCurrentIndex(3);
showDefectCountCmbIndexChanged();
}
void PreVerifyWidget::setUi() {
@ -37,61 +43,19 @@ void PreVerifyWidget::setUi() {
m_lt.addLayout(&m_leftLt, 3);
m_lt.addLayout(&m_rightLt, 11);
labelY.setText("");
labelM.setText("");
labelD.setText("");
m_spinY.setMaximum(3000);
m_spinY.setFixedWidth(70);
m_spinY.setMinimum(1900);
m_spinY.setValue(QDate::currentDate().year());
m_spinM.setMaximum(12);
m_spinM.setMinimum(1);
m_spinM.setFixedWidth(40);
m_spinM.setValue(QDate::currentDate().month());
m_spinD.setMaximum(31);
m_spinD.setMinimum(1);
m_spinD.setFixedWidth(40);
m_spinD.setValue(QDate::currentDate().day());
m_dateLt.addWidget(&m_spinY);
m_dateLt.addWidget(&labelY);
m_dateLt.addWidget(&m_yearClearBtn);
m_dateLt.addWidget(&m_spinM);
m_dateLt.addWidget(&labelM);
m_dateLt.addWidget(&m_monthClearBtn);
m_dateLt.addWidget(&m_spinD);
m_dateLt.addWidget(&labelD);
m_dateLt.addWidget(&m_dateClearBtn);
label1.setText("批号:");
label11.setText("批号:");
label2.setText("板号:");
label3.setText("料号:");
label4.setText("层号:");
label1.setFixedWidth(30);
label11.setFixedWidth(30);
m_yearClearBtn.setFixedWidth(25);
m_monthClearBtn.setFixedWidth(25);
m_dateClearBtn.setFixedWidth(25);
//m_leftLt.addWidget(&label1, 0, 0);
//m_leftLt.addLayout(&m_dateLt, 0, 1, 1, 2);
m_leftLt.addWidget(&label11, 1, 0);
m_leftLt.addWidget(&m_dateCmb, 1, 1, 1, 2);
m_leftLt.addWidget(&label1, 1, 0);
m_leftLt.addWidget(&m_dateCmb, 1, 1, 1, 4);
m_leftLt.addWidget(&label2, 2, 0);
m_leftLt.addWidget(&m_boardIdEdt, 2, 1, 1, 2);
m_leftLt.addWidget(&m_boardIdEdt, 2, 1, 1, 4);
m_leftLt.addWidget(&label3, 3, 0);
m_leftLt.addWidget(&m_jobEdt, 3, 1, 1, 2);
m_leftLt.addWidget(&m_jobEdt, 3, 1, 1, 4);
m_leftLt.addWidget(&label4, 4, 0);
m_leftLt.addWidget(&m_layerEdt, 4, 1, 1, 2);
m_leftLt.addWidget(&m_treeWgt, 5, 0, 1, 3);
m_dateEdt.setCalendarPopup(true);
m_dateEdt.setDate(QDate::currentDate());
m_dateEdt.setDisplayFormat("yyyy-MM-dd");
m_yearClearBtn.setIcon(QIcon(":/res/ico/dateClear.png"));
m_monthClearBtn.setIcon(QIcon(":/res/ico/dateClear.png"));
m_dateClearBtn.setIcon(QIcon(":/res/ico/dateClear.png"));
m_leftLt.addWidget(&m_layerEdt, 4, 1, 1, 4);
m_leftLt.addWidget(&m_treeWgt, 5, 0, 1, 5);
m_pageBtnLt.addWidget(&m_lastBoardBtn);
m_pageBtnLt.addWidget(&m_lastDefectBtn);
@ -125,7 +89,6 @@ void PreVerifyWidget::setUi() {
m_showDefectCountCmb.addItem(" 1 x 3");
m_showDefectCountCmb.addItem(" 2 x 4");
m_showDefectCountCmb.addItem(" 2 x 5");
m_showDefectCountCmb.setCurrentIndex(3);
m_rightLt.addLayout(&m_pageBtnLt);
m_rightLt.addWidget(&m_grdScr);
@ -143,12 +106,11 @@ void PreVerifyWidget::setUi() {
m_grdLt.setAlignment(Qt::AlignLeft | Qt::AlignTop);
QStringList treeHeaders;
treeHeaders << "料号/层号" << "板号" << "A/B面" << "有效/总缺陷";
QStringList treeHeaders = { "料号/层号" , "板号" , "A/B面" , "有效/总缺陷" };
m_treeWgt.setIndentation(5);
m_treeWgt.setColumnCount(treeHeaders.size());
m_treeWgt.setHeaderLabels(treeHeaders);
m_treeWgt.setColumnWidth(0, 200);
m_treeWgt.setColumnWidth(0, 150);
m_treeWgt.setColumnWidth(1, 45);
m_treeWgt.setColumnWidth(2, 30);
m_treeWgt.setColumnWidth(3, 45);
@ -156,45 +118,7 @@ void PreVerifyWidget::setUi() {
}
void PreVerifyWidget::setConnection() {
QObject::connect(&m_yearClearBtn, &QPushButton::pressed, [=]() {
m_spinY.clear();
filter();
});
QObject::connect(&m_monthClearBtn, &QPushButton::pressed, [=]() {
m_spinM.clear();
filter();
});
QObject::connect(&m_dateClearBtn, &QPushButton::pressed, [=]() {
m_spinD.clear();
filter();
});
QObject::connect(&m_spinY, &QSpinBox::valueChanged, [=]() {
filter();
});
QObject::connect(&m_spinY, &QSpinBox::textChanged, [=]() {
filter();
});
QObject::connect(&m_spinY, &QSpinBox::editingFinished, [=]() {
filter();
});
QObject::connect(&m_spinM, &QSpinBox::valueChanged, [=]() {
filter();
});
QObject::connect(&m_spinM, &QSpinBox::textChanged, [=]() {
filter();
});
QObject::connect(&m_spinM, &QSpinBox::editingFinished, [=]() {
filter();
});
QObject::connect(&m_spinD, &QSpinBox::valueChanged, [=]() {
filter();
});
QObject::connect(&m_spinD, &QSpinBox::textChanged, [=]() {
filter();
});
QObject::connect(&m_spinD, &QSpinBox::editingFinished, [=]() {
filter();
});
QObject::connect(&m_dateCmb, &QComboBox::currentIndexChanged, this, &PreVerifyWidget::filter);
QObject::connect(&m_boardIdEdt, &QLineEdit::textChanged, [=]() {
filter();
});
@ -207,36 +131,32 @@ void PreVerifyWidget::setConnection() {
QObject::connect(&m_showCamChk, &QCheckBox::stateChanged, [=](int state) {
slot_treeWgtCurrentItemChanged(m_treeWgt.currentItem(), nullptr);
});
QObject::connect(&m_showDefectCountCmb, &QComboBox::currentIndexChanged, [=]() {
if (m_treeWgt.currentItem() != nullptr) {
slot_treeWgtCurrentItemChanged(m_treeWgt.currentItem(), nullptr);
}
});
QObject::connect(&m_dateCmb, &QComboBox::currentTextChanged, [=]() {
filter();
});
QObject::connect(&m_showDefectCountCmb, &QComboBox::currentIndexChanged, this, &PreVerifyWidget::showDefectCountCmbIndexChanged);
QObject::connect(&m_treeWgt, &QTreeWidget::currentItemChanged, this, &PreVerifyWidget::slot_treeWgtCurrentItemChanged);
QObject::connect(&m_lastBoardBtn, &QPushButton::pressed, this, &PreVerifyWidget::slot_lastBoardBtnPressed);
QObject::connect(&m_lastDefectBtn, &QPushButton::pressed, this, &PreVerifyWidget::slot_lastDefectBtnPressed);
QObject::connect(&m_nextBoardBtn, &QPushButton::pressed, this, &PreVerifyWidget::slot_nextBoardBtnPressed);
QObject::connect(&m_nextDefectBtn, &QPushButton::pressed, this, &PreVerifyWidget::slot_nextDefectBtnPressed);
QObject::connect(this, &PreVerifyWidget::sig_grdLtUpdate, this, &PreVerifyWidget::slot_grdLtUpdate);
QObject::connect(m_grdScr.verticalScrollBar(), &QScrollBar::valueChanged, [=](int value) {
if (m_grdLt.count() < m_boardDetail.sumCount) {
getDefectImg(m_limit, m_boardDetail.sumCount);
m_grdScr.verticalScrollBar()->setValue(m_grdScr.verticalScrollBar()->singleStep());
}
});
}
void PreVerifyWidget::loadDate() {
m_dateCmb.addItem("");
QString path = "D:/PCBDataset/Defect/fengming/AOI_DEFECT";
QDir rootDir(path);
QStringList dateList = rootDir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs, QDir::Time);
QStringList dateList = QDir(AOI_DEFECT).entryList(QDir::NoDotAndDotDot | QDir::AllDirs, QDir::Time);
for (QString date : dateList) {
m_dateCmb.addItem(date);
}
}
void PreVerifyWidget::showDefectCountCmbIndexChanged() {
int ix = m_showDefectCountCmb.currentIndex();
switch (ix) {
switch (m_showDefectCountCmb.currentIndex()) {
case 0:
m_rowCount = 1;
m_colCount = 2;
@ -260,125 +180,130 @@ void PreVerifyWidget::showDefectCountCmbIndexChanged() {
default:
break;
}
slot_treeWgtCurrentItemChanged(m_currentItem, m_currentItem);
}
void PreVerifyWidget::readDefectTypesDesc() {
JSONDocUtil::getInstance().readJSONDoc("D:/PCBDataset/GlobalSettings/defectTypeDescription.json", m_defectTypesDescJson);
JSONDocUtil::getInstance().readJSONDoc(DEFECTTYPEDESCRIPTION_JSON, m_defectTypesDescJson);
}
QString PreVerifyWidget::defectId2Desc(int defectId) {
return m_defectTypesDescJson.value(QString::number(defectId)).toObject().value("cn").toString();
}
void PreVerifyWidget::load() {
loadTreeWgt();
}
void PreVerifyWidget::loadTreeWgt() {
m_treeWgt.clear();
QString path = "D:/PCBDataset/Defect/fengming/AOI_DEFECT";
QJsonObject yearJson;
//创建文件夹Json对象
toJson(yearJson, path);
QJsonObject* yearJson = new QJsonObject();
getDateList(yearJson);
//创建文件夹树
for (QString yearKey : yearJson.keys()) {
bool firstLoadDateItem = false;
QBrush brush = QBrush(QColor("#C3FFC3"));
QStringList years = yearJson->keys();
std::reverse(years.begin(), years.end());
for (QString yearKey : years) {
QTreeWidgetItem* yearItem = new QTreeWidgetItem(&m_treeWgt);
yearItem->setText(0, yearKey);
yearItem->setExpanded(true);
QJsonObject monthJson = yearJson.value(yearKey).toObject();
for (QString monthKey : monthJson.keys()) {
QJsonObject monthJson = yearJson->value(yearKey).toObject();
QStringList months = monthJson.keys();
std::reverse(months.begin(),months.end());
for (QString monthKey : months) {
QTreeWidgetItem* monthItem = new QTreeWidgetItem(yearItem);
monthItem->setText(0, monthKey);
monthItem->setExpanded(true);
QJsonArray dateArr = monthJson.value(monthKey).toArray();
for (int i = 0; i < dateArr.size(); i++) {
QString dateKey = dateArr.at(i).toString();
QTreeWidgetItem* dateItem = new QTreeWidgetItem(monthItem);
dateItem->setText(0, dateKey);
dateItem->setExpanded(true);
m_boardItemList->push_back(dateItem);
//创建板数据
QString datePath = path + "/" + dateKey;
QDir datDir(datePath);
QStringList boardIdList = datDir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs);
for (QString boardId : boardIdList) {
bool isInt = true;
boardId.toInt(&isInt);
if (!isInt) {
continue;
}
QString boardIdPath = datePath + "/" + boardId;
for (char i = 'A'; i <= 'B'; i++) {
QTreeWidgetItem* item;
QString vrsPath = boardIdPath + "/" + i + ".vrs";
//备份
QFile file = QFile(vrsPath);
if (file.exists()) {
file.copy(boardIdPath + "/" + i + "I.vrs");
}
vrsPath = boardIdPath + "/" + i + "I.vrs";
//读数据
if (QFile(vrsPath).exists()) {
bool hasVerify = false;
item = new QTreeWidgetItem(dateItem);
QJsonObject obj;
JSONDocUtil::getInstance().readJSONDoc(vrsPath, obj);
QString job = obj.value("Job").toString();
QString layer = obj.value("Layer").toString();
int count = obj.value("Count").toInt();
item->setText(0, job + "/" + layer);
item->setText(1, boardId);
item->setText(2, vrsPath.mid(vrsPath.size() - 6, 1));
//读有效缺陷数
int validSum = getValid(obj , hasVerify);
item->setText(3, QString::number(validSum) + "/" + QString::number(count));
if (hasVerify) {
QBrush brush = QBrush(QColor("#C3FFC3"));
item->setBackground(0, brush);
item->setBackground(1, brush);
item->setBackground(2, brush);
item->setBackground(3, brush);
}
m_boardItemList.push_back(item);
}
}
if (!firstLoadDateItem) {
loadDateItem(dateItem);
firstLoadDateItem = true;
}
}
}
}
delete yearJson;
}
void PreVerifyWidget::toJson(QJsonObject& yearJson, QString& path) {
QDir rootDir(path);
void PreVerifyWidget::getBoardList(QString date, QList<BoardDetail*>* boardList) {
QString datePath = AOI_DEFECT + "/" + date;
QStringList boardIdList = QDir(datePath).entryList(QDir::NoDotAndDotDot | QDir::AllDirs);
for (QString boardId : boardIdList) {
bool isInt = true;
boardId.toInt(&isInt);
if (!isInt) {
continue;
}
QString boardIdPath = datePath + "/" + boardId;
for (char i = 'A'; i <= 'B'; i++) {
QString vrsPath = boardIdPath + "/" + i + ".vrs";
//备份
QFile file = QFile(vrsPath);
if (file.exists()) {
file.copy(boardIdPath + "/" + i + "I.vrs");
}
vrsPath = boardIdPath + "/" + i + "I.vrs";
//读数据
if (QFile(vrsPath).exists()) {
bool hasVerify = false;
BoardDetail* boardDetail = new BoardDetail();
QJsonObject obj;
JSONDocUtil::getInstance().readJSONDoc(vrsPath, obj);
QString job = obj.value("Job").toString();
QString layer = obj.value("Layer").toString();
int count = obj.value("Count").toInt();
boardDetail->jobLayer = job + "/" + layer;
boardDetail->boardId = boardId;
boardDetail->side = vrsPath.mid(vrsPath.size() - 6, 1);
//读有效缺陷数
int validSum = getValid(obj, hasVerify);
boardDetail->validSumCount = QString::number(validSum) + "/" + QString::number(count);
boardDetail->hasVerify = hasVerify;
boardList->push_back(boardDetail);
}
}
}
}
void PreVerifyWidget::getDateList(QJsonObject* yearJson) {
QDir rootDir(AOI_DEFECT);
QStringList dateList = rootDir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs, QDir::Time);
for (QString dateStr : dateList) {
QString yearStr = dateStr.mid(0, 4);
QString monthStr = dateStr.mid(0, 7);
if (!yearJson.contains(yearStr)) {
yearJson.insert(yearStr, QJsonObject());
if (!yearJson->contains(yearStr)) {
yearJson->insert(yearStr, QJsonObject());
}
QJsonObject monthJson = yearJson.value(yearStr).toObject();
QJsonObject monthJson = yearJson->value(yearStr).toObject();
if (!monthJson.contains(monthStr)) {
monthJson.insert(monthStr, QJsonObject());
yearJson.insert(yearStr, monthJson);
yearJson->insert(yearStr, monthJson);
}
QJsonArray dateArr = monthJson.value(monthStr).toArray();
dateArr.append(dateStr);
monthJson.insert(monthStr, dateArr);
yearJson.insert(yearStr, monthJson);
yearJson->insert(yearStr, monthJson);
}
}
@ -393,59 +318,103 @@ void PreVerifyWidget::clear() {
}
}
void PreVerifyWidget::slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous) {
//清理
clear();
void PreVerifyWidget::loadDateItem(QTreeWidgetItem* dateItem) {
if (dateItem->childCount() == 0) {
QList<BoardDetail*>* list = new QList<BoardDetail*>();
getBoardList(dateItem->text(0), list);
int index = m_boardItemList->indexOf(dateItem);
for (BoardDetail* boardDetail : *list) {
QTreeWidgetItem* item = new QTreeWidgetItem(dateItem);
item->setText(0, boardDetail->jobLayer);
item->setText(1, boardDetail->boardId);
item->setText(2, boardDetail->side);
item->setText(3, boardDetail->validSumCount);
if (boardDetail->hasVerify) {
QBrush brush = QBrush(QColor("#C3FFC3"));
item->setBackground(0, brush);
item->setBackground(1, brush);
item->setBackground(2, brush);
item->setBackground(3, brush);
}
m_boardItemList->insert(++index, item);
}
qDeleteAll(*list);
list->clear();
delete list;
if (current == nullptr || current->columnCount() == 1) {
return;
filter();
}
showDefectCountCmbIndexChanged();
//填充
QString dateStr = current->parent()->text(0);
QString jobLayer = current->text(0);
QString boardId = current->text(1);
QString ab = current->text(2);
int count = current->text(3).split("/").at(1).toInt();
m_dirPath = "D:/PCBDataset/Defect/fengming/AOI_DEFECT/" + dateStr + "/" + boardId + "/";
m_ab = ab;
m_curDefectLbl.setText(boardId + "" + ab + "" + current->text(3));
//缓存 Json
QString fileName = m_dirPath + m_ab + "I.vrs";
if (QFile(fileName).exists()) {
JSONDocUtil::getInstance().readJSONDoc(fileName, m_vrsJson);
}
QJsonArray arr = m_vrsJson.value("Defectx").toArray();
QString samplePath = "D:/PCBDataset/Reference/" + jobLayer + "/Learn/panel_image.png";
if (!QPixmapCache::find(jobLayer, &m_samplePxmp)) {
m_samplePxmp.load(samplePath, nullptr, Qt::NoFormatConversion);
QPixmapCache::insert(jobLayer, m_samplePxmp);
}
QList<DefectViewCustom*> defectItems;
collect(count, arr, jobLayer, defectItems);
int sum = 0;
for (DefectViewCustom* item : defectItems) {
m_grdLt.addWidget(item, sum / m_colCount, sum % m_colCount);
sum++;
}
m_grdScr.verticalScrollBar()->setSingleStep(m_grdScr.height());
m_grdScr.verticalScrollBar()->setSliderPosition(0);
this->setFocus();
}
void PreVerifyWidget::collect(int count, QJsonArray& arr,QString& jobLayer, QList<DefectViewCustom*>& defectItems) {
QPixmap px;
QPixmapCache::find(jobLayer, &px);
for (int i = 0; i < count; i++) {
void PreVerifyWidget::slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous) {
if (current == nullptr) {
return;
}
if (current->columnCount() == 1) {
switch (current->text(0).length()) {
case 7:
for (int i = 0; i < current->childCount(); i++) {
QTreeWidgetItem* dateItem = current->child(i);
loadDateItem(dateItem);
}
break;
case 10:
loadDateItem(current);
break;
default:
break;
}
}
else if (current->columnCount() > 1) {
if (m_boardDetail.boardId == current->text(1)
&& m_boardDetail.jobLayer == current->text(0)
&& m_boardDetail.date == current->parent()->text(0)
&& m_boardDetail.hasCam == m_showCamChk.isChecked()
&& m_boardDetail.showDefectCountCmbIndex == m_showDefectCountCmb.currentIndex()) {
return;
}
m_currentItem = current;
//取板信息
m_boardDetail.showDefectCountCmbIndex = m_showDefectCountCmb.currentIndex();
m_boardDetail.hasCam = m_showCamChk.isChecked();
m_boardDetail.date = current->parent()->text(0);
m_boardDetail.jobLayer = current->text(0);
m_boardDetail.boardId = current->text(1);
m_boardDetail.side = current->text(2);
m_boardDetail.validSumCount = current->text(3);
m_boardDetail.validCount = m_boardDetail.validSumCount.split("/").at(0).toInt();
m_boardDetail.sumCount = m_boardDetail.validSumCount.split("/").at(1).toInt();
m_boardDetail.dir = AOI_DEFECT + "/" + m_boardDetail.date + "/" + m_boardDetail.boardId + "/";
//读参考图
QString samplePath = "D:/PCBDataset/Reference/" + m_boardDetail.jobLayer + "/Learn/panel_image.png";
if (!QPixmapCache::find(m_boardDetail.jobLayer, &m_samplePxmp)) {
m_samplePxmp.load(samplePath, nullptr, Qt::NoFormatConversion);
QPixmapCache::insert(m_boardDetail.jobLayer, m_samplePxmp);
}
//读Json
QString fileName = m_boardDetail.dir + m_boardDetail.side + "I.vrs";
if (QFile(fileName).exists()) {
JSONDocUtil::getInstance().readJSONDoc(fileName, m_vrsJson);
}
//界面更新
clear();
m_curDefectLbl.setText(m_boardDetail.boardId + "" + m_boardDetail.side + "" + m_boardDetail.validSumCount);
int limit = std::min(m_limit, m_boardDetail.sumCount);
m_rowHeight = m_boardDetail.showDefectCountCmbIndex < 2 ? m_grdScr.height() - m_grdLt.spacing() : m_grdScr.height() / 2 - m_grdLt.spacing();
getDefectImg(0, limit);
}
}
void PreVerifyWidget::getDefectImg(int start,int end) {
QList<DefectViewCustom*> defectItems;
QJsonArray arr = m_vrsJson.value("Defectx").toArray();
for (int i = start; i < end; i++) {
int defectId = i + 1;
QString scanImgPath = m_dirPath + m_ab + QString::number(defectId) + ".jpg";
QString scanImgPath = m_boardDetail.dir + m_boardDetail.side + QString::number(defectId) + ".jpg";
if (!QFile(scanImgPath).exists()) {
continue;
}
@ -453,16 +422,12 @@ void PreVerifyWidget::collect(int count, QJsonArray& arr,QString& jobLayer, QLis
defectItem->m_preVerifyWgt = this;
defectItem->setParent(this);
QJsonObject obj = arr.at(i).toObject();
bool isValid = true;
if (obj.contains("AIresult") && obj.value("AIresult") == 0) {
isValid = false;
}
bool isValid = (obj.contains("AIresult") && obj.value("AIresult") == 0) ? false : true;
int defectType = obj.value("Code").toInt();
double x = obj.value("X").toDouble();
double y = obj.value("Y").toDouble();
bool containSample = m_showCamChk.isChecked();
defectItem->load(scanImgPath, defectId, isValid, x, y, jobLayer, px, defectType, m_rowHeight, containSample);
defectItem->load(scanImgPath, defectId, isValid, x, y, defectType, m_rowHeight, m_boardDetail);
switch (m_colCount) {
case 2:
defectItem->scale(1.8, 1.8);
@ -481,6 +446,15 @@ void PreVerifyWidget::collect(int count, QJsonArray& arr,QString& jobLayer, QLis
}
defectItems.push_back(defectItem);
}
int sum = start;
for (DefectViewCustom* item : defectItems) {
m_grdLt.addWidget(item, sum / m_colCount, sum % m_colCount);
sum++;
}
m_grdScr.verticalScrollBar()->setSingleStep(m_grdScr.height());
m_grdScr.verticalScrollBar()->setSliderPosition(0);
this->setFocus();
}
//1.添加 -1.删除
@ -501,7 +475,7 @@ void PreVerifyWidget::updateOne(QString defectId, int action) {
m_vrsJson.insert("Defectx", arr);
//写回
QString vrsPath = m_dirPath + m_ab + "I.vrs";
QString vrsPath = m_boardDetail.dir + m_boardDetail.side + "I.vrs";
JSONDocUtil::getInstance().writeJSONDoc(vrsPath, m_vrsJson);
bool hasVerify = true;
@ -531,28 +505,19 @@ int PreVerifyWidget::getValid(QJsonObject& obj, bool& hasVerify){
return validSum;
}
void PreVerifyWidget::filter() {
void PreVerifyWidget::filter(int index) {
QString boardId = m_boardIdEdt.text();
QString job = m_jobEdt.text();
QString layer = m_layerEdt.text();
//QString year = m_spinY.text();
//QString month = m_spinM.text();
//QString date = m_spinD.text();
QString year;
QString month;
QString date;
QString dd = m_dateCmb.currentText();
if (!dd.isEmpty()) {
QStringList ll = dd.split("-");
QString dateFull = m_dateCmb.currentText();
if (!dateFull.isEmpty()) {
QStringList ll = dateFull.split("-");
year = ll.at(0);
month = ll.at(1);
date = ll.at(2);
}
if (month.size() == 1) {
month = "0" + month;
}
if (date.size() == 1) {
date = "0" + date;
month = ll.at(1).size() == 1 ? "0" + ll.at(1) : ll.at(1);
date = ll.at(2).size() == 1 ? "0" + ll.at(2) : ll.at(2);
}
int count = m_treeWgt.topLevelItemCount();
@ -565,8 +530,9 @@ void PreVerifyWidget::filter() {
yearItem->setHidden(false);
int count2 = yearItem->childCount();
bool yearIsNull = true;
for (int j = 0; j < count2; j++) {
QTreeWidgetItem* monthItem = yearItem->child(j);
QTreeWidgetItem* monthItem = yearItem->child(j);//month
if (!month.isEmpty() && !monthItem->text(0).endsWith(month)) {
monthItem->setHidden(true);
}
@ -574,16 +540,21 @@ void PreVerifyWidget::filter() {
monthItem->setHidden(false);
int count3 = monthItem->childCount();
bool monthIsNull = true;
for (int k = 0; k < count3; k++) {
QTreeWidgetItem* dateItem = monthItem->child(k);
QTreeWidgetItem* dateItem = monthItem->child(k);//date
if (!date.isEmpty() && !dateItem->text(0).endsWith(date)) {
dateItem->setHidden(true);
}
else {
if (!date.isEmpty() && dateItem->text(0).endsWith(date)) {
loadDateItem(dateItem);//先加载
}
dateItem->setHidden(false);
bool dateIsNull = true;
for (int g = 0; g < dateItem->childCount(); g++) {
QTreeWidgetItem* boardItem = dateItem->child(g);
QTreeWidgetItem* boardItem = dateItem->child(g);//board
if(!boardId.isEmpty()){
if (boardItem->text(1).contains(boardId)) {
boardItem->setHidden(false);
@ -597,7 +568,7 @@ void PreVerifyWidget::filter() {
boardItem->setHidden(false);
}
if (!job.isEmpty()) {
if (boardItem->text(0).contains(job)) {
if (boardItem->text(0).contains(job) && boardItem->text(0).split("/")[0].contains(job)) {
boardItem->setHidden(false);
}
else {
@ -609,7 +580,7 @@ void PreVerifyWidget::filter() {
boardItem->setHidden(false);
}
if (!layer.isEmpty()) {
if (boardItem->text(0).contains(layer)) {
if (boardItem->text(0).contains(layer) && boardItem->text(0).split("/")[1].contains(layer)) {
boardItem->setHidden(false);
}
else {
@ -621,68 +592,85 @@ void PreVerifyWidget::filter() {
boardItem->setHidden(false);
}
if (!boardItem->isHidden()) {
dateIsNull = false;
monthIsNull = false;
yearIsNull = false;
if (!dateFull.isEmpty() && !boardItem->isHidden()) {
dateItem->setExpanded(true);
monthItem->setExpanded(true);
yearItem->setExpanded(true);
//dateIsNull = false;
//monthIsNull = false;
//yearIsNull = false;
}
}
if (dateIsNull) {
dateItem->setHidden(true);
}
//if (dateIsNull) {
// dateItem->setHidden(true);
//}
}
}
if (monthIsNull) {
monthItem->setHidden(true);
}
//if (monthIsNull) {
// monthItem->setHidden(true);
//}
}
}
if (yearIsNull) {
yearItem->setHidden(true);
}
//if (yearIsNull) {
// yearItem->setHidden(true);
//}
}
}
m_treeWgt.expandAll();
m_treeWgt.setCurrentItem(nullptr);
clear();
if (m_currentItem!=nullptr && m_currentItem->isHidden()) {
m_treeWgt.setCurrentItem(nullptr);
m_currentItem = nullptr;
m_boardDetail.clear();
clear();
}
}
void PreVerifyWidget::slot_lastBoardBtnPressed() {
QTreeWidgetItem* cur = m_treeWgt.currentItem();
QTreeWidgetItem* cur = m_currentItem;
if (cur == nullptr) {
return;
}
int ix = m_boardItemList.indexOf(cur);
int ix = m_boardItemList->indexOf(cur);
while (ix - 1 >= 0) {
QTreeWidgetItem* lastItem = m_boardItemList.at(ix - 1);
if (!lastItem->isHidden() && !lastItem->parent()->isHidden()
QTreeWidgetItem* lastItem = m_boardItemList->at(ix - 1);
ix--;
if (lastItem->columnCount() == 1) {
continue;
}
if (!lastItem->isHidden()
&& !lastItem->parent()->isHidden()
&& !lastItem->parent()->parent()->isHidden()
&& !lastItem->parent()->parent()->parent()->isHidden()) {
&& !lastItem->parent()->parent()->parent()->isHidden()
) {
m_treeWgt.setCurrentItem(lastItem);
slot_treeWgtCurrentItemChanged(lastItem, cur);
break;
}
ix--;
}
}
void PreVerifyWidget::slot_nextBoardBtnPressed() {
QTreeWidgetItem* cur = m_treeWgt.currentItem();
QTreeWidgetItem* cur = m_currentItem;
if (cur == nullptr) {
return;
}
int ix = m_boardItemList.indexOf(cur);
while (ix + 1 < m_boardItemList.size()) {
QTreeWidgetItem* nextItem = m_boardItemList.at(ix + 1);
if (!nextItem->isHidden() && !nextItem->parent()->isHidden()
int ix = m_boardItemList->indexOf(cur);
while (ix + 1 < m_boardItemList->size()) {
QTreeWidgetItem* nextItem = m_boardItemList->at(ix + 1);
ix++;
if (nextItem->columnCount() == 1) {
continue;
}
if (!nextItem->isHidden()
&& !nextItem->parent()->isHidden()
&& !nextItem->parent()->parent()->isHidden()
&& !nextItem->parent()->parent()->parent()->isHidden()) {
&& !nextItem->parent()->parent()->parent()->isHidden()
) {
m_treeWgt.setCurrentItem(nextItem);
slot_treeWgtCurrentItemChanged(nextItem, cur);
break;
}
ix++;
}
}
@ -690,6 +678,7 @@ void PreVerifyWidget::slot_lastDefectBtnPressed() {
if (m_treeWgt.currentItem() == nullptr) {
return;
}
QScrollBar* bar = m_grdScr.verticalScrollBar();
int sliderHeight = bar->singleStep();
int newPosition = bar->sliderPosition() - sliderHeight;
@ -718,6 +707,9 @@ void PreVerifyWidget::slot_nextDefectBtnPressed() {
if (m_treeWgt.currentItem() == nullptr) {
return;
}
if (m_grdLt.count() < m_boardDetail.sumCount) {
getDefectImg(m_limit, m_boardDetail.sumCount);
}
QScrollBar* bar = m_grdScr.verticalScrollBar();
int sliderHeight = bar->singleStep();
int newPosition = bar->sliderPosition() + sliderHeight;
@ -759,12 +751,4 @@ void PreVerifyWidget::keyPressEvent(QKeyEvent* event) {
//QWidget::keyPressEvent(event);
break;
}
}
void PreVerifyWidget::slot_winStateChangeEvent() {
slot_treeWgtCurrentItemChanged(m_treeWgt.currentItem(), nullptr);
}
void PreVerifyWidget::slot_grdLtUpdate() {
update();
}

View File

@ -18,6 +18,30 @@
#include "qmutex.h"
#include "logger.h"
struct BoardDetail {
QString date;
QString jobLayer;
QString boardId;
QString side;
QString validSumCount;
int validCount;
int sumCount;
bool hasVerify = false;
bool hasCam = true;
QString dir;
int showDefectCountCmbIndex;
void clear() {
date.clear();
jobLayer.clear();
boardId.clear();
side.clear();
validSumCount.clear();
validCount = 0;
sumCount = 0;
}
};
class DefectViewCustom;
class PreVerifyWidget : public QWidget {
Q_OBJECT
@ -27,22 +51,24 @@ public:
PreVerifyWidget(QWidget* parent = nullptr);
void setUi();
void setConnection();
void load();
void collect(int count, QJsonArray& arr, QString& jobLayer, QList<DefectViewCustom*>& defectItems);
void getDefectImg(int start, int end);
void updateOne(QString defectId, int action);
QString defectId2Desc(int defectId);
void filter();
void filter(int index = 0);
void showDefectCountCmbIndexChanged();
void keyPressEvent(QKeyEvent* event) override;
private:
const QString AOI_DEFECT = "D:/PCBDataset/Defect/fengming/AOI_DEFECT";
const QString DEFECTTYPEDESCRIPTION_JSON = "D:/PCBDataset/GlobalSettings/defectTypeDescription.json";
void loadTreeWgt();
int getValid(QJsonObject& obj, bool& hasVerify);
void toJson(QJsonObject& yearJson, QString& path);
void getDateList(QJsonObject* yearJson);
void readDefectTypesDesc();
void clear();
void loadDate();
void getBoardList(QString date, QList<BoardDetail*>* boardList);
void loadDateItem(QTreeWidgetItem* dateItem);
QHBoxLayout m_lt;
QGridLayout m_leftLt;
@ -53,27 +79,13 @@ private:
QGridLayout m_grdLt;
QLabel label1;
QLabel label11;
QLabel label2;
QLabel label3;
QLabel label4;
QDateEdit m_dateEdt;
QPushButton m_yearClearBtn;
QPushButton m_monthClearBtn;
QPushButton m_dateClearBtn;
QComboBox m_dateCmb;
QLineEdit m_boardIdEdt;
QLineEdit m_jobEdt;
QLineEdit m_layerEdt;
QLabel labelY;
QLabel labelM;
QLabel labelD;
QSpinBox m_spinY;
QSpinBox m_spinM;
QSpinBox m_spinD;
QHBoxLayout m_dateLt;
QComboBox m_dateCmb;
QHBoxLayout m_pageBtnLt;
QPushButton m_lastBoardBtn;
@ -85,20 +97,18 @@ private:
QLabel m_showDefectCountLbl;
QComboBox m_showDefectCountCmb;
QString m_dirPath;
QJsonObject m_vrsJson;
QStringList m_removeList;
QString m_ab;
QJsonObject m_defectTypesDescJson;
QPixmap m_samplePxmp;
int m_rowCount = 2;
int m_colCount = 5;
int m_rowHeight = -1;
QList<QTreeWidgetItem*> m_boardItemList;
QList<QTreeWidgetItem*>* m_boardItemList = nullptr;
BoardDetail m_boardDetail;
QTreeWidgetItem* m_currentItem = nullptr;
int m_limit = 120;
signals:
void sig_grdLtUpdate();
public slots:
void slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous);
@ -106,8 +116,6 @@ public slots:
void slot_lastDefectBtnPressed();
void slot_nextBoardBtnPressed();
void slot_nextDefectBtnPressed();
void slot_winStateChangeEvent();
void slot_grdLtUpdate();
};

View File

@ -18,9 +18,9 @@ LONG WINAPI exceptionCallback(struct _EXCEPTION_POINTERS* exceptionInfo);
int main(int argc, char* argv[]) {
QApplication a(argc, argv);
SetUnhandledExceptionFilter(exceptionCallback);
//SetUnhandledExceptionFilter(exceptionCallback);
QThreadPool::globalInstance()->setMaxThreadCount(15);
//QThreadPool::globalInstance()->setMaxThreadCount(15);
MainWidget* mainWidget = new MainWidget();

0
README.txt Normal file
View File