668 lines
26 KiB
C++
668 lines
26 KiB
C++
#include "dialogalgoarg.h"
|
|
#include "ui_dialogalgoarg.h"
|
|
|
|
#include <QCheckBox>
|
|
#include <QDateTime>
|
|
#include <QDoubleValidator>
|
|
#include <QFormLayout>
|
|
#include <QFont>
|
|
#include <QIntValidator>
|
|
#include <QLineEdit>
|
|
#include <QList>
|
|
#include <QPushButton>
|
|
#include <QScrollArea>
|
|
#include <QTabWidget>
|
|
#include <QVBoxLayout>
|
|
|
|
#include "ParkingSpaceGuidePresenter.h"
|
|
#include "PathManager.h"
|
|
#include "StyledMessageBox.h"
|
|
|
|
DialogAlgoArg::DialogAlgoArg(QWidget* parent)
|
|
: QDialog(parent)
|
|
, ui(new Ui::DialogAlgoArg)
|
|
{
|
|
ui->setupUi(this);
|
|
setWindowTitle(QStringLiteral("停车引导参数设置"));
|
|
if (ui->label_title) {
|
|
ui->label_title->setText(QStringLiteral("停车引导参数设置"));
|
|
}
|
|
BuildUi();
|
|
connect(ui->tabWidget, &QTabWidget::currentChanged, this, [this](int index) {
|
|
if (index >= 0 && index < m_visiblePages.size()) {
|
|
UpdateTitle(m_visiblePages[index]);
|
|
}
|
|
});
|
|
ApplyUiFont();
|
|
}
|
|
|
|
DialogAlgoArg::~DialogAlgoArg()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void DialogAlgoArg::SetPresenter(ParkingSpaceGuidePresenter* presenter)
|
|
{
|
|
m_presenter = presenter;
|
|
LoadParams();
|
|
}
|
|
|
|
void DialogAlgoArg::SetCurrentPage(ConfigPage page)
|
|
{
|
|
if (!ui || !ui->tabWidget) {
|
|
return;
|
|
}
|
|
|
|
ShowTabGroup(page);
|
|
}
|
|
|
|
void DialogAlgoArg::ShowTabGroup(ConfigPage page)
|
|
{
|
|
if (!ui || !ui->tabWidget) {
|
|
return;
|
|
}
|
|
|
|
const bool oldBlocked = ui->tabWidget->blockSignals(true);
|
|
ui->tabWidget->clear();
|
|
HideDetachedTabs();
|
|
m_visiblePages.clear();
|
|
|
|
auto addTab = [this](QWidget* tab, const QString& title, ConfigPage tabPage) {
|
|
if (!tab) {
|
|
return;
|
|
}
|
|
ui->tabWidget->addTab(tab, title);
|
|
m_visiblePages.push_back(tabPage);
|
|
};
|
|
|
|
int selectedIndex = 0;
|
|
if (page == ConfigPage::Camera || page == ConfigPage::Lidar) {
|
|
addTab(m_cameraTab, QStringLiteral("相机参数"), ConfigPage::Camera);
|
|
addTab(m_lidarTab, QStringLiteral("雷达参数"), ConfigPage::Lidar);
|
|
selectedIndex = page == ConfigPage::Lidar ? 1 : 0;
|
|
} else if (page == ConfigPage::Calibration) {
|
|
addTab(m_centerLineTab, QStringLiteral("中心线标定"), ConfigPage::Calibration);
|
|
addTab(m_stopLineTab, QStringLiteral("停机线标定"), ConfigPage::Calibration);
|
|
} else {
|
|
addTab(m_detectionTab, QStringLiteral("检测参数"), ConfigPage::Detection);
|
|
addTab(m_multicastTab, QStringLiteral("组播参数"), ConfigPage::Multicast);
|
|
selectedIndex = page == ConfigPage::Multicast ? 1 : 0;
|
|
}
|
|
|
|
if (selectedIndex >= 0 && selectedIndex < ui->tabWidget->count()) {
|
|
ui->tabWidget->setCurrentIndex(selectedIndex);
|
|
}
|
|
if (ui->tabWidget->currentWidget()) {
|
|
ui->tabWidget->currentWidget()->show();
|
|
}
|
|
ui->tabWidget->blockSignals(oldBlocked);
|
|
UpdateTitle(page);
|
|
}
|
|
|
|
void DialogAlgoArg::UpdateTitle(ConfigPage page)
|
|
{
|
|
QString title = QStringLiteral("停车引导参数设置");
|
|
switch (page) {
|
|
case ConfigPage::Detection:
|
|
title = QStringLiteral("检测参数设置");
|
|
break;
|
|
case ConfigPage::Camera:
|
|
title = QStringLiteral("相机参数设置");
|
|
break;
|
|
case ConfigPage::Lidar:
|
|
title = QStringLiteral("雷达参数设置");
|
|
break;
|
|
case ConfigPage::Multicast:
|
|
title = QStringLiteral("组播参数设置");
|
|
break;
|
|
case ConfigPage::Calibration:
|
|
title = QStringLiteral("相机调平标定");
|
|
break;
|
|
}
|
|
|
|
setWindowTitle(title);
|
|
if (ui && ui->label_title) {
|
|
ui->label_title->setText(title);
|
|
}
|
|
}
|
|
|
|
void DialogAlgoArg::HideDetachedTabs()
|
|
{
|
|
const QList<QWidget*> tabs = {
|
|
m_detectionTab,
|
|
m_cameraTab,
|
|
m_lidarTab,
|
|
m_multicastTab,
|
|
m_centerLineTab,
|
|
m_stopLineTab
|
|
};
|
|
|
|
for (QWidget* tab : tabs) {
|
|
if (tab && tab->parentWidget() != ui->tabWidget->currentWidget()) {
|
|
tab->hide();
|
|
}
|
|
}
|
|
}
|
|
|
|
void DialogAlgoArg::BuildUi()
|
|
{
|
|
ui->tabWidget->clear();
|
|
|
|
auto makeTab = [this](QWidget** tabWidget, const QString& title) -> QWidget* {
|
|
auto* scroll = new QScrollArea(ui->tabWidget);
|
|
scroll->setWidgetResizable(true);
|
|
auto* page = new QWidget(scroll);
|
|
page->setObjectName(title);
|
|
auto* layout = new QFormLayout(page);
|
|
layout->setContentsMargins(24, 24, 24, 24);
|
|
layout->setSpacing(14);
|
|
page->setLayout(layout);
|
|
scroll->setWidget(page);
|
|
if (tabWidget) {
|
|
*tabWidget = scroll;
|
|
}
|
|
scroll->hide();
|
|
return page;
|
|
};
|
|
|
|
QWidget* algo = makeTab(&m_detectionTab, QStringLiteral("检测参数"));
|
|
m_minGuideDistance = AddDoubleEditor(algo, QStringLiteral("最小引导距离(毫米)"), 0, 0.0, 100000.0);
|
|
m_maxGuideDistance = AddDoubleEditor(algo, QStringLiteral("最大引导距离(毫米)"), 1, 0.0, 100000.0);
|
|
m_targetStopOffset = AddDoubleEditor(algo, QStringLiteral("目标停止偏移(毫米)"), 2, -100000.0, 100000.0);
|
|
m_lateralTolerance = AddDoubleEditor(algo, QStringLiteral("横向容差(毫米)"), 3, 0.0, 100000.0);
|
|
m_angleTolerance = AddDoubleEditor(algo, QStringLiteral("角度容差(度)"), 4, 0.0, 180.0);
|
|
m_confidenceThreshold = AddDoubleEditor(algo, QStringLiteral("置信度阈值"), 5, 0.0, 1.0);
|
|
|
|
QWidget* camera = makeTab(&m_cameraTab, QStringLiteral("相机参数"));
|
|
m_mvsSerialNumber = AddTextEditor(camera, QStringLiteral("设备序列号"), 0);
|
|
m_mvsDeviceIndex = AddIntEditor(camera, QStringLiteral("设备序号"), 1, 0, 64);
|
|
m_mvsEnabled = AddCheckBox(camera, QStringLiteral("启用"), 2);
|
|
|
|
QWidget* lidar = makeTab(&m_lidarTab, QStringLiteral("雷达参数"));
|
|
m_lidarType = AddTextEditor(lidar, QStringLiteral("雷达型号"), 0);
|
|
m_lidarHost = AddTextEditor(lidar, QStringLiteral("监听地址"), 1);
|
|
m_lidarMsopPort = AddIntEditor(lidar, QStringLiteral("数据端口"), 2, 1, 65535);
|
|
m_lidarDifopPort = AddIntEditor(lidar, QStringLiteral("设备端口"), 3, 1, 65535);
|
|
m_lidarMinDistance = AddDoubleEditor(lidar, QStringLiteral("最小距离(米)"), 4, 0.0, 1000.0);
|
|
m_lidarMaxDistance = AddDoubleEditor(lidar, QStringLiteral("最大距离(米)"), 5, 0.0, 1000.0);
|
|
m_lidarStartAngle = AddDoubleEditor(lidar, QStringLiteral("起始角度(度)"), 6, 0.0, 360.0);
|
|
m_lidarEndAngle = AddDoubleEditor(lidar, QStringLiteral("结束角度(度)"), 7, 0.0, 360.0);
|
|
|
|
QWidget* udp = makeTab(&m_multicastTab, QStringLiteral("组播参数"));
|
|
m_udpAddress = AddTextEditor(udp, QStringLiteral("组播地址"), 0);
|
|
m_udpPort = AddIntEditor(udp, QStringLiteral("组播端口"), 1, 1, 65535);
|
|
m_udpTargetId = AddTextEditor(udp, QStringLiteral("目标编号"), 2);
|
|
m_udpParkId = AddTextEditor(udp, QStringLiteral("车位编号"), 3);
|
|
m_udpEnabled = AddCheckBox(udp, QStringLiteral("启用"), 4);
|
|
|
|
QWidget* centerLine = makeTab(&m_centerLineTab, QStringLiteral("中心线标定"));
|
|
m_centerLineCalibrated = AddCheckBox(centerLine, QStringLiteral("已标定"), 0);
|
|
m_centerLineStartX = AddDoubleEditor(centerLine, QStringLiteral("起点X"), 1, -1000000.0, 1000000.0);
|
|
m_centerLineStartY = AddDoubleEditor(centerLine, QStringLiteral("起点Y"), 2, -1000000.0, 1000000.0);
|
|
m_centerLineEndX = AddDoubleEditor(centerLine, QStringLiteral("终点X"), 3, -1000000.0, 1000000.0);
|
|
m_centerLineEndY = AddDoubleEditor(centerLine, QStringLiteral("终点Y"), 4, -1000000.0, 1000000.0);
|
|
m_centerLineTime = AddTextEditor(centerLine, QStringLiteral("标定时间"), 5);
|
|
m_centerLineTime->setReadOnly(true);
|
|
m_calibrateCenterLine = AddActionButton(centerLine, QStringLiteral("标定中心线"), 6);
|
|
connect(m_calibrateCenterLine, &QPushButton::clicked,
|
|
this, &DialogAlgoArg::onCalibrateCenterLineClicked);
|
|
|
|
QWidget* stopLine = makeTab(&m_stopLineTab, QStringLiteral("停机线标定"));
|
|
m_stopLineCalibrated = AddCheckBox(stopLine, QStringLiteral("已标定"), 0);
|
|
m_stopLineStartX = AddDoubleEditor(stopLine, QStringLiteral("起点X"), 1, -1000000.0, 1000000.0);
|
|
m_stopLineStartY = AddDoubleEditor(stopLine, QStringLiteral("起点Y"), 2, -1000000.0, 1000000.0);
|
|
m_stopLineEndX = AddDoubleEditor(stopLine, QStringLiteral("终点X"), 3, -1000000.0, 1000000.0);
|
|
m_stopLineEndY = AddDoubleEditor(stopLine, QStringLiteral("终点Y"), 4, -1000000.0, 1000000.0);
|
|
m_countdownStartDistance = AddDoubleEditor(stopLine, QStringLiteral("倒计时开始距离(毫米)"), 5, 0.0, 1000000.0);
|
|
m_modelVerifyDistance = AddDoubleEditor(stopLine, QStringLiteral("机型验证距离(毫米)"), 6, 0.0, 1000000.0);
|
|
m_stopLineTime = AddTextEditor(stopLine, QStringLiteral("标定时间"), 7);
|
|
m_stopLineTime->setReadOnly(true);
|
|
m_calibrateStopLine = AddActionButton(stopLine, QStringLiteral("标定停机线"), 8);
|
|
connect(m_calibrateStopLine, &QPushButton::clicked,
|
|
this, &DialogAlgoArg::onCalibrateStopLineClicked);
|
|
|
|
ShowTabGroup(ConfigPage::Detection);
|
|
}
|
|
|
|
void DialogAlgoArg::ApplyUiFont()
|
|
{
|
|
QFont font;
|
|
font.setPointSize(16);
|
|
setFont(font);
|
|
|
|
const QList<QWidget*> widgets = findChildren<QWidget*>();
|
|
for (QWidget* widget : widgets) {
|
|
widget->setFont(font);
|
|
}
|
|
}
|
|
|
|
QLineEdit* DialogAlgoArg::AddDoubleEditor(QWidget* parent, const QString& label, int row, double min, double max)
|
|
{
|
|
Q_UNUSED(row);
|
|
auto* edit = new QLineEdit(parent);
|
|
auto* validator = new QDoubleValidator(min, max, 6, edit);
|
|
validator->setNotation(QDoubleValidator::StandardNotation);
|
|
edit->setValidator(validator);
|
|
static_cast<QFormLayout*>(parent->layout())->addRow(label, edit);
|
|
return edit;
|
|
}
|
|
|
|
QLineEdit* DialogAlgoArg::AddIntEditor(QWidget* parent, const QString& label, int row, int min, int max)
|
|
{
|
|
Q_UNUSED(row);
|
|
auto* edit = new QLineEdit(parent);
|
|
edit->setValidator(new QIntValidator(min, max, edit));
|
|
static_cast<QFormLayout*>(parent->layout())->addRow(label, edit);
|
|
return edit;
|
|
}
|
|
|
|
QLineEdit* DialogAlgoArg::AddTextEditor(QWidget* parent, const QString& label, int row, bool password)
|
|
{
|
|
Q_UNUSED(row);
|
|
auto* edit = new QLineEdit(parent);
|
|
if (password) {
|
|
edit->setEchoMode(QLineEdit::Password);
|
|
}
|
|
static_cast<QFormLayout*>(parent->layout())->addRow(label, edit);
|
|
return edit;
|
|
}
|
|
|
|
QCheckBox* DialogAlgoArg::AddCheckBox(QWidget* parent, const QString& label, int row)
|
|
{
|
|
Q_UNUSED(row);
|
|
auto* check = new QCheckBox(parent);
|
|
static_cast<QFormLayout*>(parent->layout())->addRow(label, check);
|
|
return check;
|
|
}
|
|
|
|
QPushButton* DialogAlgoArg::AddActionButton(QWidget* parent, const QString& text, int row)
|
|
{
|
|
Q_UNUSED(row);
|
|
auto* button = new QPushButton(text, parent);
|
|
button->setMinimumHeight(40);
|
|
button->setStyleSheet(
|
|
"QPushButton {"
|
|
"background-color: rgb(60, 120, 180);"
|
|
"color: rgb(221, 225, 233);"
|
|
"border: none;"
|
|
"border-radius: 4px;"
|
|
"padding: 8px;"
|
|
"}"
|
|
"QPushButton:hover { background-color: rgb(80, 140, 200); }"
|
|
"QPushButton:pressed { background-color: rgb(40, 100, 160); }");
|
|
static_cast<QFormLayout*>(parent->layout())->addRow(QString(), button);
|
|
return button;
|
|
}
|
|
|
|
void DialogAlgoArg::LoadParams()
|
|
{
|
|
if (!m_presenter || !m_presenter->GetConfigManager()) {
|
|
return;
|
|
}
|
|
|
|
const ConfigResult config = m_presenter->GetConfigManager()->GetConfigResult();
|
|
const VrParkingSpaceGuideParam& p = config.algorithmParams.guideParam;
|
|
|
|
SetDouble(m_minGuideDistance, p.minGuideDistance);
|
|
SetDouble(m_maxGuideDistance, p.maxGuideDistance);
|
|
SetDouble(m_targetStopOffset, p.targetStopOffset);
|
|
SetDouble(m_lateralTolerance, p.lateralTolerance);
|
|
SetDouble(m_angleTolerance, p.angleTolerance);
|
|
SetDouble(m_confidenceThreshold, p.confidenceThreshold);
|
|
|
|
m_mvsSerialNumber->setText(QString::fromStdString(config.mvsCamera.serialNumber));
|
|
SetInt(m_mvsDeviceIndex, config.mvsCamera.deviceIndex);
|
|
m_mvsEnabled->setChecked(config.mvsCamera.enabled);
|
|
|
|
m_lidarType->setText(QString::fromStdString(config.lidarConfig.lidarType));
|
|
m_lidarHost->setText(QString::fromStdString(config.lidarConfig.hostAddress));
|
|
SetInt(m_lidarMsopPort, config.lidarConfig.msopPort);
|
|
SetInt(m_lidarDifopPort, config.lidarConfig.difopPort);
|
|
SetDouble(m_lidarMinDistance, config.lidarConfig.minDistance);
|
|
SetDouble(m_lidarMaxDistance, config.lidarConfig.maxDistance);
|
|
SetDouble(m_lidarStartAngle, config.lidarConfig.startAngle);
|
|
SetDouble(m_lidarEndAngle, config.lidarConfig.endAngle);
|
|
|
|
m_udpAddress->setText(QString::fromStdString(config.udpBroadcastConfig.address));
|
|
SetInt(m_udpPort, config.udpBroadcastConfig.port);
|
|
m_udpTargetId->setText(QString::fromStdString(config.udpBroadcastConfig.targetId));
|
|
m_udpParkId->setText(QString::fromStdString(config.udpBroadcastConfig.parkId));
|
|
m_udpEnabled->setChecked(config.udpBroadcastConfig.enabled);
|
|
|
|
const VrParkingSpaceCalibrationParam& calibration = config.algorithmParams.calibrationParam;
|
|
SetLineCalibration(m_centerLineCalibrated,
|
|
m_centerLineStartX,
|
|
m_centerLineStartY,
|
|
m_centerLineEndX,
|
|
m_centerLineEndY,
|
|
m_centerLineTime,
|
|
calibration.centerLine);
|
|
SetLineCalibration(m_stopLineCalibrated,
|
|
m_stopLineStartX,
|
|
m_stopLineStartY,
|
|
m_stopLineEndX,
|
|
m_stopLineEndY,
|
|
m_stopLineTime,
|
|
calibration.stopLine);
|
|
SetDouble(m_countdownStartDistance, calibration.countdownStartDistance);
|
|
SetDouble(m_modelVerifyDistance, calibration.modelVerifyDistance);
|
|
}
|
|
|
|
bool DialogAlgoArg::SaveParams()
|
|
{
|
|
if (!m_presenter || !m_presenter->GetConfigManager()) {
|
|
return false;
|
|
}
|
|
|
|
SystemConfig systemConfig = m_presenter->GetConfigManager()->GetConfig();
|
|
ConfigResult& config = systemConfig.configResult;
|
|
VrParkingSpaceGuideParam& p = config.algorithmParams.guideParam;
|
|
|
|
if (!GetDouble(m_minGuideDistance, QStringLiteral("最小引导距离"), p.minGuideDistance)) return false;
|
|
if (!GetDouble(m_maxGuideDistance, QStringLiteral("最大引导距离"), p.maxGuideDistance)) return false;
|
|
if (!GetDouble(m_targetStopOffset, QStringLiteral("目标停止偏移"), p.targetStopOffset)) return false;
|
|
if (!GetDouble(m_lateralTolerance, QStringLiteral("横向容差"), p.lateralTolerance)) return false;
|
|
if (!GetDouble(m_angleTolerance, QStringLiteral("角度容差"), p.angleTolerance)) return false;
|
|
if (!GetDouble(m_confidenceThreshold, QStringLiteral("置信度阈值"), p.confidenceThreshold)) return false;
|
|
|
|
config.mvsCamera.serialNumber = m_mvsSerialNumber->text().trimmed().toStdString();
|
|
if (!GetInt(m_mvsDeviceIndex, QStringLiteral("相机设备序号"), config.mvsCamera.deviceIndex)) return false;
|
|
config.mvsCamera.enabled = m_mvsEnabled->isChecked();
|
|
|
|
config.lidarConfig.lidarType = m_lidarType->text().trimmed().toStdString();
|
|
config.lidarConfig.hostAddress = m_lidarHost->text().trimmed().toStdString();
|
|
int intValue = 0;
|
|
if (!GetInt(m_lidarMsopPort, QStringLiteral("雷达数据端口"), intValue)) return false;
|
|
config.lidarConfig.msopPort = static_cast<unsigned short>(intValue);
|
|
if (!GetInt(m_lidarDifopPort, QStringLiteral("雷达设备端口"), intValue)) return false;
|
|
config.lidarConfig.difopPort = static_cast<unsigned short>(intValue);
|
|
if (!GetFloat(m_lidarMinDistance, QStringLiteral("雷达最小距离"), config.lidarConfig.minDistance)) return false;
|
|
if (!GetFloat(m_lidarMaxDistance, QStringLiteral("雷达最大距离"), config.lidarConfig.maxDistance)) return false;
|
|
if (!GetFloat(m_lidarStartAngle, QStringLiteral("雷达起始角度"), config.lidarConfig.startAngle)) return false;
|
|
if (!GetFloat(m_lidarEndAngle, QStringLiteral("雷达结束角度"), config.lidarConfig.endAngle)) return false;
|
|
|
|
config.udpBroadcastConfig.address = m_udpAddress->text().trimmed().toStdString();
|
|
if (!GetInt(m_udpPort, QStringLiteral("组播端口"), config.udpBroadcastConfig.port)) return false;
|
|
config.udpBroadcastConfig.targetId = m_udpTargetId->text().trimmed().toStdString();
|
|
config.udpBroadcastConfig.parkId = m_udpParkId->text().trimmed().toStdString();
|
|
config.udpBroadcastConfig.enabled = m_udpEnabled->isChecked();
|
|
|
|
VrParkingSpaceCalibrationParam& calibration = config.algorithmParams.calibrationParam;
|
|
if (!GetLineCalibration(m_centerLineCalibrated,
|
|
m_centerLineStartX,
|
|
m_centerLineStartY,
|
|
m_centerLineEndX,
|
|
m_centerLineEndY,
|
|
m_centerLineTime,
|
|
QStringLiteral("中心线"),
|
|
calibration.centerLine)) return false;
|
|
if (!GetLineCalibration(m_stopLineCalibrated,
|
|
m_stopLineStartX,
|
|
m_stopLineStartY,
|
|
m_stopLineEndX,
|
|
m_stopLineEndY,
|
|
m_stopLineTime,
|
|
QStringLiteral("停机线"),
|
|
calibration.stopLine)) return false;
|
|
if (!GetDouble(m_countdownStartDistance, QStringLiteral("倒计时开始距离"), calibration.countdownStartDistance)) return false;
|
|
if (!GetDouble(m_modelVerifyDistance, QStringLiteral("机型验证距离"), calibration.modelVerifyDistance)) return false;
|
|
|
|
config.Normalize();
|
|
|
|
if (!m_presenter->GetConfigManager()->UpdateFullConfig(systemConfig)) {
|
|
StyledMessageBox::warning(this, QStringLiteral("失败"), QStringLiteral("更新配置缓存失败"));
|
|
return false;
|
|
}
|
|
|
|
const QString configPath = PathManager::GetInstance().GetConfigFilePath();
|
|
if (!m_presenter->GetConfigManager()->SaveConfigToFile(configPath.toStdString())) {
|
|
StyledMessageBox::warning(this, QStringLiteral("失败"), QStringLiteral("保存配置文件失败"));
|
|
return false;
|
|
}
|
|
|
|
m_presenter->OnConfigChanged(config);
|
|
return true;
|
|
}
|
|
|
|
void DialogAlgoArg::ResetParams()
|
|
{
|
|
ConfigResult config;
|
|
config.Normalize();
|
|
const VrParkingSpaceGuideParam& p = config.algorithmParams.guideParam;
|
|
SetDouble(m_minGuideDistance, p.minGuideDistance);
|
|
SetDouble(m_maxGuideDistance, p.maxGuideDistance);
|
|
SetDouble(m_targetStopOffset, p.targetStopOffset);
|
|
SetDouble(m_lateralTolerance, p.lateralTolerance);
|
|
SetDouble(m_angleTolerance, p.angleTolerance);
|
|
SetDouble(m_confidenceThreshold, p.confidenceThreshold);
|
|
|
|
m_mvsSerialNumber->setText(QString::fromStdString(config.mvsCamera.serialNumber));
|
|
SetInt(m_mvsDeviceIndex, config.mvsCamera.deviceIndex);
|
|
m_mvsEnabled->setChecked(config.mvsCamera.enabled);
|
|
|
|
m_lidarType->setText(QString::fromStdString(config.lidarConfig.lidarType));
|
|
m_lidarHost->setText(QString::fromStdString(config.lidarConfig.hostAddress));
|
|
SetInt(m_lidarMsopPort, config.lidarConfig.msopPort);
|
|
SetInt(m_lidarDifopPort, config.lidarConfig.difopPort);
|
|
SetDouble(m_lidarMinDistance, config.lidarConfig.minDistance);
|
|
SetDouble(m_lidarMaxDistance, config.lidarConfig.maxDistance);
|
|
SetDouble(m_lidarStartAngle, config.lidarConfig.startAngle);
|
|
SetDouble(m_lidarEndAngle, config.lidarConfig.endAngle);
|
|
|
|
m_udpAddress->setText(QString::fromStdString(config.udpBroadcastConfig.address));
|
|
SetInt(m_udpPort, config.udpBroadcastConfig.port);
|
|
m_udpTargetId->setText(QString::fromStdString(config.udpBroadcastConfig.targetId));
|
|
m_udpParkId->setText(QString::fromStdString(config.udpBroadcastConfig.parkId));
|
|
m_udpEnabled->setChecked(config.udpBroadcastConfig.enabled);
|
|
|
|
const VrParkingSpaceCalibrationParam& calibration = config.algorithmParams.calibrationParam;
|
|
SetLineCalibration(m_centerLineCalibrated,
|
|
m_centerLineStartX,
|
|
m_centerLineStartY,
|
|
m_centerLineEndX,
|
|
m_centerLineEndY,
|
|
m_centerLineTime,
|
|
calibration.centerLine);
|
|
SetLineCalibration(m_stopLineCalibrated,
|
|
m_stopLineStartX,
|
|
m_stopLineStartY,
|
|
m_stopLineEndX,
|
|
m_stopLineEndY,
|
|
m_stopLineTime,
|
|
calibration.stopLine);
|
|
SetDouble(m_countdownStartDistance, calibration.countdownStartDistance);
|
|
SetDouble(m_modelVerifyDistance, calibration.modelVerifyDistance);
|
|
}
|
|
|
|
void DialogAlgoArg::SetDouble(QLineEdit* edit, double value)
|
|
{
|
|
if (edit) {
|
|
edit->setText(QString::number(value, 'g', 12));
|
|
}
|
|
}
|
|
|
|
void DialogAlgoArg::SetInt(QLineEdit* edit, int value)
|
|
{
|
|
if (edit) {
|
|
edit->setText(QString::number(value));
|
|
}
|
|
}
|
|
|
|
void DialogAlgoArg::SetLineCalibration(QCheckBox* calibrated,
|
|
QLineEdit* startX,
|
|
QLineEdit* startY,
|
|
QLineEdit* endX,
|
|
QLineEdit* endY,
|
|
QLineEdit* time,
|
|
const VrGuideLineCalibration& value)
|
|
{
|
|
if (calibrated) {
|
|
calibrated->setChecked(value.calibrated);
|
|
}
|
|
SetDouble(startX, value.startX);
|
|
SetDouble(startY, value.startY);
|
|
SetDouble(endX, value.endX);
|
|
SetDouble(endY, value.endY);
|
|
if (time) {
|
|
time->setText(QString::fromStdString(value.calibrationTime));
|
|
}
|
|
}
|
|
|
|
bool DialogAlgoArg::GetDouble(QLineEdit* edit, const QString& label, double& value)
|
|
{
|
|
bool ok = false;
|
|
value = edit->text().trimmed().toDouble(&ok);
|
|
if (!ok) {
|
|
StyledMessageBox::warning(this, QStringLiteral("参数错误"), QStringLiteral("%1无效").arg(label));
|
|
edit->setFocus();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool DialogAlgoArg::GetFloat(QLineEdit* edit, const QString& label, float& value)
|
|
{
|
|
double doubleValue = 0.0;
|
|
if (!GetDouble(edit, label, doubleValue)) {
|
|
return false;
|
|
}
|
|
value = static_cast<float>(doubleValue);
|
|
return true;
|
|
}
|
|
|
|
bool DialogAlgoArg::GetInt(QLineEdit* edit, const QString& label, int& value)
|
|
{
|
|
bool ok = false;
|
|
value = edit->text().trimmed().toInt(&ok);
|
|
if (!ok) {
|
|
StyledMessageBox::warning(this, QStringLiteral("参数错误"), QStringLiteral("%1无效").arg(label));
|
|
edit->setFocus();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool DialogAlgoArg::GetLineCalibration(QCheckBox* calibrated,
|
|
QLineEdit* startX,
|
|
QLineEdit* startY,
|
|
QLineEdit* endX,
|
|
QLineEdit* endY,
|
|
QLineEdit* time,
|
|
const QString& label,
|
|
VrGuideLineCalibration& value)
|
|
{
|
|
if (!GetDouble(startX, QStringLiteral("%1起点X").arg(label), value.startX)) return false;
|
|
if (!GetDouble(startY, QStringLiteral("%1起点Y").arg(label), value.startY)) return false;
|
|
if (!GetDouble(endX, QStringLiteral("%1终点X").arg(label), value.endX)) return false;
|
|
if (!GetDouble(endY, QStringLiteral("%1终点Y").arg(label), value.endY)) return false;
|
|
|
|
value.calibrated = calibrated ? calibrated->isChecked() : false;
|
|
value.calibrationTime = time ? time->text().trimmed().toStdString() : std::string();
|
|
return !value.calibrated || ValidateLineCalibration(value, label);
|
|
}
|
|
|
|
bool DialogAlgoArg::ValidateLineCalibration(const VrGuideLineCalibration& value, const QString& label)
|
|
{
|
|
if (value.startX == value.endX && value.startY == value.endY) {
|
|
StyledMessageBox::warning(this,
|
|
QStringLiteral("参数错误"),
|
|
QStringLiteral("%1起点和终点不能相同").arg(label));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool DialogAlgoArg::SaveCalibrationWithMessage(const QString& message)
|
|
{
|
|
if (SaveParams()) {
|
|
StyledMessageBox::information(this, QStringLiteral("提示"), message);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void DialogAlgoArg::onCalibrateCenterLineClicked()
|
|
{
|
|
VrGuideLineCalibration line;
|
|
if (!GetLineCalibration(m_centerLineCalibrated,
|
|
m_centerLineStartX,
|
|
m_centerLineStartY,
|
|
m_centerLineEndX,
|
|
m_centerLineEndY,
|
|
m_centerLineTime,
|
|
QStringLiteral("中心线"),
|
|
line)) {
|
|
return;
|
|
}
|
|
|
|
if (!ValidateLineCalibration(line, QStringLiteral("中心线"))) {
|
|
return;
|
|
}
|
|
|
|
if (m_centerLineCalibrated) {
|
|
m_centerLineCalibrated->setChecked(true);
|
|
}
|
|
if (m_centerLineTime) {
|
|
m_centerLineTime->setText(QDateTime::currentDateTime().toString(QStringLiteral("yyyy-MM-dd hh:mm:ss")));
|
|
}
|
|
SaveCalibrationWithMessage(QStringLiteral("中心线标定已保存"));
|
|
}
|
|
|
|
void DialogAlgoArg::onCalibrateStopLineClicked()
|
|
{
|
|
if (!m_centerLineCalibrated || !m_centerLineCalibrated->isChecked()) {
|
|
StyledMessageBox::warning(this,
|
|
QStringLiteral("提示"),
|
|
QStringLiteral("请先完成中心线标定"));
|
|
return;
|
|
}
|
|
|
|
VrGuideLineCalibration line;
|
|
if (!GetLineCalibration(m_stopLineCalibrated,
|
|
m_stopLineStartX,
|
|
m_stopLineStartY,
|
|
m_stopLineEndX,
|
|
m_stopLineEndY,
|
|
m_stopLineTime,
|
|
QStringLiteral("停机线"),
|
|
line)) {
|
|
return;
|
|
}
|
|
|
|
if (!ValidateLineCalibration(line, QStringLiteral("停机线"))) {
|
|
return;
|
|
}
|
|
|
|
if (m_stopLineCalibrated) {
|
|
m_stopLineCalibrated->setChecked(true);
|
|
}
|
|
if (m_stopLineTime) {
|
|
m_stopLineTime->setText(QDateTime::currentDateTime().toString(QStringLiteral("yyyy-MM-dd hh:mm:ss")));
|
|
}
|
|
SaveCalibrationWithMessage(QStringLiteral("停机线标定已保存"));
|
|
}
|
|
|
|
void DialogAlgoArg::on_btnOK_clicked()
|
|
{
|
|
if (SaveParams()) {
|
|
accept();
|
|
}
|
|
}
|
|
|
|
void DialogAlgoArg::on_btnCancel_clicked()
|
|
{
|
|
reject();
|
|
}
|
|
|
|
void DialogAlgoArg::on_btnApply_clicked()
|
|
{
|
|
if (SaveParams()) {
|
|
StyledMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("参数已应用"));
|
|
}
|
|
}
|
|
|
|
void DialogAlgoArg::on_btnReset_clicked()
|
|
{
|
|
ResetParams();
|
|
}
|