GrabBag/Tools/ControlApp/DialogConfig.cpp

397 lines
14 KiB
C++
Raw Normal View History

2026-03-01 18:11:32 +08:00
#include "DialogConfig.h"
#include "ui_dialogconfig.h"
#include "DemoControlPresenter.h"
#include "StyledMessageBox.h"
#include <QDebug>
#include <QSettings>
#include <QCoreApplication>
2026-03-11 23:40:06 +08:00
#include <QStandardPaths>
#include <QDir>
#include <QFile>
2026-03-01 18:11:32 +08:00
DialogConfig::DialogConfig(DemoControlPresenter* presenter, QWidget *parent)
: QDialog(parent)
, ui(new Ui::DialogConfig)
, m_presenter(presenter)
{
ui->setupUi(this);
// 设置窗口标志
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
// 加载当前配置
loadCurrentConfig();
}
DialogConfig::~DialogConfig()
{
delete ui;
}
2026-03-11 23:40:06 +08:00
QString DialogConfig::GetConfigFilePath()
{
// 获取用户应用数据目录
QString appDataPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
// 确保目录存在
QDir dir(appDataPath);
if (!dir.exists()) {
dir.mkpath(appDataPath);
}
// 配置文件路径
QString configFilePath = appDataPath + "/config.ini";
// 如果配置文件不存在,尝试从应用程序目录复制默认配置
if (!QFile::exists(configFilePath)) {
QString defaultConfigPath = QCoreApplication::applicationDirPath() + "/config.ini";
if (QFile::exists(defaultConfigPath)) {
QFile::copy(defaultConfigPath, configFilePath);
qDebug() << "已从应用程序目录复制默认配置到用户目录:" << configFilePath;
} else {
qDebug() << "默认配置文件不存在,将创建新配置:" << configFilePath;
}
}
return configFilePath;
}
2026-03-01 18:11:32 +08:00
void DialogConfig::loadConfigFromFile()
{
2026-03-11 23:40:06 +08:00
QSettings settings(GetConfigFilePath(), QSettings::IniFormat);
2026-03-01 18:11:32 +08:00
// 控制器配置
ui->lineEdit_controller_ip->setText(settings.value("Controller/IP", "192.168.0.88").toString());
ui->spinBox_controller_port->setValue(settings.value("Controller/Port", 502).toInt());
// 机械臂配置
ui->lineEdit_robot_ip->setText(settings.value("Robot/IP", "192.168.58.2").toString());
// 准备位置
ui->doubleSpinBox_ready_x->setValue(settings.value("ReadyPosition/X", 0.0).toDouble());
ui->doubleSpinBox_ready_y->setValue(settings.value("ReadyPosition/Y", 0.0).toDouble());
ui->doubleSpinBox_ready_z->setValue(settings.value("ReadyPosition/Z", 500.0).toDouble());
ui->doubleSpinBox_ready_rx->setValue(settings.value("ReadyPosition/RX", 0.0).toDouble());
ui->doubleSpinBox_ready_ry->setValue(settings.value("ReadyPosition/RY", 0.0).toDouble());
ui->doubleSpinBox_ready_rz->setValue(settings.value("ReadyPosition/RZ", 0.0).toDouble());
// 放置位置
ui->doubleSpinBox_place_x->setValue(settings.value("PlacePosition/X", 500.0).toDouble());
ui->doubleSpinBox_place_y->setValue(settings.value("PlacePosition/Y", 0.0).toDouble());
ui->doubleSpinBox_place_z->setValue(settings.value("PlacePosition/Z", 200.0).toDouble());
ui->doubleSpinBox_place_rx->setValue(settings.value("PlacePosition/RX", 0.0).toDouble());
ui->doubleSpinBox_place_ry->setValue(settings.value("PlacePosition/RY", 0.0).toDouble());
ui->doubleSpinBox_place_rz->setValue(settings.value("PlacePosition/RZ", 0.0).toDouble());
// 抓取偏移
ui->doubleSpinBox_grasp_offset->setValue(settings.value("Grasp/OffsetZ", -50.0).toDouble());
// 运动参数
ui->spinBox_tool->setValue(settings.value("Motion/ToolNumber", 0).toInt());
ui->doubleSpinBox_velocity->setValue(settings.value("Motion/Velocity", 50.0).toDouble());
ui->doubleSpinBox_acceleration->setValue(settings.value("Motion/Acceleration", 50.0).toDouble());
}
void DialogConfig::saveConfigToFile()
{
2026-03-11 23:40:06 +08:00
QSettings settings(GetConfigFilePath(), QSettings::IniFormat);
2026-03-01 18:11:32 +08:00
// 控制器配置
settings.setValue("Controller/IP", ui->lineEdit_controller_ip->text());
settings.setValue("Controller/Port", ui->spinBox_controller_port->value());
// 机械臂配置
settings.setValue("Robot/IP", ui->lineEdit_robot_ip->text());
// 准备位置
settings.setValue("ReadyPosition/X", ui->doubleSpinBox_ready_x->value());
settings.setValue("ReadyPosition/Y", ui->doubleSpinBox_ready_y->value());
settings.setValue("ReadyPosition/Z", ui->doubleSpinBox_ready_z->value());
settings.setValue("ReadyPosition/RX", ui->doubleSpinBox_ready_rx->value());
settings.setValue("ReadyPosition/RY", ui->doubleSpinBox_ready_ry->value());
settings.setValue("ReadyPosition/RZ", ui->doubleSpinBox_ready_rz->value());
// 放置位置
settings.setValue("PlacePosition/X", ui->doubleSpinBox_place_x->value());
settings.setValue("PlacePosition/Y", ui->doubleSpinBox_place_y->value());
settings.setValue("PlacePosition/Z", ui->doubleSpinBox_place_z->value());
settings.setValue("PlacePosition/RX", ui->doubleSpinBox_place_rx->value());
settings.setValue("PlacePosition/RY", ui->doubleSpinBox_place_ry->value());
settings.setValue("PlacePosition/RZ", ui->doubleSpinBox_place_rz->value());
// 抓取偏移
settings.setValue("Grasp/OffsetZ", ui->doubleSpinBox_grasp_offset->value());
// 运动参数
settings.setValue("Motion/ToolNumber", ui->spinBox_tool->value());
settings.setValue("Motion/Velocity", ui->doubleSpinBox_velocity->value());
settings.setValue("Motion/Acceleration", ui->doubleSpinBox_acceleration->value());
settings.sync();
}
void DialogConfig::loadCurrentConfig()
{
// 从配置文件加载
loadConfigFromFile();
}
void DialogConfig::saveConfig()
{
if (!m_presenter) {
return;
}
// 保存到配置文件
saveConfigToFile();
// 保存准备位置
m_presenter->SetReadyPosition(
ui->doubleSpinBox_ready_x->value(),
ui->doubleSpinBox_ready_y->value(),
ui->doubleSpinBox_ready_z->value(),
ui->doubleSpinBox_ready_rx->value(),
ui->doubleSpinBox_ready_ry->value(),
ui->doubleSpinBox_ready_rz->value()
);
// 保存放置位置
m_presenter->SetPlacePosition(
ui->doubleSpinBox_place_x->value(),
ui->doubleSpinBox_place_y->value(),
ui->doubleSpinBox_place_z->value(),
ui->doubleSpinBox_place_rx->value(),
ui->doubleSpinBox_place_ry->value(),
ui->doubleSpinBox_place_rz->value()
);
// 保存抓取偏移
m_presenter->SetGraspOffset(ui->doubleSpinBox_grasp_offset->value());
// 保存运动参数
m_presenter->SetToolNumber(ui->spinBox_tool->value());
m_presenter->SetVelocity(ui->doubleSpinBox_velocity->value());
m_presenter->SetAcceleration(ui->doubleSpinBox_acceleration->value());
}
// 静态方法从配置文件加载配置到Presenter
void DialogConfig::LoadConfigToPresenter(DemoControlPresenter* presenter)
{
if (!presenter) {
return;
}
2026-03-11 23:40:06 +08:00
QSettings settings(GetConfigFilePath(), QSettings::IniFormat);
2026-03-01 18:11:32 +08:00
// 加载准备位置
presenter->SetReadyPosition(
settings.value("ReadyPosition/X", 0.0).toDouble(),
settings.value("ReadyPosition/Y", 0.0).toDouble(),
settings.value("ReadyPosition/Z", 500.0).toDouble(),
settings.value("ReadyPosition/RX", 0.0).toDouble(),
settings.value("ReadyPosition/RY", 0.0).toDouble(),
settings.value("ReadyPosition/RZ", 0.0).toDouble()
);
// 加载放置位置
presenter->SetPlacePosition(
settings.value("PlacePosition/X", 500.0).toDouble(),
settings.value("PlacePosition/Y", 0.0).toDouble(),
settings.value("PlacePosition/Z", 200.0).toDouble(),
settings.value("PlacePosition/RX", 0.0).toDouble(),
settings.value("PlacePosition/RY", 0.0).toDouble(),
settings.value("PlacePosition/RZ", 0.0).toDouble()
);
// 加载抓取偏移
presenter->SetGraspOffset(settings.value("Grasp/OffsetZ", -50.0).toDouble());
// 加载运动参数
presenter->SetToolNumber(settings.value("Motion/ToolNumber", 0).toInt());
presenter->SetVelocity(settings.value("Motion/Velocity", 50.0).toDouble());
presenter->SetAcceleration(settings.value("Motion/Acceleration", 50.0).toDouble());
}
void DialogConfig::on_btn_save_clicked()
{
saveConfig();
StyledMessageBox::information(this, "保存成功", "配置已保存,重启后生效");
accept();
}
void DialogConfig::on_btn_cancel_clicked()
{
reject();
}
void DialogConfig::on_btn_test_controller_clicked()
{
if (!m_presenter) {
return;
}
QString ip = ui->lineEdit_controller_ip->text();
int port = ui->spinBox_controller_port->value();
// 断开当前连接
m_presenter->DisconnectController();
// 尝试连接
bool success = m_presenter->ConnectToController(ip, port);
if (success) {
StyledMessageBox::information(this, "测试成功", "控制器连接成功");
} else {
StyledMessageBox::warning(this, "测试失败", "控制器连接失败请检查IP和端口");
}
}
void DialogConfig::on_btn_test_robot_clicked()
{
if (!m_presenter) {
return;
}
QString ip = ui->lineEdit_robot_ip->text();
// 断开当前连接
m_presenter->DisconnectRobot();
// 尝试连接
bool success = m_presenter->ConnectToRobot(ip);
if (success) {
StyledMessageBox::information(this, "测试成功", "机械臂连接成功");
} else {
StyledMessageBox::warning(this, "测试失败", "机械臂连接失败请检查IP地址");
}
}
void DialogConfig::on_btn_test_ready_clicked()
{
if (!m_presenter) {
return;
}
if (!m_presenter->IsRobotConnected()) {
StyledMessageBox::warning(this, "测试失败", "机械臂未连接,请先连接机械臂");
return;
}
// 先保存当前配置到Presenter不保存到文件
m_presenter->SetReadyPosition(
ui->doubleSpinBox_ready_x->value(),
ui->doubleSpinBox_ready_y->value(),
ui->doubleSpinBox_ready_z->value(),
ui->doubleSpinBox_ready_rx->value(),
ui->doubleSpinBox_ready_ry->value(),
ui->doubleSpinBox_ready_rz->value()
);
// 测试移动
bool success = m_presenter->TestMoveToReady();
if (success) {
StyledMessageBox::information(this, "测试成功", "机械臂已移动到准备位置");
} else {
StyledMessageBox::warning(this, "测试失败", "机械臂移动失败,请检查位置参数");
}
}
void DialogConfig::on_btn_test_place_clicked()
{
if (!m_presenter) {
return;
}
if (!m_presenter->IsRobotConnected()) {
StyledMessageBox::warning(this, "测试失败", "机械臂未连接,请先连接机械臂");
return;
}
// 先保存当前配置到Presenter不保存到文件
m_presenter->SetPlacePosition(
ui->doubleSpinBox_place_x->value(),
ui->doubleSpinBox_place_y->value(),
ui->doubleSpinBox_place_z->value(),
ui->doubleSpinBox_place_rx->value(),
ui->doubleSpinBox_place_ry->value(),
ui->doubleSpinBox_place_rz->value()
);
// 测试移动
bool success = m_presenter->TestMoveToPlace();
if (success) {
StyledMessageBox::information(this, "测试成功", "机械臂已移动到放置位置");
} else {
StyledMessageBox::warning(this, "测试失败", "机械臂移动失败,请检查位置参数");
}
}
void DialogConfig::on_btn_read_ready_clicked()
{
if (!m_presenter) {
return;
}
if (!m_presenter->IsRobotConnected()) {
StyledMessageBox::warning(this, "读取失败", "机械臂未连接,请先连接机械臂");
return;
}
// 读取当前位置
double x, y, z, rx, ry, rz;
bool success = m_presenter->GetCurrentPosition(x, y, z, rx, ry, rz);
if (success) {
// 填充到准备位置输入框
ui->doubleSpinBox_ready_x->setValue(x);
ui->doubleSpinBox_ready_y->setValue(y);
ui->doubleSpinBox_ready_z->setValue(z);
ui->doubleSpinBox_ready_rx->setValue(rx);
ui->doubleSpinBox_ready_ry->setValue(ry);
ui->doubleSpinBox_ready_rz->setValue(rz);
QString message = QString("已读取当前位置到准备位置") +
QString("\nX=%1, Y=%2, Z=%3").arg(x, 0, 'f', 2).arg(y, 0, 'f', 2).arg(z, 0, 'f', 2) +
QString("\nRX=%1, RY=%2, RZ=%3").arg(rx, 0, 'f', 2).arg(ry, 0, 'f', 2).arg(rz, 0, 'f', 2);
StyledMessageBox::information(this, "读取成功", message);
} else {
StyledMessageBox::warning(this, "读取失败", "读取机械臂当前位置失败");
}
}
void DialogConfig::on_btn_read_place_clicked()
{
if (!m_presenter) {
return;
}
if (!m_presenter->IsRobotConnected()) {
StyledMessageBox::warning(this, "读取失败", "机械臂未连接,请先连接机械臂");
return;
}
// 读取当前位置
double x, y, z, rx, ry, rz;
bool success = m_presenter->GetCurrentPosition(x, y, z, rx, ry, rz);
if (success) {
// 填充到放置位置输入框
ui->doubleSpinBox_place_x->setValue(x);
ui->doubleSpinBox_place_y->setValue(y);
ui->doubleSpinBox_place_z->setValue(z);
ui->doubleSpinBox_place_rx->setValue(rx);
ui->doubleSpinBox_place_ry->setValue(ry);
ui->doubleSpinBox_place_rz->setValue(rz);
QString message = QString("已读取当前位置到放置位置") +
QString("\nX=%1, Y=%2, Z=%3").arg(x, 0, 'f', 2).arg(y, 0, 'f', 2).arg(z, 0, 'f', 2) +
QString("\nRX=%1, RY=%2, RZ=%3").arg(rx, 0, 'f', 2).arg(ry, 0, 'f', 2).arg(rz, 0, 'f', 2);
StyledMessageBox::information(this, "读取成功", message);
} else {
StyledMessageBox::warning(this, "读取失败", "读取机械臂当前位置失败");
}
}