You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1819 lines
54 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "lpMainWin.h"
#include "quserinfo_global.h"
#include <QDir>
#include <QFileInfo>
#include "qmysplashscreen.h"
#include "InfoFile.h"
#include "WheelCtrl.h"
#include "QWorkMgrCtrl.h"
#include "qworkmgrui.h"
#include "IWheelModel.h"
#include <QDebug>
#include <QMessageBox>
#include "HubBase.h"
#include <QToolButton>
#include <QMenu>
#include "saveimgthread.h"
#include "lpGlobalData.h"
#include "qpulpewidget.h"
#include "QZkJsonParser.h"
#include <QProcess>
#include "databasesql.h"
#define VERSION_HUB "3.0.1.2"
#define VERSION_ALG "3.0.1.2"
#define UPDATE_TIME "2021-09-08"
#pragma execution_character_set("utf-8")
static QImage cvMat2QImage(const cv::Mat& mat) {
if (mat.type() == CV_8UC1) {
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
image.setColorCount(256);
for (int i = 0; i < 256; i++) {
image.setColor(i, qRgb(i, i, i));
}
uchar *pSrc = mat.data;
for (int row = 0; row < mat.rows; row++) {
uchar *pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
}
else if (mat.type() == CV_8UC3) {
const uchar *pSrc = (const uchar*)mat.data;
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
if (image.isNull())
return QImage();
return image.rgbSwapped();
}
else if (mat.type() == CV_8UC4) {
const uchar *pSrc = (const uchar*)mat.data;
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
return image.copy();
}
else {
qDebug() << "ERROR: Mat could not be converted to QImage.";
return QImage();
}
}
static cv::Mat QImageToMat(QImage image) {
cv::Mat mat;
switch (image.format())
{
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
break;
case QImage::Format_RGB888:
mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
cv::cvtColor(mat, mat, CV_BGR2RGB);
break;
case QImage::Format_Indexed8:
mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat;
}
lpMainWin::lpMainWin(QWidget *parent)
: QMainWindow(parent)
{
{//加载语言设置
QSettings languageSetting("hubdetect.ini", QSettings::IniFormat);
QString strLanguage = languageSetting.value("language", "Chinese").toString();
SetLanguage(strLanguage);
}
this->setWindowIcon(QIcon(":/image/leaper"));
qRegisterMetaType<TimeStruct>("TimeStruct");
onInitCoreCtrl();
onInitEngineCtrl();
ui.setupUi(this);
onInitAbout();
setupTrayIcon();
lpGlobalConfig::instance()->loadStandParam();
{
QGridLayout *pLayout = new QGridLayout(ui.cam_win_1);
m_ImgViewer = new RoiImgViewer(ui.cam_win_1);
m_ImgViewer->setObjectName("Imageview");
pLayout->addWidget(m_ImgViewer);
ui.cam_win_1->setLayout(pLayout);
}
{
connect(ui.action_userManager, SIGNAL(triggered()), this, SLOT(onActionClicked()));//用户管理菜单
connect(ui.action_Login, SIGNAL(triggered()), this, SLOT(onActionClicked()));//用户登录菜单
connect(ui.action_about, SIGNAL(triggered()), this, SLOT(onActionClicked()));//关于
connect(ui.action_setting_ip, SIGNAL(triggered()), this, SLOT(onActionClicked()));//IP设置
connect(ui.action_cali_raster, SIGNAL(triggered()), this, SLOT(onActionClicked()));//光栅标定
connect(ui.action_setting_ban, SIGNAL(triggered()), this, SLOT(onActionClicked()));//班次设置
connect(ui.action_debug, SIGNAL(triggered()), this, SLOT(onActionClicked()));//调试
connect(ui.action_connect_mode, SIGNAL(triggered()), this, SLOT(onActionClicked()));//连接
connect(ui.action_checkdata, SIGNAL(triggered()), this, SLOT(onActionClicked()));//历史数据查询
connect(ui.action_modelmgr, SIGNAL(triggered()), this, SLOT(onActionClicked()));//模板信号管理
connect(ui.action_designer, SIGNAL(triggered()), this, SLOT(onActionClicked()));//模板标定
connect(ui.action_ImageCali, SIGNAL(triggered()), this, SLOT(onActionClicked()));//图像标定
connect(ui.actionSystemSeting, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actioncamSetting, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.btn_start_detect, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
// connect(ui.btn_clear_data, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
ui.action_userManager->setVisible(false);
QMenu *pToolMenu = new QMenu(this);
pToolMenu->addAction(ui.action_ImageCali);//图像标定
//pToolMenu->addAction(ui.action_cali_raster);
//pToolMenu->addAction(ui.action_setting_ban);
//pToolMenu->addAction(ui.action_setting_ip);
pToolMenu->addAction(ui.action_debug);
pToolMenu->addAction(ui.actionSystemSeting);
pToolMenu->addAction(ui.actioncamSetting);
QToolButton* pbutton = new QToolButton(this);
pbutton->setMenu(pToolMenu);
pbutton->setIcon(QIcon(":/ToolBarPic/ToolButon"));
pbutton->setText(tr("工具"));
pbutton->setToolTip(tr("工具"));
pbutton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
pbutton->setPopupMode(QToolButton::InstantPopup);
ui.mainToolBar->addWidget(pbutton);
ui.mainToolBar->addAction(ui.action_about);
}
{
m_pLbCurrentTime = new QLabel(tr("系统时间"));
//m_pLbBanci = new QLabel(tr("班次信息"));
m_pLbDetectState = new QLabel(tr("检测状态"));
m_pLbUser = new QLabel(tr("用户:"));
QFont m_font;
m_font.setBold(true);
m_font.setPixelSize(12);
m_pLbCurrentTime->setFont(m_font);
m_pLbCurrentTime->setMinimumHeight(40);
m_pLbCurrentTime->setMinimumWidth(200);
m_pLbCurrentTime->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
//m_pLbBanci->setMinimumWidth(200);
//m_pLbBanci->setFont(m_font);
//m_pLbBanci->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
m_pLbDetectState->setMinimumWidth(200);
m_pLbDetectState->setFont(m_font);
m_pLbDetectState->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
m_pLbUser->setFont(m_font);
m_pLbUser->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui.statusBar->addWidget(m_pLbDetectState, 1);
ui.statusBar->addWidget(m_pLbUser, 1);
//ui.statusBar->addWidget(m_pLbBanci,1);
ui.statusBar->addPermanentWidget(m_pLbCurrentTime);
}
//加载用户管理模块
loadUserModel();
//初始化模型管理模块
{
m_pCtrl = new WheelCtrl(QCoreApplication::applicationDirPath(), nullptr);
m_pWorkCtrl = new QWorkMgrCtrl(m_pCtrl);
m_pWorkCtrl->readManageFile();
m_pWorkUI = new QWorkMgrUI(m_pWorkCtrl, m_pCtrl);
m_pWorkUI->InitUI();
connect(m_pWorkUI, SIGNAL(sgUpdatedefect()), this, SLOT(onUpdateDefect()));
m_pModelMgrDlg = new QModelMgrDlg(m_pCtrl);//模板管理
//当某个模板加入训练或者不加入训练时修改原来工作单中的模板信息
connect(m_pModelMgrDlg, SIGNAL(sgModifyModel(QString)), this, SLOT(modWorkMgr(QString)));
connect(m_pModelMgrDlg, SIGNAL(sgUpdatedefect()), this, SLOT(onUpdateDefect()));
connect(m_pModelMgrDlg, SIGNAL(sgAddNewModel(QString)), this, SLOT(onSlotAddNewModel(QString)));//新建模板型号
connect(m_pModelMgrDlg, SIGNAL(sgDelOldModel(QString)), this, SLOT(onSlotDelOldModel(QString)));//删除模板型号
m_pDebugDlg = new QDebugDlg();//调试界面
connect(m_pDebugDlg, SIGNAL(sgTriggerCam()), this, SLOT(onTriggerCam()));
m_pDebugDlg->onSetCtrl(m_pCtrl);
m_pSystemConfigUI = new lpSystemConfigUI();
m_CamSettingDlg = new QCamSettingDlg();
m_CamSettingDlg->setCoreCtrlPtr(m_pCoreCtrl);
m_pixMapList = new QPixmapListBar(ui.tp_main_tabWidget);
ui.tp_main_tabWidget->insertTab(0, m_pixMapList, tr("历史"));
ui.tp_main_tabWidget->setCurrentIndex(0);
m_pImageCaliUI = new lpImageCaliUI();
connect(m_pSystemConfigUI, SIGNAL(sgUpdateInfo()), this, SLOT(setWindowTitleInfo()));
}
onSetModel();
{
connect(this, SIGNAL(sgShowMsg(QString, bool)), this, SLOT(onTcpConnet(QString, bool)));
connect(this, SIGNAL(sgShowImgState(QString)), this, SLOT(onShowImgState(QString)));
connect(this, SIGNAL(sgGetImg()), this, SLOT(onGetImg()));
connect(this, SIGNAL(sgShowMsgdlg(QString)), this, SLOT(onShowMsg(QString)));
}
{//PLC tcp 通讯
m_pPlcDevice = new QPLCDevice();
m_pPlcDevice->onInitDevice();
m_pPlcDevice->onStartServer(lpGlobalConfig::instance()->tcpServerPort);
connect(m_pPlcDevice, SIGNAL(sgTrigerCam(int)), this, SLOT(onPLCTrigerCam(int)));
}
{
QTimer::singleShot(3000, [&]() {
ui.btn_start_detect->setText(tr("停止检测"));
lpGlobalConfig::instance()->IsDetect = true;
});
if (lpGlobalConfig::instance()->m_AutoSendTick2COM)
m_wfPulseTimer.start(1000);
}
{
m_pTableCheck = new ModelsView(ui.tableview_checkstate, m_pCtrl->getAllModelMapPtr());
m_pTableCheck->setEnable(false);
connect(m_pCtrl, SIGNAL(sgModelChanged()), m_pTableCheck, SLOT(updateModels()));
QStringList strList = forDefectList;
if (!strList.contains("NG"))
strList.append("NG");
m_pTableCheck->setModelList(strList);
}
m_timerID = startTimer(1000);
connect(this, SIGNAL(sgAutoExposure()), this, SLOT(onAutoExposure()));
QString strPath = QApplication::applicationDirPath();
readExposureTimeConfig(strPath);
{
m_pWebSocket = new WebServer();
//connect(m_pServer, SIGNAL(sgConnected(bool)), this, SLOT(onConnected(bool)));
//connect(m_pServer, SIGNAL(sgClientInfo(QString, int, bool)), this, SLOT(onClientInfo(QString, int, bool)));
int port = lpGlobalConfig::instance()->webSocketPort;
RecvFunc func = std::bind(&lpMainWin::onWebSocketRecvData, this, std::placeholders::_1, std::placeholders::_2);
m_pWebSocket->openServer(port, func);
}
setWindowTitleInfo();
}
lpMainWin::~lpMainWin()
{
m_timer.stop();
if (m_VecTranPtr.size() > 0) {
while (m_VecTranPtr.size()) {
QTranslator *pTrans = m_VecTranPtr.takeFirst();
qApp->removeTranslator(pTrans);
delete pTrans;
}
}
if (m_pUserCtrl) {
delete m_pUserCtrl;
m_pUserCtrl = NULL;
}
{
if (m_pLbCurrentTime)
{
delete m_pLbCurrentTime;
m_pLbCurrentTime = nullptr;
}
if (m_pLbDetectState)
{
delete m_pLbDetectState;
m_pLbDetectState = nullptr;
}
if (m_pLbUser)
{
delete m_pLbUser;
m_pLbUser = nullptr;
}
}
if (m_pCtrl)
{
delete m_pCtrl;
m_pCtrl = nullptr;
}
if (m_pWorkCtrl)
{
delete m_pWorkCtrl;
m_pWorkCtrl = nullptr;
}
if (m_pWorkUI)
{
delete m_pWorkUI;
m_pWorkUI = nullptr;
}
if (m_pModelMgrDlg)
{
delete m_pModelMgrDlg;
m_pModelMgrDlg = nullptr;
}
if (m_pDebugDlg) {
delete m_pDebugDlg;
m_pDebugDlg = nullptr;
}
if (m_pSystemConfigUI)
{
delete m_pSystemConfigUI;
m_pSystemConfigUI = nullptr;
}
if (m_CamSettingDlg)
{
delete m_CamSettingDlg;
m_CamSettingDlg = nullptr;
}
if (m_ImgViewer) {
delete m_ImgViewer;
m_ImgViewer = nullptr;
}
if (m_pixMapList) {
delete m_pixMapList;
m_pixMapList = nullptr;
}
if (m_pImageCaliUI)
{
delete m_pImageCaliUI;
m_pImageCaliUI = nullptr;
}
if (m_pDesigner)
{
delete m_pDesigner;
m_pDesigner = nullptr;
}
if (m_pPlcDevice)
{
delete m_pPlcDevice;
m_pPlcDevice = nullptr;
}
if (m_pDllCoreCtrl)
{
delete m_pDllCoreCtrl;
m_pDllCoreCtrl = nullptr;
}
if (m_pDllDesigner)
{
delete m_pDllDesigner;
m_pDllDesigner = nullptr;
}
if (m_pDllEngineCtrl)
{
delete m_pDllEngineCtrl;
m_pDllEngineCtrl = nullptr;
}
}
bool lpMainWin::onInitCoreCtrl()
{
//load coretrl
if (NULL == m_pDllCoreCtrl)
{
m_pDllCoreCtrl = new CDllCoreCtrl(QStringList());
if (NULL == m_pDllCoreCtrl)
{
return false;
}
m_pCoreCtrl = m_pDllCoreCtrl->m_pCoreCtrl;
FuncCallBack_VarInt getVarfunc = std::bind(&lpMainWin::IGetVariantById, this, std::placeholders::_1);
m_pCoreCtrl->IRegisterGetVariant(getVarfunc);
FuncCallBack_StrMap strMapfunc = std::bind(&lpMainWin::IVariantMapToUI, this, std::placeholders::_1, std::placeholders::_2);
m_pCoreCtrl->IRegisterResultCallBack(strMapfunc);
FuncCallBack_StrImg strImgfunc = std::bind(&lpMainWin::INewCameraImage, this, std::placeholders::_1, std::placeholders::_2);
m_pCoreCtrl->IRegisterImageCallBack(strImgfunc);
m_camKey = m_pCoreCtrl->ICameraKeys().first();
return true;
}
return false;
}
bool lpMainWin::onInitEngineCtrl()
{
if (m_pDllEngineCtrl == nullptr)
{
m_pDllEngineCtrl = new CDllDetectorEngine();
if (m_pDllEngineCtrl != nullptr)
{
m_pEngineCtrl = m_pDllEngineCtrl->m_pDE;
}
}
if (m_pDllDesigner == nullptr)
{
m_pDllDesigner = new CDllDesigner();
if (m_pDllDesigner != nullptr)
{
m_pDesigner = m_pDllDesigner->GetDesignerInterface();
if (m_pDesigner && m_pEngineCtrl)
{
m_pDesigner->Initialize(m_pEngineCtrl);
}
}
}
return false;
}
void lpMainWin::loadUserModel()
{
//userctrel
#ifdef _DEBUG
QLibrary lib("QUserInfod");
#else
QLibrary lib("QUserInfo");
#endif
_UserCtrlCreate func = (_UserCtrlCreate)lib.resolve("UserCtrlCreate");
if (func) {
m_pUserCtrl = func();
connect(m_pUserCtrl, SIGNAL(sgCurrentUserInfo(QString, int, int)), this, SLOT(onLogInOut(QString, int, int)));
}
}
void lpMainWin::SearchQmFile(const QString & strDir)
{
QDir dir(strDir);
if (!dir.exists())
{
return;
}
dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
dir.setSorting(QDir::DirsFirst); // 文件夹优先
// 转换成一个List
QFileInfoList list = dir.entryInfoList();
if (list.size() < 1)
{
return;
}
int i = 0;
do
{
QFileInfo fileInfo = list.at(i);
QString tt = fileInfo.fileName();
// 如果是文件夹
bool bisDir = fileInfo.isDir();
if (bisDir)
{
SearchQmFile(fileInfo.filePath());
}
else
{
bool bQm = fileInfo.fileName().endsWith(".qm");
SetTranslator(fileInfo.filePath());
}
i++;
} while (i < list.size());
}
void lpMainWin::SetTranslator(const QString strPath)
{
if (strPath.isEmpty())
{
return;
}
QTranslator *pTrans = new QTranslator;
if (pTrans->load(strPath)) // 如果加载成功
{
qApp->installTranslator(pTrans);
m_VecTranPtr.append(pTrans);
}
else
{
delete pTrans;
pTrans = NULL;
}
}
void lpMainWin::SetLanguage(QString strLangage)
{
QString strDirPath = QString(QCoreApplication::applicationDirPath() + "/language/");
QString translatorFileName = strLangage;
if (!translatorFileName.isEmpty())
{
if (m_VecTranPtr.size() > 0)
{
while (m_VecTranPtr.size())
{
QTranslator *pVa = m_VecTranPtr.takeFirst();
qApp->removeTranslator(pVa);
delete pVa;
pVa = NULL;
}
}
QLocale::setDefault(QLocale(translatorFileName));
QString transDir = strDirPath + translatorFileName;
SearchQmFile(transDir);
}
}
/*主线程接收图像*/
void lpMainWin::INewCameraImage(const QString& camKey, QImage img)
{
if (m_ImgViewer)
{
int widgetWidth = m_ImgViewer->width();
int imgWidth = img.width();
float scalew = (widgetWidth*1.0) / (imgWidth*1.0);
int widgetHeight = m_ImgViewer->height();
int imgHeight = img.height();
float scaleh = (widgetHeight*1.0) / (imgHeight*1.0);
float minScale = scalew < scaleh ? scalew : scaleh;
m_ImgViewer->setInitScale(minScale-0.01);
m_ImgViewer->setImg(img);
}
if (m_CamSettingDlg)
{
if (m_CamSettingDlg->isHidden())
return;
m_CamSettingDlg->onShowImage(img);
}
}
/*多线程发送算法结果*/
void lpMainWin::IVariantMapToUI(const QString& camKey, const QVariantMap& vMap)
{
QImage srcImg = vMap.value("srcImage").value<QImage>();
cv::Mat srcMat = QImageToMat(srcImg);
Result2Ui *pResult = parseMap(vMap.value("result").toMap());
if (pResult == nullptr)
{
pResult = new Result2Ui();
}
/*
(1)解析出型号识别的结果,如果识别结果是有字符的,表示识别型号成功,执行后续的定位操作;如果识别结果是NG则直接返回退出发送识别失败给PLC。
(2)执行定位算法,解析定位算法的结果
*/
pResult->m_pixSrc = QPixmap::fromImage(srcImg);
if (!pResult->m_strModel.isEmpty())
{
ui.main_value_Result->setText("定位中");
QString strMode = pResult->m_strModel;
AlgResultCallBack func = std::bind(&lpMainWin::IEngineResult, this, std::placeholders::_1);
m_pEngineCtrl->detect(srcMat, strMode, func);
}
else {
/*型号识别失败,*/
ui.main_value_Result->setText("没有找到相关task");
ui.main_label_angle->setText("-");
ui.main_value_DetectTime->setText("-");
ui.main_value_Score->setText("-");
ValueResult valueRlt;
valueRlt.angle = 361;
valueRlt.strModel = "NG";
valueRlt.score = 0;
int h = srcImg.height();
int w = srcImg.width();
uchar* p = srcImg.bits();
if(!srcImg.isNull())
valueRlt.pixmap = QPixmap::fromImage(srcImg);
valueRlt.strRunState = "no task";
onSaveValveResult(valueRlt);
}
emit(sgShowImgState(tr("显示识别结果")));
if (pResult)
{
onShowResult(pResult);
if (m_pDebugDlg) {
m_pDebugDlg->onShowResult(pResult);
}
saveImage(pResult);
m_pCtrl->saveResult(pResult);
delete pResult;
}
/*当没抠出轮毂和NG时自动调整曝光时间重新拍照最多调整的次数为5次*/
/*
if (m_autoExposureSwitch)
{
if (vMap.contains("noCircle"))
{
if (m_exposureTimeCount == 0)
{
int curExposure = getCurExposureTime();
if (curExposure != m_exposureTimeArray[0])
{
emit(sgShowMsgdlg(tr("当前曝光时间未识别到轮毂!")));
emit sgAutoExposure();
m_exposureTimeCount++;
delete pResult;
return;
}
}
m_exposureTimeCount++;
if (m_exposureTimeCount >= m_exposureTimeArray.size())
{
// m_exposureTimeCount = 0;
emit(sgShowMsgdlg(tr("调整5次曝光时间后依然未能识别到轮毂")));
}
else
{
emit(sgShowMsgdlg(tr("当前曝光时间未识别到轮毂!")));
emit sgAutoExposure();
delete pResult;
return;
}
}
bool ngFlag = (pResult->m_strModel.isEmpty()) && (m_exposureTimeCount < m_exposureTimeArray.size());
if (ngFlag)
{
if (m_exposureTimeCount == 0)
{
int curExposure = getCurExposureTime();
if (curExposure != m_exposureTimeArray[0])
{
emit(sgShowMsgdlg(tr("当前曝光时间未识别到轮毂!")));
emit sgAutoExposure();
pResult->m_strModel = "NG";
saveImage(pResult);
m_exposureTimeCount++;
delete pResult;
return;
}
}
m_exposureTimeCount++;
if (m_exposureTimeCount >= m_exposureTimeArray.size())
{
// m_exposureTimeCount = 0;
emit(sgShowMsgdlg(tr("调整5次曝光时间后依然未能识别到轮毂")));
}
else
{
emit(sgShowMsgdlg(tr("当前曝光时间未识别到轮毂!")));
emit sgAutoExposure();
pResult->m_strModel = "NG";
saveImage(pResult);
delete pResult;
return;
}
}
}
if (vMap.contains("error"))
{
m_exposureTimeCount = 0;
emit(sgShowMsgdlg(tr("相机图像和背景图不一样,请更换检测背景!")));
return;
}
onShowResult(pResult);
if (m_pDebugDlg) {
m_pDebugDlg->onShowResult(pResult);
}
saveImage(pResult);
if (m_autoExposureSwitch)
{
m_exposureTimeCount = 0;
int exp = m_exposureTimeArray[m_exposureTimeCount];
m_pCoreCtrl->ISetExposureTime(m_camKey, exp);
}
static int ErrorNum = 0;
if (m_pNet) {
if (pResult->m_strModel == "NG") {
//SendResultBee(LIGHT_REDBEE, 1);
//SendResultBee(LIGHT_BEE, 1);
ErrorNum++;
}
else {
//m_pNet->sendLight(2, 1, 1000, 100);
//SendResultBee(LIGHT_GREENBEE, 1);
ErrorNum = 0;
}
if (ErrorNum >= 3) {
//QString str = tr("警告!!!连续出现%1个未识别型号").arg(ErrorNum);
//if (DetectState::instance()->IsDetect == false)
// str += tr(",未开启检测功能造成的");
//m_pCtrl->addLog(str, emTypeWaring);
//SendResultBee(LIGHT_REDBEE, 3);
//SendResultBee(LIGHT_BEE, 3);
}
}
if (DetectState::instance()->m_SendDetectStr2Net)
SendResultStr2PLC(pResult);//发送检测结果字符到PLC
if (DetectState::instance()->m_SendChannelRes2COM)
SendResultChannelCOM(pResult);//发送检测结果通道到串口
if (DetectState::instance()->m_SendChannelRes2Net)
SendResultChannel2PLC(pResult);//发送检测结果通道到PLC
m_pCtrl->saveResult(pResult);
delete pResult;
*/
}
/*多线程获取算法参数*/
QVariant lpMainWin::IGetVariantById(int id)
{
m_nDiffTrigNum--;//进入到这里 表示获取到了图片
qWarning() << "Alg get An Image:" << "(" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") << ")";
emit(sgShowImgState(tr("获得图像,正在计算中...")));
emit(sgGetImg());
qDebug() << "get one Pic ,id=" << id;
QVariantMap vMap;
int nThickness = 0;
vMap.insert("thickness", QVariant(nThickness));
double dDiameter = 0;// = (-794.25 * nThickness / 1000000.0 + 0.775960);
dDiameter = (lpGlobalConfig::instance()->m_k * nThickness + lpGlobalConfig::instance()->m_b);
vMap.insert("d2h", dDiameter);
vMap.insert("useThickness", lpGlobalConfig::instance()->bUseThickness);
vMap.insert("useDiameter", lpGlobalConfig::instance()->bUseDiameter);
vMap.insert("Threshold", lpGlobalConfig::instance()->m_AlgThres);
vMap.insert("IsCutImg", lpGlobalConfig::instance()->m_UseCutImg);
vMap.insert("useBackground", lpGlobalConfig::instance()->m_UseBackground>0?true:false);//使用背景图
void* address = (void*)m_pCtrl->getAllModelMapPtr();
long long varadr = (long long)address;
vMap.insert("modelMap", varadr);
void* pdefectList = (void*)&forDefectList;
long long val = (long long)pdefectList;
vMap.insert("defectList", val);
qDebug() << "end get one pic" << id;
if (lpGlobalConfig::instance()->m_showThressValue == 1) {
QString str = QString("thickness value = %1,dDiameter value = %2").arg(nThickness).arg(dDiameter);
emit(sgShowMsg(str, true));
}
return vMap;
}
void lpMainWin::IEngineResult(QVariantMap vMap)
{
//不包含算法检测结果表示没有相关task
if (!vMap.contains("AlgoResult"))
{
ui.main_value_Result->setText("没有找到相关task");
ui.main_label_angle->setText("-");
ui.main_value_Center_point->setText("-");
ui.main_value_DetectTime->setText("-");
ui.main_value_Score->setText("-");
//获取图像 保存到当天NG图
ValueResult valueRlt;
valueRlt.angle = 361;
valueRlt.strModel = "NG";
valueRlt.score = 0;
//valueRlt.pixmap = QPixmap::fromImage(srcImg);
valueRlt.strRunState = "no task";
onSaveValveResult(valueRlt);
}
else {
QVariantMap algResult = vMap.value("AlgoResult").toMap();
QImage srcImg = vMap.value("originImage").value<QImage>();
double dAngle = algResult.contains("angle") ? algResult.value("angle").toDouble() : 365;
int errorType = algResult.contains("error") ? algResult.value("error").toInt() : 16;
double matchScore = algResult.value("score").toDouble() * 100;
QImage maskImg = algResult.value("image").value<QImage>();
QString str = algResult.value("resultTip").toString();
QPointF centerPoint = algResult.value("centerPoint").toPointF();
//QString rltmsg = QString("%1 %2 %3").arg(dAngle).arg(errorType).arg(matchScore);
QString taskName = vMap.value("taskName").toString();
double taskTime = vMap.value("tasktime").toDouble();
ui.main_label_angle->setText(QString("%1°").arg(dAngle));
ValueResult valueRlt;
valueRlt.angle = dAngle;
valueRlt.strModel = taskName;
valueRlt.centerPix = centerPoint;
valueRlt.score = matchScore;
valueRlt.errorCode = errorType;
valueRlt.runtime = taskTime;
valueRlt.pixmap = QPixmap::fromImage(maskImg);
valueRlt.strRunState = "run Alg success";
/*中心坐标偏移值计算*/
int centerX = centerPoint.x() * lpGlobalConfig::instance()->fScale + lpGlobalConfig::instance()->pointXOffset;
int centerY = centerPoint.y() * lpGlobalConfig::instance()->fScale + lpGlobalConfig::instance()->pointYOffset;
valueRlt.center.setX(centerX);
valueRlt.center.setY(centerY);
if (dAngle >= 361)//NG
{
ui.main_value_Result->setText("找不到气门芯");
ui.main_value_Center_point->setText("-");
ui.main_value_Score->setText(QString("%1").arg(matchScore));
valueRlt.strModel = "NG";
}
else {//OK
ui.main_value_Result->setText("定位成功");
ui.main_value_Center_point->setText(QString("(%1,%2)").arg(centerPoint.x()).arg(centerPoint.y()));
ui.main_value_Score->setText(QString("%1").arg(matchScore));
}
onSaveValveResult(valueRlt);
ui.main_value_DetectTime->setText(QString("%1s").arg(taskTime));
if (m_ImgViewer)
{
if(!maskImg.isNull())
m_ImgViewer->setImg(maskImg);
}
}
/*展示结果*/
}
void lpMainWin::showWidget()
{
if (lpGlobalConfig::instance()->bRunBackRunning == false)
{
setMainWindowVisibility(true);
}
else {
setMainWindowVisibility(false);
}
}
Q_SLOT void lpMainWin::onLogInOut(QString strName, int level, int state)
{
lpGlobalData::instance()->m_curUser = strName;
lpGlobalData::instance()->m_level = level;
if (state == 0) {
m_pCtrl->setUser(strName, level);
ui.action_Login->setText(tr("注 销"));
}
else
{
m_pCtrl->setUser(strName, level);
ui.action_Login->setText(tr("登 录"));
}
onUpdateByLevel(level);
if (m_pModelMgrDlg)
{
m_pModelMgrDlg->onUserLevel(level);
}
}
Q_SLOT void lpMainWin::onActionClicked()
{
QString strObj = sender()->objectName();
if ("action_userManager" == strObj) {
/*用户管理*/
if (m_pUserCtrl)
{
m_pUserCtrl->ShowUserMgrDlg(this);
}
else
{
QMessageBox infobox(QMessageBox::Information, tr("提示"), tr("该功能未启用."), QMessageBox::Yes, this);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, tr("确认"));
infobox.exec();
}
}
else if ("action_Login" == strObj) {
/*用户登陆*/
if (m_pUserCtrl)
{
if (m_pUserCtrl->getLoginState() == EM_LOGIN)
{
QMessageBox infobox(QMessageBox::Information, tr("提示"), QString("%1 %2 ?").arg(tr("你确定要注销")).arg(m_pUserCtrl->CurUser()), QMessageBox::Yes | QMessageBox::No, this);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, tr("确认"));
infobox.setButtonText(QMessageBox::No, tr("取消"));
if (infobox.exec() == QMessageBox::Yes) {
m_pUserCtrl->LogOutUser();
}
}
else
{
m_pUserCtrl->CheckLogin(this);
}
}
else
{
QMessageBox infobox(QMessageBox::Information, tr("提示"), tr("该功能未启用."), QMessageBox::Yes, this);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, tr("确认"));
infobox.exec();
}
}
else if ("action_about" == strObj) {
m_aboutDlg.setWindowIcon(QIcon(":/image/leaper"));
m_aboutDlg.setParent(this);
m_aboutDlg.setWindowTitle(tr("关于"));
m_aboutDlg.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_aboutDlg.setWindowModality(Qt::ApplicationModal);
m_aboutDlg.setAttribute(Qt::WA_ShowModal, true);
m_aboutDlg.show();
}
else if ("action_debug" == strObj) {
if (m_pDebugDlg) {
m_pDebugDlg->setParent(this);
m_pDebugDlg->setWindowTitle(tr("调试工具"));
m_pDebugDlg->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pDebugDlg->setWindowIcon(QIcon(":/image/leaper"));
m_pDebugDlg->setWindowModality(Qt::ApplicationModal);
m_pDebugDlg->setAttribute(Qt::WA_ShowModal, true);
m_pDebugDlg->show();
}
}
else if ("action_connect_mode" == strObj) {//检测模板勾选
if (m_pWorkUI)
{
m_pWorkUI->setParent(this);
m_pWorkUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pWorkUI->setWindowIcon(QIcon(":/image/leaper"));
m_pWorkUI->setWindowModality(Qt::ApplicationModal);
m_pWorkUI->setAttribute(Qt::WA_ShowModal, true);
m_pWorkUI->onExec();
}
}
else if ("action_checkdata" == strObj) {//历史数据查询
QProcess process;
process.setWorkingDirectory(QCoreApplication::applicationDirPath());
#ifdef _DEBUG
QString strTaskName = "lpReportd.exe";
#else
QString strTaskName = "lpReport.exe";
#endif
process.startDetached(strTaskName);
}
else if ("action_modelmgr" == strObj) {//模板管理
if (m_pModelMgrDlg)
{
m_pModelMgrDlg->setParent(this);
m_pModelMgrDlg->setWindowTitle(tr("模板管理"));
m_pModelMgrDlg->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pModelMgrDlg->setWindowIcon(QIcon(":/image/leaper"));
m_pModelMgrDlg->setWindowModality(Qt::ApplicationModal);
m_pModelMgrDlg->setAttribute(Qt::WA_ShowModal, true);
m_pModelMgrDlg->show();
}
}
else if ("actionSystemSeting" == strObj) {//系统参数设置
if (m_pSystemConfigUI)
{
m_pSystemConfigUI->setParent(this);
//m_pSystemConfigUI->onShowWidget(lpGlobalData::instance()->m_level);
m_pSystemConfigUI->setWindowTitle(tr("系统参数设置"));
m_pSystemConfigUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pSystemConfigUI->setWindowIcon(QIcon(":/image/leaper"));
m_pSystemConfigUI->setWindowModality(Qt::ApplicationModal);
m_pSystemConfigUI->setAttribute(Qt::WA_ShowModal, true);
m_pSystemConfigUI->show();
}
}
else if ("actioncamSetting" == strObj) {
if (m_CamSettingDlg)
{
m_CamSettingDlg->setParent(this);
//m_CamSettingDlg->onShowWidget(lpGlobalData::instance()->m_level);
m_CamSettingDlg->setWindowTitle(tr("相机配置"));
m_CamSettingDlg->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_CamSettingDlg->setWindowIcon(QIcon(":/image/leaper"));
m_CamSettingDlg->setWindowModality(Qt::ApplicationModal);
m_CamSettingDlg->setAttribute(Qt::WA_ShowModal, true);
m_CamSettingDlg->onInitWidget();
m_CamSettingDlg->show();
}
}
else if ("action_designer" == strObj) {
if (m_pDesigner) {
m_pDesigner->ShowMainFrame(this);
}
}
else if ("action_ImageCali" == strObj) {
if (m_pImageCaliUI) {
m_pImageCaliUI->setParent(this);
m_pImageCaliUI->setWindowTitle(tr("图像标定"));
m_pImageCaliUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pImageCaliUI->setWindowIcon(QIcon(":/image/leaper"));
m_pImageCaliUI->setWindowModality(Qt::ApplicationModal);
m_pImageCaliUI->setAttribute(Qt::WA_ShowModal, true);
m_pImageCaliUI->show();
}
}
}
Q_SLOT void lpMainWin::onButtonClicked()
{
QString strObj = sender()->objectName();
if ("btn_start_detect" == strObj)//开始
{
//开始检测按钮
if (lpGlobalConfig::instance()->IsDetect == false) {
ui.btn_start_detect->setText(tr("停止检测"));
QString str = tr("按下了开始检测按钮,检测功能开启");
m_pCtrl->addLog(str, emTypeRunState);
lpGlobalConfig::instance()->bLockDetect = true;
}
else {
ui.btn_start_detect->setText(tr("开始检测"));
QString str = tr("按下了停止检测按钮,检测功能关闭");
m_pCtrl->addLog(str, emTypeRunState);
lpGlobalConfig::instance()->bLockDetect = false;
}
lpGlobalConfig::instance()->IsDetect = !lpGlobalConfig::instance()->IsDetect;
}
else if ("btn_clear_data" == strObj) {//交班清零
QMessageBox infobox(QMessageBox::Warning, tr("提示"), tr("将清空所有数据"), QMessageBox::Yes | QMessageBox::Cancel, this);
infobox.setButtonText(QMessageBox::Yes, tr("确定"));
infobox.setButtonText(QMessageBox::Cancel, tr("取消"));
infobox.setWindowIcon(QIcon(":/image/leaper"));
if (QMessageBox::Cancel != infobox.exec()) {
QString str = m_pCtrl->getUserName() + ":" + tr("按下了清零按钮,数据全部清零");
m_pCtrl->addLog(str, emTypeUseState);
}
}
}
QString lpMainWin::SecondTimeString(quint64 value)
{
QString strTime;
int seconds = value % 60;
int minutes = value / 60;
QString strDay = tr("");
QString strHour = tr("");
QString strMinute = tr("");
QString strSecond = tr("");
strTime = QString("%1%2%3%4").arg(minutes).arg(strMinute).arg(seconds).arg(strSecond);
if (minutes >= 60) {
minutes = (value / 60) % 60;
int hours = (value / 60) / 60;
strTime = QString("%1%2%3%4%5%6").arg(hours).arg(strHour).arg(minutes).arg(strMinute).arg(seconds).arg(strSecond);
if (hours >= 24) {
hours = ((value / 60) / 60) % 24;
int day = ((value / 60) / 60) / 24;
strTime = QString("%1%2%3%4%5%6%7%8").arg(day).arg(strDay).arg(hours).arg(strHour).arg(minutes).arg(strMinute).arg(seconds).arg(strSecond);
}
}
return strTime;
}
void lpMainWin::timerEvent(QTimerEvent *event)
{
if (event->timerId() == m_timerID) {
m_runTimeCount++;
if (m_pLbCurrentTime) {
QString strTitle = tr("系统时间:");
QString m_currentTime = hubBase::genDateTime();
QString strlong = SecondTimeString(m_runTimeCount);
QString strTimeTitle = tr("运行时长:");
QString strShow = QString("%1%2 %3%4").arg(strTitle).arg(m_currentTime).arg(strTimeTitle).arg(strlong);
m_pLbCurrentTime->setText(strShow);
m_pLbCurrentTime->setStyleSheet("font: 14px;");
}
// state
if (m_pLbDetectState) {
QString strDetectState = tr("检测状态:") + (lpGlobalConfig::instance()->IsDetect == true ? tr("检测中...") : tr("未检测..."));
m_pLbDetectState->setText(strDetectState);
if (lpGlobalConfig::instance()->IsDetect) {
m_pLbDetectState->setStyleSheet("font: bold 14px;background-color: green;");
}
else {
m_pLbDetectState->setStyleSheet("font: bold 14px;background-color: red;");
}
}
if (m_pLbUser) {
QString show_label = m_pCtrl->getUserName();
m_pLbUser->setText(tr("当前用户:") + show_label);
m_pLbUser->setStyleSheet("font: 14px;");
}
onWebHeartBit();
}
}
void lpMainWin::closeEvent(QCloseEvent *event)
{
if (lpGlobalConfig::instance()->bRunBackClosing == true)
{
if (m_bExit == false)
{
setMainWindowVisibility(false);
return event->ignore();
}
}
return event->accept();
}
void lpMainWin::onSetModel()
{
/*
*重新加载模板
重新设置模板到算法中使用
*/
forDefectList = m_pWorkCtrl->getDefectList();
if (m_pTableCheck) {
QStringList strList = forDefectList;
if (!strList.contains("NG"))
strList.append("NG");
m_pTableCheck->setModelList(strList);
}
QString str = QString("%1:%2(%3)").arg(tr("正在检测型号数")).arg(forDefectList.size()).arg(m_pCtrl->getAllTrainModelName().size() - 1);
ui.main_showWorkLabel->setText(str);
}
///*******************************************************************************
Q_SLOT void lpMainWin::onUpdateDefect() {
forDefectList = m_pWorkCtrl->getDefectList();
if (m_pTableCheck) {
QStringList strList = forDefectList;
if (!strList.contains("NG"))
strList.append("NG");
m_pTableCheck->setModelList(strList);
}
QString str = QString("%1:%2(%3)").arg(tr("正在检测型号数")).arg(forDefectList.size()).arg(m_pCtrl->getAllTrainModelName().size() - 1);
ui.main_showWorkLabel->setText(str);
}
Q_SLOT void lpMainWin::onTcpConnet(QString str, bool bConnect)
{
static bool nTcpConnetSetting = true;
QTextBrowser *m_Tcp_textbrower = ui.main_textBrowser;
if (m_Tcp_textbrower && nTcpConnetSetting == true) {
m_Tcp_textbrower->clear();
QTextDocument *pDoc = m_Tcp_textbrower->document();
pDoc->setMaximumBlockCount(10244);
nTcpConnetSetting = false;
}
if (m_Tcp_textbrower) {
if (!bConnect) {
QColor m_color(255, 0, 0);
m_Tcp_textbrower->setTextColor(m_color);
}
else {
QColor m_color(16, 67, 24);
m_Tcp_textbrower->setTextColor(m_color);
}
m_Tcp_textbrower->append(str);
QTextCursor cursor = m_Tcp_textbrower->textCursor();
cursor.movePosition(QTextCursor::End);
m_Tcp_textbrower->setTextCursor(cursor);
}
}
Q_SLOT void lpMainWin::onDetectStateRecv(int nIndex, int value)
{
nIndex -= 1;
QMap<QString, IWheelModel*> *ptr = m_pCtrl->getAllModelMapPtr();
if (ptr) {
QList<QString> lst = ptr->keys();
if (nIndex < lst.size() && nIndex >= 0) {
IWheelModel*pModel = ptr->value(lst.at(nIndex));
pModel->setDetectState(value);
emit(m_pCtrl->sgModelChanged(lst.at(nIndex)));
}
else {
qDebug() << "rev detect state, index big than lst size";
}
}
}
Q_SLOT void lpMainWin::onRecvTrigPara()
{
emit(sgShowMsgdlg(tr("PLC已收到相关设置参数")));
}
Q_SLOT void lpMainWin::onReadDetectState(int nIndex, QString strModel)
{
nIndex -= 1;
QMap<QString, IWheelModel*> *ptr = m_pCtrl->getAllModelMapPtr();
if (ptr) {
QList<QString> lst = ptr->keys();
/*if (nIndex < lst.size() && nIndex >= 0)*/
{
IWheelModel*pModel = ptr->value(strModel);
if (pModel) {
pModel->setDetectState(1);
emit(m_pCtrl->sgModelChanged(strModel));
}
}
}
}
Q_SLOT void lpMainWin::onReadDetectStateASK()
{
QMap<QString, IWheelModel*> *ptr = m_pCtrl->getAllModelMapPtr();
if (ptr) {
QList<QString> lst = ptr->keys();
for (int nIndex = 0; nIndex < lst.size(); nIndex++) {
IWheelModel*pModel = ptr->value(lst.at(nIndex));
pModel->setDetectState(0);
emit(m_pCtrl->sgModelChanged(lst.at(nIndex)));
}
}
}
Q_SLOT void lpMainWin::onTrigRecv(int m_value)
{
/*用于接收PLC触发相机的信号 自检是否收到图像 */
if (lpGlobalConfig::instance()->IsDetect == true) {
onTriggerCam();
}
}
Q_SLOT void lpMainWin::onServerState(QString Addr, int port, bool m_state)
{
QString str;
if (m_state == true)
str = QString(tr("已打开"));
else
str = QString(tr("已关闭"));
QString strMsg = QString("serverIP %1 port %2 %3.").arg(Addr).arg(port).arg(str);
m_pCtrl->addLog(m_pCtrl->getUserName() + ":" + strMsg, emTypeRunState);
}
Q_SLOT void lpMainWin::onShutDownComputer()
{
qApp->closeAllWindows();
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osvi) == 0)
return;
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
// Windows NT 3.51, Windows NT 4.0, Windows 2000,
// Windows XP, Windows .NET Server
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return;
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);
}
ExitWindowsEx(EWX_SHUTDOWN, SHTDN_REASON_MAJOR_OTHER);
}
Q_SLOT void lpMainWin::onShowImgState(QString str)
{
ui.main_label_state->setText(str);
}
Q_SLOT void lpMainWin::onGetImg()
{
ui.main_lb_res_model_pic->setStyleSheet(QString("QLabel{border: 1px solid rgb(0,0,0,250);background-color: rgb(200, 200, 200);}"));
ui.main_value_Result->setText("获取到图像");
ui.main_label_angle->setText("-");
ui.main_value_DetectTime->setText("-");
ui.main_lb_res_model_time->setText("-");
ui.main_lb_res_model_id->setText("-");
ui.main_lb_res_model_score->setText("-");
ui.main_value_Center_point->setText("-");
ui.main_value_Score->setText("-");
}
//展示信息
Q_SLOT void lpMainWin::onShowMsg(QString str)
{
QPulpewidget *pw = new QPulpewidget();
pw->setParent(this);
pw->showmessage(str);
connect(pw, SIGNAL(finished()), pw, SLOT(deleteLater()));
connect(pw, SIGNAL(finished()), this, SLOT(onInitPW()));
}
Q_SLOT void lpMainWin::onTriggerCam()
{
if (m_pCoreCtrl)
{
QStringList strLst = m_pCoreCtrl->ICameraKeys();
m_pCoreCtrl->ISnapImage(strLst);
}
}
void lpMainWin::onInitAbout()
{
// QString aboutString;
// aboutString = QString(
// "<h1>%1</h1>"
// "<p>%2.</p>"
// "<p>%3:www.hzleaper.com</p>"
// "<p>%4:%5</p>"
// "<p>%6:%7</p>"
// "<p>%8%9</p>"
// "<p> </p>"
// ).arg(tr("轮毂型号识别系统"))
// .arg(tr("本软件由杭州利珀科技开发,用于轮毂型号识别和分类,可搭配流水线运输系统使用"))
// .arg(tr("若需要进一步了解该产品的相关信息,请访问我们的网站"))
// .arg(tr("软件版本")).arg(VERSION_HUB)
// .arg(tr("算法版本")).arg(VERSION_ALG)
// .arg(tr("最后更新时间")).arg(UPDATE_TIME)
// .arg(tr("版权 (c) 属 杭州利珀科技有限公司 所有"));
m_aboutDlg.setFixedSize(500, 300);
QTextEdit* pEdit = new QTextEdit(&m_aboutDlg);
pEdit->setReadOnly(true);
pEdit->append("11");
pEdit->setAttribute(Qt::WA_TranslucentBackground, true);
QPalette pl = pEdit->palette();
pl.setBrush(QPalette::Base, QBrush(QColor(255, 0, 0, 0)));
pEdit->setPalette(pl);
QPushButton* lbClose = new QPushButton(tr("关闭"));
QGridLayout* lbLayout = new QGridLayout(&m_aboutDlg);
lbLayout->addWidget(pEdit, 2, 1, 1, 3);
lbLayout->addWidget(lbClose, 3, 2);
lbClose->setMaximumSize(QSize(100, 50));
connect(lbClose, SIGNAL(clicked()), &m_aboutDlg, SLOT(hide()));
}
Q_SLOT void lpMainWin::onLanguageChange(QString strLanguage)
{
QSettings languageSetting("hubdetect.ini", QSettings::IniFormat);
languageSetting.setValue("language", strLanguage);
SetLanguage(strLanguage);
}
void lpMainWin::onShowResult(Result2Ui* pRlt)
{
if (!pRlt)
return;
/*
ui.main_lb_res_model_pic;//匹配结果图
ui.main_lb_res_okng;//匹配结果 OK NG
ui.main_lb_res_model_id;//匹配型号
ui.main_lb_res_model_score;//匹配分数
ui.main_lb_res_model_thickness;//厚度
ui.main_lb_res_model_diameter;//直径
ui.main_lb_res_model_time;//识别耗时时间
ui.main_lb_res_ok_num;//识别总数
ui.main_lb_res_ng_num;//NG 数量
*/
int scareh = ui.main_lb_res_model_pic->height();
int scarew = ui.main_lb_res_model_pic->width();
int scare = 0;
if (scareh > scarew)
scare = scarew;
else
scare = scareh;
if (pRlt->m_strModel.isEmpty()) {
lpGlobalConfig::instance()->totalUnDetectNum++;
QPixmap pix(":/image/none.jpg");
ui.main_lb_res_model_pic->setPixmap(pix.scaled(scare - 15, scare - 15));
ui.main_lb_res_model_pic->setStyleSheet(QString("QLabel{border: 5px solid rgb(250,0,0,250);background-color: rgb(200, 200, 200);}"));
pRlt->m_strModel = "NG";
ui.main_lb_res_okng->setText("NG");
ui.main_lb_res_okng->setStyleSheet("font: 75 24pt \"Consolas\";background-color: rgb(255, 0, 0);");
IWheelModel *pModel = m_pCtrl->getModel("NG");
if (pModel) {
pModel->increCount();
emit m_pTableCheck->sgValueChange(pModel->getModelID());
}
}
else {
IWheelModel *pModel = m_pCtrl->getModel(pRlt->m_strModel);
if (pModel) {
QString filepath = m_pCtrl->appRoot() + pModel->getPicPath();
QPixmap pix(filepath);
ui.main_lb_res_model_pic->setPixmap(pix.scaled(scare - 15, scare - 15));
pModel->increCount();
ui.main_lb_res_okng->setText("OK");
ui.main_lb_res_okng->setStyleSheet("font: 75 24pt \"Consolas\";background-color: rgb(0, 255, 0);");
ui.main_lb_res_model_pic->setStyleSheet(QString("QLabel{border: 5px solid rgb(0,250,0,250);background-color: rgb(200, 200, 200);}"));
emit m_pTableCheck->sgValueChange(pModel->getModelID());
}
}
lpGlobalConfig::instance()->totalDetectNum++;
//show
ui.main_lb_res_model_time->setText(QString::number(pRlt->m_dRunTime, 'f', 2)+"s");
ui.main_lb_res_model_id->setText(pRlt->m_strModel);
ui.main_lb_res_model_score->setText(QString::number(pRlt->m_dScore * 100, 'f', 1) + "%");
if (m_pixMapList) {
if (pRlt->m_pixResult.isNull())
m_pixMapList->addItemByLimit(pRlt->m_pixSrc, pRlt->m_strModel);
else
m_pixMapList->addItemByLimit(pRlt->m_pixResult, pRlt->m_strModel);
}
}
void lpMainWin::saveImage(Result2Ui* pRes)
{
if (pRes == nullptr)
return;
qDebug() << "satrt tread save Image";
QString curExposureTimeStr = QString::number(getCurExposureTime());
QDir testDir;
bool IsTestDir = testDir.exists(lpGlobalConfig::instance()->m_SaveImgDirPath);
if (!IsTestDir)
lpGlobalConfig::instance()->m_SaveImgDirPath = lpGlobalConfig::instance()->m_applicationDirPath;
QString baseSavePath = lpGlobalConfig::instance()->m_SaveImgDirPath + "\\Data\\";
IsTestDir = testDir.exists(baseSavePath);
if (!IsTestDir)
testDir.mkpath(baseSavePath);
QString dataTime = QDateTime::currentDateTime().toString("yyyy-MM-dd");
QString fileSavePath = baseSavePath + "\\" + dataTime;
QString filename = pRes->m_strModel;
if (pRes->m_strModel != "NG")
{
QString goodsourceDir = fileSavePath + "\\Good";
filename += QString("_%1_%2_").arg((int)pRes->m_dThickness).arg((int)pRes->m_dDiameter);
filename += QDateTime::currentDateTime().toString("hhmmsszzz");
if (lpGlobalConfig::instance()->bSaveSrcOKImg == true) {
goodsourceDir += "\\Source";
goodsourceDir += "\\";
goodsourceDir += pRes->m_strModel;
QString resultpath = goodsourceDir + "\\" + filename + ".png";
saveImage(pRes->m_pixSrc, goodsourceDir + "\\", filename + ".png");
}
QString goodtargetDir = fileSavePath + "\\Good";
if (lpGlobalConfig::instance()->bSaveCutOKImg == true) {
goodtargetDir += "\\Target";
goodtargetDir += "\\";
goodtargetDir += pRes->m_strModel;
QString resultpath = goodtargetDir + "\\" + filename + "Res.png";
saveImage(pRes->m_pixResult, goodtargetDir + "\\", filename + "Res.png");
}
}
else
{
QString errorSourceDir = fileSavePath + "\\Error";
filename += QString("_%1_%2_").arg((int)pRes->m_dThickness).arg((int)pRes->m_dDiameter);
filename += QDateTime::currentDateTime().toString("hhmmsszzz");
filename = filename + "_" + curExposureTimeStr;
if (lpGlobalConfig::instance()->bSaveSrcNGImg == true) {
errorSourceDir += "\\Source";
QString resultpath = errorSourceDir + "\\" + filename + ".png";
saveImage(pRes->m_pixSrc, errorSourceDir + "\\", filename + ".png");
}
QString errortargetDir = fileSavePath + "\\Error";
if (lpGlobalConfig::instance()->bSaveCutNGImg == true) {
errortargetDir += "\\Target";
QString resultpath = errortargetDir + "\\" + filename + "Res.png";
if (pRes->m_pixResult.isNull())
saveImage(pRes->m_pixSrc, errortargetDir + "\\", filename + "Res.png");
else
saveImage(pRes->m_pixResult, errortargetDir + "\\", filename + "Res.png");
}
}
}
void lpMainWin::saveImage(const QPixmap& m_pixmap, QString m_path, QString filename)
{//启动多线程保存图像
SaveImgThread *workTread = new SaveImgThread(this);
workTread->setPixmap(m_pixmap, m_path, filename);
connect(workTread, &SaveImgThread::finished, workTread, &QObject::deleteLater);
workTread->start();
}
void lpMainWin::onUpdateByLevel(int nlevel)
{
if(nlevel>4)
ui.action_userManager->setVisible(true);
else
ui.action_userManager->setVisible(false);
}
Q_SLOT void lpMainWin::modWorkMgr(QString str)
{
m_pWorkUI->modWorkMgr(str);
}
bool lpMainWin::readExposureTimeConfig(const QString& strPath)
{
QString filePath = strPath + "\\config\\exposure.json";
QJsonObject jsonObj = QZkJsonParser::ReadJsonAuto(filePath);
if (jsonObj.empty())
{
qDebug() << "Json file parsing failed!";
QJsonObject rootObj;
QJsonArray exposttime;
exposttime.append("1000");
rootObj.insert("exposureTime", exposttime);
rootObj.insert("switch", 0);
QZkJsonParser::WriteJsonObject(filePath, rootObj);
return false;
}
QJsonObject exposureObj = jsonObj.value("exposureTime").toObject();
QJsonObject::iterator objIterEnd = exposureObj.end();
for (auto objIter = exposureObj.begin(); objIter != objIterEnd; objIter++)
{
int exposureTime = objIter.value().toInt();
m_exposureTimeArray.emplace_back(exposureTime);
}
m_autoExposureSwitch = jsonObj.value("switch").toInt();
return true;
}
int lpMainWin::getCurExposureTime()
{
TP_CAMERA_OPTION camOpt;
m_pCoreCtrl->IGetCameraOption(m_camKey, camOpt);
return camOpt.exposure;
}
Q_SLOT void lpMainWin::onAutoExposure()
{
if (m_exposureTimeCount >= 0)
{
if (m_exposureTimeArray.size() <= m_exposureTimeCount)
return;
int exp = m_exposureTimeArray[m_exposureTimeCount];
qDebug() << "exp:" << exp;
m_pCoreCtrl->ISetExposureTime(m_camKey, exp);
}
onTriggerCam();
}
Result2Ui *lpMainWin::parseMap(const QVariantMap &vMap)
{
Result2Ui* pRes = new Result2Ui();
pRes->m_strModel = vMap.value("modeName").toString();
pRes->m_dMinDis = vMap.value("minDis").toDouble();
pRes->m_dScore = vMap.value("score").toDouble();
pRes->m_dDiameter = vMap.value("diameter").toDouble();
pRes->m_dThickness = vMap.value("thickness").toDouble();
pRes->m_pixResult = QPixmap::fromImage(vMap.value("pixResult").value<QImage>());
pRes->m_dRunTime = vMap.value("runTime").toDouble();
return pRes;
}
Q_SLOT void lpMainWin::onSlotAddNewModel(QString strName)
{
if (m_pEngineCtrl)
{
IDetectorSolutionMgr* pMgr = m_pEngineCtrl->getSolutionMgr();
if (pMgr)
{
IDetectorSolution* pSolution = pMgr->GetRunSolution();
if (pSolution) {
pSolution->AddTaskByTemplate(strName);
pSolution->SaveTaskByName(strName);
}
}
}
}
Q_SLOT void lpMainWin::onSlotDelOldModel(QString strName)
{
if (m_pEngineCtrl) {
IDetectorSolutionMgr* pMgr = m_pEngineCtrl->getSolutionMgr();
if (pMgr) {
IDetectorSolution* pSolution = pMgr->GetRunSolution();
if (pSolution) {
pSolution->DeleteTask(strName);
pSolution->SaveTaskByName("");
}
}
}
}
/*
保存定位检测结果数据
1把定位检测的对于图片保存起来供后期核查
2将定位的结果保存到数据库中包括型号名图片路径角度、中心坐标等等
*/
void lpMainWin::onSaveValveResult(ValueResult &rlt)
{
QString strModeName = rlt.strModel;//型号名
QDir testDir;
bool IsTestDir = testDir.exists(lpGlobalConfig::instance()->m_SaveImgDirPath);
if (!IsTestDir)
lpGlobalConfig::instance()->m_SaveImgDirPath = lpGlobalConfig::instance()->m_applicationDirPath;
QString baseSavePath = lpGlobalConfig::instance()->m_SaveImgDirPath + "\\Data\\";
IsTestDir = testDir.exists(baseSavePath);
if (!IsTestDir)
testDir.mkpath(baseSavePath);
QString dataTime = QDateTime::currentDateTime().toString("yyyy-MM-dd");
QString fileSavePath = baseSavePath + "\\" + dataTime;
QString filename = strModeName;
if (filename != "NG")
{
QString goodsourceDir = fileSavePath + "\\Good";
goodsourceDir += "\\ValueImg\\";
goodsourceDir += strModeName;
filename = QString("%1_%2").arg(strModeName).arg(QDateTime::currentDateTime().toString("hh-mm-ss zzz"));
QString resultpath = goodsourceDir + "\\" + filename + ".jpeg";
rlt.strImagePath = resultpath;
if(lpGlobalConfig::instance()->bSaveSrcOKImg_value == true)
saveImage(rlt.pixmap, goodsourceDir + "\\", filename + ".jpeg");
}
else
{
QString errorSourceDir = fileSavePath + "\\Error";
filename = QString("%1_%2").arg(strModeName).arg(QDateTime::currentDateTime().toString("hh-mm-ss zzz"));
errorSourceDir += "\\ValueImg";
QString resultpath = errorSourceDir + "\\" + filename + ".jepg";
rlt.strImagePath = resultpath;
if(lpGlobalConfig::instance()->bSaveSrcNGImg_value == true)
saveImage(rlt.pixmap, errorSourceDir + "\\", filename + ".jpeg");
}
/*数据保存到数据库中*/
if (m_pCtrl)
{
DataBaseSql *pDB = m_pCtrl->getDB();
if (pDB) {
pDB->InsertValueRlt(rlt);
}
}
if (m_pPlcDevice)
{
m_pPlcDevice->onSendValueRlt(rlt);
}
sendWebAlgRlt(rlt);
}
void lpMainWin::saveValveImage(QImage image, QString strName)
{
QString strModeName = strName;//型号名
QPixmap pixmap = QPixmap::fromImage(image);
QDir testDir;
bool IsTestDir = testDir.exists(lpGlobalConfig::instance()->m_SaveImgDirPath);
if (!IsTestDir)
lpGlobalConfig::instance()->m_SaveImgDirPath = lpGlobalConfig::instance()->m_applicationDirPath;
QString baseSavePath = lpGlobalConfig::instance()->m_SaveImgDirPath + "\\Data\\";
IsTestDir = testDir.exists(baseSavePath);
if (!IsTestDir)
testDir.mkpath(baseSavePath);
QString dataTime = QDateTime::currentDateTime().toString("yyyy-MM-dd");
QString fileSavePath = baseSavePath + "\\" + dataTime;
QString filename = strModeName;
if (filename != "NG")
{
QString goodsourceDir = fileSavePath + "\\Good";
goodsourceDir += "\\ValueImg\\";
goodsourceDir += strModeName;
filename = QString("%1_%2").arg(strModeName).arg(QDateTime::currentDateTime().toString("hh-mm-ss zzz"));
QString resultpath = goodsourceDir + "\\" + filename + ".jpeg";
saveImage(pixmap, goodsourceDir + "\\", filename + ".jpeg");
}
else
{
QString errorSourceDir = fileSavePath + "\\Error";
filename = QString("%1_%2").arg(strModeName).arg(QDateTime::currentDateTime().toString("hh-mm-ss zzz"));
errorSourceDir += "\\ValueImg";
QString resultpath = errorSourceDir + "\\" + filename + ".jpeg";
saveImage(pixmap, errorSourceDir + "\\", filename + ".jpeg");
}
}
Q_SLOT void lpMainWin::onPLCTrigerCam(int camID)
{
onTriggerCam();
}
Q_SLOT void lpMainWin::onWebSocketRecvData(QWebSocket* p, QByteArray data)
{
QJsonDocument doc = QJsonDocument::fromJson(data);
QJsonObject json = doc.object();
if (!json.empty())
{
QString strcmd = json.value("cmd").toString();
if (strcmd == "trigerCam")
{
onTriggerCam();
}
else if (strcmd == "heartbit")
{
}
else if (strcmd == "showWidget")
{
this->show();
}
else if (strcmd == "hideWidget")
{
}
else if (strcmd == "exitApp")
{
onQuitApplication();
}
}
}
void lpMainWin::onWebHeartBit()
{
QJsonObject heartObj;
heartObj.insert("deviceName", "A");
heartObj.insert("cmd", "heartbit");
heartObj.insert("time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz"));
if (m_pWebSocket)
{
m_pWebSocket->sendData(Json2byte(heartObj));
}
}
void lpMainWin::sendWebAlgRlt(const ValueResult& rlt)
{
QJsonObject sAlgRltObj;
sAlgRltObj.insert("cmd", "algRlt");
sAlgRltObj.insert("modeName", rlt.strModel);
sAlgRltObj.insert("score", rlt.score);
sAlgRltObj.insert("angle", rlt.angle);
sAlgRltObj.insert("center_x", rlt.center.x());
sAlgRltObj.insert("center_y", rlt.center.y());
sAlgRltObj.insert("imagePath", rlt.strImagePath);
QByteArray imgBuf;
QBuffer buf(&imgBuf);
rlt.pixmap.save(&buf, "jpeg");
QString strBase64 = QString(imgBuf.toBase64());
buf.close();
sAlgRltObj.insert("imageData_base64", strBase64);
if (m_pWebSocket)
{
m_pWebSocket->sendData(Json2byte(sAlgRltObj));
}
}
QJsonObject lpMainWin::byte2Json(QByteArray data)
{
QJsonDocument doc = QJsonDocument::fromJson(data);
return doc.object();
}
QByteArray lpMainWin::Json2byte(QJsonObject obj)
{
QJsonDocument doc = QJsonDocument(obj);
return doc.toJson();
}
void lpMainWin::setupTrayIcon()
{
m_trayIcon = new QSystemTrayIcon(this);
m_trayIconMenu = new QMenu(this);
m_restoreAction = new QAction(tr("后台运行"), this);
m_quitAction = new QAction(tr("退出"), this);
m_trayIconMenu->addAction(m_restoreAction);
m_trayIconMenu->addSeparator();
m_trayIconMenu->addAction(m_quitAction);
QIcon icon(":/image/leaper");
m_trayIcon->setIcon(icon);
m_trayIcon->setContextMenu(m_trayIconMenu);
m_trayIcon->show();
connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onActivated(QSystemTrayIcon::ActivationReason)));
connect(m_restoreAction, &QAction::triggered, this, [this]() {
setMainWindowVisibility(isHidden()
|| windowState() == Qt::WindowMinimized
|| (qApp->applicationState() == Qt::ApplicationInactive));
});
connect(m_quitAction, &QAction::triggered, this, &lpMainWin::onQuitApplication);
}
Q_SLOT void lpMainWin::onActivated(QSystemTrayIcon::ActivationReason reason)
{
if (reason == QSystemTrayIcon::DoubleClick)
{
setMainWindowVisibility(true);
}
}
void lpMainWin::setMainWindowVisibility(bool state)
{
if (state) {
//show();
showMaximized();
qApp->processEvents();
qApp->setActiveWindow(this);
qApp->processEvents();
m_restoreAction->setText(tr("后台运行"));
}
else {
m_restoreAction->setText(tr("显示界面"));
hide();
}
}
Q_SLOT void lpMainWin::onQuitApplication()
{
m_bExit = true;
lpMainWin::close();
}
Q_SLOT void lpMainWin::setWindowTitleInfo()
{
setWindowTitle(lpGlobalConfig::instance()->strSysTitle);
ui.m_winTitle->setText(lpGlobalConfig::instance()->strSysTitle);
if (m_trayIcon)
{
m_trayIcon->setToolTip(lpGlobalConfig::instance()->strSysTitle);
}
}