#include "AutoCuttingWidget.h"
#include "AutoCuttingAlarmTable.h"
#include "Component/LightLabel/lightLabel.h"
#include "Component/QFlightInstruments/LayoutSquare.hpp"
#include "Component/LineRuler/LineRuler.h"
#include "Component/LineRuler/RulerWidget.h"
#include "AutoCuttingActionDBManager.h"
#include "CircuitBaseScene.h"
#include "GraphicElementManage.h"
#include <QDebug>
#include <SystemSetting.h>
AutoCuttingWidget::AutoCuttingWidget(QWidget* parent)
: QWidget(parent)
, ui(new Ui::AutoCuttingWidgetClass())
{
ui->setupUi(this);
initLineRuler();
initAmpHistoryLineCharts();
initAlarmMessageTable();
initRemotePanel();
initPFDParameter();
initRemoteConnectParam();
initCutMonitor();
initDrawCutPathViewer();
m_autoCutXmlFilePath = QCoreApplication::applicationDirPath() + "/autoCutXML/";
}
AutoCuttingWidget::~AutoCuttingWidget()
{
if (m_updateCutMonitorTimer)
{
m_updateCutMonitorTimer->stop();
//delete m_updateCutMonitorTimer;
m_updateCutMonitorTimer = nullptr;
}
delete ui;
}
void AutoCuttingWidget::on_pushButton_drawPath_clicked()
{
ui->stackedWidget_autocut->setCurrentWidget(ui->page_cutPath);
m_curView->enbaleDrawLine(true);
}
void AutoCuttingWidget::on_pushButton_clearCutPath_clicked()
{
QList<QGraphicsItem*> itemList = m_curView->items();
for (QGraphicsItem* item : itemList) {
m_curView->scene()->removeItem(item);
}
}
void AutoCuttingWidget::on_pushButton_startAuto_clicked()
{
m_updateCutMonitorTimer->stop();
resetAutoCuttingDataList();
m_updateCutMonitorTimer->start(hxcommon::SystemSetting::autoCutRefreshInterval);
ui->stackedWidget_autocut->setCurrentWidget(ui->page_cutMonitor);
}
void AutoCuttingWidget::on_pushButton_stopAuto_clicked()
{
m_updateCutMonitorTimer->stop();
}
void AutoCuttingWidget::on_pushButton_systemVoltage_clicked()
{
qDebug() << "on_pushButton_systemVoltage_clicked";
ui->stackedWidget->setCurrentIndex(0);
}
void AutoCuttingWidget::on_pushButton_pumpCurrent_clicked()
{
qDebug() << "on_pushButton_pumpCurrent_clicked";
ui->stackedWidget->setCurrentIndex(1);
}
void AutoCuttingWidget::on_pushButton_cutLowCurrent_clicked()
{
qDebug() << "on_pushButton_cutLowCurrent_clicked";
ui->stackedWidget->setCurrentIndex(2);
}
void AutoCuttingWidget::on_pushButton_cutHighCurrent_clicked()
{
qDebug() << "on_pushButton_cutHighCurrent_clicked";
ui->stackedWidget->setCurrentIndex(3);
}
void AutoCuttingWidget::on_pushButton_memoryStart_clicked()
{
QDateTime time = QDateTime::currentDateTime();
QString dateTime = time.toString("MM-dd-hh-mm");
QString pathname = m_autoCutXmlFilePath + QStringLiteral("自动截割路径_%1.xml").arg(dateTime);
m_autoCutFileSavePath = QFileDialog::getSaveFileName(this, QStringLiteral("保存自动截割路径"), pathname, "Xml(*.xml)");
}
void AutoCuttingWidget::on_pushButton_memoryStop_clicked()
{
QString savePath = m_autoCutFileSavePath;
if (savePath.isEmpty()) {
QDateTime time = QDateTime::currentDateTime();
QString dateTime = time.toString("MM-dd-hh-mm");
savePath = m_autoCutXmlFilePath + QStringLiteral("自动截割路径_%1.xml").arg(dateTime);
}
if (m_graphicElementManager.saveCurrentPage(savePath)) {
emit showResponseMessage(hxcommon::NotifyType::Notify_Type_Success,QStringLiteral("自动截割路径保存成功!"));
}
else {
emit showResponseMessage(hxcommon::NotifyType::Notify_Type_Error, QStringLiteral("保存失败!"));
}
}
void AutoCuttingWidget::on_pushButton_memoryModel_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this, QStringLiteral("请打开自动截割路径文件"), m_autoCutFileSavePath, "Xml(*.xml)");
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Open failed";
return;
}
m_graphicElementManager.openPage(file);
}
void AutoCuttingWidget::initAlarmMessageTable()
{
m_alarmMessageTable = new AutoCuttingAlarmTable(ui->widget_abnormalInfo);
QLayout* alarmMessageTableLayout = ui->widget_abnormalInfo->layout();
if (alarmMessageTableLayout) {
// 如果 layout 是 QVBoxLayout 类型,添加控件
QVBoxLayout* vboxLayout = qobject_cast<QVBoxLayout*>(alarmMessageTableLayout);
if (vboxLayout) {
vboxLayout->addWidget(m_alarmMessageTable);
}
}
}
void AutoCuttingWidget::initRemotePanel()
{
// 创建 4x4 的网格布局
m_remotePanelLayout = new QGridLayout(ui->widget_remotePanel);
ui->widget_remotePanel->setLayout(m_remotePanelLayout);
// 定义 4x4 的内容
QStringList labels = {
QStringLiteral("截割头伸"), QStringLiteral("铲板升"), QStringLiteral("一运正转"), QStringLiteral("左后退"),
QStringLiteral("截割头缩"), QStringLiteral("铲板降"), QStringLiteral("一运反转"), QStringLiteral("右后退"),
QStringLiteral("左前进"), QStringLiteral("后支撑升"), QStringLiteral("截割左"), QStringLiteral("星轮正转"),
QStringLiteral("右前进"), QStringLiteral("后支撑降"), QStringLiteral("截割右"), QStringLiteral("星轮反转")
};
// 创建并添加 lightLabel 到布局
int index = 0;
for (int row = 0; row < 4; ++row) {
for (int col = 0; col < 4; ++col) {
lightLabel* label = new lightLabel(ui->widget_remotePanel);
label->setLabelText(labels[index++]); // 设置内容
label->setLightPointStep(0);
m_remotePanelLayout->addWidget(label, row, col); // 添加到网格布局
}
}
}
void AutoCuttingWidget::initPFDParameter()
{
LayoutSquare* m_layoutSq = new LayoutSquare(this);
m_layoutSq->setContentsMargins(0, 0, 0, 0);
m_layoutSq->addWidget(ui->framePFD);
}
void AutoCuttingWidget::initRemoteConnectParam()
{
//m_remoteConnectLayout = new QGridLayout(ui->widget_remoteConnectInfo);
//ui->widget_remoteConnectInfo->setLayout(m_remoteConnectLayout);
//QStringList labels = {
// QStringLiteral("遥控在线"), QStringLiteral("油泵启动"), QStringLiteral("截割启动"), QStringLiteral("一运启动"),
// QStringLiteral("二运启动"), QStringLiteral("皮带启动"), QStringLiteral("星轮启动"), QStringLiteral("人员误入")
//};
//int index = 0;
//for (int row = 0; row < 2; ++row) {
// for (int col = 0; col < 4; ++col) {
// lightLabel* label = new lightLabel(ui->widget_remoteConnectInfo);
// label->setLabelText(labels[index++]); // 设置内容
// label->setLightPointStep(0);
// m_remoteConnectLayout->addWidget(label, row, col); // 添加到网格布局
// }
//}
// 创建 4x4 的网格布局
//m_remoteConnectLayout = new QGridLayout(ui->widget_remoteConnectInfo);
//ui->widget_remoteConnectInfo->setLayout(m_remoteConnectLayout);
//// 定义 4x4 的内容
//QStringList labels = {
// QStringLiteral("截割头伸"), QStringLiteral("铲板升"), QStringLiteral("一运正转"), QStringLiteral("左后退"),
// QStringLiteral("截割头缩"), QStringLiteral("铲板降"), QStringLiteral("一运反转"), QStringLiteral("右后退"),
// QStringLiteral("左前进"), QStringLiteral("后支撑升"), QStringLiteral("截割左"), QStringLiteral("星轮正转"),
// QStringLiteral("右前进"), QStringLiteral("后支撑降"), QStringLiteral("截割右"), QStringLiteral("星轮反转")
//};
//// 创建并添加 lightLabel 到布局
//int index = 0;
//for (int row = 0; row < 4; ++row) {
// for (int col = 0; col < 4; ++col) {
// lightLabel* label = new lightLabel(ui->widget_remoteConnectInfo);
// label->setLabelText(labels[index++]); // 设置内容
// label->setLightPointStep(0);
// m_remoteConnectLayout->addWidget(label, row, col); // 添加到网格布局
// }
//}
}
void AutoCuttingWidget::initLineRuler()
{
// 创建 RulerWidget 实例,方向为垂直
RulerWidget* verticalRuler = new RulerWidget(Qt::Vertical, this);
// 检查 widget_verticalRuler 是否已有布局
QLayout* verticallayout = ui->widget_verticalRuler->layout();
if (!verticallayout) {
// 如果没有布局,创建一个 QVBoxLayout
verticallayout = new QVBoxLayout(ui->widget_verticalRuler);
ui->widget_verticalRuler->setLayout(verticallayout);
}
// 设置布局的间隔和边距为 0
verticallayout->setSpacing(0);
verticallayout->setContentsMargins(0, 0, 0, 0);
// 将 RulerWidget 添加到布局中
verticallayout->addWidget(verticalRuler);
// 创建 RulerWidget 实例,方向为垂直
RulerWidget* horizontalRuler = new RulerWidget(Qt::Horizontal, this);
// 检查 widget_verticalRuler 是否已有布局
QLayout* horizontalLayout = ui->widget_horizontalRuler->layout();
if (!horizontalLayout) {
// 如果没有布局,创建一个 QVBoxLayout
horizontalLayout = new QVBoxLayout(ui->widget_horizontalRuler);
ui->widget_verticalRuler->setLayout(horizontalLayout);
}
// 设置布局的间隔和边距为 0
horizontalLayout->setSpacing(0);
horizontalLayout->setContentsMargins(0, 0, 0, 0);
// 将 RulerWidget 添加到布局中
horizontalLayout->addWidget(horizontalRuler);
}
void AutoCuttingWidget::initAmpHistoryLineCharts()
{
m_lineChartSystemVoltage = new AmpHistoryLineChart(ui->page_systemVoltage);
m_lineChartPumpAmp = new AmpHistoryLineChart(ui->page_pumpCurrent);
m_lineChartLowCutAmp = new AmpHistoryLineChart(ui->page_cutLowCurrent);
m_lineChartHighCutAmp = new AmpHistoryLineChart(ui->page_cutHighCurrent);
// 获取 ui 中的布局,并确保布局充满空间
QLayout* layoutSystemVoltage = ui->page_systemVoltage->layout();
if (layoutSystemVoltage) {
// 如果 layout 是 QVBoxLayout 类型,添加控件
QVBoxLayout* vboxLayoutSystemVoltage = qobject_cast<QVBoxLayout*>(layoutSystemVoltage);
if (vboxLayoutSystemVoltage) {
vboxLayoutSystemVoltage->addWidget(m_lineChartSystemVoltage);
}
}
QLayout* layoutPump = ui->page_pumpCurrent->layout();
if (layoutPump) {
QVBoxLayout* vboxLayoutPump = qobject_cast<QVBoxLayout*>(layoutPump);
if (vboxLayoutPump) {
vboxLayoutPump->addWidget(m_lineChartPumpAmp);
}
}
QLayout* layoutLowCut = ui->page_cutLowCurrent->layout();
if (layoutLowCut) {
QVBoxLayout* vboxLayoutLowCut = qobject_cast<QVBoxLayout*>(layoutLowCut);
if (vboxLayoutLowCut) {
vboxLayoutLowCut->addWidget(m_lineChartLowCutAmp);
}
}
QLayout* layoutHighCut = ui->page_cutHighCurrent->layout();
if (layoutHighCut) {
QVBoxLayout* vboxLayoutHighCut = qobject_cast<QVBoxLayout*>(layoutHighCut);
if (vboxLayoutHighCut) {
vboxLayoutHighCut->addWidget(m_lineChartHighCutAmp);
}
}
m_lineChartPumpAmp->setYAxisRange(0, 100);
m_lineChartLowCutAmp->setYAxisRange(0, 100);
m_lineChartHighCutAmp->setYAxisRange(0, 100);
// TODO:假设数据点,替换为实时数据
QList<QPointF> list;
QDateTime currentTime = QDateTime::currentDateTime();
for (int i = 0; i < 120; ++i) { // 120个数据点,代表最近两个小时
list.append(QPointF(currentTime.addSecs(-i * 60).toMSecsSinceEpoch(), QRandomGenerator::global()->bounded(10, 14)));
}
m_lineChartPumpAmp->setLineData(list);
m_lineChartLowCutAmp->setLineData(list);
m_lineChartHighCutAmp->setLineData(list);
}
void AutoCuttingWidget::initCutMonitor()
{
m_autoCuttingProcessor = new AutoCuttingProcessor(this);
hxDataBaseManager::AutoCuttingActionDBManager dbManager;
QList<hxcommon::AutoCuttingAction*> list = dbManager.getActionList();
m_autoCuttingProcessor->setActionList(list);
m_autoCuttingProcessor->doWork();
m_updateCutMonitorTimer = new QTimer();
connect(m_updateCutMonitorTimer, &QTimer::timeout, this, &AutoCuttingWidget::testDrawCutterMonitor);
m_cutter = new QGraphicsPixmapItem(QPixmap(":/mainwindow/Resource/AutoCutting/cutter.png").scaled(60, 60, Qt::KeepAspectRatio));
}
void AutoCuttingWidget::resetAutoCuttingDataList()
{
if (m_updateCutMonitorTimer)
{
m_updateCutMonitorTimer->stop();//先停止可能正在进行的
}
// 重置GraphicsScene
int width = ui->widget_cutterMonitorPainter->width();
int height = ui->widget_cutterMonitorPainter->height();
int rowPointCount = hxcommon::SystemSetting::autoCutRowTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一行多少点
int columnPointCount = hxcommon::SystemSetting::autoCutColumnTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一列多少点
int columnSplitPointCount = columnPointCount / hxcommon::SystemSetting::autoCutColumnSplit;//向上的每段多少点
double wItem = 540.0 / rowPointCount;//SceneRect尺寸600 - 截割头60
double hItem = 360.0 / columnPointCount;//SceneRect尺寸420 - 截割头60
ui->graphicsViewCutterMonitor->setGeometry(width / 2 - 310, height / 2 - 220, 620, 440);//居中,因为带20边框
QGraphicsScene* scene = ui->graphicsViewCutterMonitor->scene();
if (!scene) {
scene = new QGraphicsScene(this);
ui->graphicsViewCutterMonitor->setScene(scene);
}
scene->setSceneRect(0, 0, 600, 420);
// 禁用滚动条
ui->graphicsViewCutterMonitor->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsViewCutterMonitor->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 禁用鼠标拖拽滚动
ui->graphicsViewCutterMonitor->setDragMode(QGraphicsView::NoDrag);
// 禁用鼠标滚轮滚动
ui->graphicsViewCutterMonitor->setTransformationAnchor(QGraphicsView::NoAnchor);
// 禁用索引提高性能
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
//清空画布
scene->clear();
//清空指令列表
m_autoCuttingDataList.clear();
//不管分多少段,最底下从左到右都是一样的
for (int x = 0; x < rowPointCount; x++)
{
int y = QRandomGenerator::global()->bounded(columnPointCount - 2, columnPointCount);
//int y = columnPointCount - 1;
AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed);
m_autoCuttingDataList.append(point);//从左到右
}
for (int i = 0; i < hxcommon::SystemSetting::autoCutColumnSplit; i++)
{
if (i % 2 == 0)
{
//顺着右侧向上
int yStart = columnPointCount - columnSplitPointCount * i - 1;
int yEnd = columnPointCount - columnSplitPointCount * (i + 1);
for (int y = yStart; y >= yEnd; y--)
{
int x = QRandomGenerator::global()->bounded(rowPointCount - 2, rowPointCount);
//int x = rowPointCount - 1;
AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed, 128);
m_autoCuttingDataList.append(point);//右边向上
}
for (int x = rowPointCount - 1; x >= 0; x--)
{
int y = QRandomGenerator::global()->bounded(yEnd - 2, yEnd);
//int y = yEnd - 1;
AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 + hxcommon::SystemSetting::autoCutHorizontalSpeed);
m_autoCuttingDataList.append(point);//从右到左
}
}
else
{
//顺着左侧向上
int yStart = columnPointCount - columnSplitPointCount * i - 1;
int yEnd = columnPointCount - columnSplitPointCount * (i + 1);
for (int y = yStart; y >= yEnd; y--)
{
int x = QRandomGenerator::global()->bounded(-1, 1);
//int x = 0;
AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed, 128);
m_autoCuttingDataList.append(point);//左边向上
}
for (int x = 0; x < rowPointCount; x++)
{
int y = QRandomGenerator::global()->bounded(yEnd - 2, yEnd);
//int y = yEnd - 1;
AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed);
m_autoCuttingDataList.append(point);//从左到右
}
}
}
//结束时添加停止命令
if (hxcommon::SystemSetting::autoCutColumnSplit % 2 == 0)
{
AutoCuttingPoint point1(rowPointCount - 1, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128);
m_autoCuttingDataList.append(point1);
AutoCuttingPoint point2(rowPointCount - 1, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128);
m_autoCuttingDataList.append(point2);
}
else
{
AutoCuttingPoint point1(0, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128);
m_autoCuttingDataList.append(point1);
AutoCuttingPoint point2(0, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128);
m_autoCuttingDataList.append(point2);
}
}
void AutoCuttingWidget::initDrawCutPathViewer()
{
// 创建管理器
hxdraw2dlib::GraphicElementManage manager;
// 创建场景
hxdraw2dlib::CircuitBaseScene* pScene = new hxdraw2dlib::CircuitBaseScene(this);
//pScene->setSceneRect(-297 * 3 / 2, -210 * 3 / 2, 297 * 3, 210 * 3);
pScene->setScalePerGrid(10.0);
QTimer::singleShot(0, this, [=]() {
QSize widgetSize = ui->widget_drawCutPathView->size();
pScene->setSceneRect(0, 0, widgetSize.width(), widgetSize.height());
});
// 创建视图(不要设置 parent)
hxdraw2dlib::CircuitBaseView* view = new hxdraw2dlib::CircuitBaseView(pScene);
m_curView = view;
view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
// 获取或创建布局
QLayout* layout = ui->widget_drawCutPathView->layout();
if (layout) {
// 如果 layout 是 QVBoxLayout 类型,添加控件
QVBoxLayout* vboxLayout = qobject_cast<QVBoxLayout*>(layout);
vboxLayout->setContentsMargins(0, 0, 0, 0); // 去除边距
vboxLayout->setSpacing(0); // 去除间隔
if (vboxLayout) {
//QTimer::singleShot(0, this, [=]() {
//vboxLayout->addWidget(m_curView);
//});
}
}
m_graphicElementManager.setCurView(m_curView);
}
void AutoCuttingWidget::testDrawCutterMonitor()
{
//获取本次要绘制的点
if (m_autoCuttingDataList.size() == 0)
{
return;
}
AutoCuttingPoint point = m_autoCuttingDataList.takeFirst();
emit sendAutoCuttingCmd(point.cmd, point.b0, point.b1);
m_cutterRotation -= 13;
if (m_cutterRotation <= -360)
{
m_cutterRotation = 0;
}
int width = ui->widget_cutterMonitorPainter->width();
int height = ui->widget_cutterMonitorPainter->height();
int rowPointCount = hxcommon::SystemSetting::autoCutRowTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一行多少点
int columnPointCount = hxcommon::SystemSetting::autoCutColumnTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一列多少点
double wItem = 540.0 / rowPointCount;//SceneRect尺寸600 - 截割头60
double hItem = 360.0 / columnPointCount;//SceneRect尺寸420 - 截割头60
//qDebug() << "width" << width << "height" << height;
ui->graphicsViewCutterMonitor->setGeometry(width / 2 - 310, height / 2 - 220, 620, 440);//居中,因为带20边框
QGraphicsScene* scene = ui->graphicsViewCutterMonitor->scene();
if (!scene) {
scene = new QGraphicsScene(this);
ui->graphicsViewCutterMonitor->setScene(scene);
}
scene->setSceneRect(0, 0, 600, 420);
// 禁用滚动条
ui->graphicsViewCutterMonitor->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsViewCutterMonitor->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 禁用鼠标拖拽滚动
ui->graphicsViewCutterMonitor->setDragMode(QGraphicsView::NoDrag);
// 禁用鼠标滚轮滚动
ui->graphicsViewCutterMonitor->setTransformationAnchor(QGraphicsView::NoAnchor);
// 禁用索引提高性能
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
// 先移除画上去的截割头
scene->removeItem(m_cutter);
//画很粗的圆组成切割图形
QGraphicsEllipseItem* circle = new QGraphicsEllipseItem();
circle->setRect(0, 0, 60, 60); // x, y, width, height (width=height时为圆形)
circle->setPos(point.x * wItem, point.y * hItem); // 设置位置
circle->setBrush(QColor(26, 155, 114)); // 设置填充颜色
circle->setPen(QPen(QColor(26, 155, 114), 1)); // 设置边框
scene->addItem(circle);//添加到场景
//画小点连成轨迹
QGraphicsEllipseItem* linePoint = new QGraphicsEllipseItem();
linePoint->setRect(0, 0, 1, 1); // x, y, width, height (width=height时为圆形)
linePoint->setPos(point.x * wItem + 30, point.y * hItem + 30); // 设置位置
linePoint->setBrush(Qt::green); // 设置填充颜色
linePoint->setPen(QPen(Qt::green, 1)); // 设置边框
scene->addItem(linePoint);//添加到场景
//画截割头和截割头旋转
scene->addItem(m_cutter);
m_cutter->setPos(point.x * wItem, point.y * hItem);
m_cutter->setTransformOriginPoint(QPointF(30, 30));
m_cutter->setRotation(m_cutterRotation);
//联动左边姿态
float pitch = (columnPointCount / 2 - point.y) / columnPointCount * 80.0;
float heading = (point.x - rowPointCount / 2) / rowPointCount * 80.0;
ui->graphicsPFD->setPitch(pitch);
ui->graphicsPFD->setHeading(heading);
ui->graphicsPFD->update();
//
ui->label_cutX->setText(QString::number(point.x));
ui->label_cutY->setText(QString::number(point.y));
}
最新发布