320 lines
10 KiB
C++
320 lines
10 KiB
C++
#include "PathLine.h"
|
|
#include <QTableWidgetItem>
|
|
#include <cstdio>
|
|
|
|
PathLineManager::PathLineManager()
|
|
{
|
|
}
|
|
|
|
PathLineManager::~PathLineManager()
|
|
{
|
|
}
|
|
|
|
QVector<PathLine2> PathLineManager::readFromTableWidget(QTableWidget* tableWidget)
|
|
{
|
|
QVector<PathLine2> pathLines;
|
|
|
|
if (tableWidget == nullptr)
|
|
return pathLines;
|
|
|
|
int rowCount = tableWidget->rowCount();
|
|
|
|
for (int i = 0; i < rowCount; i++)
|
|
{
|
|
PathLine2 tmp;
|
|
|
|
tmp.targetYPosition = tableWidget->item(i, 0)->text().toDouble();
|
|
tmp.speedTargetYPosition = tableWidget->item(i, 1)->text().toDouble();
|
|
tmp.targetXMinPosition = tableWidget->item(i, 2)->text().toDouble();
|
|
tmp.speedTargetXMinPosition = tableWidget->item(i, 3)->text().toDouble();
|
|
tmp.targetXMaxPosition = tableWidget->item(i, 4)->text().toDouble();
|
|
tmp.speedTargetXMaxPosition = tableWidget->item(i, 5)->text().toDouble();
|
|
|
|
pathLines.append(tmp);
|
|
}
|
|
|
|
return pathLines;
|
|
}
|
|
|
|
void PathLineManager::writeToTableWidget(QTableWidget* tableWidget, const QVector<PathLine2>& pathLines)
|
|
{
|
|
if (tableWidget == nullptr)
|
|
return;
|
|
|
|
// 清空现有行
|
|
int rowCount = tableWidget->rowCount();
|
|
for (int i = 0; i < rowCount; i++)
|
|
{
|
|
tableWidget->removeRow(0);
|
|
}
|
|
|
|
// 添加新行
|
|
for (int i = 0; i < pathLines.size(); i++)
|
|
{
|
|
tableWidget->insertRow(i);
|
|
|
|
QTableWidgetItem* item0 = new QTableWidgetItem(QString::number(pathLines[i].targetYPosition, 'f', 5));
|
|
QTableWidgetItem* item1 = new QTableWidgetItem(QString::number(pathLines[i].speedTargetYPosition, 'f', 5));
|
|
QTableWidgetItem* item2 = new QTableWidgetItem(QString::number(pathLines[i].targetXMinPosition, 'f', 5));
|
|
QTableWidgetItem* item3 = new QTableWidgetItem(QString::number(pathLines[i].speedTargetXMinPosition, 'f', 5));
|
|
QTableWidgetItem* item4 = new QTableWidgetItem(QString::number(pathLines[i].targetXMaxPosition, 'f', 5));
|
|
QTableWidgetItem* item5 = new QTableWidgetItem(QString::number(pathLines[i].speedTargetXMaxPosition, 'f', 5));
|
|
|
|
item0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item3->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item5->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
|
|
tableWidget->setItem(i, 0, item0);
|
|
tableWidget->setItem(i, 1, item1);
|
|
tableWidget->setItem(i, 2, item2);
|
|
tableWidget->setItem(i, 3, item3);
|
|
tableWidget->setItem(i, 4, item4);
|
|
tableWidget->setItem(i, 5, item5);
|
|
}
|
|
}
|
|
|
|
bool PathLineManager::saveToFile(const QString& filePath, QTableWidget* tableWidget)
|
|
{
|
|
if (tableWidget == nullptr || tableWidget->rowCount() <= 0)
|
|
return false;
|
|
|
|
FILE* fileHandle = fopen(filePath.toStdString().c_str(), "wb+");
|
|
if (fileHandle == nullptr)
|
|
return false;
|
|
|
|
double number = tableWidget->rowCount() * tableWidget->columnCount();
|
|
fwrite(&number, sizeof(double), 1, fileHandle);
|
|
|
|
double* data = new double[static_cast<int>(number)];
|
|
|
|
for (int i = 0; i < tableWidget->rowCount(); i++)
|
|
{
|
|
for (int j = 0; j < tableWidget->columnCount(); j++)
|
|
{
|
|
data[i * tableWidget->columnCount() + j] = tableWidget->item(i, j)->text().toDouble();
|
|
}
|
|
}
|
|
|
|
fwrite(data, sizeof(double), static_cast<size_t>(number), fileHandle);
|
|
|
|
fclose(fileHandle);
|
|
delete[] data;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool PathLineManager::saveToFile(const QString& filePath, const QVector<PathLine2>& pathLines)
|
|
{
|
|
if (pathLines.isEmpty())
|
|
return false;
|
|
|
|
FILE* fileHandle = fopen(filePath.toStdString().c_str(), "wb+");
|
|
if (fileHandle == nullptr)
|
|
return false;
|
|
|
|
double number = pathLines.size() * COLUMN_COUNT;
|
|
fwrite(&number, sizeof(double), 1, fileHandle);
|
|
|
|
double* data = new double[static_cast<int>(number)];
|
|
|
|
for (int i = 0; i < pathLines.size(); i++)
|
|
{
|
|
data[i * COLUMN_COUNT + 0] = pathLines[i].targetYPosition;
|
|
data[i * COLUMN_COUNT + 1] = pathLines[i].speedTargetYPosition;
|
|
data[i * COLUMN_COUNT + 2] = pathLines[i].targetXMinPosition;
|
|
data[i * COLUMN_COUNT + 3] = pathLines[i].speedTargetXMinPosition;
|
|
data[i * COLUMN_COUNT + 4] = pathLines[i].targetXMaxPosition;
|
|
data[i * COLUMN_COUNT + 5] = pathLines[i].speedTargetXMaxPosition;
|
|
}
|
|
|
|
fwrite(data, sizeof(double), static_cast<size_t>(number), fileHandle);
|
|
|
|
fclose(fileHandle);
|
|
delete[] data;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool PathLineManager::readFromFile(const QString& filePath, QTableWidget* tableWidget)
|
|
{
|
|
if (tableWidget == nullptr)
|
|
return false;
|
|
|
|
FILE* fileHandle = fopen(filePath.toStdString().c_str(), "rb");
|
|
if (fileHandle == nullptr)
|
|
return false;
|
|
|
|
double number;
|
|
fread(&number, sizeof(double), 1, fileHandle);
|
|
|
|
double* data = new double[static_cast<int>(number)];
|
|
for (int i = 0; i < static_cast<int>(number); i++)
|
|
{
|
|
fread(data + i, sizeof(double), 1, fileHandle);
|
|
}
|
|
|
|
// 清空现有行
|
|
int rowCount = tableWidget->rowCount();
|
|
for (int i = 0; i < rowCount; i++)
|
|
{
|
|
tableWidget->removeRow(0);
|
|
}
|
|
|
|
// 添加新行
|
|
int recordLineCount = static_cast<int>(number) / tableWidget->columnCount();
|
|
for (int i = 0; i < recordLineCount; i++)
|
|
{
|
|
tableWidget->insertRow(i);
|
|
}
|
|
|
|
// 填充数据
|
|
for (int i = 0; i < tableWidget->rowCount(); i++)
|
|
{
|
|
for (int j = 0; j < tableWidget->columnCount(); j++)
|
|
{
|
|
QTableWidgetItem* tmp = new QTableWidgetItem(
|
|
QString::number(data[i * tableWidget->columnCount() + j], 'f', 5));
|
|
tmp->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
tableWidget->setItem(i, j, tmp);
|
|
}
|
|
}
|
|
|
|
fclose(fileHandle);
|
|
delete[] data;
|
|
|
|
return true;
|
|
}
|
|
|
|
QVector<PathLine2> PathLineManager::readFromFile(const QString& filePath, bool* success)
|
|
{
|
|
QVector<PathLine2> pathLines;
|
|
|
|
FILE* fileHandle = fopen(filePath.toStdString().c_str(), "rb");
|
|
if (fileHandle == nullptr)
|
|
{
|
|
if (success) *success = false;
|
|
return pathLines;
|
|
}
|
|
|
|
double number;
|
|
fread(&number, sizeof(double), 1, fileHandle);
|
|
|
|
double* data = new double[static_cast<int>(number)];
|
|
for (int i = 0; i < static_cast<int>(number); i++)
|
|
{
|
|
fread(data + i, sizeof(double), 1, fileHandle);
|
|
}
|
|
|
|
int recordLineCount = static_cast<int>(number) / COLUMN_COUNT;
|
|
for (int i = 0; i < recordLineCount; i++)
|
|
{
|
|
PathLine2 tmp;
|
|
tmp.targetYPosition = data[i * COLUMN_COUNT + 0];
|
|
tmp.speedTargetYPosition = data[i * COLUMN_COUNT + 1];
|
|
tmp.targetXMinPosition = data[i * COLUMN_COUNT + 2];
|
|
tmp.speedTargetXMinPosition = data[i * COLUMN_COUNT + 3];
|
|
tmp.targetXMaxPosition = data[i * COLUMN_COUNT + 4];
|
|
tmp.speedTargetXMaxPosition = data[i * COLUMN_COUNT + 5];
|
|
|
|
pathLines.append(tmp);
|
|
}
|
|
|
|
fclose(fileHandle);
|
|
delete[] data;
|
|
|
|
if (success) *success = true;
|
|
return pathLines;
|
|
}
|
|
|
|
void PathLineManager::addRecordLine(QTableWidget* tableWidget,
|
|
double yPos, double ySpeed,
|
|
double xMinPos, double xMinSpeed,
|
|
double xMaxPos, double xMaxSpeed)
|
|
{
|
|
if (tableWidget == nullptr)
|
|
return;
|
|
|
|
int currentRow = tableWidget->currentRow();
|
|
int insertRow = (currentRow == -1) ? tableWidget->rowCount() : currentRow + 1;
|
|
|
|
tableWidget->insertRow(insertRow);
|
|
|
|
QTableWidgetItem* item0 = new QTableWidgetItem(QString::number(yPos, 'f', 2));
|
|
QTableWidgetItem* item1 = new QTableWidgetItem(QString::number(ySpeed, 'f', 2));
|
|
QTableWidgetItem* item2 = new QTableWidgetItem(QString::number(xMinPos, 'f', 2));
|
|
QTableWidgetItem* item3 = new QTableWidgetItem(QString::number(xMinSpeed, 'f', 2));
|
|
QTableWidgetItem* item4 = new QTableWidgetItem(QString::number(xMaxPos, 'f', 2));
|
|
QTableWidgetItem* item5 = new QTableWidgetItem(QString::number(xMaxSpeed, 'f', 2));
|
|
|
|
item0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item3->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
item5->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
|
|
|
tableWidget->setItem(insertRow, 0, item0);
|
|
tableWidget->setItem(insertRow, 1, item1);
|
|
tableWidget->setItem(insertRow, 2, item2);
|
|
tableWidget->setItem(insertRow, 3, item3);
|
|
tableWidget->setItem(insertRow, 4, item4);
|
|
tableWidget->setItem(insertRow, 5, item5);
|
|
}
|
|
|
|
double PathLineManager::calculateTimeFromFile(const QString& filePath)
|
|
{
|
|
bool success = false;
|
|
QVector<PathLine2> pathLines = readFromFile(filePath, &success);
|
|
if (!success || pathLines.isEmpty())
|
|
return 0.0;
|
|
|
|
double totalTimeSecond = 0.0;
|
|
double currentX = 0.0;
|
|
double currentY = 0.0;
|
|
double yTime;
|
|
double xTime;
|
|
|
|
for (int i = 0; i < pathLines.size(); i++)
|
|
{
|
|
const PathLine2& line = pathLines[i];
|
|
|
|
double yDistance = qAbs(line.targetYPosition - currentY);
|
|
if (line.speedTargetYPosition > 0.0 && yDistance > 0.0)
|
|
{
|
|
yTime = yDistance / line.speedTargetYPosition;
|
|
}
|
|
double xMinDistance = qAbs(line.targetXMinPosition - currentX);
|
|
if (line.speedTargetXMinPosition > 0.0 && xMinDistance > 0.0)
|
|
{
|
|
xTime = xMinDistance / line.speedTargetXMinPosition;
|
|
}
|
|
totalTimeSecond += std::max(yTime, xTime);
|
|
|
|
double xMaxDistance = qAbs(line.targetXMaxPosition - line.targetXMinPosition);
|
|
if (line.speedTargetXMaxPosition > 0.0 && xMaxDistance > 0.0)
|
|
{
|
|
totalTimeSecond += xMaxDistance / line.speedTargetXMaxPosition;
|
|
}
|
|
|
|
currentX = line.targetXMaxPosition;
|
|
currentY = line.targetYPosition;
|
|
}
|
|
|
|
double returnYDistance = currentY;
|
|
double returnXDistance = currentX;
|
|
if (currentY > 0.0)
|
|
{
|
|
yTime += returnYDistance / pathLines[0].speedTargetYPosition;
|
|
}
|
|
if (currentX > 0.0)
|
|
{
|
|
xTime += returnXDistance / pathLines[0].speedTargetXMinPosition;
|
|
}
|
|
totalTimeSecond += std::max(yTime, xTime);
|
|
|
|
return totalTimeSecond / 60;
|
|
}
|