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

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

View File

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

Binary file not shown.

View File

@ -1,15 +1,22 @@
#include "MainWidget.h" #include "MainWidget.h"
#include "QFont" #include "QFont"
#include "qmessagebox.h"
MainWidget::MainWidget(QWidget* parent) { MainWidget::MainWidget(QWidget* parent) {
setUi(); m_sharedMemory.setKey("PreVerify.exe");
setConnection(); 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() { void MainWidget::setUi() {
@ -54,7 +61,7 @@ void MainWidget::setUi() {
void MainWidget::setConnection() { void MainWidget::setConnection() {
QObject::connect(&m_preVerifyBtn, &QPushButton::pressed, this, &MainWidget::slot_preVerifyBtnPressed); QObject::connect(&m_preVerifyBtn, &QPushButton::pressed, this, &MainWidget::slot_preVerifyBtnPressed);
QObject::connect(&m_paramSettingBtn, &QPushButton::pressed, this, &MainWidget::slot_paramSettingBtnPressed); 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() { void MainWidget::load() {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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