#include "GActionFlow_Standard.h"
#include "GActionFlow.h"
#include "mhtparser.h"
#include "ALTableTool.h"
#include <algorithm> // 包含算法头文件
#include <QPushButton>
#include "CGlobalVariant.h"
#include <QSplineSeries>
extern GActionFlow m_GActionFlow;
extern MhtParser m_MhtParser;
extern ALTableTool m_TableTool;
extern CGlobalVariant m_Global;
GActionFlow_Standard::GActionFlow_Standard()
{
}
GActionFlow_Standard::~GActionFlow_Standard()
{
}
// 导入傲来标准值流程
void GActionFlow_Standard::SFL_Action_ALStandardValue()
{
FinallyLoadStandard = false;
// 读取data文件数据
QByteArray arr;
if (-1 == m_GActionFlow.readDataFile(arr))
{
QMessageBox::warning(NULL, "Failed!", m_GActionFlow.m_qstrError);
return;
}
// 解析数据
QVector<ALData> vec_Data;
if (-1 == m_GActionFlow.handleDataForAl(arr, vec_Data))
{
QMessageBox::warning(NULL, "Failed!", m_GActionFlow.m_qstrError);
return;
}
//将.data数据写到View上
StandardData2table(vec_Data);
// 计算标准值平均值
StandardhowAvgData();
FinallyLoadStandard = true;
}
// 导入Pro10标准值流程
void GActionFlow_Standard::SFL_Action_Pro10StandardValue()
{
FinallyLoadStandard = false;
// 读取data文件数据
QByteArray arr;
if (-1 == m_GActionFlow.readDataFile(arr))
{
QMessageBox::warning(NULL, "Failed!", m_GActionFlow.m_qstrError);
return;
}
// 解析数据
QVector<ALData> vec_Data;
if (-1 == m_GActionFlow.handleDataForPro10(arr, vec_Data))
{
QMessageBox::warning(NULL, "Failed!", m_GActionFlow.m_qstrError);
return;
}
//将.data数据写到View上
StandardData2table(vec_Data);
// 计算标准值平均值
StandardhowAvgData();
FinallyLoadStandard = true;
}
void GActionFlow_Standard::SFL_Action_HRStandardValue(QTabWidget* tabWidget)
{
// 读取.mht文件
QVector<tagMeasurement> tagMeasureMent;
if (-1 == m_GActionFlow.readMhtFile(tagMeasureMent))
{
QMessageBox::warning(NULL, "Failed!", m_GActionFlow.m_qstrError);
return;
}
// 将原始数据采用动态标签页的方式加载显示
Hr2Table(tagMeasureMent, tabWidget);
}
int GActionFlow_Standard::StandardData2table(QVector<ALData> vec_Data)
{
m_GActionFlow.row = 0;
m_GActionFlow.col = 0;
m_GActionFlow.Frequency = 110;
m_GActionFlow.UnitConversion = 1000;
m_GActionFlow.setItem(m_GActionFlow.row, m_GActionFlow.col, "频率:", Qt::green, Qt::yellow);
m_GActionFlow.setItem(m_GActionFlow.row, m_GActionFlow.col + 1, QString::number(m_GActionFlow.Frequency), Qt::green, Qt::yellow);
m_GActionFlow.setItem(m_GActionFlow.row, m_GActionFlow.col + 2, "单位:", Qt::green, Qt::yellow);
m_GActionFlow.setItem(m_GActionFlow.row, m_GActionFlow.col + 3, QString::number(m_GActionFlow.UnitConversion), Qt::green, Qt::yellow);
m_GActionFlow.row = 1;
standard_start_row = m_GActionFlow.row;
m_GActionFlow.setItem(m_GActionFlow.row, m_GActionFlow.col, "标准值", Qt::black, QColor(244, 164, 96));
m_GActionFlow.data2table(vec_Data);
standard_end_row = m_GActionFlow.row;
return 0;
}
// HR数据显示到table
int GActionFlow_Standard::Hr2Table(QVector<tagMeasurement>& tagMeasureMent, QTabWidget* tabWidget)
{
int size = tagMeasureMent.size();
if (size <= 0)
{
m_strError = "没有数据用于显示";
return -1;
}
std::set<int> mySet;
QVector<tagMeasurement> tagMeasureMentMTF;
QVector<tagMeasurement> tagMeasureMentTF;
QVector<tagMeasurement> tagMeasureMentTilt;
SpliitMeasurement(tagMeasureMent, tabWidget, tagMeasureMentMTF, tagMeasureMentTF, tagMeasureMentTilt, mySet);
ShowtagMeasureMentTilt(tagMeasureMentTilt);
int tfStartRow;
ShowtagMeasureMentMTF(tfStartRow, tagMeasureMentMTF);
auto max = *std::max_element(mySet.begin(), mySet.end());
for (int i = 0; i < max; i++)
{
hr_source_rows[i] = tfStartRow;
hr_source_cols[i] = 0;
}
int start4finadatarow = tfStartRow;
ShowtagMeasureMentTF(start4finadatarow, tagMeasureMentTF);
QMap<int, QMap<double, tagTableSections>> map_uutNumber4TableSections;
ShortTFTableSections(tagMeasureMentTF, map_uutNumber4TableSections);
FreashTfTable();
Measurement2TFTable(map_uutNumber4TableSections);
return 0;
}
int GActionFlow_Standard::StandardhowAvgData()
{
standard_avg_row = standard_end_row + 1;
standard_mtfandpeak_row = standard_avg_row + 1;
m_GActionFlow.setItem(standard_avg_row, 0, "Avg:", Qt::green);
m_GActionFlow.setItem(standard_mtfandpeak_row, 0, "MTFPeakAvg", Qt::gray);
m_GActionFlow.row = standard_avg_row;
StandardShowAvgData4EFL();
StandardShowAvgData4FFL();
StandardShowAvgData4MTF();
StandardShowAvgData4FS();
StandardShowAvgData4PEAK();
StandardShowAvgData4DOF();
StandardShowAvgData4MTFPeakAvg();
return 0;
}
int GActionFlow_Standard::StandardShowAvgData4EFL()
{
return m_GActionFlow.ShowAvgDataCol(standard_start_row, standard_end_row, m_GActionFlow.efl_col, m_GActionFlow.efl_col, standard_avg_row);
}
int GActionFlow_Standard::StandardShowAvgData4FFL()
{
return m_GActionFlow.ShowAvgDataCol(standard_start_row, standard_end_row, m_GActionFlow.ffl_col, m_GActionFlow.ffl_col, standard_avg_row);
}
int GActionFlow_Standard::StandardShowAvgData4MTF()
{
return m_GActionFlow.ShowAvgDataCol(standard_start_row, standard_end_row, m_GActionFlow.mtf_start_col, m_GActionFlow.mtf_end_col, standard_avg_row);
}
int GActionFlow_Standard::StandardShowAvgData4FS()
{
return m_GActionFlow.ShowAvgDataCol(standard_start_row, standard_end_row, m_GActionFlow.fs_start_col, m_GActionFlow.fs_end_col, standard_avg_row);
}
int GActionFlow_Standard::StandardShowAvgData4PEAK()
{
return m_GActionFlow.ShowAvgDataCol(standard_start_row, standard_end_row, m_GActionFlow.peak_start_col, m_GActionFlow.peak_end_col, standard_avg_row);
}
int GActionFlow_Standard::StandardShowAvgData4DOF()
{
return m_GActionFlow.ShowAvgDataCol(standard_start_row, standard_end_row, m_GActionFlow.dof_start_col, m_GActionFlow.dof_end_col, standard_avg_row);
}
int GActionFlow_Standard::StandardShowAvgData4MTFPeakAvg()
{
int temp = 0;
for (int i = m_GActionFlow.mtf_start_col; i <= m_GActionFlow.mtf_end_col; i++)
{
QString avg1 = m_GActionFlow.theModel4Corr->headerData(i, Qt::Horizontal).toString() + m_GActionFlow.theModel4Corr->headerData(standard_avg_row, Qt::Vertical).toString();
QString avg2 = m_GActionFlow.theModel4Corr->headerData(m_GActionFlow.peak_start_col + temp++, Qt::Horizontal).toString() + m_GActionFlow.theModel4Corr->headerData(standard_avg_row, Qt::Vertical).toString();
QString str = QString("=(%1+%2)/2").arg(avg1).arg(avg2);
m_GActionFlow.setItem(standard_mtfandpeak_row, i, str, Qt::gray);
}
return 0;
}
int GActionFlow_Standard::SpliitMeasurement(QVector<tagMeasurement>& tagMeasureMent, QTabWidget* tabWidget, QVector<tagMeasurement>& tagMeasureMentMTF, QVector<tagMeasurement>& tagMeasureMentTF, QVector<tagMeasurement>& tagMeasureMentTilt, std::set<int>& mySet)
{
int currentModelsSize = 0;
int currentRowsSize = 0;
int currentColsSize = 0;
int number = 0;
for (int i = 0; i < tagMeasureMent.size(); i++)
{
tagMeasurement measurement = tagMeasureMent.at(i);
QString name = measurement.fileName;
if (isFormatValidMTF(name))
{
tagMeasureMentMTF.append(measurement);
number = name.split("-").at(1).toInt();
}
else if (isFormatValidTF(name))
{
tagMeasureMentTF.append(measurement);
number = name.split("-").at(1).toInt();
}
else if (isFormatValidTilt(name))
{
tagMeasureMentTilt.append(measurement);
number = name.split("-").at(0).toInt();
}
else
{
continue;
}
mySet.insert(number);
int index = number - 1; // 索引应该退一位
ensureIndexExists(hr_source_models, currentModelsSize, index);
ensureIndexExists(hr_source_rows, currentRowsSize, index);
ensureIndexExists(hr_source_cols, currentColsSize, index);
m_TableTool.findOrAddPage(tabWidget, QString::number(number), hr_source_models[index]); // 定位到具体页
}
return 0;
}
int GActionFlow_Standard::ShowtagMeasureMentMTF(int& tfStartRow, QVector<tagMeasurement> tagMeasureMentMTF)
{
tfStartRow = 0;
for each (tagMeasurement measurement in tagMeasureMentMTF)
{
QString name = measurement.fileName;
QStringList list = name.split("-");
int number = list.at(1).toInt();
int index = number - 1;
QStandardItemModel* model = hr_source_models[index];
int row = hr_source_rows[index];
int col = hr_source_cols[index];
int nextTableStartCol = 0; // 单个table开始列
int startRow = row;// 单个table初始行
QString angle = measurement.tagParam.tagMTFvsImageHeight.param.value("Sample Azimuth").trimmed();
m_TableTool.setItem(model, row++, col, angle);
m_TableTool.setItem(model, row++, col, measurement.tagTable.tagMTFvsImageHeight.title);
QVector<QStringList> datas = measurement.tagTable.tagMTFvsImageHeight.tableData;
for (int j = 1; j < datas.size(); j++)
{
QStringList data = datas.at(j);
int thisTableStartCol = col;
for (int i = 0; i < data.size() - 1; i++)
{
QString var = data.at(i);
m_TableTool.setItem(model, row, col++, var);
}
row++;
nextTableStartCol = col + 1;
col = thisTableStartCol;
}
// 存入下一个table
tfStartRow = row + 1;
row = startRow;
hr_source_cols[index] = nextTableStartCol; // 间隔1列存储新的table
}
return 0;
}
int GActionFlow_Standard::ShowtagMeasureMentTF(int& start4finadatarow, QVector<tagMeasurement> tagMeasureMentTF)
{
for each (tagMeasurement measurement in tagMeasureMentTF)
{
QString name = measurement.fileName;
QStringList list = name.split("-");
int number = list.at(1).toInt();
int ang = list.at(2).toInt();
int index = number - 1;
QStandardItemModel* model = hr_source_models[index];
int row = hr_source_rows[index];
int col = hr_source_cols[index];
int nextTableStartCol = 0; // 单个table开始列
int startRow = row;// 单个table初始行
QString angle = measurement.tagParam.tagFieldFocus2DTangential.param.value("Sample Azimuth");
m_TableTool.setItem(model, row++, col, angle);
m_TableTool.setItem(model, row++, col, measurement.tagTable.tagFieldFocus2DTangential.title);
tagMeasurementTable table = measurement.tagTable.tagFieldFocus2DTangential;
QVector<QStringList> datas = table.tableData;
for (int j = 1; j < datas.size(); j++)
{
QStringList data = datas.at(j);
int thisTableStartCol = col;
for (int i = 0; i < data.size(); i++)
{
QString var = data.at(i);
m_TableTool.setItem(model, row, col++, var);
}
row++;
nextTableStartCol = col + 1;
col = thisTableStartCol;
}
row++;
angle = measurement.tagParam.tagFieldFocus2DSagittal.param.value("Sample Azimuth");
m_TableTool.setItem(model, row++, col, angle);
m_TableTool.setItem(model, row++, col, measurement.tagTable.tagFieldFocus2DSagittal.title);
table = measurement.tagTable.tagFieldFocus2DSagittal;
datas = table.tableData;
for (int j = 1; j < datas.size(); j++)
{
QStringList data = datas.at(j);
int thisTableStartCol = col;
for (int i = 0; i < data.size(); i++)
{
QString var = data.at(i);
m_TableTool.setItem(model, row, col++, var);
}
row++;
nextTableStartCol = col + 1;
col = thisTableStartCol;
}
// 存入下一个table
start4finadatarow = row + 1;
row = startRow;
hr_source_cols[index] = nextTableStartCol; // 间隔1列存储新的table
}
return 0;
}
int GActionFlow_Standard::ShortTFTableSections(QVector<tagMeasurement> tagMeasureMentTF, QMap<int, QMap<double, tagTableSections>>& map_uutNumber4TableSections)
{
int uutIndex = 1;
while (true)
{
QMap<double, tagTableSections> map; // 存入角度,table
for (int i = 0; i < tagMeasureMentTF.size(); i++)
{
tagMeasurement mea = tagMeasureMentTF.at(i);
QString name = mea.fileName;
QStringList list = name.split("-");
int uutNum = list[1].toInt();
int angle = list[2].remove(".mht").toDouble();
if (uutIndex == uutNum)
{
tagTableSections sections = mea.tagTable;
map.insert(angle, sections);
}
}
if (map.size() == 0)
{
break;
}
map_uutNumber4TableSections.insert(uutIndex, map);
uutIndex++;
}
return 0;
}
int GActionFlow_Standard::Measurement2TFTable(QMap<int, QMap<double, tagTableSections>> map_uutNumber4TableSections)
{
QVector<QStringList> qvec_CamAngleTableCol;
GetCamAngleTableCol(qvec_CamAngleTableCol);
double angle = 0;
int tabcol = 0;
for (int i = 0; i < map_uutNumber4TableSections.size(); i++)
{
QMap<double, tagTableSections> map = map_uutNumber4TableSections.value(i + 1);
int camNum = 1;
int endRow = 0;
QVector<QStringList> qvec_st;
while (camNum < 13)
{
if (1 != GetCamAngleTableCol(qvec_CamAngleTableCol, camNum, angle, tabcol))
{
break;
}
QStringList listS;
QStringList listT;
QStringList listFFL;
QString titleSag = "S" + QString::number(camNum);
listS.push_back(titleSag);
QString titleTan = "T" + QString::number(camNum);
listT.push_back(titleTan);
camNum++;
tagTableSections sections = map.value(angle);
QVector<QStringList> tableData_sag = sections.tagFieldFocus2DSagittal.tableData;
//int startRow = row;
for (int j = 1; j < tableData_sag.size(); j++)
{
QStringList list = tableData_sag.at(j);
QString ffl = list.at(0);
listFFL.push_back(ffl);
if (j == 1)// j=1筛选的FFL一列内容
{
continue;
}
QString sag = list.at(tabcol - 1);
sag = QString::number(sag.toDouble() * 100);
listS.push_back(sag);
//m_TableTool.setItem(model, row++, col, sag);
}
if (qvec_st.size() == 0)
{
qvec_st.push_back(listFFL);
}
//row = startRow;
//col++;
QVector<QStringList> tableData_tan = sections.tagFieldFocus2DTangential.tableData;
for (int j = 2; j < tableData_tan.size(); j++)
{
QStringList list = tableData_sag.at(j);
QString tan = list.at(tabcol - 1);
tan = QString::number(tan.toDouble() * 100);
listT.push_back(tan);
//m_TableTool.setItem(model, row++, col, tan);
}
//endRow = row;
//row = titleRow;
//col++;
qvec_st.push_back(listS);
qvec_st.push_back(listT);
}
map_TfTable.insert(i + 1, qvec_st);
//row = endRow + 1;
//col = 1;
}
return 0;
}
int GActionFlow_Standard::ShowTFTableAndChart(QGridLayout* layout, QTableView* view)
{
int row = tf_start_row;
int col = 1;
QStandardItemModel* model = theModel4Tf;
for (int i = 0; i < map_TfTable.size(); i++)
{
QVector<QStringList> vec = map_TfTable.value(i + 1);
UpDataOneTableAndChart(vec, model, row, col, layout, view);
}
return 0;
}
int GActionFlow_Standard::UpDataOneTableAndChart(QVector<QStringList> one, QStandardItemModel* model, int& row, int& col, QGridLayout* layout, QTableView* view)
{
if (one.isEmpty())
{
return -1;
}
// 缓存表格视图
m_currentTableView = view;
DraggableChartView* chartView;
QChart* chart;
QValueAxis* axisX;
QValueAxis* axisY;
NewChart(chartView, chart, view);
QStringList fflList = one.at(0);
QString min = *std::min_element(fflList.begin(), fflList.end());
QString max = *std::max_element(fflList.begin(), fflList.end());
NewAxisX(chart, axisX, min.toDouble(), max.toDouble());
NewAxisY(chart, axisY, 0, 100);
QString name = "";
int titleRow = row;
int rowEnd = 0;
// 更新一个表格
for (int j = 1; j < one.size(); j++)
{
QStringList list = one.at(j);
QVector<QPointF> points;
for (int k = 0; k < list.size(); k++)
{
QString var = list.at(k);
QString ffl = fflList.at(k);
if (k == 0)
{
name = var;
}
if (k != 0)
{
QPointF f;
f.setX(ffl.toDouble());
f.setY(var.toDouble());
points.push_back(f);
}
m_TableTool.setItem(model, row, col, var);
m_TableTool.setItem(model, row, 0, ffl);
row++;
}
NewSeries(chartView, chart, axisX, axisY, points, name);
rowEnd = row;
row = titleRow;
col++;
}
// 增添放Chart的空位
for (int i = titleRow; i < rowEnd; i++)
{
for (int j = col; j < col + 10; j++)
{
m_TableTool.setItem(model, i, j, "");
}
}
// 保存图表位置
ChartPosition pos;
pos.startRow = titleRow;
pos.startCol = col;
pos.endRow = titleRow + 20;
pos.endCol = col+ 8;
// 更新位置
updateChartPosition(view, chartView, pos);
row = rowEnd + 1;
col = 1;
return 0;
}
int GActionFlow_Standard::NewChart(DraggableChartView*& chartView, QChart*& chart, QTableView* view)
{
// 创建图表视图
chartView = new DraggableChartView(view->viewport());
chartView->setRenderHint(QPainter::Antialiasing); //抗锯齿
chartView->setRubberBand(QChartView::NoRubberBand); // 禁止缩放
// 设置透明背景
chartView->setStyleSheet("background: transparent;");
chartView->setAttribute(Qt::WA_TranslucentBackground);
chart = new QChart;
chart->setTheme(QChart::ChartThemeLight);
chart->setTitle("Through Focus Curves");
// 禁用图表本身的交互标志
chart->setAcceptHoverEvents(false);
chartView->setChart(chart);
chartView->show();
// 连接信号
QObject::connect(chartView, &DraggableChartView::seriesFocusChanged,
this, &GActionFlow_Standard::showQLineSeriesLinkTable);
return 0;
}
int GActionFlow_Standard::NewAxisX(QChart*& chart, QValueAxis*& axisX, double min, double max)
{
//创建坐标轴X
axisX = new QValueAxis;
axisX->setRange(min, max);
axisX->setTitleText("FFL [mm]");
axisX->setTickCount(8);
axisX->setLabelFormat("%.3f");
axisX->setLabelsAngle(-30);
axisX->setGridLineVisible(false);
axisX->setMinorGridLineVisible(false);
chart->addAxis(axisX, Qt::AlignBottom);
return 0;
}
int GActionFlow_Standard::NewAxisY(QChart *& chart, QValueAxis *& axisY, double min, double max)
{
//创建坐标轴Y
axisY = new QValueAxis;
axisY->setRange(min, max); // 设置范围
axisY->setTitleText("MTF [%]"); //设置标题
axisY->setTickCount((max - min) / 10.0); // 设置刻度数量(包括最小和最大值)
axisY->setLabelFormat("%d"); // 设置标签格式
chart->addAxis(axisY, Qt::AlignLeft);
return 0;
}
int GActionFlow_Standard::NewSeries(DraggableChartView*& chartView, QChart*& chart, QValueAxis* axisX, QValueAxis* axisY,
QVector<QPointF> points, QString seriesName)
{
// 创建数据序列
QSplineSeries *series = new QSplineSeries();
series->setName(seriesName);
series->append(points.toList());
series->setVisible(true);
// 设置系列样式
QPen pen;
pen.setWidth(2);
pen.setColor(QColor(rand() % 256, rand() % 256, rand() % 256));
series->setPen(pen);
// 创建散点序列(用于显示选中的点)
QtCharts::QScatterSeries *selectedPoint = new QtCharts::QScatterSeries();
selectedPoint->setMarkerShape(QScatterSeries::MarkerShapeCircle);
selectedPoint->setMarkerSize(10.0); // 放大显示点
selectedPoint->setColor(Qt::red); // 红色高亮
selectedPoint->setName("");
selectedPoint->hide();
// 关键调用:隐藏图例项
// 添加到图表
chart->addSeries(series);
chart->addSeries(selectedPoint);
chart->legend()->setAlignment(Qt::AlignRight);
chart->legend()->setVisible(true);
// 将序列附加到坐标轴
series->attachAxis(axisX);
series->attachAxis(axisY);
selectedPoint->attachAxis(axisX);
selectedPoint->attachAxis(axisY);
// 添加悬停效果
QObject::connect(series, &QSplineSeries::hovered, [series, chartView](const QPointF& point, bool state)
{
if (state)
{
QPen hoverPen = series->pen();
hoverPen.setWidth(4);
series->setPen(hoverPen);
chartView->setCursor(Qt::PointingHandCursor);
}
else
{
QPen normalPen = series->pen();
normalPen.setWidth(2);
series->setPen(normalPen);
chartView->setCursor(Qt::ArrowCursor);
}
});
// 注册到图表视图
chartView->registerSeries(series, selectedPoint);
return 0;
}
int GActionFlow_Standard::GetCamAngleTableCol(QVector<QStringList>& qvec_CamAngleTableCol)
{
QStandardItemModel* model = theModel4Tf;
int row = 1;
int col = 0;
for (int row = 1; row < model->rowCount(); row++)
{
QStringList list;
if (model->item(row, col) != nullptr)
{
QString camNumber = model->item(row, col)->text();
QString angle = model->item(row, col + 1)->text();
QString table_col = model->item(row, col + 2)->text();
list.push_back(camNumber);
list.push_back(angle);
list.push_back(table_col);
qvec_CamAngleTableCol.push_back(list);
}
}
return 0;
}
int GActionFlow_Standard::GetCamAngleTableCol(QVector<QStringList>& qvec_CamAngleTableCol, int cam, double & angle, int & tableCol)
{
if (qvec_CamAngleTableCol.size() <= 0)
{
return -1;
}
for (int i = 0; i < qvec_CamAngleTableCol.size(); i++)
{
QStringList list = qvec_CamAngleTableCol.at(i);
if (list.first().toInt() == cam)
{
angle = list.at(1).toDouble();
tableCol = list.at(2).toInt();
return 1;
}
}
return 0;
}
int GActionFlow_Standard::ShowtagMeasureMentTilt(QVector<tagMeasurement> tagMeasureMentTilt)
{
for each (tagMeasurement measurement in tagMeasureMentTilt)
{
QString name = measurement.fileName;
QStringList list = name.split("-");
int number = list.at(0).toInt();
int index = number - 1;
int nextTableStartCol = 0; // 单个table开始列
int startRow = hr_source_rows[index];// 单个table初始行
QString angle = list.at(1) + "°";
QStandardItemModel* model = hr_source_models[index];
m_TableTool.setItem(model, startRow, hr_source_cols[index]++, angle);
m_TableTool.setItem(model, hr_source_rows[index]++, hr_source_cols[index]--, measurement.tagTable.tagFieldFocus2DSagittal.title);
QVector<QStringList> datas = measurement.tagTable.tagFieldFocus2DSagittal.tableData;
}
return 0;
}
bool GActionFlow_Standard::isFormatValidMTF(const QString & input)
{
QRegularExpressionMatch matchMtf = regexMtf.match(input);
if (matchMtf.hasMatch())
{
return true;
}
return false;
}
bool GActionFlow_Standard::isFormatValidTF(const QString & input)
{
QRegularExpressionMatch matchTf = regexTF.match(input);
if (matchTf.hasMatch())
{
return true;
}
// 返回是否匹配成功
return false;
}
bool GActionFlow_Standard::isFormatValidTilt(const QString & input)
{
QRegularExpressionMatch matchTilt = regexTilt.match(input);
if (matchTilt.hasMatch())
{
return true;
}
// 返回是否匹配成功
return false;
}
void GActionFlow_Standard::InitView4Tf(QTableView *& view)
{
theModel4Tf = new QStandardItemModel();
view->setModel(theModel4Tf);
}
void GActionFlow_Standard::updateChartPosition(QTableView* view, DraggableChartView* chartView, ChartPosition pos)
{
// 此处可以添加图表位置管理逻辑
// 例如存储图表位置信息以便后续访问
Q_UNUSED(view);
Q_UNUSED(chartView);
Q_UNUSED(pos);
if (!chartView->isVisible())
{
return;
}
QRect rect = calculateChartGeometry(view, pos.startRow, pos.startCol, pos.endRow, pos.endCol);
chartView->setGeometry(rect);
chartView->raise(); // 确保在最上层
}
QRect GActionFlow_Standard::calculateChartGeometry(QTableView* view, int startRow, int startCol, int endRow, int endCol)
{
// 计算图表在表格中的位
int x = view->columnViewportPosition(startCol);
int width = view->columnViewportPosition(endCol) +
view->columnWidth(endCol) - x;
// 垂直位置(从第2行开始,到倒数第2行结束)
int y = view->rowViewportPosition(startRow);
int height = view->rowViewportPosition(endRow) +
view->rowHeight(endRow) - y;
// 添加边距
int margin = 10;
return QRect(x + margin, y + margin,
width - 2 * margin, height - 2 * margin);
}
void GActionFlow_Standard::FreashTfTable()
{
QStandardItemModel* model = theModel4Tf;
int row = 0;
int col = 0;
m_TableTool.setItem(model, row, col++, "相机序号");
m_TableTool.setItem(model, row, col++, "角度");
m_TableTool.setItem(model, row, col++, "对应列");
col = 0;
row++;
m_TableTool.setItem(model, row, col, "1");
m_TableTool.setItem(model, row, col + 1, "0");
m_TableTool.setItem(model, row, col + 2, "4");
row++;
m_TableTool.setItem(model, row, col, "2");
m_TableTool.setItem(model, row, col + 1, "0");
m_TableTool.setItem(model, row, col + 2, "3");
row++;
m_TableTool.setItem(model, row, col, "3");
m_TableTool.setItem(model, row, col + 1, "90");
m_TableTool.setItem(model, row, col + 2, "5");
row++;
m_TableTool.setItem(model, row, col, "4");
m_TableTool.setItem(model, row, col + 1, "0");
m_TableTool.setItem(model, row, col + 2, "5");
row++;
m_TableTool.setItem(model, row, col, "5");
m_TableTool.setItem(model, row, col + 1, "90");
m_TableTool.setItem(model, row, col + 2, "3");
row++;
m_TableTool.setItem(model, row, col, "6");
m_TableTool.setItem(model, row, col + 1, "126.87/135");
m_TableTool.setItem(model, row, col + 2, "6");
row++;
m_TableTool.setItem(model, row, col, "7");
m_TableTool.setItem(model, row, col + 1, "36.87/45");
m_TableTool.setItem(model, row, col + 2, "6");
row++;
m_TableTool.setItem(model, row, col, "8");
m_TableTool.setItem(model, row, col + 1, "126.87/135");
m_TableTool.setItem(model, row, col + 2, "2");
row++;
m_TableTool.setItem(model, row, col, "9");
m_TableTool.setItem(model, row, col + 1, "36.87/45");
m_TableTool.setItem(model, row, col + 2, "2");
tf_start_row = row + 2;
}
void GActionFlow_Standard::showQLineSeriesLinkTable(QSplineSeries* focusedSeries)
{
if (!m_currentTableView)
{
return;
}
//// 清除之前的选择
//m_currentTableView->selectionModel()->clearSelection();
clearHighlights();
if (focusedSeries == nullptr)
{
return;
}
// 获取表格模型
QStandardItemModel* model = qobject_cast<QStandardItemModel*>(m_currentTableView->model());
if (!model)
{
return;
}
QVector<double> ffl;
QVector<double> st;
const auto points = focusedSeries->points();
for (int i = 0; i < points.size(); i++)
{
QPointF f = points.at(i);
ffl.push_back(f.x());
st.push_back(f.y());
}
QMap<int, int> mapFFl;
QMap<int, int> mapST;
// 表格上寻找符合的数(x轴数据)
for (int row = 0; row < model->rowCount(); row++)
{
int col = 0; // x轴参数对应第一列
// 检查连续行是否有足够的数据
if (row + ffl.size() > model->rowCount())
{
continue;
}
bool allMatch = true;
for (int i = 0; i < ffl.size(); i++)
{
if (model->item(row + i, col) == nullptr)
{
allMatch = false;
break;
}
QString var = model->item(row + i, col)->text();
if (ffl.at(i) != var.toDouble()) // 使用精度比较浮点数
{
allMatch = false;
break;
}
}
if (allMatch)
{
for (int i = 0; i < ffl.size(); i++)
{
mapFFl.insert(row + i, col);
}
break;
}
}
QList<int> keys = mapFFl.keys();
if (keys.isEmpty()) return; // 没有找到匹配的FFL数据
// 表格上寻找符合的数(y轴数据)
for (int col = 1; col < model->columnCount(); col++)
{
int startRow = keys.first();
// 检查连续行是否有足够的数据
if (startRow + st.size() > model->rowCount())
{
continue;
}
bool allMatch = true;
for (int i = 0; i < st.size(); i++)
{
if (model->item(startRow + i, col) == nullptr)
{
allMatch = false;
break;
}
QString var = model->item(startRow + i, col)->text();
if (st.at(i) != var.toDouble()) // 使用精度比较浮点数
{
allMatch = false;
break;
}
}
if (allMatch)
{
for (int i = 0; i < st.size(); i++)
{
mapST.insert(startRow + i, col);
}
break;
}
}
// 框选显示
if (!mapFFl.isEmpty())
{
highlightRegion(mapFFl, QColor(128, 0, 128, 100)); // 紫色半透明
}
if (!mapST.isEmpty())
{
highlightRegion(mapST, QColor(0, 0, 255, 100)); // 蓝色半透明
}
}
// 高亮显示连续区域(只绘制外框)
void GActionFlow_Standard::highlightRegion(const QMap<int, int>& cellMap, const QColor& color)
{
if (!m_currentTableView) return;
QStandardItemModel* model = qobject_cast<QStandardItemModel*>(m_currentTableView->model());
if (!model) return;
// 获取区域的边界
int minRow = INT_MAX, maxRow = INT_MIN;
int minCol = INT_MAX, maxCol = INT_MIN;
for (auto it = cellMap.constBegin(); it != cellMap.constEnd(); ++it)
{
int row = it.key();
int col = it.value();
if (row < minRow) minRow = row;
if (row > maxRow) maxRow = row;
if (col < minCol) minCol = col;
if (col > maxCol) maxCol = col;
}
// 获取视觉矩形
QRect visualRect = getVisualRect(minRow, minCol, maxRow, maxCol);
if (visualRect.isEmpty()) return;
// 创建自定义覆盖层
HighlightOverlay* overlay = new HighlightOverlay(m_currentTableView->viewport(), color);
overlay->setGeometry(visualRect);
overlay->show();
m_overlays.append(overlay);
}
// 获取视觉区域矩形
QRect GActionFlow_Standard::getVisualRect(int startRow, int startCol, int endRow, int endCol) const
{
if (!m_currentTableView || !m_currentTableView->model())
return QRect();
QModelIndex topLeft = m_currentTableView->model()->index(startRow, startCol);
QModelIndex bottomRight = m_currentTableView->model()->index(endRow, endCol);
if (!topLeft.isValid() || !bottomRight.isValid())
return QRect();
QRect rect1 = m_currentTableView->visualRect(topLeft);
QRect rect2 = m_currentTableView->visualRect(bottomRight);
return rect1.united(rect2);
}
// 清除所有高亮
void GActionFlow_Standard::clearHighlights()
{
// 删除所有覆盖层
for (QWidget* overlay : m_overlays)
{
overlay->deleteLater();
}
m_overlays.clear();
}
/**
* 确保指针数组在指定索引处存在有效对象
*
* @param hr_source_models 指向指针数组的三级指针(允许修改原始数组)
* @param currentSize 指向当前数组大小的指针(允许修改大小值)
* @param index 需要确保存在的索引位置
*/
void GActionFlow_Standard::ensureIndexExists(QStandardItemModel **& hr_source_models, int& currentSize, int index)
{
if (index < 0)
{
throw std::invalid_argument("索引不能为负数");
}
// 检查是否需要扩容
if (index >= currentSize)
{
// 计算新大小(至少比所需索引大1)
int newSize = index + 1;
// 创建新数组
QStandardItemModel** newArray = new QStandardItemModel*[newSize](); // 初始化为 nullptr
// 复制旧数据(如果存在)
if (hr_source_models != nullptr)
{
for (int i = 0; i < currentSize; ++i)
{
newArray[i] = (hr_source_models)[i];
}
delete[] hr_source_models; // 删除旧数组
}
// 初始化新增元素
for (int i = currentSize; i < newSize; ++i)
{
newArray[i] = new QStandardItemModel(); // 创建新对象
}
// 更新指针和大小
hr_source_models = newArray;
currentSize = newSize;
}
// 确保索引处对象有效
if ((hr_source_models)[index] == nullptr)
{
(hr_source_models)[index] = new QStandardItemModel();
}
}
void GActionFlow_Standard::ensureIndexExists(int*& row, int& currentSize, int index)
{
if (index < 0)
{
throw std::invalid_argument("索引不能为负数");
}
// 检查是否需要扩容
if (index >= currentSize)
{
// 计算新大小(至少比所需索引大1)
int newSize = index + 1;
// 创建新数组
int* newArray = new int[newSize](); // 初始化为 nullptr
// 复制旧数据(如果存在)
if (row != nullptr)
{
for (int i = 0; i < currentSize; ++i)
{
newArray[i] = (row)[i];
}
delete[] row; // 删除旧数组
}
// 初始化新增元素
for (int i = currentSize; i < newSize; ++i)
{
newArray[i] = 0; // 创建新对象
}
// 更新指针和大小
row = newArray;
currentSize = newSize;
}
// 确保索引处对象有效
if ((hr_source_models)[index] == nullptr)
{
(hr_source_models)[index] = new QStandardItemModel();
}
}
QList<QTableView*> GActionFlow_Standard::findViewsByModel(QStandardItemModel * model)
{
QList<QTableView*> result;
// 获取所有顶层窗口
const QWidgetList topLevelWidgets = QApplication::topLevelWidgets();
for (QWidget* widget : topLevelWidgets)
{
// 递归搜索所有 QTableView
const QList<QTableView*> tableViews = widget->findChildren<QTableView*>();
for (QTableView* view : tableViews)
{
// 检查视图的模型是否匹配目标模型
if (view->model() == model)
{
result.append(view);
}
}
}
return result;
}
void GActionFlow_Standard::ensureRectItemsExist(QStandardItemModel * model, const QRect & rect)
{
if (!model)
{
qWarning() << "Model is null!";
return;
}
// 获取矩形区域边界
int topRow = rect.top();
int bottomRow = rect.bottom();
int leftCol = rect.left();
int rightCol = rect.right();
// 验证矩形边界是否有效
if (topRow < 0 || leftCol < 0 || bottomRow < topRow || rightCol < leftCol)
{
qWarning() << "Invalid rectangle coordinates:" << rect;
return;
}
// 调整模型大小以确保矩形区域存在
if (model->rowCount() <= bottomRow)
{
model->setRowCount(bottomRow + 1);
}
if (model->columnCount() <= rightCol)
{
model->setColumnCount(rightCol + 1);
}
//// 遍历矩形区域内的所有单元格
//for (int row = topRow; row <= bottomRow; ++row)
//{
// for (int col = leftCol; col <= rightCol; ++col)
// {
// // 检查单元格是否存在
// if (!model->item(row, col))
// {
// // 创建新单元格并设置默认值
// QStandardItem* newItem = new QStandardItem();
// newItem->setText(QString("R%1C%2").arg(row).arg(col));
// newItem->setData(QColor(Qt::lightGray), Qt::BackgroundRole);
// model->setItem(row, col, newItem);
// qDebug() << "Created item at:" << row << col;
// }
// }
//}
}
const QRegularExpression GActionFlow_Standard::regexMtf("^MTF-\\d+-\\d+\\.mht$");
const QRegularExpression GActionFlow_Standard::regexTF("^TF-\\d+-\\d+\\.mht$");
const QRegularExpression GActionFlow_Standard::regexTilt("^\\d+-\\d+\\.mht$");点击曲线后,legend不要更改
最新发布