单进程运行,批次倒序,列表展示加速,其他优化

This commit is contained in:
chenchaohong 2024-12-03 20:44:27 +08:00
parent e45851d2b3
commit 9adfea89d3
10 changed files with 103 additions and 50 deletions

View File

@ -15,17 +15,17 @@
#include "qpixmapcache.h"
#include "JSONDocUtil.h"
#include <opencv2/opencv.hpp>
#include "PreVerifyWidget.h"
DefectViewCustom::DefectViewCustom(QWidget* parent) {
QImageReader::setAllocationLimit(0);
setParent(parent);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
setRenderHint(QPainter::Antialiasing);
setDragMode(QGraphicsView::RubberBandDrag);
setDragMode(QGraphicsView::ScrollHandDrag);
setFrameShape(QFrame::NoFrame);
m_scene.setBackgroundBrush(QBrush(QColor(Qt::white)));

View File

@ -9,12 +9,11 @@
#include "logger.h"
#include "QPushButton"
#include "QLabel"
#include "PreVerifyWidget.h"
#include <opencv2/opencv.hpp>
class PreVerifyWidget;
class DefectViewCustom : public QGraphicsView {
Q_OBJECT
LOG4QT_DECLARE_QCLASS_LOGGER

Binary file not shown.

View File

@ -1,15 +1,22 @@
#include "MainWidget.h"
#include "QFont"
#include "qmessagebox.h"
MainWidget::MainWidget(QWidget* parent) {
setUi();
setConnection();
m_sharedMemory.setKey("PreVerify.exe");
if (m_sharedMemory.attach()) {
QMessageBox::warning(this, "警告", "PreVerify.exe正在运行请勿重复启动", QMessageBox::Ok);
exit(-1);
}
else {
m_sharedMemory.create(1);
}
MainWidget::~MainWidget() {
delete this;
setUi();
setConnection();
}
void MainWidget::setUi() {
@ -54,7 +61,7 @@ void MainWidget::setUi() {
void MainWidget::setConnection() {
QObject::connect(&m_preVerifyBtn, &QPushButton::pressed, this, &MainWidget::slot_preVerifyBtnPressed);
QObject::connect(&m_paramSettingBtn, &QPushButton::pressed, this, &MainWidget::slot_paramSettingBtnPressed);
QObject::connect(this, &MainWidget::sig_winStateChangeEvent, &m_preVerifyWgt, &PreVerifyWidget::slot_winStateChangeEvent);
//QObject::connect(this, &MainWidget::sig_winStateChangeEvent, &m_preVerifyWgt, &PreVerifyWidget::slot_winStateChangeEvent);
}
void MainWidget::load() {

View File

@ -8,6 +8,7 @@
#include "PreVerifyWidget.h"
#include "qbuttongroup.h"
#include "QEvent"
#include "qsharedmemory.h"
@ -16,7 +17,6 @@ class MainWidget : public QMainWindow {
public:
MainWidget(QWidget* parent = nullptr);
~MainWidget();
void setUi();
void setConnection();
void load();
@ -36,6 +36,7 @@ private:
PreVerifyWidget m_preVerifyWgt;
QWidget m_paramSettingWgt;
QButtonGroup m_menuGrp;
QSharedMemory m_sharedMemory;
public:
void changeEvent(QEvent* event) override;

View File

@ -166,7 +166,7 @@
<QtMoc Include="JSONDocUtil.h" />
<QtMoc Include="JSONUtil.h" />
<QtMoc Include="DefectViewCustom.h" />
<ClInclude Include="PreVerifyWidget.h" />
<QtMoc Include="PreVerifyWidget.h" />
</ItemGroup>
<ItemGroup>
<QtRcc Include="PreVerify.qrc" />

View File

@ -16,6 +16,9 @@
<Filter Include="utils">
<UniqueIdentifier>{7630d594-8c7c-4b8e-b52e-948aa2bbc118}</UniqueIdentifier>
</Filter>
<Filter Include="customComponent">
<UniqueIdentifier>{3f54e682-abaa-4fc8-b627-2d43d4b38d7f}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="MainWidget.cpp">
@ -31,8 +34,12 @@
<ClCompile Include="JSONUtil.cpp">
<Filter>utils</Filter>
</ClCompile>
<ClCompile Include="DefectViewCustom.cpp" />
<ClCompile Include="ScrollAreaCustom.cpp" />
<ClCompile Include="DefectViewCustom.cpp">
<Filter>customComponent</Filter>
</ClCompile>
<ClCompile Include="ScrollAreaCustom.cpp">
<Filter>customComponent</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<QtMoc Include="MainWidget.h">
@ -44,7 +51,10 @@
<QtMoc Include="JSONUtil.h">
<Filter>utils</Filter>
</QtMoc>
<QtMoc Include="DefectViewCustom.h" />
<QtMoc Include="PreVerifyWidget.h" />
<QtMoc Include="DefectViewCustom.h">
<Filter>customComponent</Filter>
</QtMoc>
</ItemGroup>
<ItemGroup>
<None Include="PreVerify.yml">
@ -54,11 +64,12 @@
<Filter>main</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ClInclude Include="PreVerifyWidget.h" />
<ClInclude Include="ScrollAreaCustom.h" />
</ItemGroup>
<ItemGroup>
<QtRcc Include="PreVerify.qrc" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="ScrollAreaCustom.h">
<Filter>customComponent</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -16,10 +16,13 @@
#include "qpixmapcache.h"
#include "QSpacerItem"
#include "qmessagebox.h"
#include "resource.h"
#include "QtConcurrent/qtconcurrentrun.h"
#include "QFutureWatcher"
#include "DefectViewCustom.h"
PreVerifyWidget::PreVerifyWidget(QWidget* parent) {
QImageReader::setAllocationLimit(0);
QPixmapCache::setCacheLimit(8 * 1024 * 1024);
setUi();
setConnection();
@ -29,10 +32,6 @@ PreVerifyWidget::PreVerifyWidget(QWidget* parent) {
loadDate();
}
PreVerifyWidget::~PreVerifyWidget() {
delete this;
}
void PreVerifyWidget::setUi() {
setLayout(&m_lt);
m_lt.addLayout(&m_leftLt, 3);
@ -149,7 +148,10 @@ void PreVerifyWidget::setUi() {
m_treeWgt.setIndentation(5);
m_treeWgt.setColumnCount(treeHeaders.size());
m_treeWgt.setHeaderLabels(treeHeaders);
m_treeWgt.header()->setSectionResizeMode(QHeaderView::ResizeToContents);
m_treeWgt.setColumnWidth(0, 200);
m_treeWgt.setColumnWidth(1, 45);
m_treeWgt.setColumnWidth(2, 30);
m_treeWgt.setColumnWidth(3, 45);
m_treeWgt.setSelectionMode(QAbstractItemView::SingleSelection);
}
@ -218,12 +220,12 @@ void PreVerifyWidget::setConnection() {
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);
}
void PreVerifyWidget::loadDate() {
m_dateCmb.addItem("");
QString path = "D:/PCBDataset/Defect/fengming/AOI_DEFECT";
QJsonObject yearJson;
QDir rootDir(path);
QStringList dateList = rootDir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs, QDir::Time);
@ -281,6 +283,7 @@ void PreVerifyWidget::loadTreeWgt() {
//创建文件夹Json对象
toJson(yearJson, path);
//创建文件夹树
for (QString yearKey : yearJson.keys()) {
QTreeWidgetItem* yearItem = new QTreeWidgetItem(&m_treeWgt);
@ -417,7 +420,35 @@ void PreVerifyWidget::slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, Q
}
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++) {
int defectId = i + 1;
QString scanImgPath = m_dirPath + m_ab + QString::number(defectId) + ".jpg";
if (!QFile(scanImgPath).exists()) {
continue;
}
DefectViewCustom* defectItem = new DefectViewCustom();
defectItem->m_preVerifyWgt = this;
defectItem->setParent(this);
@ -426,37 +457,30 @@ void PreVerifyWidget::slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, Q
if (obj.contains("AIresult") && obj.value("AIresult") == 0) {
isValid = false;
}
int defectId = i + 1;
int defectType = obj.value("Code").toDouble();
int defectType = obj.value("Code").toInt();
double x = obj.value("X").toDouble();
double y = obj.value("Y").toDouble();
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);
}
bool containSample = m_showCamChk.isChecked();
defectItem->load(m_dirPath + m_ab + QString::number(defectId) + ".jpg", defectId, isValid, x, y, jobLayer, m_samplePxmp, defectType, m_rowHeight, containSample);
if (m_colCount == 2) {
defectItem->load(scanImgPath, defectId, isValid, x, y, jobLayer, px, defectType, m_rowHeight, containSample);
switch (m_colCount) {
case 2:
defectItem->scale(1.8, 1.8);
}
else if (m_colCount == 3) {
break;
case 3:
defectItem->scale(1.6, 1.6);
}
else if (m_colCount == 4) {
break;
case 4:
defectItem->scale(0.9, 0.9);
}
else if (m_colCount == 5) {
break;
case 5:
defectItem->scale(0.9, 0.9);
break;
default:
break;
}
m_grdLt.addWidget(defectItem, i / m_colCount, i % m_colCount);
m_grdScr.verticalScrollBar()->setSingleStep(m_grdScr.height());
defectItems.push_back(defectItem);
}
m_grdScr.verticalScrollBar()->setSliderPosition(0);
this->setFocus();
}
//1.添加 -1.删除
@ -740,3 +764,7 @@ void PreVerifyWidget::keyPressEvent(QKeyEvent* event) {
void PreVerifyWidget::slot_winStateChangeEvent() {
slot_treeWgtCurrentItemChanged(m_treeWgt.currentItem(), nullptr);
}
void PreVerifyWidget::slot_grdLtUpdate() {
update();
}

View File

@ -16,16 +16,19 @@
#include "qspinbox.h"
#include "ScrollAreaCustom.h"
#include "qmutex.h"
#include "logger.h"
class DefectViewCustom;
class PreVerifyWidget : public QWidget {
Q_OBJECT
LOG4QT_DECLARE_QCLASS_LOGGER
public:
PreVerifyWidget(QWidget* parent = nullptr);
~PreVerifyWidget();
void setUi();
void setConnection();
void load();
void collect(int count, QJsonArray& arr, QString& jobLayer, QList<DefectViewCustom*>& defectItems);
void updateOne(QString defectId, int action);
QString defectId2Desc(int defectId);
void filter();
@ -94,7 +97,8 @@ private:
int m_rowHeight = -1;
QList<QTreeWidgetItem*> m_boardItemList;
signals:
void sig_grdLtUpdate();
public slots:
void slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous);
@ -103,6 +107,7 @@ public slots:
void slot_nextBoardBtnPressed();
void slot_nextDefectBtnPressed();
void slot_winStateChangeEvent();
void slot_grdLtUpdate();
};

View File

@ -7,9 +7,9 @@
#include "QGuiApplication"
#include <windows.h>
#include <dbghelp.h>
#include "XDongleVerifierWorker.h"
#include "QDir"
#include "QDateTime"
#include "qthreadpool.h"
#pragma comment(lib, "Dbghelp.lib")
@ -20,6 +20,8 @@ int main(int argc, char* argv[]) {
QApplication a(argc, argv);
SetUnhandledExceptionFilter(exceptionCallback);
QThreadPool::globalInstance()->setMaxThreadCount(15);
MainWidget* mainWidget = new MainWidget();
mainWidget->load();