|
|
#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);
|
|
|
}
|
|
|
}
|
|
|
|