82 lines
3.4 KiB
C++
82 lines
3.4 KiB
C++
#include "mainwindow.h"
|
|
#include "ui_mainwindow.h"
|
|
#include <QDateTime>
|
|
#include <QMetaType>
|
|
#include <thread>
|
|
|
|
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_presenter(nullptr)
|
|
{
|
|
ui->setupUi(this);
|
|
m_logModel = new QStringListModel(this);
|
|
ui->listView_log->setModel(m_logModel);
|
|
|
|
qRegisterMetaType<WorkpiecePositionDetectionResult>("WorkpiecePositionDetectionResult");
|
|
qRegisterMetaType<WorkStatus>("WorkStatus");
|
|
qRegisterMetaType<WorkpieceCenterPosition>("WorkpieceCenterPosition");
|
|
|
|
connect(this, &MainWindow::workStatusUpdateRequested, this, &MainWindow::updateWorkStatusLabel);
|
|
connect(this, &MainWindow::detectionResultUpdateRequested, this, &MainWindow::updateDetectionResultDisplay);
|
|
connect(this, &MainWindow::logUpdateRequested, this, &MainWindow::updateDetectionLog);
|
|
|
|
Init();
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
if (m_presenter) delete m_presenter;
|
|
delete ui;
|
|
}
|
|
|
|
void MainWindow::updateStatusLog(const QString& message) { emit logUpdateRequested(message); }
|
|
|
|
void MainWindow::Init()
|
|
{
|
|
m_presenter = new WorkpiecePositionPresenter();
|
|
m_presenter->SetStatusCallback(this);
|
|
std::thread([this]() { m_presenter->Init(); }).detach();
|
|
}
|
|
|
|
void MainWindow::OnStatusUpdate(const std::string& msg) { updateStatusLog(QString::fromStdString(msg)); }
|
|
void MainWindow::OnDetectionResult(const WorkpiecePositionDetectionResult& result) { emit detectionResultUpdateRequested(result); }
|
|
void MainWindow::OnBinocularMarkConnectionChanged(bool connected) { updateStatusLog(QString("BinocularMark: %1").arg(connected ? "已连接" : "断开")); }
|
|
void MainWindow::OnEpicEyeConnectionChanged(bool connected) { updateStatusLog(QString("EpicEye: %1").arg(connected ? "已连接" : "断开")); }
|
|
void MainWindow::OnWorkStatusChanged(WorkStatus status) { emit workStatusUpdateRequested(status); }
|
|
|
|
void MainWindow::updateWorkStatusLabel(WorkStatus status)
|
|
{
|
|
ui->label_status->setText(QString::fromStdString(WorkStatusToString(status)));
|
|
}
|
|
|
|
void MainWindow::updateDetectionResultDisplay(const WorkpiecePositionDetectionResult& result)
|
|
{
|
|
displayMarkData(result.marks);
|
|
if (!result.positions.empty()) displayCenterPosition(result.positions[0]);
|
|
}
|
|
|
|
void MainWindow::updateDetectionLog(const QString& message)
|
|
{
|
|
if (!m_logModel) return;
|
|
QStringList list = m_logModel->stringList();
|
|
list.append(QString("[%1] %2").arg(QDateTime::currentDateTime().toString("hh:mm:ss")).arg(message));
|
|
m_logModel->setStringList(list);
|
|
}
|
|
|
|
void MainWindow::on_btn_start_clicked() { if (m_presenter) m_presenter->StartDetection(); }
|
|
void MainWindow::on_btn_stop_clicked() { if (m_presenter) m_presenter->StopDetection(); }
|
|
|
|
void MainWindow::displayMarkData(const std::vector<VrMark3D>& marks)
|
|
{
|
|
QString info = QString("%1个Mark:\n").arg(marks.size());
|
|
for (size_t i = 0; i < marks.size(); i++) {
|
|
info += QString("%1: ID=%2 (%.2f,%.2f,%.2f)\n").arg(i+1).arg(marks[i].markID)
|
|
.arg(marks[i].x,0,'f',2).arg(marks[i].y,0,'f',2).arg(marks[i].z,0,'f',2);
|
|
}
|
|
ui->textEdit_marks->setPlainText(info);
|
|
}
|
|
|
|
void MainWindow::displayCenterPosition(const WorkpieceCenterPosition& pos)
|
|
{
|
|
QString info = QString("中心点:\nX:%.2f\nY:%.2f\nZ:%.2f").arg(pos.x,0,'f',2).arg(pos.y,0,'f',2).arg(pos.z,0,'f',2);
|
|
ui->textEdit_center->setPlainText(info);
|
|
}
|