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.

2086 lines
64 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 "QWorkMgrCtlr.h"
#include "qworkmgrui.h"
#include "IWheelModel.h"
#include <QDebug>
#include "qnettickthread.h"
#include "QMessageBox"
#include "ChannelInfo.h"
#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.0.2"
#define VERSION_ALG "3.0.0.2"
#define UPDATE_TIME "2021-05-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"));
QMySplashScreen m_screen;
m_screen.show();
qRegisterMetaType<TimeStruct>("TimeStruct");
m_screen.ShowMsg(tr("加载必要模块....."));
onInitCoreCtrl();
onInitEngineCtrl();
ui.setupUi(this);
onInitAbout();
{
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(), &m_screen);
pWorkCtrl = new QWorkMgrCtlr(m_pCtrl);
pWorkCtrl->readManageFile();
m_pworkUI = new QWorkMgrUI(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_pTimerMgrDlg = new QTimeMgrDlg();//班次管理
m_pTimerMgrDlg->onSetCtrlPtr(m_pCtrl);
m_pSystemSettingDlg = new QSystemSettingDlg();//系统设置
m_CamSettingDlg = new QCamSettingDlg();
m_CamSettingDlg->setCoreCtrlPtr(m_pCoreCtrl);
connect(m_pSystemSettingDlg, SIGNAL(sgChangeLanguage(QString)), this, SLOT(onLanguageChange(QString)));
connect(m_pSystemSettingDlg, SIGNAL(sgChangePLCParam()), this, SLOT(onChangePLCParam()));
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();
}
{
/*发送模板库线程*/
SendModelLibTask = new QMyThread();
SendModelLibTask->setUser(true);
TaskFunc KuTaskFunc = std::bind(&lpMainWin::SendModelKuTskFun,this);
SendModelLibTask->loadfunc(KuTaskFunc);
SendTiskTsk = new QMyThread();
TaskFunc TickFunc = std::bind(&lpMainWin::SendTickTskFun, this);
SendTiskTsk->loadfunc(TickFunc);
m_screen.ShowMsg(tr("系统初始化完成..."));
}
{
onSetModel();
/*网络通信加载*/
m_pNet = ((WheelCtrl*)m_pCtrl)->getNet();
connect(m_pNet, SIGNAL(sgShow2UI(QString, bool)), this, SLOT(onTcpConnet(QString, bool)));//net
connect(m_pNet, SIGNAL(sgClientConnect(QString, bool)), this, SLOT(onClientConnect(QString, bool)));//net
/*connect(m_pNet, SIGNAL(sgRecv(const QString &)), this, SLOT(onTcpRecv(const QString &)));*/ // net显示
connect(m_pNet, SIGNAL(sgThickness(double)), this, SLOT(onThickness(double)));//xy height
connect(m_pNet, SIGNAL(sgRecvDetectState(int, int)), this, SLOT(onDetectStateRecv(int, int)));//xy check
connect(m_pNet, SIGNAL(sgClearRev(bool)), this, SLOT(onClearLibRev(bool)));//xy clearlib
connect(m_pNet, SIGNAL(sgPulseRev()), this, SLOT(onPulseRev()));
/*connect(m_pNet, SIGNAL(sgResultRev()), this, SLOT(onResultRev()));*/
connect(m_pNet, SIGNAL(sgRecvTrigPara()), this, SLOT(onRecvTrigPara()));
connect(m_pNet, SIGNAL(sgReadDetectState(int, QString)), this, SLOT(onReadDetectState(int, QString)));
connect(m_pNet, SIGNAL(sgReadDetectStateASK()), this, SLOT(onReadDetectStateASK()));
connect(m_pNet, SIGNAL(sgCameraTrig(int)), this, SLOT(onTrigRecv(int)));
connect(m_pNet, SIGNAL(sgServerState(QString, int, bool)), this, SLOT(onServerState(QString, int, bool)));
connect(m_pNet, SIGNAL(sgShutDownComputer()), this, SLOT(onShutDownComputer()));
connect(m_pNet, SIGNAL(sgLibRev(bool)), SendModelLibTask, SLOT(WaitSingleIn(bool)));//xy lib
/*connect(m_pNet, SIGNAL(sgChangeOnlineState(int)), m_pUi, SLOT(onSwitchOnlineModel(int)));*///强制在线 离线
QTimer::singleShot(500, m_pNet, SLOT(onOpenServer()));//延迟2s打开网络TCP服务
}
{
connect(&m_PulseTimer, SIGNAL(timeout()), this, SLOT(onPulseTimer()));//心跳包
connect(&m_wfPulseTimer, SIGNAL(timeout()), this, SLOT(onwfPulseTimer()));//心跳包
connect(&m_ThicknessTimer, SIGNAL(timeout()), this, SLOT(onThicknessTimer()));// 厚度查询
connect(&m_ReadLibTimer, SIGNAL(timeout()), this, SLOT(onSendReadOnlineLib()));
connect(this, SIGNAL(sgTickTsk()), this, SLOT(onPulseTimer()));
connect(this, SIGNAL(sgShowMsg(QString, bool)), this, SLOT(onTcpConnet(QString, bool)));
connect(this, SIGNAL(sgTaskSendModels(int, QString, double, double)), this, SLOT(onTaskSendModels(int, QString, double, double)));//用于发送莫板库
connect(this, SIGNAL(sgTskSendDetectState(int, QString, int)), this, SLOT(onTaskSendDetectState(int, QString, int)));//离线检测发送 用于发送检测状态
connect(this, SIGNAL(sgTskSendCheck(int, int, QString)), this, SLOT(onTaskCheck(int, int, QString)));//在线检测状态查询 用于查询线程
// connect(this, SIGNAL(sgCheckEnd()), this, SLOT(onCheckEnd()));
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)));
connect(this, SIGNAL(sgSendDisLib(int, QString)), this, SLOT(onSendDisLib(int, QString)));
connect(this, SIGNAL(sgSendDisLibDone()), this, SLOT(onSendDisLibDone()));
connect(this, SIGNAL(sgShowChannelRes(QString)), this, SLOT(onShowChannel(QString)));
}
{//PLC tcp 通讯
m_pPlcDevice = new QPLCDevice();
m_pPlcDevice->onInitDevice();
m_pPlcDevice->onStartServer(10100);
connect(m_pPlcDevice, SIGNAL(sgTrigerCam(int)), this, SLOT(onPLCTrigerCam(int)));
}
{
/*启动之后就一直发送心跳包和厚度查询*/
if (DetectState::instance()->m_AutoSendTick2Net)
{
SendTiskTsk->setSleepTime(1000);
SendTiskTsk->start();
}
//if (DetectState::instance()->m_StartAndDetect == 1)//m_sysType 表示万丰科技的
{
QTimer::singleShot(3000, [&](){
ui.btn_start_detect->setText(tr("停止检测"));
DetectState::instance()->IsDetect = true;
m_pCtrl->onStart();
});
}
if (DetectState::instance()->m_AutoSendTick2COM)
m_wfPulseTimer.start(1000);
pTickThread = new QThread(this);
QNetTickThread *pNetTick = new QNetTickThread;
pNetTick->setNetPtr(m_pNet);
pNetTick->moveToThread(pTickThread);
connect(pTickThread, &QThread::finished, pNetTick, &QObject::deleteLater);
connect(this, SIGNAL(sgNetData(int, QVariantMap)), pNetTick, SLOT(doWork(int, QVariantMap)));
connect(pNetTick, SIGNAL(resultReady(int, QVariantMap)), m_pNet, SLOT(onSendDataByType(int, QVariantMap)));
pTickThread->start();
}
{
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);
//m_PulseTimer.start(1000);
connect(this, SIGNAL(sgAutoExposure()), this, SLOT(onAutoExposure()));
QString strPath = QApplication::applicationDirPath();
readExposureTimeConfig(strPath);
}
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 (SendModelLibTask)
{
qDebug() << "delete SendModelLibTak";
if (SendModelLibTask->isRunning())
SendModelLibTask->stop();
SendModelLibTask->wait(50);
delete SendModelLibTask;
SendModelLibTask = NULL;
qDebug() << "delete SendModelLibTak end";
}
if (SendTiskTsk)
{
qDebug() << "delete SendTiskTsk";
if (SendTiskTsk->isRunning())
SendTiskTsk->stop();
SendTiskTsk->wait(50);
delete SendTiskTsk;
SendTiskTsk = NULL;
qDebug() << "delete SendTiskTsk end";
}
if (pTickThread)
{
qDebug() << "delete pTickThread";
if (pTickThread->isRunning())
{
pTickThread->quit();
pTickThread->wait(50);
}
delete pTickThread;
pTickThread = NULL;
qDebug() << "delete pTickThread end";
}
{
if (m_pLbCurrentTime)
{
delete m_pLbCurrentTime;
m_pLbCurrentTime = nullptr;
}
//if (m_pLbBanci)
//{
// delete m_pLbBanci;
// m_pLbBanci = 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 (pWorkCtrl)
{
delete pWorkCtrl;
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_pTimerMgrDlg) {
delete m_pTimerMgrDlg;
m_pTimerMgrDlg = nullptr;
}
if (m_pSystemSettingDlg)
{
delete m_pSystemSettingDlg;
m_pSystemSettingDlg = 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_pDllCoreCtrl)
{
delete m_pDllCoreCtrl;
m_pDllCoreCtrl = nullptr;
}
if (m_pDllEngineCtrl)
{
delete m_pDllEngineCtrl;
m_pDllEngineCtrl = nullptr;
}
if (m_pDesigner)
{
delete m_pDesigner;
m_pDesigner = nullptr;
}
if (m_pPlcDevice)
{
delete m_pPlcDevice;
m_pPlcDevice = 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);
//m_pDesigner->ShowMainFrame();
}
}
}
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;
}
}
//if (strLangage == "Chinese")
// return;
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)执行定位算法,解析定位算法的结果
*/
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;
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;
if (DetectState::instance()->m_showThressList == 1) {
QString str = m_pCtrl->getThicknessStr();
emit(sgShowMsg(str, true));
}
QVariantMap vMap;
int nThickness = 0;
if (DetectState::instance()->m_IsUseRaster == 0)
nThickness = m_nWfThress;
else
nThickness = m_pCtrl->getThickness();// m_houduVec.first();
vMap.insert("thickness", QVariant(nThickness));
double dDiameter = 0;// = (-794.25 * nThickness / 1000000.0 + 0.775960);
dDiameter = (DetectState::instance()->m_k * nThickness + DetectState::instance()->m_b);
vMap.insert("d2h", dDiameter);
vMap.insert("useThickness", DetectState::instance()->bUseThickness);
vMap.insert("useDiameter", DetectState::instance()->bUseDiameter);
vMap.insert("Threshold", DetectState::instance()->m_AlgThres);
vMap.insert("IsCutImg", DetectState::instance()->m_UseCutImg);
vMap.insert("useBackground", DetectState::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 (DetectState::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";
/*中心坐标偏移值计算*/
valueRlt.center = centerPoint;
//
if (dAngle >= 361)//NG
{
ui.main_value_Result->setText("找不到气门芯");
ui.main_value_Center_point->setText("-");
ui.main_value_Score->setText(QString("%1").arg(matchScore));
saveValveImage(maskImg);
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)
m_ImgViewer->setImg(maskImg);
}
/*展示结果*/
}
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_setting_ip" == strObj) {
if (m_pNet)
m_pNet->onShowIpDlg(this);
}
else if ("action_cali_raster" == strObj) {//光栅测试
if (m_pCtrl)
{
m_pCtrl->onShowRaster(this);
}
}
else if ("action_setting_ban" == strObj) {
if (m_pTimerMgrDlg) {
m_pTimerMgrDlg->setParent(this);
m_pTimerMgrDlg->setWindowTitle(tr("班次管理"));
m_pTimerMgrDlg->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pTimerMgrDlg->setWindowIcon(QIcon(":/image/leaper"));
m_pTimerMgrDlg->setWindowModality(Qt::ApplicationModal);
m_pTimerMgrDlg->setAttribute(Qt::WA_ShowModal, true);
m_pTimerMgrDlg->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_pSystemSettingDlg)
{
m_pSystemSettingDlg->setParent(this);
m_pSystemSettingDlg->onShowWidget(lpGlobalData::instance()->m_level);
m_pSystemSettingDlg->setWindowTitle(tr("系统参数设置"));
m_pSystemSettingDlg->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pSystemSettingDlg->setWindowIcon(QIcon(":/image/leaper"));
m_pSystemSettingDlg->setWindowModality(Qt::ApplicationModal);
m_pSystemSettingDlg->setAttribute(Qt::WA_ShowModal, true);
m_pSystemSettingDlg->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 (DetectState::instance()->IsDetect == false) {
ui.btn_start_detect->setText(tr("停止检测"));
m_pCtrl->onStart();
QString str = tr("按下了开始检测按钮,检测功能开启");
m_pCtrl->addLog(str, emTypeRunState);
DetectState::instance()->bLockDetect = true;
}
else {
m_pCtrl->onFinish();
ui.btn_start_detect->setText(tr("开始检测"));
QString str = tr("按下了停止检测按钮,检测功能关闭");
m_pCtrl->addLog(str, emTypeRunState);
DetectState::instance()->bLockDetect = false;
}
DetectState::instance()->IsDetect = !DetectState::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()) {
m_pCtrl->onClear();
// ui.main_lb_res_ok_num->setText(QString::number(0));
// ui.main_lb_res_ng_num->setText(QString::number(0));
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("检测状态:") + (DetectState::instance()->IsDetect == true ? tr("检测中...") : tr("未检测..."));
m_pLbDetectState->setText(strDetectState);
if (DetectState::instance()->IsDetect) {
m_pLbDetectState->setStyleSheet("font: bold 14px;background-color: green;");
}
else {
m_pLbDetectState->setStyleSheet("font: bold 14px;background-color: red;");
}
}
//if (m_pLbBanci) {
// QString show_label;
// if (m_pCtrl)
// show_label = m_pCtrl->getCurrentBan();
// QString strMsg = tr("班次信息:") + (show_label.isEmpty() == true ? tr("该时间段未设置班次") : show_label);
// m_pLbBanci->setText(strMsg);
// m_pLbBanci->setStyleSheet("font: 14px;");
//}
if (m_pLbUser) {
QString show_label = m_pCtrl->getUserName();
// if (strLanguage != "Chinese")
// m_pLbUser->setText(tr("User:") + show_label);
// else
m_pLbUser->setText(tr("当前用户:") + show_label);
m_pLbUser->setStyleSheet("font: 14px;");
}
}
}
void lpMainWin::closeEvent(QCloseEvent *event)
{
}
void lpMainWin::SendModelKuTskFun()
{
/*
发送模板库线程
把已有的所有模板库全部发送至PLC中
*/
DetectState::instance()->m_ThreadWaitTime = 100;
const int c_nErrorTime = 3;
int nError = 0;
QMap<QString, IWheelModel*>*ptr = m_pCtrl->getAllModelMapPtr();
QList<QString> lst = ptr->keys();
if (ptr->size() > 0 && lst.size() > 0)
{
int nIndex = 0;
do
{
IWheelModel *p = ptr->value(lst.at(nIndex));
emit sgTaskSendModels(nIndex + 1, lst.at(nIndex), p->getDiameter(), p->getThickness());
bool b = this->SendModelLibTask->WaitForSingle(DetectState::instance()->m_ThreadWaitTime);
if (!b) {
nError++;
if (DetectState::instance()->m_PLC_ASK == 1) {
if (nError > c_nErrorTime) {
++nIndex;
nError = 0;
qDebug() << "timeout, more than 3 times, cannot rev ask";
}
}
else {
++nIndex;
nError = 0;
}
}
else {
nError = 0;
nIndex++;
}
} while (nIndex < lst.size());
}
emit(sgShowMsgdlg(tr("模板库发送完成")));
}
void lpMainWin::SendTickTskFun()
{
//心跳包发送
if (m_pNet)
{
m_pNet->sendPulse(6000, DetectState::instance()->IsDetect, DetectState::instance()->IsOnline);
//m_TimerID = startTimer(500);
}
}
void lpMainWin::onSetModel()
{
/*
重新加载模板
重新设置模板到算法中使用
*/
forDefectList = 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);
// IWheelUi *pMainWidget = m_pUi->getItemWidget(WHEEL_UI_MAINWINDOW);
// if (pMainWidget) {
// pMainWidget->setViewList(forDefectList);
// }
// void* address = (void*)m_pCtrl->getAllModelMapPtr();
// gpTpCoreCtrl->ISetAlgorithmShared("modelMap", (int)address);
// QVariant filepath = QVariant(QCoreApplication::applicationDirPath());
// gpTpCoreCtrl->ISetAlgorithmShared("filepath", filepath);
//
// void* pdefectList = (void*)&forDefectList;
// gpTpCoreCtrl->ISetAlgorithmShared("defectList", (int)pdefectList);
}
///*******************************************************************************
Q_SLOT void lpMainWin::onUpdateDefect() {
forDefectList = 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::onSendClearLib2PLC()
{
if (m_pNet)
m_pNet->sendClearLib();
}
Q_SLOT void lpMainWin::onClientConnect(QString addr, bool bConnect)
{
/*判断连接的机器IP地址是不是本地设置好的IP并检测他的连接状态如果是 默认将发送模板库给他*/
QString m_addr = NetProtocol::genAddressPort(m_pNet->getIp(emNetClient), m_pNet->getPort(emNetClient));
if (m_addr == addr && bConnect)
{
QTimer::singleShot(200, this, SLOT(onSendClearLib2PLC()));
}
if (bConnect == true && 1 == DetectState::instance()->IsOnline) {
//m_pUi->onSwitchOnlineModel(m_pState->IsOnline);//在线模式 离线模式切换
}
QString strMsg;
if (bConnect)
{
strMsg += QString("IP:%1 %2").arg(addr).arg(tr("已连接"));
}
else
{
strMsg += QString("IP:%1 %2").arg(addr).arg(tr("已断开"));
}
m_pCtrl->addLog(strMsg, emTypeRunState);
ui.main_textBrowser->append(strMsg);
}
Q_SLOT void lpMainWin::onThickness(double dValue)
{
m_pCtrl->appendThicknessValue(dValue);
}
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::onClearLibRev(bool state)
{
/*接收到库清空应答*/
if (SendModelLibTask) {
if (SendModelLibTask->isRunning())
SendModelLibTask->stop();
if (m_pNet)
m_pNet->sendModelNum(m_pCtrl->getAllModelMapPtr()->size());
SendModelLibTask->start();
}
}
//接收到心跳包 关闭定时器
Q_SLOT void lpMainWin::onPulseRev()
{
if (m_TimerID != 0)
{
killTimer(m_TimerID);
m_TimerOutCount = 0;
m_RestartServerCount = 0;
}
}
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触发相机的信号 自检是否收到图像 */
qDebug() << "recv a camera trig :" << QString::number(m_value);
qWarning() << "recv a Triger signal from PLC:" << "(" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") << ")";
//if (m_pState)//如果是使用软件触发相机拍照
{
//if (DetectState::instance()->m_CameraTrigeType == 0)//软件触发模式
{
if (DetectState::instance()->IsDetect == true) {
// if (m_exposureTimeCount != 0)
// {
// m_pCoreCtrl->ISetExposureTime(m_camKey, m_exposureTimeArray[m_exposureTimeCount]);
// }
onTriggerCam();
qWarning() << "soft ctrol camera :" << "(" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") << ")";
}
}
}
}
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::onPulseTimer()
{
//心跳包发送
if (m_pNet)
{
m_pNet->sendPulse(6000, DetectState::instance()->IsDetect, DetectState::instance()->IsOnline);
//m_TimerID = startTimer(500);
}
}
Q_SLOT void lpMainWin::onTaskSendModels(int nIndex, QString strModel, double dDiameter, double dHeight)
{
if (m_pNet)
m_pNet->sendModelList(nIndex, strModel, dDiameter, dHeight);
}
Q_SLOT void lpMainWin::onTaskSendDetectState(int nIndex, QString strModel, int IsState)
{
if (m_pNet)
m_pNet->sendDeteStateList(nIndex, IsState, strModel);
}
Q_SLOT void lpMainWin::onTaskCheck(int nIndex, int IsState, QString strModel)
{
if (m_pNet)
m_pNet->sendCheckDeteStateList(nIndex, IsState, strModel);
}
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::onSendDisLib(int nIndex, QString strModel)
{
m_pNet->sendDisLibs(nIndex, strModel);
}
Q_SLOT void lpMainWin::onSendDisLibDone()
{
m_pNet->sendDisLibsDone();
}
Q_SLOT void lpMainWin::onShowChannel(QString str)
{
//ui.main_lb_res_Channle_Show->setText(str);
}
Q_SLOT void lpMainWin::onTriggerCam()
{
if (m_pCoreCtrl)
{
QStringList strLst = m_pCoreCtrl->ICameraKeys();
m_pCoreCtrl->ISnapImage(strLst);
}
}
Q_SLOT void lpMainWin::onChangePLCParam()
{
if (m_pNet)
m_pNet->sendTrigerPara(DetectState::instance()->m_PLC_TrigerFilter, DetectState::instance()->m_PLC_CamTrigDelay, DetectState::instance()->m_PLC_CamTrigPulse, DetectState::instance()->m_PLC_LightDelay, DetectState::instance()->m_PLC_TrigerType, DetectState::instance()->m_PLC_ResHoldTime);
}
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(aboutString);
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()) {
DetectState::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());
}
}
DetectState::instance()->totalDetectNum++;
//show
// ui.main_lb_res_ng_num->setText(QString::number(DetectState::instance()->totalUnDetectNum));
// ui.main_lb_res_ok_num->setText(QString::number(DetectState::instance()->totalDetectNum));
ui.main_lb_res_model_time->setText(QString::number(pRlt->m_dRunTime, 'f', 2)+"s");
// ui.main_lb_res_model_thickness->setText(QString::number((int)pRlt->m_dThickness));
// ui.main_lb_res_model_diameter->setText(QString::number((int)pRlt->m_dDiameter));
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::SendResultBee(emTypeBee m_Type, int num)
{
if (m_Type == LIGHT_REDBEE) {
m_pNet->sendLight(0, 1, 500, 500);//红灯
}
else if (m_Type == LIGHT_GREENBEE) {
m_pNet->sendLight(2, 1, 500, 500);
}
else if (m_Type == LIGHT_YELLOWBEE) {
m_pNet->sendLight(1, 1, 500, 500);
}
else if (m_Type == LIGHT_BEE) {
m_pNet->sendLight(3, 1, 500, 500);
}
}
void lpMainWin::SendResultStr2PLC(Result2Ui* m_Res)
{
qDebug() << "sendResultToPLC resultName=" << m_Res->m_strModel << endl;
if (m_pNet)
m_pNet->sendDetectResult(m_Res->m_strModel, m_Res->m_dDiameter, m_Res->m_dThickness);
}
void lpMainWin::SendResultChannel2PLC(Result2Ui* m_Res)
{
qDebug() << "SendResultChannel2PLC";
CChannelInfo *pChannelInfo = m_pCtrl->getChannelInfo();
ChannelInfo *npInfo = pChannelInfo->getChannelInfo(m_Res->m_strModel);
if (npInfo && DetectState::instance()->m_bObjAll2A == false) {
if (m_pNet)
m_pNet->sendResultChannel(npInfo->m_value, m_Res->m_dDiameter, m_Res->m_dThickness, m_Res->m_strModel);
emit(sgShowChannelRes(npInfo->m_ChannelName));
}
else
{
int defaultChannel = pChannelInfo->getDefaultChannel();
ChannelInfo *defaultInfo = pChannelInfo->getChannelInfo(defaultChannel);
int nResultChannel = 0;
if (defaultInfo)
{
nResultChannel = defaultInfo->m_value;
emit(sgShowChannelRes(defaultInfo->m_ChannelName + tr("(默认)")));
}
else
{
nResultChannel = 1000;
emit(sgShowChannelRes(tr("默认通道 值1000")));
}
if (m_pNet)
m_pNet->sendResultChannel(nResultChannel, m_Res->m_dDiameter, m_Res->m_dThickness, m_Res->m_strModel);
}
}
void lpMainWin::SendResultChannelCOM(Result2Ui* m_Res)
{
//qDebug() << "SendResultStr2COM";
//if (!m_pCtrl)
// return;
//CChannelInfo *pChannelInfo = m_pCtrl->getChannelInfo();
//ChannelInfo *npInfo = pChannelInfo->getChannelInfo(m_Res->m_strModel);
//SComframe frame;
//if (npInfo&&m_pState->m_bObjAll2A == false) {
// frame.data1 = npInfo->m_value;
// SendDataToCom(0x47, frame);
// emit(sgShowChannelRes(npInfo->m_ChannelName));
//}
//else
//{
// int defaultChannel = pChannelInfo->getDefaultChannel();
// ChannelInfo *defaultInfo = pChannelInfo->getChannelInfo(defaultChannel);
// if (defaultInfo)
// {
// frame.data1 = defaultInfo->m_value;
// emit(sgShowChannelRes(defaultInfo->m_ChannelName + QString(tr("(默认)"))));
// }
// else
// {
// frame.data1 = 1000;
// emit(sgShowChannelRes(tr("默认通道 值1000")));
// }
// SendDataToCom(0x47, frame);
//}
}
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(DetectState::instance()->m_SaveImgDirPath);
if (!IsTestDir)
DetectState::instance()->m_SaveImgDirPath = DetectState::instance()->m_applicationDirPath;
QString baseSavePath = DetectState::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 (DetectState::instance()->saveGood == 1) {
goodsourceDir += "\\Source";
goodsourceDir += "\\";
goodsourceDir += pRes->m_strModel;
QString resultpath = goodsourceDir + "\\" + filename + ".png";
saveImage(pRes->m_pixSrc, goodsourceDir + "\\", filename + ".png");
}
QString goodtargetDir = fileSavePath + "\\Good";
if (DetectState::instance()->saveCutGood == 1) {
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 (DetectState::instance()->saveBad == 1) {
errorSourceDir += "\\Source";
QString resultpath = errorSourceDir + "\\" + filename + ".png";
saveImage(pRes->m_pixSrc, errorSourceDir + "\\", filename + ".png");
}
QString errortargetDir = fileSavePath + "\\Error";
if (DetectState::instance()->saveCutBad == 1) {
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)
{//启动多线程保存图像
return;
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);
}
Q_SLOT void lpMainWin::onSendReadOnlineLib()
{
if (m_pNet)
m_pNet->sendCheckAllModelState();
}
Q_SLOT void lpMainWin::onThicknessTimer()
{
//查询厚度
if (m_pNet)
m_pNet->sendThickness();
}
Q_SLOT void lpMainWin::onwfPulseTimer()
{
// SComframe frame;
// frame.data1 = 0;
// frame.data2 = 0;
// frame.data8 = 50;
// SendDataToCom(0x43, frame);
}
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!";
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_pixSrc = QPixmap::fromImage(vMap.value("pixSrc").value<QImage>());
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)
{
return;
QString strModeName = rlt.strModel;//型号名
QDir testDir;
bool IsTestDir = testDir.exists(DetectState::instance()->m_SaveImgDirPath);
if (!IsTestDir)
DetectState::instance()->m_SaveImgDirPath = DetectState::instance()->m_applicationDirPath;
QString baseSavePath = DetectState::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;
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;
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);
}
}
void lpMainWin::saveValveImage(QImage image, QString strName)
{
QString strModeName = strName;//型号名
QPixmap pixmap = QPixmap::fromImage(image);
QDir testDir;
bool IsTestDir = testDir.exists(DetectState::instance()->m_SaveImgDirPath);
if (!IsTestDir)
DetectState::instance()->m_SaveImgDirPath = DetectState::instance()->m_applicationDirPath;
QString baseSavePath = DetectState::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();
}