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.

1739 lines
53 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 "CMainWin.h"
#include <QDateTime>
#include <QMessageBox>
#include <QCloseEvent>
#include <QLibrary>
#include <QProcess>
#include <QMenu>
#include <QToolButton>
#include "quserinfo_global.h"
#include "Serialport_global.h"
#include "WfCtrl.h"
#include "lpGlobalConfig.h"
#include "lpGlobalData.h"
#include "lpSysConfig.h"
#include "lpSysLog.h"
#include "lpCryptokey.h"
#include "saveimgthread.h"
#include "QDiskCleanThread.h"
#define LEAPER_LOGO ":/leaper/Resource/app.png"
#define WINDOWS_ICON ":/leaper/Resource/app.png"
#define DELETE_POINTER(p) if (p) {delete p; p = NULL;}
#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_Grayscale8:
case QImage::Format_Indexed8:
mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat;
}
CMainWin::CMainWin(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
lpSysLog::instance()->Init();
lpSysConfig::instance()->readConfig();
lpSysConfig::instance()->writeConfig();
lpGlobalConfig::instance()->readConfig();
SetLanguage(lpSysConfig::instance()->m_CurLanguage);//语言设置
setWindowIcon(QIcon(LEAPER_LOGO));
onInitCoreCtrl();//核心模块
onInitSerial();//串口通讯模块
onInitUser();//用户登录模块
onInitUI();//其他UI
onInitStatus();//状态栏
onInitDiskClean();//定期删除任务
SYSLOG_STATUS << "系统启动";
{
QString strPath = QCoreApplication::applicationDirPath();
QString DBFilePath = strPath + "\\DBFiles";
QDir dbDir;
dbDir.mkpath(DBFilePath);
m_db = new StationDB(DBFilePath + "\\AntMan.db");
m_db->InitDatabase();
}
m_pCameraTrig = new AutoTrigger;
connect(m_pCameraTrig, SIGNAL(sgTrig()), this, SLOT(onTrigImage()));
connect(&m_devMgrWid, SIGNAL(sgChangeLanguage(QString)), this, SLOT(onLanguageChange(QString)));
connect(&m_testWid, SIGNAL(sgTestMode(int)), this, SLOT(onTestMode(int)));
m_pWfCtrl = new CWfCtrl(m_pDetectorEngine);
m_pWfCtrl->onInit();
m_mangeWid.onInitModelList(m_pWfCtrl);
QStringList strList = m_pWfCtrl->IGetStationKeys();
foreach(QString str, strList) {
IStation *pS = m_pWfCtrl->IGetStationByKey(str);
connect(pS, SIGNAL(sgShowModeName(QString, QString)), this, SLOT(onShowName(QString, QString)));
}
m_pWfCtrl->ISelModel(lpGlobalConfig::instance()->m_StationSolution_1, lpGlobalConfig::instance()->m_StationRunModel_1);
m_pWfCtrl->ISelModel(lpGlobalConfig::instance()->m_StationSolution_2, lpGlobalConfig::instance()->m_StationRunModel_2);
m_pImageCaliUI = new lpImageCaliUI();//图像标定页面
m_pImageCaliUI4P = new lpImageCaliUI4P();//图像标定页面
lpGlobalData::instance()->m_bCheckLinese = lpCheckKey::instance()->checkLinese();
m_pCheckLineseUI = new QCryptokeyUI();
connect(m_pCheckLineseUI, SIGNAL(sgRegisterFinish(bool)), this, SLOT(onLineseCheck(bool)));
onLineseCheck(lpGlobalData::instance()->m_bCheckLinese);
m_TimerID_Status = startTimer(1000);
//ui.actionSystem->setDisabled(true);
//ui.actionTest->setDisabled(true);
//ui.actionStandard->setDisabled(true);
m_solotions = m_pDetectorEngine->getSolutionMgr()->GetAllSolutions().keys();
if (m_solotions.size() <= 1)
{
ui.groupBox_2->setVisible(false);
}
m_timerA.setSingleShot(true);
m_timerB.setSingleShot(true);
}
CMainWin::~CMainWin()
{
m_timerA.stop();
m_timerB.stop();
DELETE_POINTER(m_pCameraTrig);
if (m_db)
{
delete m_db;
m_db = NULL;
}
if (m_pUserCtrl) {
delete m_pUserCtrl;
m_pUserCtrl = NULL;
}
if (m_pSerialPort) {
m_HeartBit.stop();
m_pSerialPort->CloseCom();
delete m_pSerialPort;
m_pSerialPort = NULL;
}
if (m_pDesigner)
{
delete m_pDesigner;
m_pDesigner = nullptr;
}
if (m_pDllDesigner)
{
delete m_pDllDesigner;
m_pDllDesigner = nullptr;
}
if (m_pDllDetectorEngine)
{
delete m_pDllDetectorEngine;
m_pDllDetectorEngine = nullptr;
}
//load coretrl
if (m_pDllCoreCtrl)
{
delete m_pDllCoreCtrl;
m_pDllCoreCtrl = nullptr;
}
if (m_pWfCtrl)
{
delete m_pWfCtrl;
m_pWfCtrl = nullptr;
}
{
if (m_ImgViewer_A)
{
delete m_ImgViewer_A;
m_ImgViewer_A = nullptr;
}
if (m_ImgViewer_B)
{
delete m_ImgViewer_B;
m_ImgViewer_B = nullptr;
}
}
if (m_pLabelInfo)
{
delete m_pLabelInfo;
m_pLabelInfo = nullptr;
}
if (m_pLbCurrentTime)
{
delete m_pLbCurrentTime;
m_pLbCurrentTime = nullptr;
}
if (m_pLbOnLine)
{
delete m_pLbOnLine;
m_pLbOnLine = nullptr;
}
if (m_pLbUser)
{
delete m_pLbUser;
m_pLbUser = nullptr;
}
if (m_pLbConnect)
{
delete m_pLbConnect;
m_pLbConnect = nullptr;
}
if (m_pImageCaliUI)
{
delete m_pImageCaliUI;
m_pImageCaliUI = nullptr;
}
if (m_pImageCaliUI4P)
{
delete m_pImageCaliUI4P;
m_pImageCaliUI4P = nullptr;
}
if (m_pCheckLineseUI)
{
delete m_pCheckLineseUI;
m_pCheckLineseUI = nullptr;
}
if (m_pDCThreadList.size() > 0){
for (int nIndex = 0; nIndex < m_pDCThreadList.size(); nIndex++)
{
QDiskCleanThread *pDCThread = m_pDCThreadList.at(nIndex);
if (pDCThread)
{
pDCThread->ExitThread();
pDCThread->quit();
pDCThread->wait();
delete pDCThread;
pDCThread = NULL;
}
}
}
m_pDCThreadList.clear();
lpSysConfig::uninstance();
rmTranslator();
lpSysLog::uninstance();
}
//相机原图接收回调 用于展示图像
void CMainWin::INewCameraImage(const QString& camKey, QImage img)
{
emit sgShowSrcImg(camKey, img);
QString solutionName;
QString strRunModel;
int stationID = 0;
if (camKey == lpGlobalConfig::instance()->m_StationCamKey_1)
{
solutionName = lpGlobalConfig::instance()->m_StationSolution_1;
strRunModel = lpGlobalConfig::instance()->m_StationRunModel_1;
stationID = 1;
}
else if (camKey == lpGlobalConfig::instance()->m_StationCamKey_2)
{
solutionName = lpGlobalConfig::instance()->m_StationSolution_2;
strRunModel = lpGlobalConfig::instance()->m_StationRunModel_2;
stationID = 2;
}
onShowImage(stationID, img);
if (solutionName.isEmpty())
{
}
else {
QString strMode = strRunModel;
cv::Mat srcMat = QImageToMat(img);
AlgResultCallBack func = std::bind(&CMainWin::IEngineResult, this, std::placeholders::_1);
m_pDetectorEngine->detectByName(srcMat, solutionName, strMode, func);
}
}
//算法结果接收
void CMainWin::IVariantMapToUI(const QString& camKey, const QVariantMap& vMap)
{
}
QVariant CMainWin::IGetVariantById(int id)
{
return QVariant();
}
QString CMainWin::genSaveSrcImgPath(int stationID, QString modelName, QImage &img)
{
QString strStation = (stationID == 1 ? "Station1" : "Station2");
QString strApp = QApplication::applicationDirPath();
QString targetPath = strApp + "/DBFiles/SrcImages";
QString strData = QDateTime::currentDateTime().toString("yyyy-MM-dd");
QString strFileName = QDateTime::currentDateTime().toString("yyyy_MM_dd_hhmmsszzz") + ".jpg";
targetPath = targetPath + "/" + strData + "/" + strStation + "/" + modelName;
QDir dir;
dir.mkpath(strApp + targetPath);
if (!img.isNull()) {
saveImage(img, targetPath, strFileName);
}
targetPath = targetPath + "/" + strFileName;
return targetPath;
}
QString CMainWin::genSavePath(int stationID, QString modelName, QImage &img)
{
QString strStation = (stationID == 1 ? "Station1" : "Station2");
QString strApp = QApplication::applicationDirPath();
QString targetPath = strApp + "/DBFiles/Images";
QString strData = QDateTime::currentDateTime().toString("yyyy-MM-dd");
QString strFileName = QDateTime::currentDateTime().toString("yyyy_MM_dd_hhmmsszzz") + ".jpg";
targetPath = targetPath + "/" + strData + "/" + strStation + "/"+ modelName;
QDir dir;
dir.mkpath(strApp + targetPath);
if (!img.isNull()) {
saveImage(img, targetPath, strFileName);
}
targetPath = targetPath + "/" + strFileName;
return targetPath;
}
Q_SLOT void CMainWin::onAppanalysis(SComFrame frame)
{
//数据接收
int nCmd = frame.cmd;
if (0x43 == nCmd)//心跳 型号切换
{
onHeartComm(frame);
m_heartTimeOut = 0;
m_bPLCConnect = true;
return;
}
else if (0x50 == nCmd) {//触发相机
int nCameraID = -1;
if (5 == frame.data1) {
nCameraID = 1;
}
else if (6 == frame.data1) {
nCameraID = 2;
}
if (lpGlobalConfig::instance()->m_bOnlineMode == true)//是PLC控制台切换型号模式 进入型号判断
{
if (nCameraID == 1)
{
if (m_timerA.isActive())
return;
int t = lpGlobalConfig::instance()->trigerFilter;
if(t>0)
m_timerA.start(t);
if (m_StationInfo_1.m_bRunEnable == true)
{
QString strCam = lpGlobalConfig::instance()->m_StationCamKey_1;
m_pCoreCtrl->ISnapImage(QStringList() << strCam);
}
else {
QString strMsg = QString("%1:该型号ID:%2在模型库中不存在不能拍照").arg(QTime::currentTime().toString("hh:mm:ss zzz:")).arg(m_StationInfo_1.m_PLCID);
emit sgShowLog(1, strMsg);
if (m_StationInfo_1.m_PLCID > 0) {
sendResult(1, 999, 0, 0);
SYSLOG_STATUS << QString("●工位%1:收到触发信号,因索引不合法所以没触发相机拍照,发送了999角度数据,型号为[%2],型号索引ID为[%3],时间:%4")
.arg(nCameraID)
.arg(m_StationInfo_1.strModelName.isEmpty() == true ? "" : m_StationInfo_1.strModelName)
.arg(m_StationInfo_1.m_PLCID)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
}
else {
SYSLOG_STATUS << QString("●工位%1:收到触发信号,因索引不合法所以没触发相机拍照,型号为[%2],型号索引ID为[%3],时间:%4")
.arg(nCameraID)
.arg(m_StationInfo_1.strModelName.isEmpty() == true ? "" : m_StationInfo_1.strModelName)
.arg(m_StationInfo_1.m_PLCID)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
}
}
}
else if (nCameraID == 2)
{
if (m_timerB.isActive())
return;
int t = lpGlobalConfig::instance()->trigerFilter;
if (t > 0)
m_timerB.start(t);
if (m_StationInfo_2.m_bRunEnable == true)
{
QString strCam = lpGlobalConfig::instance()->m_StationCamKey_2;
m_pCoreCtrl->ISnapImage(QStringList() << strCam);
}
else
{
QString strMsg = QString("%1:该型号ID:%2在模型库中不存在不能拍照").arg(QTime::currentTime().toString("hh:mm:ss zzz:")).arg(m_StationInfo_2.m_PLCID);
emit sgShowLog(2, strMsg);
if (m_StationInfo_2.m_PLCID > 0) {
sendResult(2, 999, 0, 0);
SYSLOG_STATUS << QString("●工位%1:收到触发信号,因索引不合法所以没触发相机拍照,发送了999角度数据,型号为[%2],型号索引ID为[%3],时间:%4")
.arg(nCameraID)
.arg(m_StationInfo_2.strModelName.isEmpty() == true ? "" : m_StationInfo_2.strModelName)
.arg(m_StationInfo_2.m_PLCID)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
}
else {
SYSLOG_STATUS << QString("●工位%1:收到触发信号,因索引不合法所以没触发相机拍照,型号为[%2],型号索引ID为[%3],时间:%4")
.arg(nCameraID)
.arg(m_StationInfo_2.strModelName.isEmpty() == true ? "" : m_StationInfo_2.strModelName)
.arg(m_StationInfo_2.m_PLCID)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
}
}
}
}
else//不是PLC切换型号模式 可以触发拍照
{
if (nCameraID == 1)
{
if (m_timerA.isActive())
return;
int t = lpGlobalConfig::instance()->trigerFilter;
if (t > 0)
m_timerA.start(t);
QString strCam = lpGlobalConfig::instance()->m_StationCamKey_1;
m_pCoreCtrl->ISnapImage(QStringList() << strCam);
}
else if (nCameraID == 2)
{
if (m_timerB.isActive())
return;
int t = lpGlobalConfig::instance()->trigerFilter;
if (t > 0)
m_timerB.start(t);
QString strCam = lpGlobalConfig::instance()->m_StationCamKey_2;
m_pCoreCtrl->ISnapImage(QStringList() << strCam);
}
}
}
else if (0xf1 == nCmd)
{//接收到下位机的命令关闭所有窗口 关机
qApp->closeAllWindows();
}
}
void CMainWin::onHeartComm(SComFrame &frame)
{
static int nS1 = -1;
static int nS2 = -1;
if (lpGlobalConfig::instance()->m_bOnlineMode == true)
{
int nSta1 = frame.data1;
int nSta2 = frame.data2;
if (nS1 != nSta1 || nS2 != nSta2)
{
nS1 = nSta1;
nS2 = nSta2;
}
else
return;
QStringList lstKeys = m_pWfCtrl->IGetStationKeys();
for each (QString var in lstKeys)
{
IStation *pStation = m_pWfCtrl->IGetStationByKey(var);
if (!pStation) {
continue;
}
int mmCmd = 0;
if (var == lpGlobalConfig::instance()->m_StationSolution_1)
{
mmCmd = frame.data1;
QString strModel = pStation->modelByPlcCmd(mmCmd);
if (!strModel.isEmpty())
{
if (m_StationInfo_1.m_PLCID != mmCmd)
{
m_StationInfo_1.m_PLCID = mmCmd;
m_StationInfo_1.strModelName = strModel;
SYSLOG_STATUS << QString("★工位%1:切换型号为[%2],型号索引ID为[%3],时间:%4")
.arg(1)
.arg(strModel)
.arg(mmCmd)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
if (m_pWfCtrl) {
m_pWfCtrl->ISelModel(var, strModel);
lpGlobalConfig::instance()->m_StationRunModel_1 = strModel;
}
}
m_StationInfo_1.m_bRunEnable = true;
}
else {
if (m_StationInfo_1.m_PLCID != mmCmd) {
m_StationInfo_1.m_PLCID = mmCmd;
m_StationInfo_1.strModelName = strModel;
if (mmCmd <= 0)
SYSLOG_STATUS << QString("★工位%1:型号清零,型号索引ID为[%2],时间:%3")
.arg(1)
.arg(mmCmd)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
else
SYSLOG_STATUS << QString("★工位%1:型号切换失败,对应的索引不存在,型号索引ID为[%2],时间:%3")
.arg(1)
.arg(mmCmd)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
}
m_StationInfo_1.m_bRunEnable = false;
if (mmCmd > 0)
{
QString strMsg = QString("%1:型号设置失败,模型库中不存在索引%2").arg(QTime::currentTime().toString("hh:mm:ss zzz:")).arg(mmCmd);
emit sgShowLog(1, strMsg);
}
}
}
else if (var == lpGlobalConfig::instance()->m_StationSolution_2)
{
mmCmd = frame.data2;
QString strModel = pStation->modelByPlcCmd(mmCmd);
if (!strModel.isEmpty())
{
if (m_StationInfo_2.m_PLCID != mmCmd) {
m_StationInfo_2.m_PLCID = mmCmd;
m_StationInfo_2.strModelName = strModel;
SYSLOG_STATUS << QString("★工位%1:切换型号为[%2],型号索引ID为[%3],时间:%4")
.arg(2)
.arg(strModel)
.arg(mmCmd)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
if (m_pWfCtrl) {
m_pWfCtrl->ISelModel(var, strModel);
lpGlobalConfig::instance()->m_StationRunModel_2 = strModel;
}
}
m_StationInfo_2.m_bRunEnable = true;
}
else {
if (m_StationInfo_2.m_PLCID != mmCmd) {
m_StationInfo_2.m_PLCID = mmCmd;
m_StationInfo_2.strModelName = strModel;
if (mmCmd <= 0)
SYSLOG_STATUS << QString("★工位%1:型号清零,型号索引ID为[%2],时间:%3")
.arg(2)
.arg(mmCmd)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
else
SYSLOG_STATUS << QString("★工位%1:型号切换失败,对应的索引不存在,型号索引ID为[%2],时间:%3")
.arg(2)
.arg(mmCmd)
.arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz"));
}
m_StationInfo_2.m_bRunEnable = false;
if (mmCmd > 0) {
QString strMsg = QString("%1:型号设置失败,模型库中不存在索引%2").arg(QTime::currentTime().toString("hh:mm:ss zzz:")).arg(mmCmd);
emit sgShowLog(2, strMsg);
}
}
}
}
}
else {
nS1 = -1;
nS2 = -1;
m_StationInfo_1.m_PLCID = 0;
m_StationInfo_2.m_PLCID = 0;
}
}
Q_SLOT void CMainWin::onHeardBit()
{
if (m_pSerialPort) {
SComFrame frame;
memset(&frame, 0, sizeof(SComFrame));
frame.cmd = 0x43;
frame.data7 = 200;
frame.data8 = 0x50;
m_pSerialPort->enquequeData(frame);
}
}
Q_SLOT void CMainWin::onActionClicked()
{
QString strObj = sender()->objectName();
if ("actionSetting" == strObj) {//标定
if (m_pDesigner) {
m_pDesigner->ShowMainFrame(this);
}
}
else if ("actionManage" == strObj) {//模板管理
m_mangeWid.setParent(this);
m_mangeWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_mangeWid.setWindowModality(Qt::ApplicationModal);
m_mangeWid.setAttribute(Qt::WA_ShowModal, true);
m_mangeWid.show();
}
else if ("actionTest" == strObj) {//测试
m_testWid.setParent(this);
m_testWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
//m_testWid.setWindowModality(Qt::ApplicationModal);
//m_testWid.setAttribute(Qt::WA_ShowModal, true);
m_testWid.show();
}
else if ("actionHelp" == strObj) {//帮助
m_aboutWid.setParent(this);
m_aboutWid.setWindowIcon(QIcon(LEAPER_LOGO));
m_aboutWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_aboutWid.setWindowModality(Qt::ApplicationModal);
m_aboutWid.setAttribute(Qt::WA_ShowModal, true);
m_aboutWid.show();
}
else if ("action_Check" == strObj) {//历史记录查询
QProcess process;
process.setWorkingDirectory(QCoreApplication::applicationDirPath());
#ifdef _DEBUG
QString strTaskName = "Reportd.exe";
#else
QString strTaskName = "Report.exe";
#endif
process.startDetached(strTaskName);
}
else if ("actionSystem" == strObj) {//系统参数设置
m_devMgrWid.setParent(this);
m_devMgrWid.setWindowIcon(QIcon(LEAPER_LOGO));
m_devMgrWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
//m_devMgrWid.setWindowModality(Qt::ApplicationModal);
//m_devMgrWid.setAttribute(Qt::WA_ShowModal, true);
QStringList camkeys = m_pCoreCtrl->ICameraKeys();
QStringList solutions = m_pDetectorEngine->getSolutionMgr()->GetAllSolutions().keys();
m_devMgrWid.setSystemConfig(camkeys, solutions);
if (solutions.size() <= 1)
m_devMgrWid.setStationFlags(false);
m_devMgrWid.show();
}
else if ("main_Login_action" == strObj) {//用户登陆
if (m_pUserCtrl) {
if (m_pUserCtrl->getLoginState() == EM_LOGIN)
{
QMessageBox infobox(QMessageBox::Information, QString(QObject::tr("提示")), QString(QObject::tr("你确定要注销%1 ?")).arg(m_pUserCtrl->CurUser()), QMessageBox::Yes | QMessageBox::No, NULL);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, QString("确认"));
infobox.setButtonText(QMessageBox::No, QString("取消"));
if (infobox.exec() == QMessageBox::Yes) {
m_pUserCtrl->LogOutUser();
}
}
else
m_pUserCtrl->CheckLogin(this);
}
else
{
QMessageBox infobox(QMessageBox::Information, QString(QObject::tr("提示")), QString(QObject::tr("该功能未启用.")), QMessageBox::Yes, NULL);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, QString(QObject::tr("确认")));
infobox.exec();
}
}
else if ("main_action_userManager" == strObj) {//用户管理
if (m_pUserCtrl) {
m_pUserCtrl->ShowUserMgrDlg(this);
}
else
{
QMessageBox infobox(QMessageBox::Information, QString(QObject::tr("提示")), QString(QObject::tr("该功能未启用.")), QMessageBox::Yes, NULL);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, QString(QObject::tr("确认")));
infobox.exec();
}
}
else if ("actionStandard" == strObj) {
if (lpGlobalConfig::instance()->bUse4PointStand == true)
{
if (m_pImageCaliUI4P) {
m_pImageCaliUI4P->setParent(this);
m_pImageCaliUI4P->setWindowTitle(tr("图像标定 4点标定"));
m_pImageCaliUI4P->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pImageCaliUI4P->setWindowIcon(QIcon(WINDOWS_ICON));
m_pImageCaliUI4P->setWindowModality(Qt::ApplicationModal);
m_pImageCaliUI4P->setAttribute(Qt::WA_ShowModal, true);
if (m_solotions.size() <= 1)
m_pImageCaliUI4P->setStationFlags(false);
m_pImageCaliUI4P->show();
}
}
else {
if (m_pImageCaliUI) {
m_pImageCaliUI->setParent(this);
m_pImageCaliUI->setWindowTitle(tr("图像标定 2点标定"));
m_pImageCaliUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pImageCaliUI->setWindowIcon(QIcon(WINDOWS_ICON));
m_pImageCaliUI->setWindowModality(Qt::ApplicationModal);
m_pImageCaliUI->setAttribute(Qt::WA_ShowModal, true);
if (m_solotions.size() <= 1)
m_pImageCaliUI->setStationFlags(false);
m_pImageCaliUI->show();
}
}
}
else if ("actionRegister" == strObj) {
if (m_pCheckLineseUI) {
m_pCheckLineseUI->setInfo(lpCheckKey::instance()->getSerialNo(), lpGlobalData::instance()->m_bCheckLinese);
m_pCheckLineseUI->setParent(this);
m_pCheckLineseUI->setWindowTitle(tr("注册"));
m_pCheckLineseUI->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_pCheckLineseUI->setWindowIcon(QIcon(WINDOWS_ICON));
m_pCheckLineseUI->setWindowModality(Qt::ApplicationModal);
m_pCheckLineseUI->setAttribute(Qt::WA_ShowModal, true);
m_pCheckLineseUI->show();
}
}
}
void CMainWin::timerEvent(QTimerEvent *event)
{
if (m_TimerID_Status == event->timerId())
{
onUpdateStatus();
}
}
void CMainWin::closeEvent(QCloseEvent *event)
{
QMessageBox info(this);
info.setWindowIcon(QIcon(LEAPER_LOGO));
info.setWindowTitle(QObject::tr("警告"));
info.setText(QObject::tr("本检测系统正在运行,您真的要关闭?"));
info.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
info.setButtonText(QMessageBox::Ok, QObject::tr("确定"));
info.setButtonText(QMessageBox::Cancel, QObject::tr("取消"));
if (info.exec() != QMessageBox::Ok)
{
event->ignore();
}
else
event->accept();
}
void CMainWin::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange)
{
ui.retranslateUi(this);
}
}
//初始化状态栏
void CMainWin::onInitStatus()
{
m_pLbCurrentTime = new QLabel(QObject::tr("系统时间"));
m_pLbCurrentTime->setMinimumHeight(40);
m_pLbOnLine = new QLabel(QObject::tr("模式:"));
m_pLbUser = new QLabel(QObject::tr("用户:无"));
m_pLbConnect = new QLabel(QObject::tr("连接状态:"));
m_pLbOnLine->setAlignment(Qt::AlignCenter);
m_pLbConnect->setAlignment(Qt::AlignCenter);
m_pLbUser->setAlignment(Qt::AlignCenter);
m_pLbCurrentTime->setAlignment(Qt::AlignCenter);
ui.statusBar->addWidget(m_pLbConnect,50);
ui.statusBar->addWidget(m_pLbOnLine,50);
ui.statusBar->addWidget(m_pLbUser,50);
ui.statusBar->addPermanentWidget(m_pLbCurrentTime,50);
}
void CMainWin::onUpdateStatus()
{
m_tickCount++;
m_heartTimeOut++;
if (m_heartTimeOut > 5)//统计心跳超时次数 用于判断连接是否超时
{
m_bPLCConnect = false;
m_heartTimeOut = 0;
}
if (m_pLbCurrentTime) {
QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString strlong = SecondTimeString(m_tickCount);
QString strTimeTitle = tr("运行时长:");
QString strShow = QString("%1 %2 %3").arg(currentTime).arg(strTimeTitle).arg(strlong);
m_pLbCurrentTime->setText(strShow);
m_pLbCurrentTime->setStyleSheet("font: 14px;");
}
if (m_pLbOnLine) {
QString strOnlineState = QString(QObject::tr("检测模式:"))
+ (lpGlobalConfig::instance()->m_bOnlineMode == true ? QObject::tr("在线模式") : QObject::tr("离线模式"));
m_pLbOnLine->setText(strOnlineState);
m_pLbOnLine->setStyleSheet("font: 14px;");
}
if (m_pLbConnect) {
QString strOnlineState = QString(QObject::tr("连接状态:"))
+ (m_bPLCConnect == true ? QObject::tr("连接正常") : QObject::tr("连接异常"));
m_pLbConnect->setText(strOnlineState);
if (m_bPLCConnect == true)
{
m_pLbConnect->setStyleSheet("font: 14px;background-color: rgb(63, 170, 24);");
}
else {
m_pLbConnect->setStyleSheet("font: 14px;background-color: rgb(200, 10, 10);");
}
}
if (m_pLbUser) {
m_pLbUser->setText(QObject::tr("用户: %1").arg(m_strUserName.isEmpty()==true?QObject::tr("未登录"):m_strUserName));
}
}
bool CMainWin::onInitCoreCtrl()
{
//load coretrl 初始化框架模块
if (NULL == m_pDllCoreCtrl)
{
m_pDllCoreCtrl = new CDllCoreCtrl(QStringList());
if (NULL == m_pDllCoreCtrl)
{
return false;
}
m_pCoreCtrl = m_pDllCoreCtrl->m_pCoreCtrl;
if (m_pCoreCtrl == nullptr)//corectrl 加载失败
{
QMessageBox infobox(QMessageBox::Critical, tr("提示"), tr("Corectrl模块加载失败,请检查!"), QMessageBox::Yes, this);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, tr("确认"));
infobox.exec();
exit(0);
}
FuncCallBack_VarInt getVarfunc = std::bind(&CMainWin::IGetVariantById, this, std::placeholders::_1);
m_pCoreCtrl->IRegisterGetVariant(getVarfunc);
FuncCallBack_StrMap strMapfunc = std::bind(&CMainWin::IVariantMapToUI, this, std::placeholders::_1, std::placeholders::_2);
m_pCoreCtrl->IRegisterResultCallBack(strMapfunc);
FuncCallBack_StrImg strImgfunc = std::bind(&CMainWin::INewCameraImage, this, std::placeholders::_1, std::placeholders::_2);
m_pCoreCtrl->IRegisterImageCallBack(strImgfunc);
if (m_pCoreCtrl->ICameraKeys().size() <= 0)
{
QMessageBox infobox(QMessageBox::Critical, tr("提示"), tr("camera.json文件出错,请检查!"), QMessageBox::Yes, this);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, tr("确认"));
infobox.exec();
exit(0);
}
}
//load engine
if (NULL == m_pDllDetectorEngine)
{
m_pDllDetectorEngine = new CDllDetectorEngine();
if (NULL == m_pDllDetectorEngine)
{
return false;
}
m_pDetectorEngine = m_pDllDetectorEngine->m_pDE;
if (m_pDetectorEngine == nullptr)
{
QMessageBox infobox(QMessageBox::Critical, tr("提示"), tr("lpbengine模块加载失败,请检查!"), QMessageBox::Yes, this);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, tr("确认"));
infobox.exec();
exit(0);
}
}
if (m_pDllDesigner == nullptr)
{
m_pDllDesigner = new CDllDesigner();
if (m_pDllDesigner != nullptr)
{
m_pDesigner = m_pDllDesigner->GetDesignerInterface();
if (m_pDesigner && m_pDetectorEngine)
{
m_pDesigner->Initialize(m_pDetectorEngine);
}
else {
QMessageBox infobox(QMessageBox::Critical, tr("提示"), tr("lpdesigner模块加载失败,请检查!"), QMessageBox::Yes, this);
infobox.setWindowIcon(QIcon(":/image/leaper"));
infobox.setButtonText(QMessageBox::Yes, tr("确认"));
infobox.exec();
exit(0);
}
}
}
return true;
}
void CMainWin::onInitDevice()
{
QStringList strCamKeys = m_pCoreCtrl->ICameraKeys();
for (int nIndex = 0; nIndex < strCamKeys.size(); nIndex++)
{
QString camKey = strCamKeys.at(nIndex);
m_pCoreCtrl->IOpenCamera(camKey);
m_pCoreCtrl->IStartCamera(camKey);
}
}
void CMainWin::onInitUser()
{
{//用户管理模块加载
#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 CMainWin::onInitSerial()
{
{//串口设备加载
#ifdef _DEBUG
QLibrary lib("SerialPortToold");//库文件名
#else
QLibrary lib("SerialPortTool");//库文件名
#endif
_SerialPortCreate func = (_SerialPortCreate)lib.resolve("SerialPortCreate");
if (func)
m_pSerialPort = func();
//load seriport dll
if (m_pSerialPort)//如果文件存在 使用自定义的串口
{
m_pSerialPort->loadAnalysefunc(this, &CMainWin::onRecvComData);
connect(this, SIGNAL(sgRecvData(SComFrame)), this, SLOT(onAppanalysis(SComFrame)));
//关闭框架的串口使用
QString strDefaultPort = lpSysConfig::instance()->m_ComName;
int baut = lpSysConfig::instance()->m_Baut;
bool bOpen = m_pSerialPort->OpenCom(strDefaultPort, QString::number(baut));
if (bOpen == false)
{
QMessageBox infobox(QMessageBox::Information, QString(QObject::tr("提示")), QString("Com %1 %2 open failed").arg(strDefaultPort).arg(baut), QMessageBox::Yes | QMessageBox::No, NULL);
infobox.setWindowIcon(QIcon(LEAPER_LOGO));
infobox.exec();
}
connect(&m_HeartBit, SIGNAL(timeout()), this, SLOT(onHeardBit()));
m_HeartBit.start(300);
}
}
}
void CMainWin::onInitUI()
{
//检测结果图展示 UI初始化
{
QGridLayout *pLayout_A = new QGridLayout(ui.widget_A);//A侧相机结果图展示UI
m_ImgViewer_A = new RoiImgViewer(ui.widget_A);
m_ImgViewer_A->setObjectName("m_ImgViewer_A");
connect(m_ImgViewer_A, SIGNAL(sgImageScale(qreal)), this, SLOT(onImageScale(qreal)));
pLayout_A->addWidget(m_ImgViewer_A);
ui.widget_A->setLayout(pLayout_A);
QGridLayout *pLayout_B = new QGridLayout(ui.widget_B);//B侧相机结果图展示UI
m_ImgViewer_B = new RoiImgViewer(ui.widget_A);
m_ImgViewer_B->setObjectName("m_ImgViewer_B");
connect(m_ImgViewer_B, SIGNAL(sgImageScale(qreal)), this, SLOT(onImageScale(qreal)));
pLayout_B->addWidget(m_ImgViewer_B);
ui.widget_B->setLayout(pLayout_B);
QString strPath = QApplication::applicationDirPath() + "/showImg.ini";//图像展示比例的参数
QSettings setting(strPath, QSettings::IniFormat);
double nScale_A = setting.value("ShowImg/ScaleA", 0.53).toDouble();
double nScale_B = setting.value("ShowImg/ScaleB", 0.53).toDouble();
m_ImgViewer_A->setInitScale(nScale_A);
m_ImgViewer_B->setInitScale(nScale_B);
m_ImgViewer_A->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_ImgViewer_A, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onPopMenu(const QPoint&)));
m_ImgViewer_B->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_ImgViewer_B, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onPopMenu(const QPoint&)));
}
QFont font;
//工具栏菜单
QMenu *pToolMenu = new QMenu(this);
pToolMenu->addAction(ui.actionStandard);//系统配置
pToolMenu->addAction(ui.actionSystem);//测试调试
pToolMenu->addAction(ui.actionTest);
QToolButton* pbutton = new QToolButton(this);
pbutton->setMenu(pToolMenu);
pbutton->setIcon(QIcon(":/toolbar/Resource/toolBar/setting.png"));
pbutton->setText(tr("工具"));
pbutton->setToolTip(tr("工具"));
pbutton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
pbutton->setPopupMode(QToolButton::InstantPopup);
font.setBold(false);
font.setPixelSize(16);
pbutton->setFont(font);
ui.mainToolBar->addWidget(pbutton);
QMenu *pHelpMenu = new QMenu(this);
pHelpMenu->addAction(ui.actionHelp);
pHelpMenu->addAction(ui.actionRegister);
QToolButton* pHelptool = new QToolButton(this);
pHelptool->setMenu(pHelpMenu);
pHelptool->setIcon(QIcon(":/toolbar/Resource/toolBar/help.png"));
pHelptool->setText(tr("帮助"));
pHelptool->setToolTip(tr("帮助"));
pHelptool->setFont(font);
pHelptool->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
pHelptool->setPopupMode(QToolButton::InstantPopup);
ui.mainToolBar->addWidget(pHelptool);
ui.mainToolBar->addSeparator();
m_pLabelInfo = new QLabel(this);
m_pLabelInfo->setText(tr("本系统未注册激活"));
m_pLabelInfo->setStyleSheet("font: bold 14px; color: red;");
ui.mainToolBar->addWidget(m_pLabelInfo);
//工具栏按钮事件绑定
connect(ui.actionSetting, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actionManage, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actionTest, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actionHelp, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.action_Check, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actionSystem, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.main_Login_action, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.main_action_userManager, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actionStandard, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actionRegister, SIGNAL(triggered()), this, SLOT(onActionClicked()));
//图像结果展示
connect(this, SIGNAL(sgShowImg(int, QImage)), this, SLOT(onShowImage(int, QImage)));
connect(this, SIGNAL(sgSelModel(int, QString)), this, SLOT(onSelModel(int, QString)));
connect(this, SIGNAL(sgShowLog(int, QString)), this, SLOT(onShowLog(int, QString)));
ui.main_action_userManager->setVisible(false);
QTextDocument *pDoc = ui.wf_text_edit_result_1->document();
pDoc->setMaximumBlockCount(200);
pDoc = ui.wf_text_edit_result_2->document();
pDoc->setMaximumBlockCount(200);
// ui.wf_lb_image_show_1->setContextMenuPolicy(Qt::CustomContextMenu);
// connect(ui.wf_lb_image_show_1, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onPopMenu(const QPoint&)));
// ui.wf_lb_image_show_2->setContextMenuPolicy(Qt::CustomContextMenu);
// connect(ui.wf_lb_image_show_2, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onPopMenu(const QPoint&)));
connect(this, SIGNAL(sgShowSrcImg(QString, QImage)), &m_camSetWid, SLOT(onShowImage(QString, QImage)));
}
//======系统翻译相关
void CMainWin::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 CMainWin::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;
}
}
Q_SLOT void CMainWin::onLanguageChange(QString strLanguage)
{
// QSettings languageSetting(lpSysConfig::instance()->getCfgPath(), QSettings::IniFormat);
// languageSetting.value("language/select", "Chinese").toString();
if (strLanguage == lpSysConfig::instance()->m_CurLanguage)
return;
lpSysConfig::instance()->m_CurLanguage = strLanguage;
lpSysConfig::instance()->writeConfig();
SetLanguage(strLanguage);
}
void CMainWin::SetLanguage(QString strLangage)
{
QString strDirPath = QString(QCoreApplication::applicationDirPath() + "/language/");
QString translatorFileName = strLangage;
if (!translatorFileName.isEmpty())
{
rmTranslator();
QLocale::setDefault(QLocale(translatorFileName));
QString transDir = strDirPath + translatorFileName;
SearchQmFile(transDir);
}
}
void CMainWin::rmTranslator()
{
if (m_VecTranPtr.size() > 0)
{
while (m_VecTranPtr.size())
{
QTranslator *pVa = m_VecTranPtr.takeFirst();
qApp->removeTranslator(pVa);
delete pVa;
pVa = NULL;
}
}
}
//相机触发
Q_SLOT void CMainWin::onSnapImage(int nCamera /*= -1*/)
{
if (nCamera == 1)
{
QString camKey = lpGlobalConfig::instance()->m_StationCamKey_1;
m_pCoreCtrl->ISnapImage(QStringList() << camKey);
}
else if (nCamera == 2)
{
QString camKey = lpGlobalConfig::instance()->m_StationCamKey_2;
m_pCoreCtrl->ISnapImage(QStringList() << camKey);
}
}
Q_SLOT void CMainWin::onTrigImage()
{
onSnapImage(1);
onSnapImage(2);
}
Q_SLOT void CMainWin::onChangeUI(QString strUsr, int nLevel)
{
switch (nLevel) {
case 9:
case 8:
case 7:
case 6:
ui.main_action_userManager->setVisible(true);
ui.actionSystem->setDisabled(false);
ui.actionTest->setDisabled(false);
ui.actionStandard->setDisabled(false);
break;
case 5:
ui.main_action_userManager->setVisible(true);
ui.actionSystem->setDisabled(false);
ui.actionTest->setDisabled(false);
ui.actionStandard->setDisabled(false);
break;
case 4:
case 3:
case 2:
case 1:
case 0:
ui.main_action_userManager->setVisible(false);
ui.actionSystem->setDisabled(true);
ui.actionTest->setDisabled(true);
ui.actionStandard->setDisabled(true);
break;
default:
break;
}
}
Q_SLOT void CMainWin::onLogInOut(QString strName, int level, int state)
{
onChangeUI(strName, level);
m_strUserName = strName;
if (state == 0) {
ui.main_Login_action->setText(QObject::tr("注 销"));
}
else
{
ui.main_Login_action->setText(QObject::tr("登 录"));
}
}
Q_SLOT void CMainWin::onTestMode(int val)
{
if (val == 0) {
m_pCameraTrig->start(5000);
}
else if(val ==1){
m_pCameraTrig->stop();
}
else if (val == 2) {
onSnapImage(1);
}
else if (val == 3) {
onSnapImage(2);
}
}
//展示结果图片
Q_SLOT void CMainWin::onShowImage(int ID, QImage img)
{
auto ShowImg=[&](QLabel* pLab ,QImage& img) {
if (!pLab) {
qDebug() << "label image is null";
return;
}
if (img.isNull())
{
QString str = QObject::tr("检测到错误: 模型与图像尺寸不匹配,请重新标定模型!!!");
pLab->setText(str);
}
else
{
QRect rt = pLab->rect();
int h = img.height();
int w = img.width();
float d = w * 1.0 / h;
if (d > 0)
{
int h2 = rt.width() / d;
rt.setHeight(h2);
}
QImage imgShow = img.scaled(QSize(rt.size()));
pLab->setPixmap(QPixmap::fromImage(imgShow));
}
};
if (ID == 1)
{
if(m_ImgViewer_A)
m_ImgViewer_A->setImg(img);
//ShowImg(ui.wf_lb_image_show_1,img);
}
else if (ID == 2)
{
if (m_ImgViewer_B)
m_ImgViewer_B->setImg(img);
//ShowImg(ui.wf_lb_image_show_2, img);
}
}
//展示正在检测的型号名
Q_SLOT void CMainWin::onShowName(QString ID, QString strName)
{
if (ID == lpGlobalConfig::instance()->m_StationSolution_1) {
ui.wf_lb_station_name_1->setText(strName);
}
else if (ID == lpGlobalConfig::instance()->m_StationSolution_2) {
ui.wf_lb_station_name_2->setText(strName);
}
}
//展示log
Q_SLOT void CMainWin::onShowLog(int nID, QString strMsg)
{
if (nID == 1) {
if (ui.wf_text_edit_result_1->toPlainText().size() > 50000)
ui.wf_text_edit_result_1->clear();
ui.wf_text_edit_result_1->append(strMsg);
}
else if (nID == 2) {
if (ui.wf_text_edit_result_2->toPlainText().size() > 50000)
ui.wf_text_edit_result_2->clear();
ui.wf_text_edit_result_2->append(strMsg);
}
}
Q_SLOT void CMainWin::onPopMenu(const QPoint& pt)
{
/*根据UI名判断是哪个工位需要设置相机*/
QString strCamKey;
//QString strObj = sender()->objectName();
//if ("wf_lb_image_show_1" == strObj)
if(m_ImgViewer_A == sender())
{
strCamKey = lpGlobalConfig::instance()->m_StationCamKey_1;
}
//else if ("wf_lb_image_show_2" == strObj)
else if (m_ImgViewer_B == sender())
{
strCamKey = lpGlobalConfig::instance()->m_StationCamKey_2;
}
QStringList camkeys = m_pCoreCtrl->ICameraKeys();
if (!camkeys.contains(strCamKey) || strCamKey.isEmpty())
{
QMessageBox infobox(QMessageBox::Critical, tr("提示"), tr("请对该工位的相机进行绑定!"), QMessageBox::Yes, this);
infobox.setWindowIcon(QIcon(WINDOWS_ICON));
infobox.setButtonText(QMessageBox::Yes, tr("确认"));
infobox.exec();
return ;
}
QMenu menu;
QAction *pSetAction = menu.addAction(tr("相机配置"));
pSetAction->setObjectName("setAction");
QAction *pSelect = menu.exec(QCursor::pos());
if (!pSelect)
{
menu.clear();
return;
}
QString strObjAction = pSelect->objectName();
if (strObjAction == "setAction") {
m_camSetWid.setParent(this);
m_camSetWid.setWindowIcon(QIcon(LEAPER_LOGO));
m_camSetWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
m_camSetWid.setWindowModality(Qt::ApplicationModal);
m_camSetWid.setAttribute(Qt::WA_ShowModal, true);
m_camSetWid.setCamParam(m_pCoreCtrl, strCamKey);
m_camSetWid.show();
}
menu.clear();
}
Q_SLOT void CMainWin::onSlotAddNewModel(QString strName)
{
if (m_pDetectorEngine)
{
IDetectorSolutionMgr* pMgr = m_pDetectorEngine->getSolutionMgr();
if (pMgr)
{
IDetectorSolution* pSolution = pMgr->GetRunSolution();
if (pSolution) {
pSolution->AddTaskByTemplate(strName);
pSolution->SaveTaskByName(strName);
}
}
}
}
Q_SLOT void CMainWin::onSlotDelOldModel(QString strName)
{
if (m_pDetectorEngine) {
IDetectorSolutionMgr* pMgr = m_pDetectorEngine->getSolutionMgr();
if (pMgr) {
IDetectorSolution* pSolution = pMgr->GetRunSolution();
if (pSolution) {
pSolution->DeleteTask(strName);
pSolution->SaveTaskByName("");
}
}
}
}
void CMainWin::IEngineResult(QVariantMap vMap)
{
QImage srcImg = vMap.value("originImage").value<QImage>();
bool taskCali = vMap.value("taskCali").toBool();//标定标志位 使用有标定图来判断
QString solutionName = vMap.value("solutionName").toString();
QString taskName = vMap.value("taskName").toString();
double taskTime = vMap.value("tasktime").toDouble();
if (solutionName.isEmpty())
return;
if (taskCali == false)//模板未标定
{
int stationID = 0;
if (solutionName == lpGlobalConfig::instance()->m_StationSolution_1)
{
stationID = 1;
}
else if (solutionName == lpGlobalConfig::instance()->m_StationSolution_2)
{
stationID = 2;
}
QString strResult = QTime::currentTime().toString("hh:mm:ss zzz:") + taskName;
strResult += " No Cali!!!";
emit sgShowLog(stationID, strResult);
sendResult(stationID, 361, 0, 0);
//只保存原图
if ((lpSysConfig::instance()->m_bSaveSrcImg_st1 == true && stationID == 1)
|| (lpSysConfig::instance()->m_bSaveSrcImg_st2 == true && stationID == 2))
genSaveSrcImgPath(stationID, taskName, srcImg);
return;
}
//不包含算法检测结果表示没有相关task
if (!vMap.contains("AlgoResult"))
{
int stationID = 0;
if (solutionName == lpGlobalConfig::instance()->m_StationSolution_1)
{
stationID = 1;
}
else if (solutionName == lpGlobalConfig::instance()->m_StationSolution_2)
{
stationID = 2;
}
onShowImage(stationID, srcImg);
QString strResult = QTime::currentTime().toString("hh:mm:ss zzz:") + taskName;
strResult += " No Task!!!";
emit sgShowLog(stationID, strResult);
sendResult(stationID, 361, 0, 0);
if ((lpSysConfig::instance()->m_bSaveSrcImg_st1 == true && stationID == 1)
|| (lpSysConfig::instance()->m_bSaveSrcImg_st2 == true && stationID == 2))
genSaveSrcImgPath(stationID, taskName, srcImg);
}
else {
QVariantMap algResult = vMap.value("AlgoResult").toMap();
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 rltImg = algResult.value("image").value<QImage>();
QString strResultTip = algResult.value("resultTip").toString();
QPointF centerPoint = algResult.value("centerPoint").toPointF();
double centerX = 0.0;
double centerY = 0.0;
int stationID = 0;
if (solutionName == lpGlobalConfig::instance()->m_StationSolution_1)
{
if (lpGlobalConfig::instance()->bUse4PointStand == false)//使用的是两点标定方案
{
if (lpGlobalConfig::instance()->m_StationXYTrans_1 == true) {
centerY = centerPoint.x() * lpGlobalConfig::instance()->m_StationScale_1 + lpGlobalConfig::instance()->m_StationXOffset_1;
centerX = centerPoint.y() * lpGlobalConfig::instance()->m_StationScale_1 + lpGlobalConfig::instance()->m_StationYOffset_1;
}
else {
centerX = centerPoint.x() * lpGlobalConfig::instance()->m_StationScale_1 + lpGlobalConfig::instance()->m_StationXOffset_1;
centerY = centerPoint.y() * lpGlobalConfig::instance()->m_StationScale_1 + lpGlobalConfig::instance()->m_StationYOffset_1;
}
}
else {//使用的是四点标定方案
QPointF tmpCenter = transWorldPoint(centerPoint, lpGlobalConfig::instance()->stationParam1.matix);
if (lpGlobalConfig::instance()->stationParam1.bXYTrans == false)
{
centerX = tmpCenter.x() + lpGlobalConfig::instance()->stationParam1.xPointOffset;
centerY = tmpCenter.y() + lpGlobalConfig::instance()->stationParam1.yPointOffset;
}
else {
centerY = tmpCenter.x() + lpGlobalConfig::instance()->stationParam1.xPointOffset;
centerX = tmpCenter.y() + lpGlobalConfig::instance()->stationParam1.yPointOffset;
}
}
sendResult(1, dAngle, centerX, centerY);
stationID = 1;
}
else if (solutionName == lpGlobalConfig::instance()->m_StationSolution_2)
{
if (lpGlobalConfig::instance()->bUse4PointStand == false)//使用的是两点标定方案
{
if (lpGlobalConfig::instance()->m_StationXYTrans_2 == true) {
centerY = centerPoint.x() * lpGlobalConfig::instance()->m_StationScale_2 + lpGlobalConfig::instance()->m_StationXOffset_2;
centerX = centerPoint.y() * lpGlobalConfig::instance()->m_StationScale_2 + lpGlobalConfig::instance()->m_StationYOffset_2;
}
else {
centerX = centerPoint.x() * lpGlobalConfig::instance()->m_StationScale_2 + lpGlobalConfig::instance()->m_StationXOffset_2;
centerY = centerPoint.y() * lpGlobalConfig::instance()->m_StationScale_2 + lpGlobalConfig::instance()->m_StationYOffset_2;
}
}
else//使用的是四点标定方案
{
QPointF tmpCenter = transWorldPoint(centerPoint, lpGlobalConfig::instance()->stationParam2.matix);
if (lpGlobalConfig::instance()->stationParam2.bXYTrans == false)
{
centerX = tmpCenter.x() + lpGlobalConfig::instance()->stationParam2.xPointOffset;
centerY = tmpCenter.y() + lpGlobalConfig::instance()->stationParam2.yPointOffset;
}
else {
centerY = tmpCenter.x() + lpGlobalConfig::instance()->stationParam2.xPointOffset;
centerX = tmpCenter.y() + lpGlobalConfig::instance()->stationParam2.yPointOffset;
}
}
sendResult(2, dAngle, centerX, centerY);
stationID = 2;
}
/******保存数据********/
QString strImgPath;
if ((lpSysConfig::instance()->m_bSaveRltImg_st1 == true && stationID == 1)
|| (lpSysConfig::instance()->m_bSaveRltImg_st2 == true && stationID == 2))
strImgPath = genSavePath(stationID,taskName, rltImg);
if ((lpSysConfig::instance()->m_bSaveSrcImg_st1 == true && stationID == 1)
|| (lpSysConfig::instance()->m_bSaveSrcImg_st2 == true && stationID == 2))
genSaveSrcImgPath(stationID,taskName, srcImg);
QString str2 = taskName;
int ID = stationID;
QString strModelName = QString("%1_%2").arg(ID).arg(str2);
Struct2SaveData nStructData;
nStructData.dAngle = dAngle;
nStructData.errorType = errorType;
nStructData.matchScore = matchScore;
//nStructData.threshBenchMark = threshBenchMark;
nStructData.resultTip = strResultTip;
nStructData.stationName = QString("Station_%1").arg(stationID);
nStructData.value1 = strImgPath;
nStructData.value2 = str2;
m_db->addData2DB(nStructData);
/*展示结果*/
onShowImage(stationID, rltImg);
/********打印检测结果到ui上*********/
QString strResult = QTime::currentTime().toString("hh:mm:ss zzz:") + taskName;
strResult += " angle : " + QString::number(dAngle, 'f', 3);
if (dAngle >= 361)
{
dAngle = 361.0;
strResult += " no found Value";
}
else {
int lowX = (centerX - (int)centerX) * 1000;
double X = (int)centerX + lowX / 1000.0;
int lowY = (centerY - (int)centerY) * 1000;
double Y = (int)centerY + lowY / 1000.0;
strResult += tr(" center:(%1,%2)").arg(QString::number(X, 'f', 3)).arg(QString::number(Y, 'f', 3));
}
emit sgShowLog(stationID, strResult);
}
}
bool CMainWin::sendResult(int nID, double angleValue, double centerX, double centerY)
{
if (m_pSerialPort)
{
const int c_nDataNum = 8;
const double c_dMaxAngle = 360.0;
if (angleValue < 0) {
angleValue += c_dMaxAngle;
}
unsigned short data[c_nDataNum] = { 0 };
data[2] = int(angleValue);//角度整数部分
double tmp = angleValue - int(angleValue);
tmp *= 1000.0;
data[3] = int(tmp);//角度小数部分
data[4] = int(centerX);
double tmpX = centerX - int(centerX);
tmpX *= 1000.0;
data[5] = int(tmpX);
data[6] = int(centerY);
double tmpY = centerY - int(centerY);
tmpY *= 1000.0;
data[7] = int(tmpY);
SComFrame sendFram;
int nCmd = (nID == 1 ? 0x46 : 0x47);//stion1 0x46 /station2 0x47
sendFram.cmd = nCmd;
sendFram.data1 = data[0];
sendFram.data2 = data[1];
sendFram.data3 = data[2];
sendFram.data4 = data[3];
sendFram.data5 = data[4];
sendFram.data6 = data[5];
sendFram.data7 = data[6];
sendFram.data8 = data[7];
m_pSerialPort->enquequeData(sendFram);
if (angleValue >= c_dMaxAngle) {
unsigned short data2[c_nDataNum] = { 0 };
data2[0] = 6 + nID - 1;
data2[1] = 50;
// for (int i = 0; i < c_nDataNum; i++) {
// swapBigEndian(data2[i]);
// }
SComFrame sendFram2;
sendFram2.cmd = 0x48;
sendFram2.data1 = data2[0];
sendFram2.data2 = data2[1];
sendFram2.data3 = data2[2];
sendFram2.data4 = data2[3];
sendFram2.data5 = data2[4];
sendFram2.data6 = data2[5];
sendFram2.data7 = data2[6];
sendFram2.data8 = data2[7];
m_pSerialPort->enquequeData(sendFram2);
}
}
return true;
}
QString CMainWin::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;
}
//根据注册状态启用相关功能
Q_SLOT void CMainWin::onLineseCheck(bool bFlag)
{
ui.actionSetting->setDisabled(!bFlag);
ui.actionManage->setDisabled(!bFlag);
ui.actionTest->setDisabled(!bFlag);
ui.action_Check->setDisabled(!bFlag);
ui.actionSystem->setDisabled(!bFlag);
ui.main_Login_action->setDisabled(!bFlag);
ui.actionStandard->setDisabled(!bFlag);
if (m_pLabelInfo)
{
if (bFlag)
{
m_pLabelInfo->setText(tr(""));
m_pLabelInfo->setStyleSheet("");
}
else
{
m_pLabelInfo->setText(tr("本系统未注册激活"));
m_pLabelInfo->setStyleSheet("font: bold 14px; color: red;");
}
}
}
void CMainWin::saveImage(const QImage& 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 CMainWin::onRecvComData(SComFrame frame)
{
emit sgRecvData(frame);
}
void CMainWin::onInitDiskClean()
{
{
QString strSrcImgPath = QCoreApplication::applicationDirPath() + "/DBFiles/SrcImages/";
QDiskCleanThread *pDCleanThread = new QDiskCleanThread;
pDCleanThread->setModel(CleanDir);
pDCleanThread->setUseFlag(lpSysConfig::instance()->m_CheckEnable_SrcImg);
pDCleanThread->setDays(lpSysConfig::instance()->m_CheckFileDays);
pDCleanThread->SetImgStorageFolder(strSrcImgPath);
pDCleanThread->setMiniSize(lpSysConfig::instance()->m_MinSpaceSizeG);
pDCleanThread->start();
m_pDCThreadList.append(pDCleanThread);
QString strRltImgPath = QCoreApplication::applicationDirPath() + "/DBFiles/Images/";
QDiskCleanThread *pCleanDir = new QDiskCleanThread;
pCleanDir->setModel(CleanDir);
pCleanDir->setUseFlag(lpSysConfig::instance()->m_CheckEnable_RltImg);
pCleanDir->setDays(lpSysConfig::instance()->m_CheckFileDays);
pCleanDir->SetImgStorageFolder(strRltImgPath);
pCleanDir->setMiniSize(lpSysConfig::instance()->m_MinSpaceSizeG);
pCleanDir->start();
m_pDCThreadList.append(pCleanDir);
}
}
Q_SLOT void CMainWin::onImageScale(qreal value)
{
QString strPath = QApplication::applicationDirPath() + "/showImg.ini";
QSettings setting(strPath, QSettings::IniFormat);
QObject *obj = sender();
if (m_ImgViewer_A == obj)
{
setting.setValue("ShowImg/ScaleA", value);
}
else if (m_ImgViewer_B == obj)
{
setting.setValue("ShowImg/ScaleB", value);
}
}