2023-10-19 14:15:31 +08:00
|
|
|
|
#include "DataGraphView.h"
|
|
|
|
|
|
#include "ui_DataGraphView.h"
|
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
#include "log.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define CHANNELID_ROLE (Qt::UserRole + 2)
|
|
|
|
|
|
#define CHANNELTYPE_ROLE (Qt::UserRole + 3)
|
|
|
|
|
|
|
|
|
|
|
|
CDataGraphView::CDataGraphView(QWidget *parent) :
|
|
|
|
|
|
QWidget(parent),
|
|
|
|
|
|
ui(new Ui::CDataGraphView)
|
|
|
|
|
|
{
|
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
|
//ReadDat();
|
|
|
|
|
|
tracer = new QCPItemTracer(ui->widget_TimeGraph);
|
|
|
|
|
|
tracer->setStyle(QCPItemTracer::tsCrosshair);
|
|
|
|
|
|
tracer->setPen(QPen(Qt::red));
|
|
|
|
|
|
tracer->setBrush(Qt::red);
|
|
|
|
|
|
tracer->setSize(6);
|
|
|
|
|
|
tracer->setVisible(false);
|
|
|
|
|
|
tracer->setInterpolating(false);
|
|
|
|
|
|
|
|
|
|
|
|
QFont font;
|
|
|
|
|
|
font.setPixelSize(20);
|
|
|
|
|
|
tracerLabel = new QCPItemText(ui->widget_TimeGraph);
|
|
|
|
|
|
tracerLabel->setLayer("overlay");
|
|
|
|
|
|
tracerLabel->setPen(QPen(Qt::white));
|
|
|
|
|
|
tracerLabel->setBrush(QColor(64, 156, 225));
|
|
|
|
|
|
tracerLabel->setPadding(QMargins(2,2,2,2));//边界宽度
|
|
|
|
|
|
tracerLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignLeft);//文字布局:顶、左对齐
|
|
|
|
|
|
tracerLabel->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位)
|
|
|
|
|
|
tracerLabel->position->setCoords(0, 0);
|
|
|
|
|
|
tracerLabel->setFont(font);
|
|
|
|
|
|
tracerLabel->setText("");
|
|
|
|
|
|
|
|
|
|
|
|
tracer2 = new QCPItemTracer(ui->widget_FsGraph);
|
|
|
|
|
|
tracer2->setStyle(QCPItemTracer::tsCrosshair);
|
|
|
|
|
|
tracer2->setPen(QPen(Qt::red));
|
|
|
|
|
|
tracer2->setBrush(Qt::red);
|
|
|
|
|
|
tracer2->setSize(6);
|
|
|
|
|
|
tracer2->setVisible(false);
|
|
|
|
|
|
tracer2->setInterpolating(false);
|
|
|
|
|
|
|
|
|
|
|
|
tracerLabel2 = new QCPItemText(ui->widget_FsGraph);
|
|
|
|
|
|
tracerLabel2->setLayer("overlay");
|
|
|
|
|
|
tracerLabel2->setPen(QPen(Qt::white));
|
|
|
|
|
|
tracerLabel2->setBrush(QColor(64, 156, 225));
|
|
|
|
|
|
tracerLabel2->setPadding(QMargins(2,2,2,2));//边界宽度
|
|
|
|
|
|
tracerLabel2->setPositionAlignment(Qt::AlignTop|Qt::AlignLeft);//文字布局:顶、左对齐
|
|
|
|
|
|
tracerLabel2->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位)
|
|
|
|
|
|
tracerLabel2->position->setCoords(0, 0);
|
|
|
|
|
|
tracerLabel2->setFont(font);
|
|
|
|
|
|
tracerLabel2->setText("");
|
|
|
|
|
|
|
|
|
|
|
|
connect(ui->widget_TimeGraph, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMoveEvent(QMouseEvent*)));
|
|
|
|
|
|
connect(ui->widget_TimeGraph, SIGNAL(mouseDoubleClick(QMouseEvent*)), this, SLOT(mouseDoubleClickEvent(QMouseEvent*)));
|
|
|
|
|
|
connect(ui->widget_FsGraph, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMoveEvent2(QMouseEvent*)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDataGraphView::~CDataGraphView()
|
|
|
|
|
|
{
|
|
|
|
|
|
ui->widget_TimeGraph->clearGraphs();
|
|
|
|
|
|
ui->widget_TimeGraph->plotLayout()->clear();
|
|
|
|
|
|
ui->widget_TimeGraph->destroyed();
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QString,QVector<WAVE_DATA>>::Iterator itermapWaveData = m_mapWaveData.begin();
|
|
|
|
|
|
for(itermapWaveData = m_mapWaveData.begin();itermapWaveData != m_mapWaveData.end();itermapWaveData++){
|
|
|
|
|
|
itermapWaveData->clear();
|
|
|
|
|
|
QVector<WAVE_DATA>().swap(itermapWaveData.value());
|
|
|
|
|
|
m_mapWaveData.erase(itermapWaveData);
|
|
|
|
|
|
}
|
|
|
|
|
|
delete ui;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CDataGraphView::RemoveSeries()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
tracer->setVisible(false);
|
|
|
|
|
|
tracer2->setVisible(false);
|
|
|
|
|
|
tracerLabel->setVisible(false);
|
|
|
|
|
|
tracerLabel2->setVisible(false);
|
|
|
|
|
|
ui->widget_TimeGraph->clearGraphs();
|
|
|
|
|
|
ui->widget_FsGraph->clearGraphs();
|
|
|
|
|
|
|
|
|
|
|
|
ui->widget_TimeGraph->replot();
|
|
|
|
|
|
ui->widget_FsGraph->replot();
|
|
|
|
|
|
ui->widget_FsGraph->replot(QCustomPlot::rpQueuedReplot);//刷新图表
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDataGraphView::ItemPressSlot(QTableWidgetItem *item)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
if(!item) return;
|
|
|
|
|
|
if(item->column() != 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
QString strID = item->data(CHANNELID_ROLE).toString();
|
|
|
|
|
|
QString strType = item->data(CHANNELTYPE_ROLE).toString();
|
|
|
|
|
|
|
|
|
|
|
|
if(item->isSelected() && !item->checkState())
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
listChannelID.push_back(strID);
|
|
|
|
|
|
item->setCheckState(Qt::Checked);
|
|
|
|
|
|
item->setSelected(true);
|
|
|
|
|
|
qDebug() << "Add1 channelID" << strID << endl;
|
|
|
|
|
|
RemoveSeries();
|
|
|
|
|
|
emit ItemCheckStateSignal(strID, true);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(item->checkState() && !item->isSelected())
|
|
|
|
|
|
{
|
|
|
|
|
|
item->setCheckState(Qt::Unchecked);
|
|
|
|
|
|
emit ItemCheckStateSignal(strID, false);
|
|
|
|
|
|
listChannelID.removeOne(strID);
|
|
|
|
|
|
qDebug() << "remove1 channelID" << strID << endl;
|
|
|
|
|
|
RemoveSeries();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
void CDataGraphView::ItemChangedSlot(QTableWidgetItem *item)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
if(!item) return;
|
|
|
|
|
|
if(item->column() != 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
QString strID = item->data(CHANNELID_ROLE).toString();
|
|
|
|
|
|
QString strType = item->data(CHANNELTYPE_ROLE).toString();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(item->checkState() && !item->isSelected())
|
|
|
|
|
|
{
|
|
|
|
|
|
listChannelID.push_back(strID);
|
|
|
|
|
|
item->setCheckState(Qt::Checked);
|
|
|
|
|
|
item->setSelected(true);
|
|
|
|
|
|
qDebug() << "Add2 channelID" << strID << endl;
|
|
|
|
|
|
RemoveSeries();
|
|
|
|
|
|
emit ItemCheckStateSignal(strID, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(!item->checkState() && item->isSelected())
|
|
|
|
|
|
{
|
|
|
|
|
|
item->setCheckState(Qt::Unchecked);
|
|
|
|
|
|
item->setSelected(false);
|
|
|
|
|
|
emit ItemCheckStateSignal(strID, false);
|
|
|
|
|
|
listChannelID.removeOne(strID);
|
|
|
|
|
|
qDebug() << "remove2 channelID" << strID << endl;
|
|
|
|
|
|
RemoveSeries();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QTableWidgetItem * CDataGraphView::AddTableWgtItem(QString strText, QString clolor, QString strID)
|
|
|
|
|
|
{
|
|
|
|
|
|
ui->tableWidget->setRowCount(ui->tableWidget->rowCount() + 1);
|
|
|
|
|
|
ui->tableWidget->setColumnWidth(0, 256);
|
|
|
|
|
|
ui->tableWidget->setColumnWidth(1, 5);
|
|
|
|
|
|
QTableWidgetItem *pItemName = new QTableWidgetItem();
|
|
|
|
|
|
pItemName->setText(strText);
|
|
|
|
|
|
pItemName->setCheckState(Qt::Unchecked);
|
|
|
|
|
|
|
|
|
|
|
|
QWidget *pWgt = new QWidget;
|
|
|
|
|
|
QVBoxLayout *pLayout = new QVBoxLayout(pWgt);
|
|
|
|
|
|
QLabel *pLabel = new QLabel(ui->tableWidget);
|
|
|
|
|
|
pLabel->setFixedSize(20, 20);
|
|
|
|
|
|
pLabel->setStyleSheet(QString("QLabel{background: rgb(%1)}").arg(clolor));
|
|
|
|
|
|
pLayout->addWidget(pLabel);
|
|
|
|
|
|
pLayout->setMargin(0);
|
|
|
|
|
|
pLayout->setAlignment(pLabel, Qt::AlignCenter);
|
|
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 0, pItemName);
|
|
|
|
|
|
ui->tableWidget->setCellWidget(ui->tableWidget->rowCount() - 1, 1, pWgt);
|
|
|
|
|
|
|
|
|
|
|
|
m_mapChannelIDtoLabel[strID] = pItemName;
|
|
|
|
|
|
return pItemName;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDataGraphView::SetDataIDs(const QStringList &strIDList, QString strTitle,const QStringList& strChannleTypeList,\
|
|
|
|
|
|
const QStringList& strChannleNameList)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
disconnect(ui->tableWidget, SIGNAL(itemPressed(QTableWidgetItem *)), this, SLOT(ItemPressSlot(QTableWidgetItem *)));
|
|
|
|
|
|
disconnect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(ItemChangedSlot(QTableWidgetItem *)));
|
|
|
|
|
|
//m_listChannelID = strIDList;
|
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
for(int j = 0; j < strIDList.size();j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
QString strNum1 = strIDList[j].right(4).left(2);
|
|
|
|
|
|
QString strNum2 = strIDList[j].right(2);
|
|
|
|
|
|
QString strChannleType = "";
|
|
|
|
|
|
if(strChannleTypeList[j] == "ACCELEROMETER")
|
|
|
|
|
|
{
|
|
|
|
|
|
strChannleType = "加速度";
|
|
|
|
|
|
}else if(strChannleTypeList[j] == "PROXIMETER"){
|
|
|
|
|
|
strChannleType = "径向位移";
|
|
|
|
|
|
}else if(strChannleTypeList[j] == "VELOCITY"){
|
|
|
|
|
|
strChannleType = "速度";
|
|
|
|
|
|
}else if(strChannleTypeList[j] == "SLOW_CURRENT"){
|
|
|
|
|
|
strChannleType = "电流";
|
|
|
|
|
|
}else if(strChannleTypeList[j] == "THRUST"){
|
|
|
|
|
|
strChannleType = "轴向位移";
|
|
|
|
|
|
}else if(strChannleTypeList[j] == "TACHOMETER"){
|
|
|
|
|
|
strChannleType = "转速";
|
|
|
|
|
|
}else if(strChannleTypeList[j] == "MICROPHONE"){
|
|
|
|
|
|
strChannleType = "声音";
|
|
|
|
|
|
}else if(strChannleTypeList[j] == "FAST_VOLTAGE"){
|
|
|
|
|
|
strChannleType = "动态电压";
|
|
|
|
|
|
}else if(strChannleTypeList[j] == "PULSE_CURRENT"){
|
|
|
|
|
|
strChannleType = "高速电流";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QString strText = QStringLiteral("%1-%2%3 (%4)").arg(strChannleNameList[j]).arg(strNum1).arg(strNum2).arg(strChannleType);
|
|
|
|
|
|
//QString strText = QStringLiteral("%1").arg(strChannleType[j]);
|
|
|
|
|
|
QString strColor = "0,255,0";
|
|
|
|
|
|
switch(i){
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
strColor = "0,255,0";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
strColor = "30,144,255";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
strColor = "255,182,193";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
strColor = "0, 255, 255";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
strColor = "255, 0, 255";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
strColor = "255, 255, 0";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 6:
|
|
|
|
|
|
strColor = "255,69,0";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 7:
|
|
|
|
|
|
strColor = "0, 255, 127";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 8:
|
|
|
|
|
|
strColor = "255,140,0";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 9:
|
|
|
|
|
|
strColor = "0, 191, 255";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 10:
|
|
|
|
|
|
strColor = "139, 0, 139";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 11:
|
|
|
|
|
|
strColor = "211, 211, 211";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 12:
|
|
|
|
|
|
strColor = "205, 205, 0";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 13:
|
|
|
|
|
|
strColor = "153,51, 250";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 14:
|
|
|
|
|
|
strColor = "255, 218, 185";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 15:
|
|
|
|
|
|
strColor = "0, 199 ,140";
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
strColor = "0,255,0";
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
i++;
|
|
|
|
|
|
if(i > 15)
|
|
|
|
|
|
i = 0;
|
|
|
|
|
|
QTableWidgetItem *pItem = AddTableWgtItem(strText, strColor, strIDList[j]);
|
|
|
|
|
|
|
|
|
|
|
|
pItem->setData(CHANNELID_ROLE, strIDList[j]);
|
|
|
|
|
|
pItem->setData(CHANNELTYPE_ROLE, strChannleTypeList[j]);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
connect(ui->tableWidget, SIGNAL(itemPressed(QTableWidgetItem *)), this, SLOT(ItemPressSlot(QTableWidgetItem *)));
|
|
|
|
|
|
connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(ItemChangedSlot(QTableWidgetItem *)));
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
m_mapChannelIDtoLabel[strIDList[0]]->setSelected(true);
|
|
|
|
|
|
m_mapChannelIDtoLabel[strIDList[0]]->setCheckState(Qt::Checked);
|
|
|
|
|
|
listChannelID.push_back(strIDList[0]);
|
|
|
|
|
|
emit ItemCheckStateSignal(strIDList[0], true);
|
|
|
|
|
|
//ViewData(strIDList[0]);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDataGraphView::ViewData(QString& strChannelID,QVector<WAVE_DATA>& wavedata)
|
|
|
|
|
|
{
|
|
|
|
|
|
qDebug() << "ViewData" << endl;
|
|
|
|
|
|
foreach (auto ID, listChannelID){
|
|
|
|
|
|
if(ID != strChannelID){
|
|
|
|
|
|
m_mapChannelIDtoLabel[ID]->setCheckState(Qt::Unchecked);
|
|
|
|
|
|
m_mapChannelIDtoLabel[ID]->setSelected(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
m_strChannelID = strChannelID;
|
|
|
|
|
|
m_wavedata = wavedata;
|
|
|
|
|
|
int Time = wavedata.size();
|
|
|
|
|
|
ui->widget_TimeGraph->xAxis->setRange(1, Time);
|
|
|
|
|
|
ui->widget_TimeGraph->xAxis->setLabel("Time(s)");
|
|
|
|
|
|
QVector<double> key,value;
|
|
|
|
|
|
key.reserve(Time*wavedata[0].waveData.size());
|
|
|
|
|
|
value.reserve(Time*wavedata[0].waveData.size());
|
|
|
|
|
|
qDebug() << "Time" << Time << endl;
|
|
|
|
|
|
double gap = (double)1/(double)wavedata[0].waveData.size();
|
|
|
|
|
|
double f = 0.0;
|
|
|
|
|
|
for(int i = 0; i < Time;i++){
|
|
|
|
|
|
for(int j = 0; j < wavedata[i].waveData.size();j++){
|
|
|
|
|
|
|
|
|
|
|
|
key.push_back(f);
|
|
|
|
|
|
value.push_back(wavedata[i].waveData[j]-wavedata[i].mean);
|
|
|
|
|
|
f += gap;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
ui->widget_TimeGraph->addGraph(ui->widget_TimeGraph->xAxis, ui->widget_TimeGraph->yAxis);
|
|
|
|
|
|
QString str = QString("key size: %1,value size:%2").arg(key.size()).arg(value.size());
|
|
|
|
|
|
customLogMessageHandler(QtDebugMsg,str);
|
|
|
|
|
|
ui->widget_TimeGraph->graph(0)->setData(key, value);
|
|
|
|
|
|
QPen pen;
|
|
|
|
|
|
pen.setColor(wavedata.at(0).linColor);
|
|
|
|
|
|
pen.setStyle(Qt::SolidLine);
|
|
|
|
|
|
ui->widget_TimeGraph->graph(0)->setPen(pen);
|
|
|
|
|
|
|
|
|
|
|
|
ui->widget_TimeGraph->rescaleAxes(true);
|
|
|
|
|
|
QString stryLabel = wavedata[0].sensorType + "(" + wavedata[0].sensorEngineeringUnit +")";
|
|
|
|
|
|
ui->widget_TimeGraph->yAxis->setLabel( stryLabel);
|
|
|
|
|
|
ui->widget_TimeGraph->setSelectionRectMode(QCP::SelectionRectMode::srmNone);
|
|
|
|
|
|
ui->widget_TimeGraph->setInteractions(QCP::iRangeZoom|QCP::iRangeDrag);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QVector<double>::iterator max = std::max_element(std::begin(value), std::end(value));
|
|
|
|
|
|
QVector<double>::iterator min = std::min_element(std::begin(value), std::end(value));
|
|
|
|
|
|
double biggest = *max;
|
|
|
|
|
|
double minimum = *min;
|
2024-09-11 16:37:00 +08:00
|
|
|
|
ui->widget_TimeGraph->yAxis->setRange(minimum,biggest);
|
2023-10-19 14:15:31 +08:00
|
|
|
|
ui->widget_TimeGraph->axisRect()->setRangeZoomFactor(1.2,1);
|
|
|
|
|
|
ui->widget_TimeGraph->axisRect()->setRangeZoomAxes(ui->widget_TimeGraph->xAxis,ui->widget_TimeGraph->yAxis);
|
|
|
|
|
|
ui->widget_TimeGraph->replot();
|
|
|
|
|
|
}
|
|
|
|
|
|
void CDataGraphView::mouseMoveEvent2(QMouseEvent *event)
|
|
|
|
|
|
{
|
|
|
|
|
|
tracer2->setVisible(true);
|
|
|
|
|
|
tracerLabel2->setVisible(true);
|
|
|
|
|
|
//将像素点转换成qcustomplot中的坐标值,并通过setGraphKey将锚点值设为真实数据值。tracer->setGraphKey(xAxis->pixelToCoord(event->pos().x()));
|
|
|
|
|
|
int graphCount = ui->widget_FsGraph->graphCount();
|
|
|
|
|
|
if(graphCount < 1)
|
|
|
|
|
|
return;
|
|
|
|
|
|
//获得鼠标位置处对应的横坐标数据x
|
|
|
|
|
|
double x = ui->widget_FsGraph->xAxis->pixelToCoord(event->pos().x());
|
|
|
|
|
|
double y = ui->widget_FsGraph->xAxis->pixelToCoord(event->pos().y());
|
|
|
|
|
|
//遍历曲线
|
|
|
|
|
|
for (int i = 0; i < graphCount && tracer2->visible(); ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
//显示锚点
|
|
|
|
|
|
QCPGraph *mGraph = ui->widget_FsGraph->graph(i);
|
|
|
|
|
|
tracer2->setGraph(mGraph);//将锚点设置到被选中的曲线上
|
|
|
|
|
|
tracer2->setGraphKey(x); //将游标横坐标设置成刚获得的横坐标数据x
|
|
|
|
|
|
tracer2->updatePosition(); //使得刚设置游标的横纵坐标位置生效
|
|
|
|
|
|
double xValue = tracer2->position->key();
|
|
|
|
|
|
double yValue = tracer2->position->value();
|
|
|
|
|
|
tracerLabel2->setVisible(true);
|
|
|
|
|
|
tracerLabel2->setText(QString("X: %1 Y: %2").arg( QString::number(xValue)).arg(QString::number(yValue)));
|
|
|
|
|
|
//显示tip框
|
|
|
|
|
|
//QCPDataContainer<QCPGraphData>::const_iterator coorPoint = ui->widget_TimeGraph->graph(0)->data().data()->findBegin(xValue, true);//true代表向左搜索
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//重绘
|
|
|
|
|
|
ui->widget_FsGraph->replot();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDataGraphView::mouseMoveEvent(QMouseEvent *event)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
tracer->setVisible(true);
|
|
|
|
|
|
tracerLabel->setVisible(true);
|
|
|
|
|
|
//将像素点转换成qcustomplot中的坐标值,并通过setGraphKey将锚点值设为真实数据值。tracer->setGraphKey(xAxis->pixelToCoord(event->pos().x()));
|
|
|
|
|
|
int graphCount = ui->widget_TimeGraph->graphCount();
|
|
|
|
|
|
if(graphCount < 1)
|
|
|
|
|
|
return;
|
|
|
|
|
|
//获得鼠标位置处对应的横坐标数据x
|
|
|
|
|
|
double x = ui->widget_TimeGraph->xAxis->pixelToCoord(event->pos().x());
|
|
|
|
|
|
double y = ui->widget_TimeGraph->xAxis->pixelToCoord(event->pos().y());
|
|
|
|
|
|
//遍历曲线
|
|
|
|
|
|
for (int i = 0; i < graphCount && tracer->visible(); ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
//显示锚点
|
|
|
|
|
|
QCPGraph *mGraph = ui->widget_TimeGraph->graph(i);
|
|
|
|
|
|
tracer->setGraph(mGraph);//将锚点设置到被选中的曲线上
|
|
|
|
|
|
tracer->setGraphKey(x); //将游标横坐标设置成刚获得的横坐标数据x
|
|
|
|
|
|
tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效
|
|
|
|
|
|
double xValue = tracer->position->key();
|
|
|
|
|
|
double yValue = tracer->position->value();
|
|
|
|
|
|
tracerLabel->setVisible(true);
|
|
|
|
|
|
tracerLabel->setText(QString("X: %1 Y: %2").arg( QString::number(xValue)).arg(QString::number(yValue)));
|
|
|
|
|
|
//显示tip框
|
|
|
|
|
|
//QCPDataContainer<QCPGraphData>::const_iterator coorPoint = ui->widget_TimeGraph->graph(0)->data().data()->findBegin(xValue, true);//true代表向左搜索
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//重绘
|
|
|
|
|
|
ui->widget_TimeGraph->replot();
|
|
|
|
|
|
}
|
|
|
|
|
|
void CDataGraphView::mouseDoubleClickEvent(QMouseEvent *event)
|
|
|
|
|
|
{
|
|
|
|
|
|
int graphCount = ui->widget_TimeGraph->graphCount();
|
|
|
|
|
|
if(graphCount < 1)
|
|
|
|
|
|
return;
|
|
|
|
|
|
qDebug()<<"mouseDoubleClickEvent" << endl;
|
|
|
|
|
|
int x = ui->widget_TimeGraph->xAxis->pixelToCoord(event->pos().x());
|
|
|
|
|
|
|
|
|
|
|
|
ui->widget_FsGraph->xAxis->setLabel("Fs(Hz)");
|
|
|
|
|
|
QVector<double> vecData,vecFFTSpecData;
|
|
|
|
|
|
double sum = std::accumulate(std::begin(m_wavedata[x].waveData), std::end(m_wavedata[x].waveData), 0.0);
|
|
|
|
|
|
float size = m_wavedata[x].SamleRate;
|
|
|
|
|
|
double mean = sum/size;
|
|
|
|
|
|
for(int j = 0 ; j < m_wavedata[x].SamleRate;j++){
|
|
|
|
|
|
|
|
|
|
|
|
vecData.push_back(m_wavedata[x].waveData.at(j)-mean);
|
|
|
|
|
|
}
|
|
|
|
|
|
comFun.FFTSpec(vecData,vecFFTSpecData);
|
|
|
|
|
|
QVector<double> key,value;
|
|
|
|
|
|
|
|
|
|
|
|
for(int j = 0; j < vecFFTSpecData.size();j++){
|
|
|
|
|
|
key.push_back(j);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ui->widget_FsGraph->addGraph(ui->widget_FsGraph->xAxis, ui->widget_FsGraph->yAxis);
|
|
|
|
|
|
ui->widget_FsGraph->graph(0)->setData(key, vecFFTSpecData);
|
|
|
|
|
|
QPen pen;
|
|
|
|
|
|
pen.setColor(m_wavedata.at(0).linColor);
|
|
|
|
|
|
pen.setStyle(Qt::SolidLine);
|
|
|
|
|
|
ui->widget_FsGraph->graph(0)->setPen(pen);
|
|
|
|
|
|
|
|
|
|
|
|
ui->widget_FsGraph->rescaleAxes(true);
|
|
|
|
|
|
QString stryLabel = m_wavedata[0].sensorType + "(" + m_wavedata[0].sensorEngineeringUnit +")";
|
|
|
|
|
|
ui->widget_FsGraph->yAxis->setLabel( stryLabel);
|
|
|
|
|
|
ui->widget_FsGraph->setSelectionRectMode(QCP::SelectionRectMode::srmNone);
|
|
|
|
|
|
ui->widget_FsGraph->setInteractions(QCP::iRangeZoom|QCP::iRangeDrag);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QVector<double>::iterator max = std::max_element(std::begin(value), std::end(value));
|
|
|
|
|
|
QVector<double>::iterator min = std::min_element(std::begin(value), std::end(value));
|
|
|
|
|
|
double biggest = *max;
|
|
|
|
|
|
double minimum = *min;
|
|
|
|
|
|
ui->widget_FsGraph->yAxis->setRange(minimum-1,biggest+2);
|
|
|
|
|
|
ui->widget_FsGraph->graph(0)->rescaleValueAxis(false,true);
|
|
|
|
|
|
|
|
|
|
|
|
ui->widget_FsGraph->axisRect()->setRangeZoomFactor(1.2,1);
|
|
|
|
|
|
ui->widget_FsGraph->axisRect()->setRangeZoomAxes(ui->widget_FsGraph->xAxis,ui->widget_FsGraph->yAxis);
|
|
|
|
|
|
ui->widget_FsGraph->replot();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDataGraphView::ReadDatFile(QString strFileName){
|
|
|
|
|
|
QFile file(strFileName);
|
|
|
|
|
|
if (!file.open(QIODevice::ReadOnly))
|
|
|
|
|
|
{
|
|
|
|
|
|
qDebug() << "::MainWidget::ReadDatData() cannot open file for read";
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QProgressDialog *progressDialog = new QProgressDialog(this);
|
|
|
|
|
|
progressDialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
|
|
|
|
|
|
progressDialog->setWindowModality(Qt::WindowModal);
|
|
|
|
|
|
progressDialog->setWindowTitle(tr("Please Wait"));
|
|
|
|
|
|
progressDialog->setLabelText(tr("数据读取中..."));
|
|
|
|
|
|
progressDialog->setCancelButton(0);
|
|
|
|
|
|
progressDialog->show();
|
|
|
|
|
|
|
|
|
|
|
|
QString m_sEquipNo; //设备号
|
|
|
|
|
|
QString m_strDeviceName; //设备名称
|
|
|
|
|
|
QString m_strCollectTime; //采集时间
|
|
|
|
|
|
QTime startTime = QTime::currentTime();
|
|
|
|
|
|
// qDebug() << "Vector 的 容量为1" << m_vecPushData.capacity() << endl;
|
|
|
|
|
|
qDebug() << "m_vecAllData 的 容量为2" << m_vecAllData.capacity() << endl;
|
|
|
|
|
|
m_vecGroupdata.clear();
|
|
|
|
|
|
m_vecWaveInfo.clear();
|
|
|
|
|
|
QVector<GroupData>().swap(m_vecGroupdata);
|
|
|
|
|
|
QVector<WAVE_INFO>().swap(m_vecWaveInfo);
|
|
|
|
|
|
QVector<WAVE_ALLDATA>().swap(m_vecAllData);
|
|
|
|
|
|
QMap<QString,QVector<WAVE_DATA>>::Iterator iter1 = mapWaveData.begin();
|
|
|
|
|
|
for(iter1 = mapWaveData.begin();iter1 !=mapWaveData.end();iter1++){
|
|
|
|
|
|
QVector<WAVE_DATA>().swap(iter1.value());
|
|
|
|
|
|
mapWaveData.erase(iter1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
qDebug() << "m_vecAllData 的 容量为2" << m_vecAllData.capacity() << endl;
|
|
|
|
|
|
|
|
|
|
|
|
int theSize = 0; //通道数
|
|
|
|
|
|
//读12字节头文件
|
|
|
|
|
|
int iJsonSize, iChannelsize;
|
|
|
|
|
|
char equipNo[12]; //设备No 12字节
|
|
|
|
|
|
char time[10]; //数据起始时间 10字节
|
|
|
|
|
|
|
|
|
|
|
|
file.read((char*)&iChannelsize, sizeof(iChannelsize));
|
|
|
|
|
|
|
|
|
|
|
|
qDebug() << "::MainWidget::ReadDatData() Channelsize:" << iChannelsize;
|
|
|
|
|
|
int iCount; //存储dat文件原始数据秒数
|
|
|
|
|
|
file.read((char*)&iCount, sizeof(iCount));
|
|
|
|
|
|
qDebug() << "::MainWidget::ReadDatData() iCount:" << iCount;
|
|
|
|
|
|
|
|
|
|
|
|
file.read(equipNo, sizeof(equipNo));
|
|
|
|
|
|
QString sEquipNo(equipNo);
|
|
|
|
|
|
m_sEquipNo = sEquipNo.left(12);
|
|
|
|
|
|
qDebug() << "::MainWidget::ReadDatData() equipNo:" << m_sEquipNo;
|
|
|
|
|
|
file.read(time, sizeof(time));
|
|
|
|
|
|
QString CollectTime(time);
|
|
|
|
|
|
m_strCollectTime = CollectTime.left(10);
|
|
|
|
|
|
qDebug() << "::MainWidget::ReadDatData() time:" << m_strCollectTime;
|
|
|
|
|
|
file.read((char *)&iJsonSize, sizeof(iJsonSize));
|
|
|
|
|
|
qDebug() << "::MainWidget::ReadDatData() iJsonSize:" << iJsonSize;
|
|
|
|
|
|
|
|
|
|
|
|
//读json串
|
|
|
|
|
|
char *buf0 = (char *)malloc(sizeof(char) *iJsonSize);
|
|
|
|
|
|
file.read(buf0,iJsonSize);
|
|
|
|
|
|
|
|
|
|
|
|
QJsonParseError parseJsonErr;
|
|
|
|
|
|
QJsonDocument document = QJsonDocument::fromJson(buf0,&parseJsonErr);
|
|
|
|
|
|
if(!(parseJsonErr.error == QJsonParseError::NoError))
|
|
|
|
|
|
{
|
|
|
|
|
|
qDebug()<<tr("解析json文件错误!");
|
|
|
|
|
|
//delete progressDialog;
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("Dat文件不符合规范!"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
int channels = 0;
|
|
|
|
|
|
QJsonObject jsonObject = document.object();
|
|
|
|
|
|
QString strType = jsonObject["DeviceType"].toString();
|
|
|
|
|
|
qDebug() << "Device Type" << strType << endl;
|
|
|
|
|
|
if(jsonObject.contains(QStringLiteral("ChannelSettings"))){
|
|
|
|
|
|
QJsonValue arrayValue = jsonObject.value(QStringLiteral("ChannelSettings"));
|
|
|
|
|
|
if(arrayValue.isArray()){
|
|
|
|
|
|
QJsonArray array = arrayValue.toArray();
|
|
|
|
|
|
theSize = array.size();
|
|
|
|
|
|
for(int i = 0; i<array.size();i++){
|
|
|
|
|
|
WAVE_INFO waveInfo;
|
|
|
|
|
|
channelEnabled[i] = array.at(i)["isEnable"].toInt();
|
|
|
|
|
|
channelwork[i] = array.at(i)["isWork"].toInt();
|
|
|
|
|
|
QString strchannelType = array.at(i)["sensorType"].toString();
|
|
|
|
|
|
//qDebug() << channelEnabled[i] << channelwork[i] << array.at(i)["channelId"].toString() << endl;
|
|
|
|
|
|
if(channelEnabled[i] && channelwork[i] && strchannelType != "DO" && strchannelType != "DI"){
|
|
|
|
|
|
waveInfo.channelId = array.at(i)["channelId"].toString();
|
|
|
|
|
|
waveInfo.channelType = array.at(i)["sensorType"].toString();
|
|
|
|
|
|
waveInfo.channelName = array.at(i)["channelName"].toString();
|
|
|
|
|
|
waveInfo.sensorType = array.at(i)["sensorType"].toString();
|
|
|
|
|
|
waveInfo.channelSamleRate = array.at(i)["samplingRate"].toInt();
|
|
|
|
|
|
waveInfo.pairChannelID = array.at(i)["pairChannelId"].toString();
|
|
|
|
|
|
waveInfo.equipmentName = array.at(i)["equipmentName"].toString();
|
|
|
|
|
|
waveInfo.sensorEngineeringUnit = array.at(i)["sensorEngineeringUnit"].toString();
|
|
|
|
|
|
waveInfo.speedRefChannelId = array.at(i)["speedRefChannelId"].toString();
|
|
|
|
|
|
waveInfo.tachAutoTach = array.at(i)["tachAutoTach"].toBool();
|
|
|
|
|
|
waveInfo.sensorGapVoltage = array.at(i)["sensorGapVoltage"].toDouble();
|
|
|
|
|
|
waveInfo.sensorSensitivity = array.at(i)["sensorSensitivity"].toDouble();
|
|
|
|
|
|
QString strtachTriggerEdge = array.at(i)["tachTriggerEdge"].toString();
|
|
|
|
|
|
if(strtachTriggerEdge == "rising"){
|
|
|
|
|
|
waveInfo.iTrigger = 0;
|
|
|
|
|
|
}else if(strtachTriggerEdge == "falling"){
|
|
|
|
|
|
waveInfo.iTrigger = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
waveInfo.iTrigger = 0;
|
|
|
|
|
|
waveInfo.iKeyCount = array.at(i)["tachTriggerPerRev"].toInt();
|
|
|
|
|
|
waveInfo.iTriggerValue = array.at(i)["tachTriggerVoltageLevel"].toDouble();
|
|
|
|
|
|
waveInfo.iHysteresis = array.at(i)["tachTriggerHysteresis"].toDouble();
|
|
|
|
|
|
qDebug() <<waveInfo.channelId<< "iKeyCount" << waveInfo.iKeyCount << "iTriggerValue" << waveInfo.iTriggerValue << "iHysteresis" << waveInfo.iHysteresis << endl;
|
|
|
|
|
|
m_vecWaveInfo.push_back(waveInfo);
|
|
|
|
|
|
channels ++ ;
|
|
|
|
|
|
qDebug() << waveInfo.sensorGapVoltage << waveInfo.sensorSensitivity << endl;
|
|
|
|
|
|
qDebug() << waveInfo.channelId << waveInfo.channelType <<waveInfo.channelName << waveInfo.pairChannelID << waveInfo.sensorEngineeringUnit << waveInfo.speedRefChannelId << waveInfo.iTriggerValue<<endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}if(jsonObject.contains(QStringLiteral("groups"))){
|
|
|
|
|
|
QJsonValue arrayValue = jsonObject.value(QStringLiteral("groups"));
|
|
|
|
|
|
if(arrayValue.isArray()){
|
|
|
|
|
|
QJsonArray array1 = arrayValue.toArray();
|
|
|
|
|
|
theSize = array1.size();
|
|
|
|
|
|
for(int i = 0; i<array1.size();i++){
|
|
|
|
|
|
QString strChannelType = array1.at(i)["ChannelType"].toString();
|
|
|
|
|
|
QString strChannelID = array1.at(i)["name"].toString();
|
|
|
|
|
|
//if(strChannelType == "TACHOMETER")
|
|
|
|
|
|
{
|
|
|
|
|
|
for(int ii = 0; ii < m_vecWaveInfo.size();ii++){
|
|
|
|
|
|
if(strChannelID == m_vecWaveInfo[ii].channelId){
|
|
|
|
|
|
QJsonValue arrayValue = array1.at(i)["channels"];
|
|
|
|
|
|
QJsonArray array2 = arrayValue.toArray();
|
|
|
|
|
|
for(int j = 0; j<array2.size();j++){
|
|
|
|
|
|
if("SpeedProfileSpeed" == array2.at(j)["name"].toString()){
|
|
|
|
|
|
QJsonArray arrayValue = array2.at(j)["data"].toArray();
|
|
|
|
|
|
for(int jj = 0; jj < arrayValue.size();jj++){
|
|
|
|
|
|
m_vecWaveInfo[ii].SpeedProfileSpeed.push_back(arrayValue[jj].toDouble());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if("RMSValues" == array2.at(j)["name"].toString()){
|
|
|
|
|
|
QJsonArray arrayValue = array2.at(j)["data"].toArray();
|
|
|
|
|
|
for(int jj = 0; jj < arrayValue.size();jj++){
|
|
|
|
|
|
m_vecWaveInfo[ii].RMSValue.push_back(arrayValue[jj].toDouble());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qDebug()<<"channels" <<channels<<endl;
|
|
|
|
|
|
//循环读出原始数据内容
|
|
|
|
|
|
WAVE_CHNDATA m_WaveChnData[15000];
|
|
|
|
|
|
int Count, waveSize,bufferSiz;
|
|
|
|
|
|
if(strType == "3500")
|
|
|
|
|
|
bufferSiz = 16;
|
|
|
|
|
|
else
|
|
|
|
|
|
bufferSiz = 15;
|
|
|
|
|
|
char buf[bufferSiz];
|
|
|
|
|
|
m_vecAllData.clear();
|
|
|
|
|
|
//QVector<WAVE_DATA> pData;
|
|
|
|
|
|
int j = 0;
|
|
|
|
|
|
int temCount = 0;
|
|
|
|
|
|
int flag = -1;
|
|
|
|
|
|
progressDialog->setRange(0, iCount * channels-1);
|
|
|
|
|
|
|
|
|
|
|
|
while (!file.atEnd()) {
|
|
|
|
|
|
file.read((char *)&Count, sizeof(Count));
|
|
|
|
|
|
//qDebug()<<"Count" << Count << "temCount" <<temCount<< endl;
|
|
|
|
|
|
if(Count > temCount && flag == 0)//过滤超出的秒数的数据
|
|
|
|
|
|
break;
|
|
|
|
|
|
if(Count == temCount && flag == 0)
|
|
|
|
|
|
flag = 1;
|
|
|
|
|
|
if(Count < temCount || flag == 1){//过滤原始数据中转速多余数据
|
|
|
|
|
|
file.read(buf, sizeof(buf));
|
|
|
|
|
|
file.read((char *)&waveSize, sizeof(waveSize));
|
|
|
|
|
|
float f = 0.0;
|
|
|
|
|
|
QVector<double> vecSpeed;
|
|
|
|
|
|
qDebug()<<"waveSize1" <<waveSize<<endl;
|
|
|
|
|
|
for (int i = 0; i < waveSize; i++) {
|
|
|
|
|
|
file.read((char *)&f, sizeof(f));
|
|
|
|
|
|
vecSpeed.push_back(f);
|
|
|
|
|
|
}
|
|
|
|
|
|
for(int ii = 0; ii < 2000;ii++){
|
|
|
|
|
|
if(m_WaveChnData[ii].Second == Count){
|
|
|
|
|
|
m_WaveChnData[ii].TimeStamp = vecSpeed;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
flag = 0;
|
|
|
|
|
|
qDebug()<<"::MainWidget::ReadDatData()11 wave.channelId" << buf <<" wave.count"<<Count<<" wave.wavedata"<<m_WaveChnData[j].waveData.size()<<"waveSize"<<waveSize << "j"<<j<<endl;;
|
|
|
|
|
|
}else {
|
|
|
|
|
|
file.read(buf, sizeof(buf));
|
|
|
|
|
|
file.read((char *)&waveSize, sizeof(waveSize));
|
|
|
|
|
|
float f = 0.0;
|
|
|
|
|
|
WAVE_ALLDATA waveAll;
|
|
|
|
|
|
if(waveSize < 0 || waveSize > 131072){
|
|
|
|
|
|
qDebug() << "waveSize2" << waveSize << endl;
|
|
|
|
|
|
//delete progressDialog;
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("Dat文件不符合规范!"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
for (int i = 0; i < waveSize; i++) {
|
|
|
|
|
|
file.read((char *)&f, sizeof(f));
|
|
|
|
|
|
m_WaveChnData[j].channelId = buf;
|
|
|
|
|
|
m_WaveChnData[j].waveData.push_back((double)f);
|
|
|
|
|
|
m_WaveChnData[j].Second = Count;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
temCount = Count;
|
|
|
|
|
|
//qDebug()<<"::MainWidget::ReadDatData() wave.channelId" << m_WaveChnData[j].channelId<<" wave.count"<<Count<<" wave.wavedata"<<m_WaveChnData[j].waveData.size()<<"waveSize"<<waveSize << "j"<<j<<endl;;
|
|
|
|
|
|
}
|
|
|
|
|
|
progressDialog->setValue(j);
|
|
|
|
|
|
if (progressDialog->wasCanceled())
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
delete progressDialog;
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
return ;
|
|
|
|
|
|
}
|
|
|
|
|
|
j++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//qDebug()<<m_vecAllData.size()<<m_vecAllData.capacity() << "iCount" <<iCount << "m_vecWaveInfo" << m_vecWaveInfo.size() <<endl;
|
|
|
|
|
|
QVector<WAVE_INFO>::iterator iter = m_vecWaveInfo.begin();
|
|
|
|
|
|
int linecolor = 0;
|
|
|
|
|
|
|
|
|
|
|
|
for (;iter != m_vecWaveInfo.end() ; iter++ ) {
|
|
|
|
|
|
WAVE_DATA wave;
|
|
|
|
|
|
int ii = 0;
|
|
|
|
|
|
QVector<WAVE_DATA> m_vecPushData1;
|
|
|
|
|
|
for(int i = 0; i < j; i++){
|
|
|
|
|
|
//qDebug() << "i" << iter->channelId.left(bufferSiz) << "j " << m_WaveChnData[i].channelId.left(bufferSiz) <<endl;
|
|
|
|
|
|
if(iter->channelId.left(bufferSiz) == m_WaveChnData[i].channelId.left(bufferSiz)){
|
|
|
|
|
|
|
|
|
|
|
|
wave.waveData = m_WaveChnData[i].waveData;
|
|
|
|
|
|
double sum = 0.0;
|
|
|
|
|
|
if(iter->sensorType == "ACCELEROMETER" || iter->sensorType == "MICROPHONE" ||
|
|
|
|
|
|
iter->sensorType == "PROXIMETER" || iter->sensorType == "VELOCITY" ||
|
|
|
|
|
|
iter->sensorType == "TACHOMETER" || iter->sensorType == "THRUST" ||
|
|
|
|
|
|
iter->sensorType == "FAST_VOLTAGE"){
|
|
|
|
|
|
sum = std::accumulate(std::begin(wave.waveData), std::end(wave.waveData), 0.0);
|
|
|
|
|
|
double size = m_WaveChnData[i].waveData.size();
|
|
|
|
|
|
wave.mean = sum/size;
|
|
|
|
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
sum = 0.0;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(iter->sensorType == "TACHOMETER"){
|
|
|
|
|
|
wave.TimeStamp = m_WaveChnData[i].TimeStamp;
|
|
|
|
|
|
//qDebug()<< "iCount" <<iCount<<endl;
|
|
|
|
|
|
ii ++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
wave.SpeedProfileSpeed = iter->SpeedProfileSpeed;
|
|
|
|
|
|
wave.wavesize = wave.waveData.size();
|
|
|
|
|
|
wave.SamleRate = iter->channelSamleRate;
|
|
|
|
|
|
wave.sensorType = iter->sensorType;
|
|
|
|
|
|
wave.channelId = iter->channelId;
|
|
|
|
|
|
wave.channelNo = theSize;
|
|
|
|
|
|
wave.Time = iCount;
|
|
|
|
|
|
wave.channelName = iter->channelName;
|
|
|
|
|
|
wave.pairChannelID = iter->pairChannelID;
|
|
|
|
|
|
wave.sensorEngineeringUnit = iter->sensorEngineeringUnit;
|
|
|
|
|
|
wave.speedRefChannelId = iter->speedRefChannelId;
|
|
|
|
|
|
wave.RMSValue = iter->RMSValue;
|
|
|
|
|
|
|
|
|
|
|
|
wave.iTrigger = iter->iTrigger;
|
|
|
|
|
|
wave.iKeyCount = iter->iKeyCount;
|
|
|
|
|
|
wave.iTriggerValue = iter->iTriggerValue;
|
|
|
|
|
|
wave.iHysteresis = iter->iHysteresis;
|
|
|
|
|
|
wave.tachAutoTach = iter->tachAutoTach;
|
|
|
|
|
|
wave.sensorGapVoltage = iter->sensorGapVoltage;
|
|
|
|
|
|
wave.sensorSensitivity = iter->sensorSensitivity;
|
|
|
|
|
|
switch(linecolor){
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
wave.linColor = Qt::green ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
wave.linColor = QColor(30,144,255) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
wave.linColor = QColor(255,182,193) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
wave.linColor = Qt::cyan ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
wave.linColor = Qt::magenta ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
wave.linColor = Qt::yellow ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 6:
|
|
|
|
|
|
wave.linColor = QColor(255,69,0) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 7:
|
|
|
|
|
|
wave.linColor = QColor(0, 255, 127) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 8:
|
|
|
|
|
|
wave.linColor = QColor(255,140,0) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 9:
|
|
|
|
|
|
wave.linColor = QColor(0, 191, 255) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 10:
|
|
|
|
|
|
wave.linColor = Qt::darkMagenta ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 11:
|
|
|
|
|
|
wave.linColor = Qt::lightGray ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 12:
|
|
|
|
|
|
wave.linColor = Qt::darkYellow ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 13:
|
|
|
|
|
|
wave.linColor = QColor(153, 51, 250);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 14:
|
|
|
|
|
|
wave.linColor = QColor(255, 218, 185) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 15:
|
|
|
|
|
|
wave.linColor = QColor(0,199,140) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
m_vecPushData1.push_back(wave);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
linecolor++;
|
|
|
|
|
|
if(linecolor > 15){
|
|
|
|
|
|
linecolor = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
qDebug() << "channelId"<<iter->channelId << endl;
|
|
|
|
|
|
mapWaveData.insert(iter->channelId,m_vecPushData1);
|
|
|
|
|
|
m_iRealCount = m_vecPushData1.size();
|
|
|
|
|
|
qDebug() << "m_iRealCount"<<m_iRealCount << endl;
|
|
|
|
|
|
qDebug()<<"mapWaveData size"<<mapWaveData.size()<<endl;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
free(buf0);
|
|
|
|
|
|
//qDebug() << "=====waveSpeedData time=====" <<mapWaveData[strChannelID].at(0).Time <<mapWaveData[speedChannelID].at(0).Time << endl;
|
|
|
|
|
|
qDebug() << "m_iRealCount" << m_iRealCount << endl;
|
|
|
|
|
|
//设置播放进度条
|
|
|
|
|
|
m_iCount = 0;
|
|
|
|
|
|
m_iCount = m_iRealCount;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QTime stopTime = QTime::currentTime();
|
|
|
|
|
|
qDebug() << "Time: " << startTime.msecsTo(stopTime) << "ms" <<endl;
|
|
|
|
|
|
|
|
|
|
|
|
delete progressDialog;
|
|
|
|
|
|
|
|
|
|
|
|
if(m_iRealCount < 1){
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("未读取到数据!"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
QStringList strIDList,strChannleType,strChannleNameList;
|
|
|
|
|
|
QMap<QString,QVector<WAVE_DATA>>::Iterator iter2 = mapWaveData.begin();
|
|
|
|
|
|
for (; iter2 != mapWaveData.end(); iter2 ++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!strIDList.contains(iter2.key()))
|
|
|
|
|
|
strIDList.push_back(iter2.key());
|
|
|
|
|
|
strChannleType.push_back(iter2.value()[0].sensorType);
|
|
|
|
|
|
strChannleNameList.push_back(iter2.value()[0].channelName);
|
|
|
|
|
|
}
|
|
|
|
|
|
qDebug() << "End1 " <<endl;
|
|
|
|
|
|
SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|