From d66ad58b8bd96b439b1e0797b7911f7ae02dc6fe Mon Sep 17 00:00:00 2001 From: Zhang0626 Date: Mon, 7 Nov 2022 14:02:09 +0800 Subject: [PATCH] =?UTF-8?q?1.0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChaosDataPlayer/Adddeviceform.ui | 3 + ChaosDataPlayer/BaseWgt.cpp | 2 +- ChaosDataPlayer/Calculation.cpp | 49 +- ChaosDataPlayer/Calculation.hpp | 2 +- ChaosDataPlayer/ChildForm.cpp | 873 +++++++++++------- ChaosDataPlayer/ChildForm.h | 28 +- ChaosDataPlayer/ChildForm.ui | 18 +- ChaosDataPlayer/CreateReport.cpp | 12 + ChaosDataPlayer/FilterForm.cpp | 6 +- ChaosDataPlayer/FilterForm.h | 2 +- ChaosDataPlayer/MainWidget.cpp | 172 +++- ChaosDataPlayer/MainWidget.h | 1 + ChaosDataPlayer/MainWidget.ui | 72 +- ChaosDataPlayer/SetScalesForm.ui | 32 +- ChaosDataPlayer/SetScalesform.cpp | 7 +- ChaosDataPlayer/SetScalesform.h | 2 +- ChaosDataPlayer/global.h | 4 +- ChaosDataPlayer/images/B7-h.png | Bin 0 -> 381 bytes ChaosDataPlayer/images/B7.png | Bin 0 -> 384 bytes ChaosDataPlayer/images/M2-h.png | Bin 0 -> 608 bytes ChaosDataPlayer/images/M2-p.png | Bin 0 -> 553 bytes ChaosDataPlayer/images/M2.png | Bin 0 -> 614 bytes ChaosDataPlayer/images/ico.rar | Bin 1327 -> 0 bytes .../images/imgDatamodel/wave-h.png | Bin 0 -> 689 bytes .../images/imgDatamodel/wave-p.png | Bin 0 -> 661 bytes ChaosDataPlayer/images/imgDatamodel/wave.png | Bin 0 -> 704 bytes ChaosDataPlayer/images/加载条.gif.zip | Bin 42326 -> 0 bytes .../images/加载条.gif/__MACOSX/._加载条.gif | Bin 284 -> 0 bytes ChaosDataPlayer/images/加载条.gif/loading.gif | Bin 48916 -> 0 bytes .../images/加载条.gif/loading1.gif | Bin 14051 -> 0 bytes ChaosDataPlayer/qrc.qrc | 3 + 31 files changed, 839 insertions(+), 449 deletions(-) create mode 100644 ChaosDataPlayer/images/B7-h.png create mode 100644 ChaosDataPlayer/images/B7.png create mode 100644 ChaosDataPlayer/images/M2-h.png create mode 100644 ChaosDataPlayer/images/M2-p.png create mode 100644 ChaosDataPlayer/images/M2.png delete mode 100644 ChaosDataPlayer/images/ico.rar create mode 100644 ChaosDataPlayer/images/imgDatamodel/wave-h.png create mode 100644 ChaosDataPlayer/images/imgDatamodel/wave-p.png create mode 100644 ChaosDataPlayer/images/imgDatamodel/wave.png delete mode 100644 ChaosDataPlayer/images/加载条.gif.zip delete mode 100644 ChaosDataPlayer/images/加载条.gif/__MACOSX/._加载条.gif delete mode 100644 ChaosDataPlayer/images/加载条.gif/loading.gif delete mode 100644 ChaosDataPlayer/images/加载条.gif/loading1.gif diff --git a/ChaosDataPlayer/Adddeviceform.ui b/ChaosDataPlayer/Adddeviceform.ui index bc1d717..6279a34 100644 --- a/ChaosDataPlayer/Adddeviceform.ui +++ b/ChaosDataPlayer/Adddeviceform.ui @@ -95,6 +95,9 @@ text-align:center; 31 + + 查找 + background-image: url(:/images/images/imgModelAction/Search.png); diff --git a/ChaosDataPlayer/BaseWgt.cpp b/ChaosDataPlayer/BaseWgt.cpp index 17e7a03..2a32b44 100644 --- a/ChaosDataPlayer/BaseWgt.cpp +++ b/ChaosDataPlayer/BaseWgt.cpp @@ -361,7 +361,7 @@ void BaseWgt::maximumBtnClickedSlot() this->setGeometry(m_screenRect); m_pMaxBtn->setProperty("maxState", true); - m_pMaxBtn->setToolTip("restore"); + m_pMaxBtn->setToolTip("最大化"); } else { diff --git a/ChaosDataPlayer/Calculation.cpp b/ChaosDataPlayer/Calculation.cpp index 3db04ba..1435f48 100644 --- a/ChaosDataPlayer/Calculation.cpp +++ b/ChaosDataPlayer/Calculation.cpp @@ -441,8 +441,8 @@ void Calculation::_Integration(QVector & vecData,QVector& retDat qDebug()<< imageshiftfft.size() << endl; for(int k = 1; k < realshiftfft.size()+1;k++){ - realvalue.push_back((realshiftfft.at(k-1)/(k*2*3.14))*1000 * 2);//单位转换mm/s,*1000 *2 精度损失 - imagevalue.push_back((imageshiftfft.at(k-1)/(k*2*3.14))*1000 * 2);//单位转换mm/s,*1000 + realvalue.push_back((realshiftfft.at(k-1)/(k*2*PI))*1000 * 2);//单位转换mm/s,*1000 *2 精度损失 + imagevalue.push_back((imageshiftfft.at(k-1)/(k*2*PI))*1000 * 2);//单位转换mm/s,*1000 } _iFFT(realvalue,imagevalue,retData); @@ -722,6 +722,51 @@ QVector Calculation::filter(QVector&x, QVector& coeff_b, void Calculation::ButterWorth(QVector&inData,double *FrequencyBands,QVector& outData) { int FiltOrd = 4; +// double s = inData.size(); +// double a = cos(M_PI*(FrequencyBands[0]+FrequencyBands[1])/s)/cos(M_PI*(FrequencyBands[0]-FrequencyBands[1])/s); +// double a2 = a*a; +// double b = tan(M_PI*(FrequencyBands[0]-FrequencyBands[1])/s); +// double b2 = b*b; +// double r; +// int n = FiltOrd/4; +// double *A = (double *)malloc(n*sizeof(double)); +// double *d1 = (double *)malloc(n*sizeof(double)); +// double *d2 = (double *)malloc(n*sizeof(double)); +// double *d3 = (double *)malloc(n*sizeof(double)); +// double *d4 = (double *)malloc(n*sizeof(double)); +// double *w0 = (double *)calloc(n, sizeof(double)); +// double *w1 = (double *)calloc(n, sizeof(double)); +// double *w2 = (double *)calloc(n, sizeof(double)); +// double *w3 = (double *)calloc(n, sizeof(double)); +// double *w4 = (double *)calloc(n, sizeof(double)); +// double x; + +// for(int i=0; i a,b; a = ComputeDenCoeffs(FiltOrd, FrequencyBands[0], FrequencyBands[1]); diff --git a/ChaosDataPlayer/Calculation.hpp b/ChaosDataPlayer/Calculation.hpp index b7f306b..a5e3bf4 100644 --- a/ChaosDataPlayer/Calculation.hpp +++ b/ChaosDataPlayer/Calculation.hpp @@ -95,7 +95,7 @@ public: QVector ComputeHP(int FilterOrder); //vector filter(int ord, vector a, vector b, int np, vector x); - //巴特沃斯滤波 + //巴特沃斯滤波(带通) QVector filter(QVector&x, QVector& coeff_b, QVector& coeff_a); void ButterWorth(QVector& inData,double *FrequencyBands,QVector& outData); diff --git a/ChaosDataPlayer/ChildForm.cpp b/ChaosDataPlayer/ChildForm.cpp index 2800712..090c982 100644 --- a/ChaosDataPlayer/ChildForm.cpp +++ b/ChaosDataPlayer/ChildForm.cpp @@ -35,14 +35,13 @@ #define CHANNELID_ROLE (Qt::UserRole + 2) #define CHANNELTYPE_ROLE (Qt::UserRole + 3) -ChildForm::ChildForm(FormType iType,QString m_strName,DEVICE_INFO* DeviceInfo,QWidget *parent) : +ChildForm::ChildForm(FormType iType,QString m_strName,DEVICE_INFO* DeviceInfo,int iCurCount,QWidget *parent) : BaseWgt(parent), ui(new Ui::ChildForm), m_pChartView(nullptr), m_iFormType(iType), m_bAttach(false), m_pLegendForm(nullptr), - m_iRealTimer(0), m_bDC(false), //m_client(nullptr), m_bRpm(false), @@ -55,9 +54,10 @@ ChildForm::ChildForm(FormType iType,QString m_strName,DEVICE_INFO* DeviceInfo,QW m_isPause(false), m_isStop(true) { - m_position = 0; + m_position = iCurCount; m_nStart = 0; m_nEnd = 0; + m_strFilter = ","; ui->setupUi(m_pMainWgt); SetFormType(iType); setWindowTitle(m_strName); @@ -75,8 +75,8 @@ ChildForm::ChildForm(FormType iType,QString m_strName,DEVICE_INFO* DeviceInfo,QW // connect(ui->measureBtn, SIGNAL(clicked()), this, SLOT(MeasureBtnSlot())); connect(ui->ChannelBtn, SIGNAL(clicked()), this, SLOT(ChannelBtnSlot())); //打开通道选择 - connect(ui->zoomBtn_hand, SIGNAL(clicked()), this, SLOT(ZoomBtnSlot_Hand())); - connect(ui->Btn_Zoom, SIGNAL(clicked()), this, SLOT(Btn_ZoomSlot())); + connect(ui->zoomBtn_hand, SIGNAL(clicked()), this, SLOT(ScalesBtnSlot_Hand())); + connect(ui->Btn_Zoom, SIGNAL(clicked()), this, SLOT(Btn_ScalesSlot())); connect(ui->Btn_setScales, SIGNAL(clicked()), this, SLOT(SetScales())); connect(ui->temBtn_4, SIGNAL(clicked()), this, SLOT(SetFilter())); connect(ui->Btn_AC_DC, SIGNAL(clicked()), this, SLOT(SetDC())); @@ -339,24 +339,27 @@ void ChildForm::InitIntegration() } void ChildForm::InitWidget() { - QMenu *ZoomMenu = new QMenu(); - ZoomMenu->setWindowFlags(ZoomMenu->windowFlags() | Qt::FramelessWindowHint); - QAction *Zoom_xy = new QAction(ZoomMenu); - QAction * Zoom_x= new QAction(ZoomMenu); - QAction *Zoom_y = new QAction(ZoomMenu); + ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); + ui->tableWidget->setDragEnabled(true); - ZoomMenu->addAction(Zoom_xy); - ZoomMenu->addAction(Zoom_x); - ZoomMenu->addAction(Zoom_y); + QMenu *ScalesMenu = new QMenu(); + ScalesMenu->setWindowFlags(ScalesMenu->windowFlags() | Qt::FramelessWindowHint); + QAction *Scales_xy = new QAction(ScalesMenu); + QAction * Scales_x= new QAction(ScalesMenu); + QAction *Scales_y = new QAction(ScalesMenu); - Zoom_xy->setIcon(QIcon(":/images/images/imgModelAction/Zoom_xy.png")); - Zoom_x->setIcon(QIcon(":/images/images/imgModelAction/axisX.png")); - Zoom_y->setIcon(QIcon(":/images/images/imgModelAction/axisY.png")); + ScalesMenu->addAction(Scales_xy); + ScalesMenu->addAction(Scales_x); + ScalesMenu->addAction(Scales_y); - Zoom_xy->setText(tr(" 自动缩放XY")); - Zoom_x->setText(tr(" 自动缩放X")); - Zoom_y->setText(tr(" 自动缩放Y")); - ui->Btn_ZoomMenu->setMenu(ZoomMenu); + Scales_xy->setIcon(QIcon(":/images/images/imgModelAction/Zoom_xy.png")); + Scales_x->setIcon(QIcon(":/images/images/imgModelAction/axisX.png")); + Scales_y->setIcon(QIcon(":/images/images/imgModelAction/axisY.png")); + + Scales_xy->setText(tr(" 自动缩放XY")); + Scales_x->setText(tr(" 自动缩放X")); + Scales_y->setText(tr(" 自动缩放Y")); + ui->Btn_ScalesMenu->setMenu(ScalesMenu); QMenu *HzMenu = new QMenu(); HzMenu->setWindowFlags(HzMenu->windowFlags() | Qt::FramelessWindowHint); @@ -406,37 +409,37 @@ void ChildForm::InitWidget() connect(differentiation, SIGNAL(triggered()), this, SLOT(DifferentiationSlot())); connect(doubleDifferentiation, SIGNAL(triggered()), this, SLOT(DoubleDifferentiationSlot())); - connect(Zoom_xy, SIGNAL(triggered()), this, SLOT(ZoomBtnSlot_XY())); - connect(Zoom_x, SIGNAL(triggered()), this, SLOT(ZoomBtnSlot_X())); - connect(Zoom_y, SIGNAL(triggered()), this, SLOT(ZoomBtnSlot_Y())); + connect(Scales_xy, SIGNAL(triggered()), this, SLOT(ScalesBtnSlot_XY())); + connect(Scales_x, SIGNAL(triggered()), this, SLOT(ScalesBtnSlot_X())); + connect(Scales_y, SIGNAL(triggered()), this, SLOT(ScalesBtnSlot_Y())); connect(Rad, SIGNAL(triggered()), this, SLOT(ToRpm())); - QMenu *ScaleMenu = new QMenu(); - ScaleMenu->setWindowFlags(ScaleMenu->windowFlags() | Qt::FramelessWindowHint); - QAction *Scale_X = new QAction(ScaleMenu); - QAction *ScaleMenu_Y = new QAction(ScaleMenu); - QAction *ScaleMenu_XY = new QAction(ScaleMenu); - QAction *ScaleMenu_Box = new QAction(ScaleMenu); + QMenu *ZoomMenu = new QMenu(); + ZoomMenu->setWindowFlags(ZoomMenu->windowFlags() | Qt::FramelessWindowHint); + QAction *Zoom_X = new QAction(ZoomMenu); + QAction *ZoomMenu_Y = new QAction(ZoomMenu); + QAction *ZoomMenu_XY = new QAction(ZoomMenu); + QAction *ZoomMenu_Box = new QAction(ZoomMenu); - ScaleMenu->addAction(Scale_X); - ScaleMenu->addAction(ScaleMenu_Y); - ScaleMenu->addAction(ScaleMenu_XY); - ScaleMenu->addAction(ScaleMenu_Box); + ZoomMenu->addAction(Zoom_X); + ZoomMenu->addAction(ZoomMenu_Y); + ZoomMenu->addAction(ZoomMenu_XY); + ZoomMenu->addAction(ZoomMenu_Box); - Scale_X->setIcon(QIcon(":/images/images/imgModelAction/Zoom_X.png")); - ScaleMenu_Y->setIcon(QIcon(":/images/images/imgModelAction/Zoom_Y.png")); - ScaleMenu_XY->setIcon(QIcon(":/images/images/imgModelAction/Zoom-XY.png")); - ScaleMenu_Box->setIcon(QIcon(":/images/images/imgModelAction/Zoom_Box.png")); - Scale_X->setText(tr(" 放大X")); - ScaleMenu_Y->setText(tr(" 放大Y")); - ScaleMenu_XY->setText(tr(" 放大XY")); - ScaleMenu_Box->setText(tr(" 框选放大")); - ui->Btn_Zoom->setMenu(ScaleMenu); + Zoom_X->setIcon(QIcon(":/images/images/imgModelAction/Zoom_X.png")); + ZoomMenu_Y->setIcon(QIcon(":/images/images/imgModelAction/Zoom_Y.png")); + ZoomMenu_XY->setIcon(QIcon(":/images/images/imgModelAction/Zoom-XY.png")); + ZoomMenu_Box->setIcon(QIcon(":/images/images/imgModelAction/Zoom_Box.png")); + Zoom_X->setText(tr(" 放大X")); + ZoomMenu_Y->setText(tr(" 放大Y")); + ZoomMenu_XY->setText(tr(" 放大XY")); + ZoomMenu_Box->setText(tr(" 框选放大")); + ui->Btn_Zoom->setMenu(ZoomMenu); - connect(Scale_X, SIGNAL(triggered()), this, SLOT(ScalesX())); - connect(ScaleMenu_Y, SIGNAL(triggered()), this, SLOT(ScalesY())); - connect(ScaleMenu_XY, SIGNAL(triggered()), this, SLOT(ScalesXY())); - connect(ScaleMenu_Box, SIGNAL(triggered()), this, SLOT(ScalesBox())); + connect(Zoom_X, SIGNAL(triggered()), this, SLOT(ZoomX())); + connect(ZoomMenu_Y, SIGNAL(triggered()), this, SLOT(ZoomY())); + connect(ZoomMenu_XY, SIGNAL(triggered()), this, SLOT(ZoomXY())); + connect(ZoomMenu_Box, SIGNAL(triggered()), this, SLOT(ZoomBox())); QMenu *CursorMenu = new QMenu(); @@ -466,7 +469,7 @@ void ChildForm::InitWidget() connect(Cursor, SIGNAL(triggered()), this, SLOT(Cursor())); - ui->Btn_ZoomMenu->setStyleSheet("QPushButton::menu-indicator{image:none;}"); + ui->Btn_ScalesMenu->setStyleSheet("QPushButton::menu-indicator{image:none;}"); ui->Btn_Zoom->setStyleSheet("QPushButton::menu-indicator{image:none;}"); ui->Btn_Cursor->setStyleSheet("QPushButton::menu-indicator{image:none;}"); @@ -504,8 +507,12 @@ void ChildForm::InitWidget() QPushButton:pressed{border-image:url(:/images/images/imgModelAction/lvbo-p.png) 5; }\ QPushButton:checked{border-image:url(:/images/images/imgModelAction/lvbo.png) 5; } " ); + ui->realTimeDataBtn->setStyleSheet(" QPushButton{ border-image:url(:/images/images/imgModelAction/realTime.png) 5; }\ + QPushButton:hover{ border-image:url(:/images/images/imgModelAction/realTime-h.png) 5; }\ + QPushButton:pressed{border-image:url(:/images/images/imgModelAction/realTime-p.png) 5; }\ + QPushButton:checked{border-image:url(:/images/images/imgModelAction/realTime-p.png) 5; } "); ui->temBtn_4->setEnabled(true); - + ui->realTimeDataBtn->setEnabled(true); ui->Btn_AC_DC->setEnabled(true); ui->Btn_Sound->setEnabled(true); ui->Btn_differentiation->setEnabled(true); @@ -533,8 +540,22 @@ void ChildForm::InitWidget() doubleIntegration->setEnabled(false); differentiation->setEnabled(false); doubleDifferentiation->setEnabled(false); + }else if(m_iFormType == TimeWavePlot){ + + + ui->Btn_Cursor->setEnabled(false); + }else if(m_iFormType == PolarPlot){ + + ui->Btn_Zoom->setEnabled(false); + ui->Btn_ScalesMenu->setEnabled(false); + ui->Btn_setScales->setEnabled(false); + ui->Btn_Cursor->setEnabled(false); + + }else if(m_iFormType == BodePlot){ + }else if(m_iFormType == ShaftCenterline /*|| m_iFormType == BodePlot*/ || m_iFormType == PolarPlot || m_iFormType == OrbitPlot || m_iFormType ==WaterFallPlot){ + Cursor->setEnabled(false); } @@ -556,7 +577,7 @@ QCPGraph* ChildForm::MultiyAxis(QString strID,QString sensorType,QString sensorE qDebug() << "contains" << endl; if(mapMultiGraph.size() == 0){ qDebug() << "mapMultiGraph1" << sensorEngineeringUnit << endl; - graph = ui->widget->addGraph(ui->widget->xAxis, Axis[0]); + graph = ui->widget->addGraph(ui->widget->xAxis, Axis[0] ); ui->widget->yAxis->setLabel( sensorEngineeringUnit); Axis[0]->setVisible(true); mapGraph.insert(strID,Axis[0]); @@ -611,7 +632,6 @@ QCPGraph* ChildForm::MultiyAxis(QString strID,QString sensorType,QString sensorE } } - QMap>::iterator iter = mapMultiGraph.begin(); for(; iter != mapMultiGraph.end();iter++){ if(iter.key() == sensorType){ @@ -654,21 +674,9 @@ void ChildForm::SecondData(const QString& strID,WAVE_DATA& waveData,WAVE_DISPALY waveShowData.Key.push_back(f); waveShowData.wavedata_DC.push_back(waveData.waveDataRealTime.at(j)); } -<<<<<<< HEAD - if(m_bIntegration){ - QVector retValue; - double RMS = 0.0; - pCalculation->_Integration(waveShowData.wavedata,retValue,RMS); - QVector().swap(waveShowData.wavedata); - waveShowData.wavedata = retValue; - waveShowData.RMS = RMS; - } -======= ->>>>>>> master - qDebug() << "waveShowData.wavedata_DC" << waveShowData.wavedata_DC.size()<< endl; }else{ - QVector vecOutData; + QVector vecOutData,vecOutData2; for(int j = 0 ; j < waveData.wavesize;j++){ waveShowData.wavedata.push_back(waveData.waveData.at(j)-waveData.mean); f += gap; @@ -676,10 +684,13 @@ void ChildForm::SecondData(const QString& strID,WAVE_DATA& waveData,WAVE_DISPALY waveShowData.wavedata_DC.push_back(waveData.waveData.at(j)); } if(m_nStart > 0 && m_nEnd > 0){ - double FrequencyBands[2] = { (double)m_nStart/waveData.SamleRate*2, (double)m_nEnd/waveData.SamleRate*2 }; - pCalculation->ButterWorth(waveShowData.wavedata,FrequencyBands,vecOutData); + // double FrequencyBands[2] = { (double)m_nEnd ,(double)m_nStart}; + // pCalculation->ButterWorth(waveShowData.wavedata,FrequencyBands,vecOutData); + double FrequencyBands2[2] = { (double)m_nStart/(double)waveData.SamleRate*2, (double)m_nEnd/(double)waveData.SamleRate*2}; + pCalculation->ButterWorth(waveShowData.wavedata,FrequencyBands2,vecOutData2); + QVector().swap(waveShowData.wavedata); - waveShowData.wavedata = vecOutData; + waveShowData.wavedata = vecOutData2; } } if(m_bIntegration){ @@ -760,19 +771,66 @@ void ChildForm::SecondData(const QString& strID,WAVE_DATA& waveData,WAVE_DISPALY WAVE_DISPALYDATA WaveDisplay; QVector vecFFTSpecData; QVector vecData; - for(int j = 0; j < waveData.wavesize;j++){ - float fData = waveData.waveData.at(j)-waveData.mean; - vecData.push_back(fData); + if(m_bRealTime){ + + double sum = std::accumulate(std::begin(waveData.waveDataRealTime), std::end(waveData.waveDataRealTime), 0.0); + float size = waveData.SamleRateRealTime; + double mean = sum/size; + for(int j = 0 ; j < waveData.SamleRateRealTime;j++){ + + vecData.push_back(waveData.waveDataRealTime.at(j)-mean); + } + + }else{ + for(int j = 0; j < waveData.wavesize;j++){ + float fData = waveData.waveData.at(j)-waveData.mean; + vecData.push_back(fData); + } } QVector vecOutData; if(m_nStart > 0 && m_nEnd > 0){ - double FrequencyBands[2] = { (double)m_nStart/waveData.SamleRate*2, (double)m_nEnd/waveData.SamleRate*2 }; + double FrequencyBands[2] = { (double)m_nStart/(double)waveData.SamleRate*2, (double)m_nEnd/(double)waveData.SamleRate*2}; pCalculation->ButterWorth(vecData,FrequencyBands,vecOutData); QVector().swap(vecData); vecData = vecOutData; } + if(m_bIntegration){ + QVector retValue; + double RMS = 0.0; + pCalculation->_Integration(vecData,retValue,RMS); + QVector().swap(vecData); + vecData = retValue; + } + if(m_bDoubleIntegration){ + QVector retValue,retValue2; + double RMS = 0.0; + pCalculation->_Integration(vecData,retValue,RMS); + pCalculation->_Integration(retValue,retValue2,RMS); + QVector().swap(vecData); + vecData = retValue2; + } + if(m_bDifferentiation){ + QVector diffValue; + pCalculation->_Differentiation(vecData,diffValue); + QVector().swap(vecData); + vecData = diffValue; + } + if(m_bDoubleDifferentiation){ + QVector diffValue,yValue,diffValue2,yValue2; + pCalculation->_Differentiation(vecData,diffValue); + + for(int ii = 0; ii < diffValue.size();ii++){ + yValue.push_back(diffValue[ii]/(double)10000); + } + pCalculation->_Differentiation(yValue,diffValue2); + for(int i = 0 ; i < diffValue2.size();i++){ + yValue2.push_back(diffValue2[i]/(double)10000); + } + QVector().swap(vecData); + vecData = diffValue2; + } pCalculation->FFTSpec(vecData,vecFFTSpecData);//每一秒的FFT qDebug() << vecData.size() <widget->xAxis->setLabel("Frequency(Hz)"); }else if(m_iFormType == EnvChartPlot){ @@ -799,20 +858,19 @@ void ChildForm::SecondData(const QString& strID,WAVE_DATA& waveData,WAVE_DISPALY }else{ pCalculation->envSpec(vecData,vecEnvSpecData,m_nStart,m_nEnd); } - for(int jj = 0 ; jj < vecEnvSpecData.size();jj++){ - waveShowData.Key.push_back(jj); - } - waveShowData.wavedataEnv = vecEnvSpecData; - waveShowData.wavedata = vecData; - waveShowData.linColor = waveData.linColor; - //wavetempData.push_back(vecEnvSpecData); - waveShowData.channelType = waveData.sensorType; - waveShowData.sensorEngineeringUnit = waveData.sensorEngineeringUnit; - ui->widget->xAxis->setLabel("Frequency(Hz)"); + for(int jj = 0 ; jj < vecEnvSpecData.size();jj++){ + waveShowData.Key.push_back(jj); + } + waveShowData.wavedataEnv = vecEnvSpecData; + waveShowData.wavedata = vecData; + waveShowData.linColor = waveData.linColor; + waveShowData.channleName = waveData.channelName; + //wavetempData.push_back(vecEnvSpecData); + waveShowData.channelType = waveData.sensorType; + waveShowData.sensorEngineeringUnit = waveData.sensorEngineeringUnit; + ui->widget->xAxis->setLabel("Frequency(Hz)"); } - - if(mapWaveDisplayData.contains(strID)){ mapWaveDisplayData[strID] = waveShowData; @@ -824,12 +882,20 @@ void ChildForm::SecondData(const QString& strID,WAVE_DATA& waveData,WAVE_DISPALY void ChildForm::UpdateDiffMenu() { if(m_iFormType == TimeDomainPlot || m_iFormType == FrequencyDomainPlot){ - if(mapMultiGraph.contains("VELOCITY") && mapMultiGraph.contains("ACCELEROMETER")){ + if(mapMultiGraph.contains("VELOCITY") && mapMultiGraph.contains("ACCELEROMETER") + && !mapMultiGraph.contains("THRUST") && !mapMultiGraph.contains("PROXIMETER") + && !(mapMultiGraph.contains("MICROPHONE")) && !(mapMultiGraph.contains("FAST_VOLTAGE")) + && !(mapMultiGraph.contains("SLOW_CURRENT")) + && !(mapMultiGraph.contains("TACHOMETER"))){ Integration->setEnabled(true); doubleIntegration->setEnabled(false); differentiation->setEnabled(false); doubleDifferentiation->setEnabled(false); - }else if(mapMultiGraph.contains("VELOCITY") && mapMultiGraph.contains("ACCELEROMETER")){ + }else if(mapMultiGraph.contains("VELOCITY") && !mapMultiGraph.contains("ACCELEROMETER") + && (mapMultiGraph.contains("THRUST") || mapMultiGraph.contains("PROXIMETER")) + && !(mapMultiGraph.contains("MICROPHONE")) && !(mapMultiGraph.contains("FAST_VOLTAGE")) + && !(mapMultiGraph.contains("SLOW_CURRENT")) + && !(mapMultiGraph.contains("TACHOMETER"))){ Integration->setEnabled(false); doubleIntegration->setEnabled(false); differentiation->setEnabled(true); @@ -884,7 +950,7 @@ void ChildForm::UpdateDiffMenu() void ChildForm::AddSeries(QString strID, QVector& waveData) { //InitDisPaly(); - qDebug() << "AddSeries"<& waveData) //qDebug() << "Time" << Time << endl; QVector().swap(x); QVector wavetempTrendData; - for(int i = 0; i < Time;i++){//平方和除以点数再开根 + for(int i = 1; i <= Time;i++){//平方和除以点数再开根 // float Sum = 0.0; // for(int j = 0; j < waveData[i].SamleRate;j++){ @@ -958,7 +1024,7 @@ void ChildForm::AddSeries(QString strID, QVector& waveData) x.push_back(i); //wavetempTrendData.push_back(rms); } - ui->widget->xAxis->setRange(0, Time); + ui->widget->xAxis->setRange(1, Time); ui->widget->xAxis->setLabel("Time(s)"); waveTrendData.insert(strID,wavetempTrendData); QString stryLabel = waveData[m_position].sensorType + "(" + waveData[m_position].sensorEngineeringUnit +")"; @@ -1066,6 +1132,38 @@ void ChildForm::AddSeries(QString strID, QVector& waveData) ui->widget->xAxis->setLabel("Frequency(Hz)"); ui->widget->yAxis->setLabel(waveData[0].sensorType + "(" + waveData[0].sensorEngineeringUnit+")"); + }else if(m_iFormType == TimeWavePlot){ + foreach (auto ID, listChannelID){ + if(ID != strID){ + m_mapChannelIDtoLabel[ID]->setCheckState(Qt::Unchecked); + m_mapChannelIDtoLabel[ID]->setSelected(false); + } + } + int Time = waveData.size(); + ui->widget->xAxis->setRange(1, Time); + ui->widget->xAxis->setLabel("Time(s)"); + QVector key,value; + double gap = (double)1/(double)waveData[0].waveData.size(); + double f = 0.0; + for(int i = 0; i < Time;i++){ + QVector().swap(key); + QVector().swap(value); + for(int j = 0; j < waveData[i].waveData.size();j++){ + f += gap; + key.push_back(f); + value.push_back(waveData[i].waveData[j]); + } + ui->widget->addGraph(ui->widget->xAxis, ui->widget->yAxis); + ui->widget->graph(i)->setData(key, value); + QPen pen; + pen.setColor(waveData.at(i).linColor); + pen.setStyle(Qt::SolidLine); + ui->widget->graph(i)->setPen(pen); + } + + QString stryLabel = waveData[m_position].sensorType + "(" + waveData[m_position].sensorEngineeringUnit +")"; + ui->widget->yAxis->setLabel( stryLabel); + ui->widget->graph(line)->setName(waveData[0].channelName); } if(m_iFormType != WaterFallPlot){//设置通道颜色 ui->widget->graph(line)->rescaleValueAxis(); @@ -1083,7 +1181,7 @@ void ChildForm::AddSeries(QString strID, QVector& waveData) line++; } ui->widget->replot(); - ZoomBtnSlot_XY(); + ScalesBtnSlot_XY(); } void ChildForm::UpdateEnvSerises(QString Start,QString End) @@ -1091,7 +1189,8 @@ void ChildForm::UpdateEnvSerises(QString Start,QString End) ui->widget->clearGraphs(); InitDisPaly(); - if(Start.toInt() < 10 || End.toInt() > 131072){ + if(Start.toInt() < 10 || End.toInt() > 131072) + { MyMsgBox(QMessageBox::Warning,"警告","请输入正确信息!"); return; } @@ -1142,6 +1241,7 @@ void ChildForm::UpdateEnvSerises(QString Start,QString End) } void ChildForm::handlePlayWave(double position,double size ) { + m_position = position; if(m_iFormType == WaterFallPlot){ int graphCount = ui->widget->graphCount(); if(graphCount < 1) @@ -1165,15 +1265,16 @@ void ChildForm::handlePlayWave(double position,double size ) }else { - int graphCount = ui->widget->clearGraphs(); + ui->widget->clearGraphs(); } if(m_iFormType != TrendChartPlot) QMap().swap(waveGraph); - m_position = position; + //使键轴范围与数据一起滚动: if(m_iFormType == FrequencyDomainPlot || m_iFormType == EnvChartPlot || m_iFormType == TimeDomainPlot){ + qDebug() << "m_position" << position <setData(waveShowData.Key, waveShowData.wavedata); } } - graph->rescaleValueAxis(); + //graph->rescaleValueAxis(); xRange = waveShowData.Key.size(); graph->setName(waveShowData.channleName); QPen pen; @@ -1288,19 +1389,19 @@ void ChildForm::handlePlayWave(double position,double size ) } fermatSpiral1->data()->set(dataSpiral1, true); fermatSpiral1->setPen(QPen(OrbitYWave[0].linColor)); - fermatSpiral1->rescaleAxes(); + //fermatSpiral1->rescaleAxes(); QCPGraph* dwPoints = new QCPGraph(wideAxisRectOrbit->axis(QCPAxis::atBottom), wideAxisRectOrbit->axis(QCPAxis::atLeft)); dwPoints->setAdaptiveSampling(false); dwPoints->setLineStyle(QCPGraph::lsNone); dwPoints->setScatterStyle(QCPScatterStyle::ssDot); - dwPoints->setPen(QPen(QBrush(Qt::white), 2)); + dwPoints->setPen(QPen(QBrush(Qt::red), 5)); dwPoints->addData(vecKeyPhasor[position].key, vecKeyPhasor[position].value); }else { return; } - ZoomBtnSlot_XY(); + ScalesBtnSlot_XY(); ui->widget->replot(QCustomPlot::rpImmediateRefresh); } @@ -1323,7 +1424,25 @@ QPixmap ChildForm::GetSerise(QString& strImagePath) break; case EnvChartPlot: PicName = "EnvChart"; - break; + break; + case WaterFallPlot: + PicName = "WaterFall"; + break; + case OrbitPlot: + PicName = "Orbit"; + break; + case PolarPlot: + PicName = "Polar"; + break; + case BodePlot: + PicName = "Bode"; + break; + case ShaftCenterline: + PicName = "ShaftCenterline"; + break; + case AllWavePlot: + PicName = "AllWave"; + break; } strImagePath = QCoreApplication::applicationDirPath() + "\\report\\" + PicName + ".png"; ui->widget->savePng(strImagePath,600,400); @@ -1390,6 +1509,7 @@ void ChildForm::AddShaftCenterlineSeries(QString strID, const QVector void ChildForm::AddBodeSeries(QString strID, const QVector& waveData,const QVector& waveSpeedData) { + ui->widget->setInteractions(QCP::iRangeDrag | QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables); /*mapBodeData.insert(strID,waveData); if(mapBodeData.size() < 2){ MyMsgBox(QMessageBox::Warning,"警告","请选择两条通道进行伯德图分析!"); @@ -1454,11 +1574,11 @@ void ChildForm::AddBodeSeries(QString strID, const QVector& waveData, wideAxisRect1->setMarginGroup(QCP::msLeft, marginGroup); wideAxisRect2->setMarginGroup(QCP::msLeft, marginGroup); - QCPGraph *mainGraph1 = ui->widget->addGraph(wideAxisRect1->axis(QCPAxis::atBottom), wideAxisRect1->axis(QCPAxis::atLeft)); + mainGraph1 = ui->widget->addGraph(wideAxisRect1->axis(QCPAxis::atBottom), wideAxisRect1->axis(QCPAxis::atLeft)); mainGraph1->rescaleAxes(); mainGraph1->setPen(QPen(QColor(Qt::green), 2)); - QCPGraph *mainGraph2 = ui->widget->addGraph(wideAxisRect2->axis(QCPAxis::atBottom), wideAxisRect2->axis(QCPAxis::atLeft)); + mainGraph2 = ui->widget->addGraph(wideAxisRect2->axis(QCPAxis::atBottom), wideAxisRect2->axis(QCPAxis::atLeft)); mainGraph2->rescaleAxes(); mainGraph2->setPen(QPen(QColor(Qt::green), 2)); @@ -1499,8 +1619,7 @@ void ChildForm::AddBodeSeries(QString strID, const QVector& waveData, QVector vecmainGraph1; QVector vecmainGraph2; QVector vecSpeed; - double sum = 0.0; - qDebug() << "=====Speed=====" << vecSpeedTime[99] << vecSpeedTime[100] << endl; + //qDebug() << "=====Speed=====" << vecSpeedTime[99] << vecSpeedTime[100] << endl; { for(int j = 1;j < vecSpeedTime.size();j++){ @@ -1526,15 +1645,15 @@ void ChildForm::AddBodeSeries(QString strID, const QVector& waveData, // qDebug() << "=====iter=====" << vecSpeed[i].key < 10){//增速 - RPM rpmData; - rpmData.key1 = vecSpeed[i-1].key1; - rpmData.key2 = vecSpeed[i-1].key2; - rpmData.fSpeed = vecSpeed[i-1].fSpeed; - vecIncreaseSpeed.push_back(rpmData); + + RPM rpmData; + rpmData.key1 = vecSpeed[i-1].key1; + rpmData.key2 = vecSpeed[i-1].key2; + rpmData.fSpeed = vecSpeed[i-1].fSpeed; + vecIncreaseSpeed.push_back(rpmData); + - } } QVector VibrateData;//(waveVibrateData.size() * waveVibrateData[0].SamleRate); VibrateData.reserve(waveData.size() * waveData[0].SamleRate); @@ -1551,35 +1670,49 @@ void ChildForm::AddBodeSeries(QString strID, const QVector& waveData, for (int i = Time1; i < Time2 ; i++) { vecPP.push_back(VibrateData[i]); } - qDebug() << "pp" << vecPP.size() << endl; + //qDebug() << "pp" << vecPP.size() << endl; auto p1 = std::max_element(std::begin(vecPP), std::end(vecPP)); auto p2 = std::min_element(std::begin(vecPP), std::end(vecPP)); float Max = *p1; float Min = *p2; - qDebug() << "=====Max====="<< *p1 << "===Min===" << *p2 << endl; + //qDebug() << "=====Max====="<< *p1 << "===Min===" << *p2 << endl; QCPGraphData data; data.key = vecIncreaseSpeed[i].fSpeed; data.value = Max - Min; vecmainGraph2.push_back(data); double Phase = pCalculation->Phase(vecPP); - qDebug() << "=====Phase1====="<< Phase << endl; + //qDebug() << "=====Phase1====="<< Phase << endl; QCPGraphData data1; data1.key = vecIncreaseSpeed[i].fSpeed; data1.value = Phase; vecmainGraph1.push_back(data1); } +// QVector x1(50), y1(50), y1err(50); +// QVector dataCos(21), dataGauss(50), dataRandom(100); +// QVector x3, y3; +// std::srand(3); +// for (int i=0; iwidget->addGraph(wideAxisRect1->axis(QCPAxis::atBottom), wideAxisRect1->axis(QCPAxis::atLeft)); mainGraph1->data()->set(vecmainGraph1); - mainGraph1->rescaleKeyAxis(); + mainGraph1->rescaleAxes(); mainGraph1->setPen(QPen(QColor(waveData[0].linColor), 1)); - mainGraph1->setName("1"); + mainGraph1->setName("相位"); mainGraph2 = ui->widget->addGraph(wideAxisRect2->axis(QCPAxis::atBottom), wideAxisRect2->axis(QCPAxis::atLeft)); mainGraph2->data()->set(vecmainGraph2); - mainGraph2->rescaleKeyAxis(); + mainGraph2->rescaleAxes(); mainGraph2->setPen(QPen(QColor(waveData[0].linColor), 1)); - mainGraph2->setName("2"); + mainGraph2->setName("峰峰值"); ui->widget->replot(); } @@ -1601,6 +1734,7 @@ void ChildForm::AddOrbitSeries(QString strID, const QVector& wavexDat OrbitXWave = wavexData; OrbitYWave = waveyData; ui->widget->plotLayout()->clear(); + ui->widget->replot(QCustomPlot::rpImmediateRefresh); wideAxisRect1 = new QCPAxisRect(ui->widget); wideAxisRect2 = new QCPAxisRect(ui->widget); @@ -1683,8 +1817,8 @@ void ChildForm::AddOrbitSeries(QString strID, const QVector& wavexDat fermatSpiral1->rescaleAxes(); QVector> vecSpeedTime; - qDebug() << "=====Time====="<< waveSpeedData[0].Time << endl; - qDebug() << "=====wavexData size====="<< wavexData.size() << endl; + //qDebug() << "=====Time====="<< waveSpeedData[0].Time << endl; + //qDebug() << "=====wavexData size====="<< wavexData.size() << endl; int iTime = 0; if(wavexData.size() <= waveSpeedData[0].Time)//防止Dat文件数据丢失,取实际读到的秒数 iTime = wavexData.size(); @@ -1692,7 +1826,7 @@ void ChildForm::AddOrbitSeries(QString strID, const QVector& wavexDat { QVector vecTemp; int flag = 0; - qDebug() << "=====size====="<< waveSpeedData.at(i).waveData.size() << endl; + //qDebug() << "=====size====="<< waveSpeedData.at(i).waveData.size() << endl; for(int j = 1; j < waveSpeedData.at(0).waveData.size();j++) { if(waveSpeedData.at(0).iTrigger == 0){ @@ -1709,10 +1843,10 @@ void ChildForm::AddOrbitSeries(QString strID, const QVector& wavexDat } } vecSpeedTime.push_back(vecTemp); - qDebug() << "=====vecSpeedTime====="<< vecSpeedTime.size()<< endl; + //qDebug() << "=====vecSpeedTime====="<< vecSpeedTime.size()<< endl; } - qDebug() << "=====vecSpeedTime====="<< vecSpeedTime[10][10]<< endl; + //qDebug() << "=====vecSpeedTime====="<< vecSpeedTime[10][10]<< endl; QVector key,value; for(int j = 0;j < vecSpeedTime.size();j++) { @@ -1741,7 +1875,7 @@ void ChildForm::AddOrbitSeries(QString strID, const QVector& wavexDat dwPoints->setAdaptiveSampling(false); dwPoints->setLineStyle(QCPGraph::lsNone); dwPoints->setScatterStyle(QCPScatterStyle::ssDot); - dwPoints->setPen(QPen(QBrush(Qt::white), 2)); + dwPoints->setPen(QPen(QBrush(Qt::red), 5)); dwPoints->addData(vecKeyPhasor[0].key, vecKeyPhasor[0].value); //dwPoints->rescaleAxes(); @@ -1800,7 +1934,7 @@ void ChildForm::AddPolarPlotSeries(QString strID, const QVector& wave rpmData.fSpeed = Speed; vecSpeed.push_back(rpmData); SumRPM += Speed; - qDebug() << "=====Speed=====" << Speed << vecSpeedTime.at(j) << vecSpeedTime.at(j-1) << endl; + //qDebug() << "=====Speed=====" << Speed << vecSpeedTime.at(j) << vecSpeedTime.at(j-1) << endl; } double MeanRPM = SumRPM/(double)vecSpeed.size(); vecMeanRPM.push_back(MeanRPM); @@ -1846,7 +1980,7 @@ void ChildForm::AddPolarPlotSeries(QString strID, const QVector& wave double real = vecFFTrealData[(int)hz]; double image = vecFFTimageData[(int)hz]; - double phase = atan2(image,real)*180/3.14; + double phase = atan2(image,real)*180/3.1415926; ValueAmp.push_back(rms); keyPhase.push_back(phase); @@ -1891,7 +2025,7 @@ void ChildForm::AddPolarPlotSeries(QString strID, const QVector& wave angularAxis->setRange(0, 360); angularAxis->radialAxis()->setRange(-10, 10); //坐标轴为白色 - angularAxis->setBasePen(QPen(Qt::white, 1)); + angularAxis->setBasePen(QPen(Qt::white, 3)); //坐标轴的提示信息为白色 angularAxis->setTickLabelColor(Qt::white); @@ -1900,7 +2034,7 @@ void ChildForm::AddPolarPlotSeries(QString strID, const QVector& wave angularAxis->radialAxis()->setLabelColor(Qt::white); angularAxis->radialAxis()->setTickLabelColor(Qt::white); - g1->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Qt::red, 1.5), QBrush(Qt::red), 3));//散列点 + g1->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Qt::red, 1.5), QBrush(Qt::red), 1.5));//散列点 ui->widget->replot(); } void ChildForm::ChannelBtnSlot() @@ -1967,7 +2101,7 @@ QTableWidgetItem * ChildForm::AddTableWgtItem(QString strText, QString clolor, Q pLabel->setFixedSize(20, 20); pLabel->setStyleSheet(QString("QLabel{background: rgb(%1)}").arg(clolor)); pLayout->addWidget(pLabel); - pLayout->setMargin(0); //设置边缘距离 否则会很难看 + pLayout->setMargin(0); pLayout->setAlignment(pLabel, Qt::AlignCenter); @@ -2055,15 +2189,16 @@ void ChildForm::SetDataIDs(const QStringList &strIDList, QString strTitle,const strColor = "205, 205, 0"; break; case 13: - strColor = "198, 226, 255"; + strColor = "153,51, 250"; break; case 14: strColor = "255, 218, 185"; break; case 15: - strColor = "255, 20, 147"; + strColor = "0, 199 ,140"; break; default: + strColor = "0,255,0"; break; } i++; @@ -2074,11 +2209,16 @@ void ChildForm::SetDataIDs(const QStringList &strIDList, QString strTitle,const 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); + if(m_iFormType == TimeDomainPlot || m_iFormType == FrequencyDomainPlot ||\ + m_iFormType == TrendChartPlot || m_iFormType == SpecChartPlot || \ + m_iFormType == EnvChartPlot || m_iFormType == TimeWavePlot || m_iFormType == WaterFallPlot){ + m_mapChannelIDtoLabel[strIDList[0]]->setSelected(true); + m_mapChannelIDtoLabel[strIDList[0]]->setCheckState(Qt::Checked); + listChannelID.push_back(strIDList[0]); + emit ItemCheckStateSignal(strIDList[0], true); + } + - listChannelID.push_back(strIDList[0]); - emit ItemCheckStateSignal(strIDList[0], true); } void ChildForm::RemoveSeries(QString strID) { @@ -2086,22 +2226,32 @@ void ChildForm::RemoveSeries(QString strID) qDebug()<<"::ChildForm::waveGraph" <widget->plotLayout()->clear(); return; } } + QMap>::Iterator iter1 = mapBodeData.begin(); + for (;iter1 != mapBodeData.end() ; iter1++) { + if(strID == iter1.key()){ + QVector().swap(iter1.value()); + mapBodeData.erase(iter1); + } + } ui->widget->clearGraphs(); ui->widget->clearPlottables(); qDebug() << ui->widget->graphCount() << endl; line = 0; - }else if(m_iFormType == TrendChartPlot || m_iFormType == TimeDomainPlot || m_iFormType == FrequencyDomainPlot || m_iFormType == EnvChartPlot){ - QMap>::Iterator itermultiGraph = mapMultiGraph.begin(); + }else if(m_iFormType == TrendChartPlot || m_iFormType == TimeDomainPlot || + m_iFormType == FrequencyDomainPlot || m_iFormType == EnvChartPlot){ + QMap>::Iterator itermultiGraph = mapMultiGraph.begin(); for(;itermultiGraph != mapMultiGraph.end();itermultiGraph++){ int flag = 0; QMap::Iterator iterGraph = itermultiGraph.value().begin(); @@ -2191,48 +2341,36 @@ void ChildForm::RemoveSeries(QString strID) } } - QMap>::Iterator iter1 = mapBodeData.begin(); - for (;iter1 != mapBodeData.end() ; iter1++) { - if(strID == iter1.key()){ - QVector().swap(iter1.value()); - mapBodeData.erase(iter1); - } - } + } - if(m_bIntegration) - m_bIntegration = false; - - if(m_bDifferentiation) - m_bDifferentiation = false; - if(m_bRpm) m_bRpm = false; ui->widget->replot(); - if(tracerLabel->visible()) + if(tracerLabel) tracerLabel->setVisible(false); - if(tracerLabel2->visible()) + if(tracerLabel2) tracerLabel2->setVisible(false); - if(tracerLabel3->visible()) + if(tracerLabel3) tracerLabel3->setVisible(false); - if(tracerLabel4->visible()) + + if(tracerLabel4) tracerLabel4->setVisible(false); - if(tracerLabel5->visible()) + + if(tracerLabel5) tracerLabel5->setVisible(false); - - //disconnect(dismove); disconnect(disPress); - ZoomBtnSlot_XY(); + ScalesBtnSlot_XY(); UpdateDiffMenu(); } void ChildForm::ItemPressSlot(QTableWidgetItem *item) { if(m_bRealTime){ - realTimeData(); + //realTimeData(); MyMsgBox(QMessageBox::Information,"提示","请先暂停实时数据播放!"); return; } @@ -2249,7 +2387,7 @@ void ChildForm::ItemPressSlot(QTableWidgetItem *item) m_iFormType == TrendChartPlot || m_iFormType == SpecChartPlot || m_iFormType == EnvChartPlot)){ - + MyMsgBox(QMessageBox::Information,"提示","最大支持三条曲线"); item->setCheckState(Qt::Unchecked); item->setSelected(false); return; @@ -2259,18 +2397,24 @@ void ChildForm::ItemPressSlot(QTableWidgetItem *item) item->setSelected(false); return; - }else if(m_iFormType == BodePlot && strType != "ACCELEROMETER"){ + }else if(m_iFormType == BodePlot && strType != "ACCELEROMETER" /*&& strType != "TACHOMETER"*/){ item->setCheckState(Qt::Unchecked); item->setSelected(false); return; } + listChannelID.push_back(strID); item->setCheckState(Qt::Checked); emit ItemCheckStateSignal(strID, true); - listChannelID.push_back(strID); + } else if(item->checkState() && !item->isSelected()) { + if(listChannelID.size() == 1 && m_iFormType == PolarPlot){ + item->setCheckState(Qt::Checked); + item->setSelected(true); + return; + } item->setCheckState(Qt::Unchecked); emit ItemCheckStateSignal(strID, false); listChannelID.removeOne(strID); @@ -2281,7 +2425,8 @@ void ChildForm::ItemPressSlot(QTableWidgetItem *item) void ChildForm::ItemChangedSlot(QTableWidgetItem *item) { if(m_bRealTime){ - realTimeData(); + //realTimeData(); + MyMsgBox(QMessageBox::Information,"提示","请先暂停实时数据播放!"); return; } if(!item) return; @@ -2297,7 +2442,7 @@ void ChildForm::ItemChangedSlot(QTableWidgetItem *item) item->setSelected(false); return; - }else if(m_iFormType == BodePlot && strType != "ACCELEROMETER"){ + }else if(m_iFormType == BodePlot && strType != "ACCELEROMETER" && strType != "TACHOMETER"){ item->setCheckState(Qt::Unchecked); item->setSelected(false); return; @@ -2321,19 +2466,25 @@ void ChildForm::ItemChangedSlot(QTableWidgetItem *item) item->setSelected(false); return; - }else if(m_iFormType == BodePlot && strType != "ACCELEROMETER"){ + }else if(m_iFormType == BodePlot && strType != "ACCELEROMETER"/* && strType != "TACHOMETER"*/){ item->setCheckState(Qt::Unchecked); item->setSelected(false); return; } + listChannelID.push_back(strID); item->setCheckState(Qt::Checked); item->setSelected(true); emit ItemCheckStateSignal(strID, true); - listChannelID.push_back(strID); + } else if(!item->checkState() && item->isSelected()) { + if(listChannelID.size() == 1 && m_iFormType == PolarPlot){ + item->setCheckState(Qt::Checked); + item->setSelected(true); + return; + } item->setCheckState(Qt::Unchecked); item->setSelected(false); emit ItemCheckStateSignal(strID, false); @@ -2359,67 +2510,50 @@ void ChildForm::mouseMoveEvent(QMouseEvent *event) //for (int i = 0; i < graphCount; ++i) { - //显示锚点 - QCPGraph *mGraph = ui->widget->graph(0); - tracer->setVisible(true); - tracerLabel->setVisible(true); - tracerLabel->setPositionAlignment(Qt::AlignLeft); - tracerLabel->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位) - tracerLabel->position->setCoords(0, 0); - tracer->setGraph(mGraph);//将锚点设置到被选中的曲线上 - { - tracer->setGraphKey(x); - //tracer->setInterpolating(true); //游标的纵坐标可以通过曲线数据线性插值自动获得 - tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效 + //显示锚点 + QCPGraph *mGraph = ui->widget->graph(0); + tracer->setVisible(true); + tracer->setGraph(mainGraph1);//将锚点设置到被选中的曲线上 + tracer->setGraphKey(x); + //tracer->setInterpolating(true); //游标的纵坐标可以通过曲线数据线性插值自动获得 + tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效 - double y = ui->widget->axisRect(0)->axis(QCPAxis::atLeft)->pixelToCoord(event->pos().y()); + //double yValue = ui->widget->axisRect(0)->axis(QCPAxis::atLeft)->pixelToCoord(event->pos().y()); - double xValue = tracer->position->key(); - double yValue = y; - //显示tip框 - QCPDataContainer::const_iterator coorPoint = ui->widget->graph(0)->data().data()->findBegin(x, true);//true代表向左搜索 - tracer->setGraphKey(coorPoint->key); - //tracer->setInterpolating(true); //游标的纵坐标可以通过曲线数据线性插值自动获得 - tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效 + double xValue = tracer->position->key(); + double yValue = tracer->position->value(); + //显示tip框 + //QCPDataContainer::const_iterator coorPoint = mainGraph1->data().data()->findBegin(x, true);//true代表向左搜索 + //tracerLabel->setText(QString("%1 X: %2 Y: %3").arg(mGraph->name()).arg( QString::number(xValue)).arg(QString::number(yValue))); - tracerLabel->setText(QString("%1 X: %2 Y: %3").arg(mGraph->name()).arg( QString::number(x)).arg(QString::number(yValue))); - } //显示锚点 QCPGraph *mGraph2 = ui->widget->graph(1); tracerLabel3->setVisible(true); - tracerLabel3->setPositionAlignment(Qt::AlignVCenter); + tracerLabel3->setPositionAlignment(Qt::AlignLeft); tracerLabel3->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位) tracerLabel3->position->setCoords(10, 20); - tracer->setGraph(mGraph2);//将锚点设置到被选中的曲线上 - { - tracer->setGraphKey(x); - //tracer->setInterpolating(true); //游标的纵坐标可以通过曲线数据线性插值自动获得 - tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效 + tracerLabel3->setTextAlignment(Qt::AlignLeft); - double y2 = ui->widget->axisRect(1)->axis(QCPAxis::atLeft)->pixelToCoord(event->pos().y()); + double yValue2 = ui->widget->axisRect(1)->axis(QCPAxis::atLeft)->pixelToCoord(event->pos().y()); - double xValue = tracer->position->key(); - double yValue2 = y2; - //显示tip框 - QCPDataContainer::const_iterator coorPoint = ui->widget->graph(1)->data().data()->findBegin(x, true);//true代表向左搜索 - tracer->setGraphKey(coorPoint->key); - //tracer->setInterpolating(true); //游标的纵坐标可以通过曲线数据线性插值自动获得 - tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效 + //显示tip框 + QCPDataContainer::const_iterator coorPoint = mainGraph2->data().data()->findBegin(x, true);//true代表向左搜索 + + tracerLabel3->setText(QString("%1 X: %2 Y: %3 \n%4 X: %5 Y: %6 ").arg(mainGraph1->name()).arg( QString::number(xValue))\ + .arg(QString::number(yValue)).arg(mainGraph2->name()).arg( QString::number(xValue)).arg(QString::number(coorPoint->value))); - tracerLabel3->setText(QString("%1 X: %2 Y: %3").arg(mGraph2->name()).arg( QString::number(x)).arg(QString::number(yValue2))); - } } }else{ x = ui->widget->xAxis->pixelToCoord(event->pos().x()); //遍历曲线 - for (int i = 0; i < graphCount; ++i) + for (int i = 0; i < graphCount && tracer->visible(); ++i) { //显示锚点 QCPGraph *mGraph = ui->widget->graph(i); - tracer->setVisible(true); + //tracer->setVisible(true); tracer->setGraph(mGraph);//将锚点设置到被选中的曲线上 @@ -2533,14 +2667,14 @@ void ChildForm::CalculateRPM() int flag = 0; qDebug() << "wavedata.size()" << iter.value().wavedata_DC.size(); for(int i = 0; i < iter.value().wavedata_DC.size();i++){ - if(iter.value().iTrigger == 0){//上升沿 if((iter.value().wavedata_DC[i]) > iter.value().iTriggerValue && flag == 0){ flag = i; - }else if (iter.value().wavedata_DC[i] < (iter.value().iTriggerValue - iter.value().iHysteresis) && flag > 0){ + }else if (iter.value().wavedata_DC[i] < (iter.value().iTriggerValue - iter.value().iHysteresis)\ + && flag > 0){ vecSpeedTime.push_back(flag); flag = 0; @@ -2608,7 +2742,7 @@ void ChildForm::CalculateRPM() } ui->widget->xAxis->setRange(0, 1, Qt::AlignLeft); ui->widget->replot(QCustomPlot::rpImmediateRefresh); - ZoomBtnSlot_XY(); + ScalesBtnSlot_XY(); } void ChildForm::ToRpm() { @@ -2623,8 +2757,7 @@ void ChildForm::ToRpm() if(listChannelID.size() > 1) return; - qDebug() << global::rotatingSpeed.iTriggerValue << global::rotatingSpeed.iKeyCount \ - << global::rotatingSpeed.iHysteresis<< global::rotatingSpeed.iTrigger << endl; + ui->widget->clearGraphs(); QMap().swap(waveGraph); if(m_bRpm){ @@ -2646,7 +2779,7 @@ void ChildForm::ToRpm() } } -void ChildForm::ZoomBtnSlot_X() +void ChildForm::ScalesBtnSlot_X() { ui->widget->setSelectionRectMode(QCP::SelectionRectMode::srmNone); int graphCount = ui->widget->graphCount(); @@ -2663,7 +2796,7 @@ void ChildForm::ZoomBtnSlot_X() } ui->widget->replot(); } -void ChildForm::ZoomBtnSlot_Y() +void ChildForm::ScalesBtnSlot_Y() { ui->widget->setSelectionRectMode(QCP::SelectionRectMode::srmNone); int graphCount = ui->widget->graphCount(); @@ -2680,7 +2813,7 @@ void ChildForm::ZoomBtnSlot_Y() } ui->widget->replot(); } -void ChildForm::ZoomBtnSlot_XY() +void ChildForm::ScalesBtnSlot_XY() { ui->widget->setSelectionRectMode(QCP::SelectionRectMode::srmNone); int graphCount = ui->widget->graphCount(); @@ -2694,11 +2827,8 @@ void ChildForm::ZoomBtnSlot_XY() } } -void ChildForm::ZoomBtnSlot_Hand() +void ChildForm::ScalesBtnSlot_Hand() { - - - // ui->widget->setMultiSelectModifier(Qt::ControlModifier);// 使用ctrl键来多选 // ui->widget->xAxis->setSelectableParts(QCPAxis::spAxis | QCPAxis::spAxisLabel | QCPAxis::spTickLabels); // 轴的三个部分都可以被选择 // ui->widget->yAxis->setSelectableParts(QCPAxis::spAxis | QCPAxis::spAxisLabel | QCPAxis::spTickLabels); @@ -2721,7 +2851,7 @@ void ChildForm::ZoomBtnSlot_Hand() ui->widget->setInteractions(QCP::iNone); } } -void ChildForm::Btn_ZoomSlot() +void ChildForm::Btn_ScalesSlot() { if(ui->Btn_Zoom->isChecked()){ ui->widget->setInteractions(QCP::iRangeDrag); @@ -2731,15 +2861,16 @@ void ChildForm::Btn_ZoomSlot() } } -void ChildForm::ScalesX() +void ChildForm::ZoomX() { ui->widget->setSelectionRectMode(QCP::SelectionRectMode::srmNone); ui->widget->setInteractions(QCP::iRangeZoom|QCP::iRangeDrag); - ui->widget->axisRect()->setRangeZoomFactor(1.2,1); + ui->widget->axisRect()->setRangeZoomFactor(1.2,1); ui->widget->axisRect()->setRangeZoomAxes(ui->widget->xAxis,ui->widget->yAxis); + } -void ChildForm::ScalesY() +void ChildForm::ZoomY() { ui->widget->setSelectionRectMode(QCP::SelectionRectMode::srmNone); ui->widget->setInteractions(QCP::iRangeZoom|QCP::iRangeDrag|QCP::iSelectAxes); @@ -2750,7 +2881,7 @@ void ChildForm::ScalesY() } //ui->widget->axisRect()->setRangeZoomAxis(ui->widget->xAxis,ui->widget->yAxis); } -void ChildForm::ScalesXY() +void ChildForm::ZoomXY() { ui->widget->setSelectionRectMode(QCP::SelectionRectMode::srmNone); ui->widget->setInteractions(QCP::iRangeZoom|QCP::iRangeDrag|QCP::iSelectAxes); @@ -2761,7 +2892,7 @@ void ChildForm::ScalesXY() } //ui->widget->axisRect()->setRangeZoomAxis(ui->widget->xAxis,ui->widget->yAxis); } -void ChildForm::ScalesBox() +void ChildForm::ZoomBox() { ui->widget->setSelectionRectMode(QCP::SelectionRectMode::srmZoom); ui->widget->selectionRect()->setPen(QPen(Qt::black,1,Qt::DashLine));//虚线 @@ -2769,19 +2900,30 @@ void ChildForm::ScalesBox() } void ChildForm::Cursor() { - if(tracer->visible()) + if(tracer->visible()){ tracer->setVisible(false); - else + disconnect(ui->widget, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMoveEvent(QMouseEvent*))); + UpdateTracerLabel(); + } + else{ tracer->setVisible(true); + connect(ui->widget, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMoveEvent(QMouseEvent*))); + } ui->widget->setInteractions(QCP::iRangeZoom|QCP::iRangeDrag); - dismove = connect(ui->widget, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMoveEvent(QMouseEvent*))); + disDoubleclick = connect(ui->widget, SIGNAL(mouseDoubleClick(QMouseEvent*)), this, SLOT(mouseDoubleClickEvent(QMouseEvent*))); disPress = connect(ui->widget, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(mouseWheelEvent(QWheelEvent*))); + + ui->widget->replot(); } void ChildForm::SetScales() { - pSetScales = new SetScalesForm(this); //将类指针实例化 + QCPRange xRange = ui->widget->xAxis->range(); + QCPRange yRange = ui->widget->yAxis->range(); + + m_strSacles = QString("%1,%2,%3,%4").arg(xRange.lower).arg(xRange.upper).arg(yRange.lower).arg(yRange.upper); + pSetScales = new SetScalesForm(m_strSacles,this); //将类指针实例化 connect(pSetScales, SIGNAL(sgSetScales(QString)), this, SLOT(slotSetScales(QString))); pSetScales->setWindowModality(Qt::ApplicationModal); pSetScales->show(); @@ -2795,28 +2937,29 @@ void ChildForm::slotSetScales(QString str) int j = 0,ii = 0; for(int i = 0; i < Axis.size();i++){ - if(Axis[i]->visible()){ - j ++; - ii = i; +// if(Axis[i]->visible()){ +// j ++; +// ii = i; - } - if (Axis[i]->selectedParts().testFlag(QCPAxis::spAxis) && j > 1){ +// } + if (Axis[i]->selectedParts().testFlag(QCPAxis::spAxis)/* && j > 1*/){ Axis[i]->setRange(strList[2].toFloat(), strList[3].toFloat()-strList[2].toFloat(), Qt::AlignLeft); } } - if(j == 1){ - Axis[ii]->setRange(strList[2].toFloat(), strList[3].toFloat()-strList[2].toFloat(), Qt::AlignLeft); - } +// if(j == 1){ +// Axis[ii]->setRange(strList[2].toFloat(), strList[3].toFloat()-strList[2].toFloat(), Qt::AlignLeft); +// } ui->widget->replot(QCustomPlot::rpImmediateRefresh); } void ChildForm::slotSetFilter(QString str) { + m_strFilter = str; QStringList strList = str.split(","); UpdateEnvSerises(strList[0],strList[1]); } void ChildForm::SetFilter() { - pSetFilter = new FilterForm(this); //将类指针实例化 + pSetFilter = new FilterForm(m_strFilter,this); //将类指针实例化 connect(pSetFilter, SIGNAL(sgSetFilter(QString)), this, SLOT(slotSetFilter(QString))); pSetFilter->setWindowModality(Qt::ApplicationModal); pSetFilter->show(); @@ -2896,7 +3039,8 @@ void ChildForm::RealTimeWave(QByteArray payLoad) graph->setData(waveShowData.Key, waveShowData.wavedata); } }else if(m_iFormType == FrequencyDomainPlot){ - graph->setData(waveShowData.Key, waveShowData.wavedata); + graph->setData(waveShowData.Key, waveShowData.wavedataFre); + qDebug() << waveShowData.wavedataFre.size() << waveShowData.wavedataFre[50]<< endl; } } @@ -2909,16 +3053,16 @@ void ChildForm::RealTimeWave(QByteArray payLoad) ui->widget->xAxis->setLabel(strRMS); } - graph->rescaleValueAxis(); + //graph->rescaleValueAxis(); graph->setName(waveShowData.channleName); QPen pen; pen.setColor(waveShowData.linColor); pen.setStyle(Qt::SolidLine); pen.setWidth(0); graph->setPen(pen); - if(m_iFormType == FrequencyDomainPlot || m_iFormType == EnvChartPlot){ - ui->widget->xAxis->setRange(0, 1000); - } +// if(m_iFormType == FrequencyDomainPlot || m_iFormType == EnvChartPlot){ +// ui->widget->xAxis->setRange(0, 1000); +// } waveGraph.insert(QString(waveContain.channelId),graph); ui->widget->replot(QCustomPlot::rpImmediateRefresh); @@ -3140,9 +3284,8 @@ void ChildForm::SetDC() // } // } - int graphCount = ui->widget->clearGraphs(); + ui->widget->clearGraphs(); QMap().swap(waveGraph); - qDebug() << "graphCount" << graphCount<< endl; if(!ui->Btn_AC_DC->isChecked()){ m_bDC = false; @@ -3157,10 +3300,7 @@ void ChildForm::CalculateIntegration(bool isDoubleIntegration) QMap().swap(waveGraph); QVector x,y; QVector temDCWave; -<<<<<<< HEAD -======= QString strLabel; ->>>>>>> master QMap::Iterator iter = mapWaveDisplayData.begin(); for (int i = 0; i < listChannelID.size(); ++i){ for(iter = mapWaveDisplayData.begin();iter != mapWaveDisplayData.end();iter++){ @@ -3173,26 +3313,35 @@ void ChildForm::CalculateIntegration(bool isDoubleIntegration) } double rms = 0.0; double f = 0.0; + QVector realvalue; pCalculation->_Integration(temDCWave,y,rms); - if(isDoubleIntegration){ m_bDoubleIntegration = true; QVector key,Proximeter; pCalculation->_Integration(y,Proximeter,rms); - double gap = (double)1/(double)Proximeter.size(); - for(int ii = 0; ii < Proximeter.size();ii++){ - f += gap; - key.push_back(f); + if(m_iFormType == FrequencyDomainPlot){ + pCalculation->FFTSpec(Proximeter,realvalue); + QVector().swap(Proximeter); + Proximeter = realvalue; + ui->widget->xAxis->setLabel("Frequency(Hz)"); + for(int ii = 0; ii < Proximeter.size();ii++){ + key.push_back(ii); + } + }else{ + ui->widget->xAxis->setRange(0, 1); + ui->widget->xAxis->setLabel("Time(s)"); + double gap = (double)1/(double)Proximeter.size(); + for(int ii = 0; ii < Proximeter.size();ii++){ + f += gap; + key.push_back(f); + } } -<<<<<<< HEAD -======= if(iter.value().channelType =="ACCELEROMETER"){ strLabel = "PROXIMETER(um)"; } QCPGraph* graph = MultiyAxis(iter.key(),iter.value().channelType,strLabel); ->>>>>>> master - ui->widget->xAxis->setRange(0, 1); + graph->setData(key, Proximeter); // let the ranges scale themselves so graph 0 fits perfectly in the visible area: graph->rescaleValueAxis(); @@ -3202,25 +3351,33 @@ void ChildForm::CalculateIntegration(bool isDoubleIntegration) pen.setStyle(Qt::SolidLine); pen.setWidth(0); graph->setPen(pen); - // give the Axis some labels: - ui->widget->xAxis->setLabel("Time(s)"); }else{ + if(m_iFormType == FrequencyDomainPlot){ + pCalculation->FFTSpec(y,realvalue); + QVector().swap(y); + y = realvalue; - double gap = (double)1/(double)y.size(); - for(int ii = 0; ii < y.size();ii++){ - f += gap; - x.push_back(f); + for(int ii = 0; ii < y.size();ii++){ + x.push_back(ii); + } + }else{ + ui->widget->xAxis->setRange(0, 1); + qDebug() <<"y.size()" <widget->xAxis->setRange(0, 1); - //QCPGraph* graph = ui->widget->addGraph(); + graph->setData(x, y); // let the ranges scale themselves so graph 0 fits perfectly in the visible area: graph->rescaleValueAxis(); @@ -3229,27 +3386,12 @@ void ChildForm::CalculateIntegration(bool isDoubleIntegration) pen.setColor(iter.value().linColor); pen.setStyle(Qt::SolidLine); pen.setWidth(0); -<<<<<<< HEAD - ui->widget->graph(i)->setPen(pen); - // give the axes some labels: - // QString strRMS = QString("Time(s) %1: %2").arg( "RMS" ).arg(rms); - - ui->widget->xAxis->setLabel("Time(s)"); - if(iter.value().channelType =="VELOCITY"){ - ui->widget->yAxis->setLabel("PROXIMETER(um)"); - }else if(iter.value().channelType =="ACCELEROMETER"){ - ui->widget->yAxis->setLabel("Velocity(mm/s)"); - } - waveGraph.insert(listChannelID.at(i), graph); -======= graph->setPen(pen); // give the Axis some labels: - QString strRMS = QString("Time(s) %1: %2").arg( "RMS" ).arg(rms); +// QString strRMS = QString("Time(s) %1: %2 mm/s").arg( "RMS" ).arg(rms); - ui->widget->xAxis->setLabel(strRMS); +// ui->widget->xAxis->setLabel(strRMS); - //waveGraph.insert(listChannelID.at(i), graph); ->>>>>>> master } ui->widget->replot(QCustomPlot::rpImmediateRefresh); @@ -3263,20 +3405,20 @@ void ChildForm::CalculateDifferentiation(bool isDoubleDifferentiation) { QVector key,value,yValue,key2,yValue2; QVector temDCWave,diffValue,diffValue2; -<<<<<<< HEAD -======= QString strLabel; QCPGraph* graph = NULL; qDebug() << mapWaveDisplayData.size() << endl; ->>>>>>> master QMap::Iterator iter = mapWaveDisplayData.begin(); for (int i = 0; i < listChannelID.size(); ++i){ for(iter = mapWaveDisplayData.begin();iter != mapWaveDisplayData.end();iter++){ if(listChannelID.at(i) == iter.key()){ double gap,f; f= 0.0; + QVector realvalue; QVector().swap(temDCWave); QVector().swap(diffValue); + QVector().swap(yValue); + QVector().swap(yValue2); gap = (double)1/(double)iter.value().SamleRate; for(int j = 0; j < iter.value().SamleRate;j++){ temDCWave.push_back(iter.value().wavedata.at(j) - iter.value().mean); @@ -3300,21 +3442,36 @@ void ChildForm::CalculateDifferentiation(bool isDoubleDifferentiation) f += gap; key2.push_back(f); } + if(m_iFormType == FrequencyDomainPlot){ + pCalculation->FFTSpec(yValue2,realvalue); + QVector().swap(yValue2); + QVector().swap(key2); + yValue2 = realvalue; + for(int i = 0 ; i < yValue2.size();i++){ + key2.push_back(i); + } + ui->widget->xAxis->setLabel("Frequency(Hz)"); + }else{ + ui->widget->xAxis->setLabel("Time(s)"); + } strLabel = "ACCELEROMETER(m/s^2)"; graph = MultiyAxis(iter.key(),iter.value().channelType,strLabel); - ui->widget->xAxis->setRange(0, 1); graph->setData(key2, yValue2); + }else{ - ui->widget->xAxis->setRange(0, 1); -<<<<<<< HEAD - ui->widget->graph(i)->setData(key, yValue); - if(iter.value().channelType == "VELOCITY") - ui->widget->yAxis->setLabel("ACCELEROMETER(mm/s)"); - else if(iter.value().channelType == "THRUST" || - iter.value().channelType == "PROXIMETER") - ui->widget->yAxis->setLabel("Velocity(mm/s)"); -======= + if(m_iFormType == FrequencyDomainPlot){ + pCalculation->FFTSpec(yValue,realvalue); + QVector().swap(yValue); + QVector().swap(key); + yValue = realvalue; + for(int i = 0 ; i < yValue.size();i++){ + key.push_back(i); + } + ui->widget->xAxis->setLabel("Frequency(Hz)"); + }else{ + ui->widget->xAxis->setLabel("Time(s)"); + } if(iter.value().channelType == "VELOCITY") strLabel = "ACCELEROMETER(m/s^2)"; @@ -3323,7 +3480,7 @@ void ChildForm::CalculateDifferentiation(bool isDoubleDifferentiation) strLabel = "Velocity(mm/s)"; graph = MultiyAxis(iter.key(),iter.value().channelType,strLabel); graph->setData(key, yValue); ->>>>>>> master + graph->setName(iter.value().channleName); } // let the ranges scale themselves so graph 0 fits perfectly in the visible area: @@ -3334,13 +3491,8 @@ void ChildForm::CalculateDifferentiation(bool isDoubleDifferentiation) pen.setWidth(0); graph->setPen(pen); graph->setName(iter.value().channleName); - // give the axes some labels: - ui->widget->xAxis->setLabel("Time(s)"); -<<<<<<< HEAD -======= qDebug() << listChannelID.at(i) << endl; ->>>>>>> master ui->widget->replot(QCustomPlot::rpImmediateRefresh); } } @@ -3361,7 +3513,8 @@ void ChildForm::DoubleDifferentiationSlot() }else{ m_bDoubleDifferentiation = true; m_bDifferentiation = false; - if(m_iFormType == TimeDomainPlot){ + //if(m_iFormType == TimeDomainPlot) + { CalculateDifferentiation(true); } } @@ -3381,7 +3534,8 @@ void ChildForm::DifferentiationSlot() m_bDifferentiation = true; m_bDoubleDifferentiation = false; m_bIntegration = false; - if(m_iFormType == TimeDomainPlot){ + //if(m_iFormType == TimeDomainPlot) + { CalculateDifferentiation(); } } @@ -3400,7 +3554,8 @@ void ChildForm::DoubleIntegrationSlot() }else{ m_bDoubleIntegration = true; m_bIntegration = false; - if(m_iFormType == TimeDomainPlot){ + //if(m_iFormType == TimeDomainPlot) + { CalculateIntegration(true); } } @@ -3421,64 +3576,63 @@ void ChildForm::IntegrationSlot() m_bDifferentiation = false; QVector x,y,y1,realvalue,imagevalue; QVector temDCWave; + CalculateIntegration(); +// if(m_iFormType == TimeDomainPlot){ +// CalculateIntegration(); +// }else if(m_iFormType == FrequencyDomainPlot){ +// QMap::Iterator iter = mapWaveDisplayData.begin(); +// for (int i = 0; i < listChannelID.size(); ++i){ +// for(;iter != mapWaveDisplayData.end();iter++){ +// if(listChannelID.at(i) == iter.key()){ +// QVector().swap(x); +// QVector().swap(y); +// QVector().swap(temDCWave); +// for(int j = 0; j < iter.value().SamleRate;j++){ +// double f = iter.value().wavedata.at(j) - iter.value().mean; +// temDCWave.push_back(f); +// } - if(m_iFormType == TimeDomainPlot){ - CalculateIntegration(); - }else if(m_iFormType == FrequencyDomainPlot){ - QMap::Iterator iter = mapWaveDisplayData.begin(); - for (int i = 0; i < listChannelID.size(); ++i){ - for(;iter != mapWaveDisplayData.end();iter++){ - if(listChannelID.at(i) == iter.key()){ - QVector().swap(x); - QVector().swap(y); - QVector().swap(temDCWave); - for(int j = 0; j < iter.value().SamleRate;j++){ - double f = iter.value().wavedata.at(j) - iter.value().mean; - temDCWave.push_back(f); - } +// double rms = 0.0; +// pCalculation->_Integration(temDCWave,y,rms); +// pCalculation->FFTSpec(y,realvalue); +// for(int jj = 0 ; jj < realvalue.size();jj++){ +// x.push_back(jj); +// } - double rms = 0.0; - pCalculation->_Integration(temDCWave,y,rms); - pCalculation->FFTSpec(y,realvalue); - for(int jj = 0 ; jj < realvalue.size();jj++){ - x.push_back(jj); - } +// ui->widget->xAxis->setRange(0, realvalue.size()); +// QString strLabel = ""; +// if(iter.value().channelType == "ACCELEROMETER") +// strLabel = "Velocity(mm/s)"; +// else if(iter.value().channelType == "VELOCITY") +// strLabel = "PROXIMETER(um)"; +// QCPGraph* graph = MultiyAxis(iter.key(),iter.value().channelType,strLabel); +// //QCPGraph* graph = ui->widget->addGraph(); +// ui->widget->graph(i)->setData(x, realvalue); +// // let the ranges scale themselves so graph 0 fits perfectly in the visible area: +// ui->widget->graph(i)->rescaleValueAxis(); +// QPen pen; +// pen.setColor(iter.value().linColor); +// pen.setStyle(Qt::SolidLine); +// pen.setWidth(0); +// ui->widget->graph(i)->setPen(pen); +// // give the axes some labels: +// ui->widget->xAxis->setLabel("Frequency(Hz)"); +// ui->widget->replot(QCustomPlot::rpImmediateRefresh); - ui->widget->xAxis->setRange(0, realvalue.size()); - QString strLabel = ""; - if(iter.value().channelType == "ACCELEROMETER") - strLabel = "Velocity(mm/s)"; - else if(iter.value().channelType == "VELOCITY") - strLabel = "PROXIMETER(um)"; - QCPGraph* graph = MultiyAxis(iter.key(),iter.value().channelType,strLabel); - //QCPGraph* graph = ui->widget->addGraph(); - ui->widget->graph(i)->setData(x, realvalue); - // let the ranges scale themselves so graph 0 fits perfectly in the visible area: - ui->widget->graph(i)->rescaleValueAxis(); - QPen pen; - pen.setColor(iter.value().linColor); - pen.setStyle(Qt::SolidLine); - pen.setWidth(0); - ui->widget->graph(i)->setPen(pen); - // give the axes some labels: - ui->widget->xAxis->setLabel("Frequency(Hz)"); - ui->widget->replot(QCustomPlot::rpImmediateRefresh); - - //waveGraph.insert(listChannelID.at(i), graph); - } - } - } - } +// } +// } +// } +// } } ui->widget->replot(QCustomPlot::rpImmediateRefresh); } void ChildForm::EnableBtn() { - if(m_iFormType == TimeDomainPlot){ + if(m_iFormType == TimeDomainPlot || m_iFormType == FrequencyDomainPlot){ if(ui->Btn_Sound->isChecked()){ ui->Btn_Zoom->setEnabled(false); - ui->Btn_ZoomMenu->setEnabled(false); + ui->Btn_ScalesMenu->setEnabled(false); ui->Btn_setScales->setEnabled(false); ui->measureBtn->setEnabled(false); ui->Btn_Hz->setEnabled(false); @@ -3492,7 +3646,7 @@ void ChildForm::EnableBtn() }else if(ui->realTimeDataBtn->isChecked()){ ui->zoomBtn_hand->setEnabled(false); ui->Btn_Zoom->setEnabled(false); - ui->Btn_ZoomMenu->setEnabled(false); + ui->Btn_ScalesMenu->setEnabled(false); ui->Btn_setScales->setEnabled(false); ui->measureBtn->setEnabled(false); ui->Btn_Hz->setEnabled(false); @@ -3506,7 +3660,7 @@ void ChildForm::EnableBtn() }else{ ui->zoomBtn_hand->setEnabled(true); ui->Btn_Zoom->setEnabled(true); - ui->Btn_ZoomMenu->setEnabled(true); + ui->Btn_ScalesMenu->setEnabled(true); ui->Btn_setScales->setEnabled(true); ui->Btn_AC_DC->setEnabled(true); ui->Btn_differentiation->setEnabled(true); @@ -3516,6 +3670,19 @@ void ChildForm::EnableBtn() } } } +void ChildForm::UpdateTracerLabel() +{ + if(tracerLabel->visible()) + tracerLabel->setVisible(false); + if(tracerLabel2->visible()) + tracerLabel2->setVisible(false); + if(tracerLabel3->visible()) + tracerLabel3->setVisible(false); + if(tracerLabel4->visible()) + tracerLabel4->setVisible(false); + if(tracerLabel5->visible()) + tracerLabel5->setVisible(false); +} //选点处理函数 void ChildForm::OnPlotClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event) { diff --git a/ChaosDataPlayer/ChildForm.h b/ChaosDataPlayer/ChildForm.h index e17be8b..91f7b45 100644 --- a/ChaosDataPlayer/ChildForm.h +++ b/ChaosDataPlayer/ChildForm.h @@ -31,7 +31,8 @@ enum FormType PolarPlot, //极坐标 BodePlot, //伯德图 ShaftCenterline, //轴心位置图 - AllWavePlot //全谱图 + AllWavePlot , //全谱图 + TimeWavePlot //时域长波形 }; @@ -58,7 +59,7 @@ class ChildForm : public BaseWgt Q_OBJECT public: - explicit ChildForm(FormType iType,QString m_strName = "",DEVICE_INFO* DeviceInfo = NULL, QWidget *parent = nullptr); + explicit ChildForm(FormType iType,QString m_strName = "",DEVICE_INFO* DeviceInfo = NULL,int iCurCount = 0, QWidget *parent = nullptr); ~ChildForm(); void SetName(QString strName) @@ -103,6 +104,7 @@ public: void EnableBtn(); void UpdateDiffMenu(); void InitIntegration(); + void UpdateTracerLabel(); QVector childWave; QVector OrbitXWave,OrbitYWave; QVector vecKeyPhasor; @@ -126,20 +128,20 @@ signals: protected: public slots: - void ZoomBtnSlot_X(); - void ZoomBtnSlot_Y(); - void ZoomBtnSlot_XY(); - void ZoomBtnSlot_Hand(); + void ScalesBtnSlot_X(); + void ScalesBtnSlot_Y(); + void ScalesBtnSlot_XY(); + void ScalesBtnSlot_Hand(); void ToRpm(); - void Btn_ZoomSlot(); + void Btn_ScalesSlot(); void IntegrationSlot(); void DoubleIntegrationSlot(); void DifferentiationSlot(); void DoubleDifferentiationSlot(); - void ScalesBox(); - void ScalesX(); - void ScalesY(); - void ScalesXY(); + void ZoomBox(); + void ZoomX(); + void ZoomY(); + void ZoomXY(); void Cursor(); void SetScales(); void SetFilter(); @@ -170,7 +172,8 @@ private: std::condition_variable m_cv; std::mutex mu; WAVE_CSVDATA m_vecCsvData[32]; - + QString m_strFilter; + QString m_strSacles; int m_nStart; int m_nEnd; QMenu *remove_menu; @@ -180,6 +183,7 @@ private: QAction *Ord; QAction *Rad; + QCPAxis *yAxis3; QList Axis; QCPItemTracer *tracer; //游标 diff --git a/ChaosDataPlayer/ChildForm.ui b/ChaosDataPlayer/ChildForm.ui index 2eb2749..6bf718c 100644 --- a/ChaosDataPlayer/ChildForm.ui +++ b/ChaosDataPlayer/ChildForm.ui @@ -17,11 +17,11 @@ Form - #Btn_ZoomMenu { border-image:url(:/images/images/imgModelAction/Zoom_xy.png) 1; } -#Btn_ZoomMenu:hover { border-image:url(:/images/images/imgModelAction/Zoom-xy-h.png) 1; } -#Btn_ZoomMenu:pressed { border-image:url(:/images/images/imgModelAction/Zoom-xy-p.png) 1; } -#Btn_ZoomMenu:checked { border-image:url(:/images/images/imgModelAction/Zoom_xy.png) 1; } -#Btn_ZoomMenu::menu-indicator{image:none;} + #Btn_ScalesMenu { border-image:url(:/images/images/imgModelAction/Zoom_xy.png) 1; } +#Btn_ScalesMenu:hover { border-image:url(:/images/images/imgModelAction/Zoom-xy-h.png) 1; } +#Btn_ScalesMenu:pressed { border-image:url(:/images/images/imgModelAction/Zoom-xy-p.png) 1; } +#Btn_ScalesMenu:checked { border-image:url(:/images/images/imgModelAction/Zoom_xy.png) 1; } +#Btn_ScalesMenu::menu-indicator{image:none;} #Btn_setScales { border-image:url(:/images/images/imgModelAction/setScales.png) 5; } #Btn_setScales:hover { border-image:url(:/images/images/imgModelAction/setScales-h.png) 5; } @@ -98,7 +98,7 @@ #measureBtn:pressed {border-image:url(:/images/images/imgModelAction/measure-p.png) 5; } #measureBtn:checked {border-image:url(:/images/images/imgModelAction/measure-p.png) 5; } -#realTimeDataBtn { border-image:url(:/images/images/imgModelAction/realTime.png) 5; } +#realTimeDataBtn { border-image:url(:/images/images/imgModelAction/realTime-d.png) 5; } #realTimeDataBtn:hover { border-image:url(:/images/images/imgModelAction/realTime-h.png) 5; } #realTimeDataBtn:pressed {border-image:url(:/images/images/imgModelAction/realTime-p.png) 5; } #realTimeDataBtn:checked {border-image:url(:/images/images/imgModelAction/realTime-p.png) 5; } @@ -338,7 +338,7 @@ 41 - + 90 @@ -473,7 +473,7 @@ - true + false @@ -979,7 +979,7 @@ Btn_Cursor Btn_Zoom line_5 - Btn_ZoomMenu + Btn_ScalesMenu Btn_setScales line_6 Btn_Annotation diff --git a/ChaosDataPlayer/CreateReport.cpp b/ChaosDataPlayer/CreateReport.cpp index eb14382..9380efe 100644 --- a/ChaosDataPlayer/CreateReport.cpp +++ b/ChaosDataPlayer/CreateReport.cpp @@ -73,6 +73,18 @@ bool CreateReport::CreateWord()//创建word m_wordOperate->SetText("趋势图"); if(_strImagePathList.at(i).contains("EnvChart")) m_wordOperate->SetText("包络图"); + if(_strImagePathList.at(i).contains("Orbit")) + m_wordOperate->SetText("轴心轨迹图"); + if(_strImagePathList.at(i).contains("WaterFall")) + m_wordOperate->SetText("瀑布图"); + if(_strImagePathList.at(i).contains("Polar")) + m_wordOperate->SetText("极坐标图"); + if(_strImagePathList.at(i).contains("ShaftCenterline")) + m_wordOperate->SetText("轴心位置图"); + if(_strImagePathList.at(i).contains("Bode")) + m_wordOperate->SetText("伯德图"); + if(_strImagePathList.at(i).contains("AllWave")) + m_wordOperate->SetText("全频图"); m_wordOperate->insertEnter(); } DrawTable(); diff --git a/ChaosDataPlayer/FilterForm.cpp b/ChaosDataPlayer/FilterForm.cpp index bc29344..74c2ccb 100644 --- a/ChaosDataPlayer/FilterForm.cpp +++ b/ChaosDataPlayer/FilterForm.cpp @@ -4,7 +4,7 @@ #include #include "msgbox.h" -FilterForm::FilterForm(QWidget *parent) : +FilterForm::FilterForm(QString strFilter, QWidget *parent) : BaseWgt(parent), ui(new Ui::FilterForm) { @@ -17,6 +17,10 @@ FilterForm::FilterForm(QWidget *parent) : QRegExpValidator *validator = new QRegExpValidator(rx, this); ui->lineEdit->setValidator(validator); ui->lineEdit_2->setValidator(validator); + QStringList strList = strFilter.split(","); + ui->lineEdit->setText(strList[0]); + ui->lineEdit_2->setText(strList[1]); + } FilterForm::~FilterForm() diff --git a/ChaosDataPlayer/FilterForm.h b/ChaosDataPlayer/FilterForm.h index 9c543e6..59e867a 100644 --- a/ChaosDataPlayer/FilterForm.h +++ b/ChaosDataPlayer/FilterForm.h @@ -14,7 +14,7 @@ class FilterForm : public BaseWgt Q_OBJECT public: - explicit FilterForm(QWidget *parent = nullptr); + explicit FilterForm(QString strFilter,QWidget *parent = nullptr); ~FilterForm(); private: diff --git a/ChaosDataPlayer/MainWidget.cpp b/ChaosDataPlayer/MainWidget.cpp index 86b7325..8e9304f 100644 --- a/ChaosDataPlayer/MainWidget.cpp +++ b/ChaosDataPlayer/MainWidget.cpp @@ -130,6 +130,7 @@ void MainWidget::InitSignalandSlot() connect(ui->modelBtn_5, SIGNAL(clicked()), this, SLOT(BodePlotSlot())); connect(ui->modelBtn_6, SIGNAL(clicked()), this, SLOT(ShaftCenterlinePlotSlot())); connect(ui->modelBtn_12, SIGNAL(clicked()), this, SLOT(View3D())); + connect(ui->modelBtn_TimeWave, SIGNAL(clicked()), this, SLOT(TimeWave())); connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(Dat2Csv())); connect(ui->refreshBtn, SIGNAL(clicked()), this, SLOT(RefreshBtnSlot()));//刷新终端列表 @@ -248,6 +249,11 @@ void MainWidget::SearchSlot(QString strIP,bool AutoSearch) } void MainWidget::RefreshBtnSlot() { + + ui->refreshBtn->setEnabled(false); + QTimer::singleShot(1000, this, [=]() { + ui->refreshBtn->setEnabled(true); + }); ui->treeWidget->clear(); InitDevList(); /*QString tablename = "t_Device"; @@ -631,7 +637,6 @@ void MainWidget::addChildItem(QTreeWidgetItem *pDataItem,QTreeWidgetItem *pNoIte else if ("manu" == strFlag) { pManulItem = pItem; - } } @@ -687,7 +692,7 @@ void MainWidget::addChildItem(QTreeWidgetItem *pDataItem,QTreeWidgetItem *pNoIte QIcon icon(":/images/images/imgTreeIcon/remove6.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,0); - pSizeItem->addChild(pNewItem); + pTimeItem->addChild(pNewItem); }else{ QIcon icon(":/images/images/imgTreeIcon/remove2.png"); pNewItem->setIcon(0, icon); @@ -696,16 +701,17 @@ void MainWidget::addChildItem(QTreeWidgetItem *pDataItem,QTreeWidgetItem *pNoIte } } - else if (sfileName.contains("DELTA_EU") || sfileName.contains("DELTA_SPPEED")) + else if (sfileName.contains("DELTA_EU") || sfileName.contains("DELTA_SPEED")) { datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNo + "\\" + "change" + "\\"; filename = datpath + sfileName; QFileInfo file(filename); + qDebug() << filename << endl; if(file.exists()){ QIcon icon(":/images/images/imgTreeIcon/remove6.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,0); - pSizeItem->addChild(pNewItem); + pChangeItem->addChild(pNewItem); }else{ QIcon icon(":/images/images/imgTreeIcon/remove2.png"); pNewItem->setIcon(0, icon); @@ -1028,7 +1034,7 @@ void MainWidget::OutPDF(QStringList strResult,QString filePath) break; case FormType::FrequencyDomainPlot: pPdfPainter->setPen(QColor(0,0,0)); - pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"频谱图"); + pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"频域图"); break; case FormType::EnvChartPlot: pPdfPainter->setPen(QColor(0,0,0)); @@ -1162,7 +1168,8 @@ void MainWidget::ItemCheckStateSlot(QString strID, bool bChecked) if(pChild->GetFormType() == FrequencyDomainPlot || pChild->GetFormType() == TimeDomainPlot || pChild->GetFormType() == EnvChartPlot || pChild->GetFormType() == SpecChartPlot - || pChild->GetFormType() == TrendChartPlot || pChild->GetFormType() == WaterFallPlot) + || pChild->GetFormType() == TrendChartPlot || pChild->GetFormType() == WaterFallPlot + || pChild->GetFormType() == TimeWavePlot) {//频域图,时域图,包络图,频谱图 QString strChannelID = strID; QMap>::Iterator iter = mapWaveData.begin(); @@ -1217,23 +1224,27 @@ void MainWidget::ItemCheckStateSlot(QString strID, bool bChecked) QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); ++iter){ if((iter.key() == strChannelID)){ - + qDebug() << strChannelID << endl; pChild->mapBodeData.insert(strID,iter.value()); + qDebug() << pChild->mapBodeData.size() << endl; if(pChild->mapBodeData.size() < 2){ QString ChannelID = iter.value().at(0).speedRefChannelId; + qDebug() << "speedRefChannelId" <mapBodeData.insert(strID,mapWaveData[ChannelID]); pChild->AddBodeSeries(strChannelID, iter.value(),mapWaveData[ChannelID]); return; } }else{ + qDebug() << 2 << strChannelID << endl; QVector waveSpeedData; //转速 QVector waveVibrateData; //加速度 QMap>::Iterator iter = pChild->mapBodeData.begin(); for (;iter != pChild->mapBodeData.end() ; iter++) { + qDebug() << iter.value()[0].sensorType << endl; if(iter.value()[0].sensorType != "ACCELEROMETER" && iter.value()[0].sensorType != "TACHOMETER"){ MyMsgBox(QMessageBox::Warning,"警告","请选择转速和振动通道进行伯德图分析"); return; @@ -1257,7 +1268,7 @@ void MainWidget::ItemCheckStateSlot(QString strID, bool bChecked) QString ChannelID = iter.value().at(0).pairChannelID; QString ChannelType = iter.value().at(0).sensorType; if((ChannelType != "PROXIMETER") /*&& (ChannelID == "NONE" || ChannelID == "")*/){ - MyMsgBox(QMessageBox::Warning,"警告","请选择径向位移通道"); + //MyMsgBox(QMessageBox::Warning,"警告","请选择径向位移通道"); return; } pChild->AddShaftCenterlineSeries(strChannelID, iter.value(),mapWaveData[ChannelID]); @@ -1276,7 +1287,7 @@ void MainWidget::ItemCheckStateSlot(QString strID, bool bChecked) if(strChannelType != "PROXIMETER") return; if(speedChannelID == "NONE" || speedChannelID == ""){ - MyMsgBox(QMessageBox::Warning,"警告","当前文件中没有转速通道数据"); + //MyMsgBox(QMessageBox::Warning,"警告","当前文件中没有转速通道数据"); return; } @@ -1330,7 +1341,11 @@ void MainWidget::TrendChartPlotSlot() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - ChildForm *pChild = new ChildForm(FormType::TrendChartPlot,tr("趋势图"),&m_DeviceInfo,this); + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::TrendChartPlot,tr("趋势图"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("趋势图")); @@ -1379,7 +1394,12 @@ void MainWidget::TimeDomainPlotSlot() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - ChildForm *pChild = new ChildForm(FormType::TimeDomainPlot,tr("时域图"),&m_DeviceInfo,this); + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + + ChildForm *pChild = new ChildForm(FormType::TimeDomainPlot,tr("时域图"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); @@ -1430,7 +1450,11 @@ void MainWidget::FrequencyDomainPlotSlot() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - ChildForm *pChild = new ChildForm(FormType::FrequencyDomainPlot,tr("频域图"),&m_DeviceInfo,this); + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::FrequencyDomainPlot,tr("频域图"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("频域图")); @@ -1478,7 +1502,11 @@ void MainWidget::EnvelopeAnalysisPlotSlot() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - ChildForm *pChild = new ChildForm(FormType::EnvChartPlot,tr("包络图"),&m_DeviceInfo,this); + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::EnvChartPlot,tr("包络图"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("包络图")); @@ -1526,7 +1554,11 @@ void MainWidget::WaterFallPlotSlot() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - ChildForm *pChild = new ChildForm(FormType::WaterFallPlot,tr("瀑布图"),&m_DeviceInfo,this); + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::WaterFallPlot,tr("瀑布图"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("瀑布图")); @@ -1583,7 +1615,11 @@ void MainWidget::BodePlotSlot() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - ChildForm *pChild = new ChildForm(FormType::BodePlot,tr("Bode"),&m_DeviceInfo,this); + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::BodePlot,tr("伯德图"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("伯德图")); @@ -1629,7 +1665,11 @@ void MainWidget::OrbitPlotSlot() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - ChildForm *pChild = new ChildForm(FormType::OrbitPlot,tr("轴心轨迹图"),&m_DeviceInfo,this); + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::OrbitPlot,tr("轴心轨迹图"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("轴心轨迹图")); @@ -1677,7 +1717,11 @@ void MainWidget::ShaftCenterlinePlotSlot() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - ChildForm *pChild = new ChildForm(FormType::ShaftCenterline,tr("轴心位置图"),&m_DeviceInfo,this); + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::ShaftCenterline,tr("轴心位置图"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("轴心位置图")); @@ -1721,7 +1765,15 @@ void MainWidget::ShaftCenterlinePlotSlot() } void MainWidget::PolarplotSlot() { - ChildForm *pChild = new ChildForm(FormType::PolarPlot,tr("极坐标"),&m_DeviceInfo,this); + if(mapWaveData.size() < 1){ + MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); + return; + } + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::PolarPlot,tr("极坐标"),&m_DeviceInfo,m_iCurCount-1,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("极坐标")); @@ -1763,6 +1815,58 @@ void MainWidget::PolarplotSlot() ui->tabWidget->setCurrentWidget(pChild); } +void MainWidget::TimeWave() +{ + if(mapWaveData.size() < 1){ + MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); + return; + } + if( ui->tabWidget->count() == 10){ + MyMsgBox(QMessageBox::Warning,"警告","最大支持打开10张图谱"); + return; + } + ChildForm *pChild = new ChildForm(FormType::TimeWavePlot,tr("时域长波形"),&m_DeviceInfo,m_iCurCount-1,this); + pChild->setCloseBtnVisible(true); + pChild->hideTopWgt(); + pChild->SetName(tr("时域长波形")); + pChild->SetFormType(FormType::TimeWavePlot); + + QIcon icon(":/images/images/imgDatamodel/wave.png"); + ui->tabWidget->addTab(pChild, icon, pChild->GetName()); + //pChild->AddPolarPlotSeries(); + QPushButton *pCustomButton = new QPushButton(); + pCustomButton->setFixedSize(14, 14); + pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ + QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ + QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); + ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); + connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); + m_mapTabBtnToForm[pCustomButton] = pChild; + + connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); + connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); + connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); + // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); + + m_vecChildForm.push_back(pChild); + + QStringList strIDList,strChannleType,strChannleNameList; +// QVector::Iterator iter = m_vecPushData.begin(); + QMap>::Iterator iter = mapWaveData.begin(); + for (; iter != mapWaveData.end(); iter ++) + { + if(!strIDList.contains(iter.key())) + strIDList.push_back(iter.key()); + strChannleType.push_back(iter.value()[0].sensorType); + strChannleNameList.push_back(iter.value()[0].channelName); + } + if(mapWaveData.size() > 8) + pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); + else + pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); + + ui->tabWidget->setCurrentWidget(pChild); +} void MainWidget::View3D() { /* Child3DFrom *pChild = new Child3DFrom(this); @@ -1776,7 +1880,7 @@ void MainWidget::Dat2Csv() MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } - QString dirpath = QFileDialog::getExistingDirectory(this, QStringLiteral("选择目录"), "./", QFileDialog::ShowDirsOnly); + QString dirpath = QFileDialog::getExistingDirectory(this, QStringLiteral("请选择保存CSV文件路径"), "./", QFileDialog::ShowDirsOnly); if(dirpath.isEmpty()) return; if(mapWaveData.size() < 1){ @@ -1816,7 +1920,8 @@ void MainWidget::Dat2Csv() } QDateTime time = QDateTime::fromTime_t(m_strCollectTime.toUInt()); QString DevicemCollectTime = time.toString("yyyy-MM-dd_hhmmss"); - QString filename = QString(dirName + "%1-%2-%3.csv").arg(iter.key()).arg(iter.value().at(0).sensorType).arg(DevicemCollectTime); + QString filename = QString(dirName + "%1-%2-%3-%4.csv").arg(iter.key()).arg(iter.value().at(0).sensorType)\ + .arg(iter.value().at(0).SamleRate).arg(DevicemCollectTime); QFile file(filename); qDebug()<< "filename = "<sensorType == "TACHOMETER"){ wave.TimeStamp = m_WaveChnData[i].TimeStamp; - qDebug()<< "iCount" <modelBtn_TimeWave->setEnabled(false); + ui->modelBtn_TimeWave->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/wave-p.png) 1; }\ + QPushButton:hover { border-image:url(:/images/images/imgDatamodel/wave-h.png) 1; }\ + QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/wave-p.png) 1; }\ + QPushButton:checked {border-image:url(:/images/images/imgDatamodel/wave-p.png) 1; }"); }else{ ui->modelBtn_TrendChart->setEnabled(true); ui->modelBtn_TrendChart->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M1.png) 1; }\ @@ -2898,6 +3010,12 @@ void MainWidget::EnableGraph(bool isOpen) QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M8-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M8-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M8-p.png) 1; }"); + + ui->modelBtn_TimeWave->setEnabled(true); + ui->modelBtn_TimeWave->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/wave.png) 1; }\ + QPushButton:hover { border-image:url(:/images/images/imgDatamodel/wave-h.png) 1; }\ + QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/wave-p.png) 1; }\ + QPushButton:checked {border-image:url(:/images/images/imgDatamodel/wave-p.png) 1; }"); } // ui->modelBtn_11->setEnabled(true); diff --git a/ChaosDataPlayer/MainWidget.h b/ChaosDataPlayer/MainWidget.h index 790cf47..01a3aeb 100644 --- a/ChaosDataPlayer/MainWidget.h +++ b/ChaosDataPlayer/MainWidget.h @@ -56,6 +56,7 @@ public slots: void PolarplotSlot(); void BodePlotSlot(); void ShaftCenterlinePlotSlot(); + void TimeWave(); void OutSlot(); void ReturnSlot(); void View3D(); diff --git a/ChaosDataPlayer/MainWidget.ui b/ChaosDataPlayer/MainWidget.ui index 0824d54..8fa9d15 100644 --- a/ChaosDataPlayer/MainWidget.ui +++ b/ChaosDataPlayer/MainWidget.ui @@ -79,6 +79,7 @@ #modelBtn_TrendChart{border-image:url(:/images/images/imgDatamodel/M1-p.png);} #modelBtn_TimeDomain{border-image:url(:/images/images/imgDatamodel/M2-p.png);} +#modelBtn_TimeWave{border-image:url(:/images/images/imgDatamodel/wave-p.png);} #modelBtn_FrequencyDomain{border-image:url(:/images/images/imgDatamodel/M3-p.png);} #modelBtn_4{border-image:url(:/images/images/imgDatamodel/M4-p.png);} #modelBtn_5{border-image:url(:/images/images/imgDatamodel/M5-p.png);} @@ -92,6 +93,7 @@ #modelBtn_TrendChart:hover{border-image:url(:/images/images/imgDatamodel/M1-h.png);} #modelBtn_TimeDomain:hover{border-image:url(:/images/images/imgDatamodel/M2-h.png);} +#modelBtn_TimeWave:hover{border-image:url(:/images/images/imgDatamodel/wave-h.png);} #modelBtn_FrequencyDomain:hover{border-image:url(:/images/images/imgDatamodel/M3-h.png);} #modelBtn_4:hover{border-image:url(:/images/images/imgDatamodel/M4-h.png);} #modelBtn_5:hover{border-image:url(:/images/images/imgDatamodel/M5-h.png);} @@ -105,6 +107,7 @@ #modelBtn_TrendChart:pressed{border-image:url(:/images/images/imgDatamodel/M1-p.png);} #modelBtn_TimeDomain:pressed{border-image:url(:/images/images/imgDatamodel/M2-p.png);} +#modelBtn_TimeWave:pressed{border-image:url(:/images/images/imgDatamodel/wave-p.png);} #modelBtn_FrequencyDomain:pressed{border-image:url(:/images/images/imgDatamodel/M3-p.png);} #modelBtn_4:pressed{border-image:url(:/images/images/imgDatamodel/M4-p.png);} #modelBtn_5:pressed{border-image:url(:/images/images/imgDatamodel/M5-p.png);} @@ -289,28 +292,6 @@ - - - - - 18 - 18 - - - - - 18 - 18 - - - - 退出当前DAT文件 - - - - - - @@ -333,6 +314,28 @@ + + + + + 18 + 18 + + + + + 18 + 18 + + + + 退出当前DAT文件 + + + + + + @@ -668,6 +671,31 @@ + + + + false + + + + 36 + 36 + + + + + 36 + 36 + + + + 时域长波形 + + + + + + diff --git a/ChaosDataPlayer/SetScalesForm.ui b/ChaosDataPlayer/SetScalesForm.ui index f03ec33..49a5bf3 100644 --- a/ChaosDataPlayer/SetScalesForm.ui +++ b/ChaosDataPlayer/SetScalesForm.ui @@ -25,9 +25,9 @@ - 170 + 150 50 - 51 + 91 31 @@ -41,7 +41,7 @@ text-align:center; - 113 + 93 50 31 31 @@ -54,9 +54,9 @@ text-align:center; - 300 + 280 50 - 51 + 91 31 @@ -70,10 +70,10 @@ text-align:center; - 240 + 250 60 - 54 - 12 + 21 + 16 @@ -83,9 +83,9 @@ text-align:center; - 170 + 150 100 - 51 + 91 31 @@ -99,7 +99,7 @@ text-align:center; - 113 + 93 100 31 31 @@ -112,9 +112,9 @@ text-align:center; - 300 + 280 100 - 51 + 91 31 @@ -128,10 +128,10 @@ text-align:center; - 240 + 250 110 - 54 - 12 + 21 + 16 diff --git a/ChaosDataPlayer/SetScalesform.cpp b/ChaosDataPlayer/SetScalesform.cpp index ec8c965..6c5feac 100644 --- a/ChaosDataPlayer/SetScalesform.cpp +++ b/ChaosDataPlayer/SetScalesform.cpp @@ -3,7 +3,7 @@ #include "QMessageBox" #include -SetScalesForm::SetScalesForm(QWidget *parent) : +SetScalesForm::SetScalesForm(QString m_strSacles,QWidget *parent) : BaseWgt(parent), ui(new Ui::SetScalesForm) { @@ -18,6 +18,11 @@ SetScalesForm::SetScalesForm(QWidget *parent) : ui->lineEdit_2->setValidator(validator); ui->lineEdit_3->setValidator(validator); ui->lineEdit_4->setValidator(validator); + QStringList strList = m_strSacles.split(","); + ui->lineEdit->setText(strList[0]); + ui->lineEdit_2->setText(strList[1]); + ui->lineEdit_3->setText(strList[2]); + ui->lineEdit_4->setText(strList[3]); } SetScalesForm::~SetScalesForm() diff --git a/ChaosDataPlayer/SetScalesform.h b/ChaosDataPlayer/SetScalesform.h index b8b727f..155a8a0 100644 --- a/ChaosDataPlayer/SetScalesform.h +++ b/ChaosDataPlayer/SetScalesform.h @@ -15,7 +15,7 @@ class SetScalesForm : public BaseWgt Q_OBJECT public: - explicit SetScalesForm(QWidget *parent = nullptr); + explicit SetScalesForm(QString m_strSacles,QWidget *parent = nullptr); ~SetScalesForm(); private: Ui::SetScalesForm *ui; diff --git a/ChaosDataPlayer/global.h b/ChaosDataPlayer/global.h index 80fdf62..c5df306 100644 --- a/ChaosDataPlayer/global.h +++ b/ChaosDataPlayer/global.h @@ -124,8 +124,8 @@ typedef struct{ double sensorSensitivity; int iTrigger; int iKeyCount; - int iTriggerValue; - int iHysteresis; + double iTriggerValue; + double iHysteresis; }WAVE_INFO; typedef struct tag_DEVICE_INFO{ diff --git a/ChaosDataPlayer/images/B7-h.png b/ChaosDataPlayer/images/B7-h.png new file mode 100644 index 0000000000000000000000000000000000000000..950623a3a483230bf6d8e4a72f17d6e2354975ad GIT binary patch literal 381 zcmV-@0fPRCP)TUr6-Pb`+H;C+os(!Z4F`x+CC3Oe5e$ zhGLb730^8VS>>*%VUE+8itzR{qZf?R>0A{NXbM8#L%0(hrH`3WGgF8KjfEoaDX%{Y zS9OB1&H5LVlH|>Aefqr27xM;~Os1PqB#@_d{_1Mz7{}%eytmol01Rs30oay>+x-c) zjw87A%>vDK`R2+~s}A5*V_wuxZ|yW`102~bGDf0Mq+-fd;kKRNf2=A@N4cb#BjvmuSdHK>3E(1)0ael`FVkh2Crd;74yv3Kx=%HOelJC1KCbic|M bt-t0Q{$$hMxF?(b00000NkvXXu0mjfDTt>1 literal 0 HcmV?d00001 diff --git a/ChaosDataPlayer/images/B7.png b/ChaosDataPlayer/images/B7.png new file mode 100644 index 0000000000000000000000000000000000000000..2c50189e454ccbd4e8ca17553baaac0303f02a32 GIT binary patch literal 384 zcmV-`0e}99P)_ zSuJl4A#4b67PqZFEG|E_I>+hvb-nI+BjLjLfCq#!M~*6SLFl(@Zk{bmxcFSD$fy82 z1rsGoPtX97Qu$Dh)oh(*#R{)xZNKRbIE{QGvGr$;6qt1`-7**ak5y4(3qpPX z7CsPRux+SREt;yda>4N3S2ZEn#>|4ClqpKXKzlny^500004b3#c}2nYxW zd0 z`Ms!stV8@KPsPF1HnvI=jAff`Lqi|{eAfLGa&o637S!0NJo#) z3`JdmTBE_*rq0kL2R2D&cy|I-7fiHxF3f@A#8_!BebYG4kI3qkzur2K$V4HV4YY~QDwxy zo7ZQD5qp7)83s3WH!=R@6EDnFnnqKb8AES-iLioZ#KO?I*TA-$@u9beH;lVYMI~hz zvs&bb;S%ai%~(cjbIwxRln19q_oESYC1xq7500004b3#c}2nYxW zdr28=7{;H?rQp)C=A{TkGchP4l7i^(??Vt&R+^F~g_?8D z+th{Am|!1l$8GB9!rssCInVDr?}bAF^a#HsC>180IQ(&(VkQL}Mym|AGoin6rwnJN=S(TK(Ov9`W}hA6=8W+6!( zJm=C&0Wt-1c$7pTpGBwL`VtR>wz0VxK>FckVIadWp{*TM-^*yX8s9_%!ELx%7BBhS zLO_OKUJ5z*{Xt|i_e8Pe*#)kzE-@Mn=LRwa!&ggC1`5ihSE5ifmVi*JqS>fh2Xk_I zfquUSx!*;v*Ch(EtY_>>w<{5I7-j{P(i>#CubHFkj0&T^R+f7h4#_2OvmQ_sW^QWE zA42Bgc77P68`!tOVb$ZsYca3+YKCDD-P=btogzA?>x@wthH+vyp1{-Nou-&~-3OnK zL$N@fxTV3U1mQ>w&4xH$h|>|-jYFvMXf;LaotY@?B@Q6g1&DPX%3uJe(=~>y3;cN6 zX2nvSnFy)k92bNnwLv=^s8-6T@fF>Xw*+RQO4Ibr37n?06h_yIsRSG5e|*Tz)_swD r-JV(Ga500004b3#c}2nYxW zdnD}uEaUCLZ)fv zT!uMa?F^6Z-l2JJBN#HHj=@#vVG9{Hb`AzX5fO$DZ{ITf{PCS?(MM7=v9Pi-L}%wQ zXz1%RTswb`K~h$p;pv0>3`?g@qKbn^a!hGgFT>h-a~SU3xDL16+RcN(z}$jiYI6g{ z4kFqyc3$2L$M^1GxO?p?hNV_6ZVZxga$tv20*G?Vy7_Y%jBIQe=Jj;pw5x62B8Iy3 zWQIS#f0OMVq8xK#-(H3v-@h{K+q4mS_c1E(c&0YS%reEjCc3x>BZUogCQ z@))N*aw;ke|Ns7HczpjZPBlDyd<^@xY+`u-`ZZQHL^rHc%2U%h1b{p%M_i)59R z8JHNE7#`lajZ=-Oy#vG4rh4)nLu?7GYi7ERLtr1^kYfP)Q4s!j2;0#Yo+ zPM#qgKv2Vx(gEau_H=O!(FlGzd2it%2Z7f6haIxY8>|~n3pRTxFf3ihJl%n_B*DX# zVO@iCU65Z$!%K&aj&aX& z<2V-Rz4wRPj>2=2Y_H7>`FFj1p=Bj;=*h0hrysu0>vx@ZwmV()ous~*<_Y^ofj#2? z`l^NJFjzgD7g@RTPZ7}j44$rjF6*2Un$CWIbpsU4=a^Z}F)RF?_-;`HD41I}zns37 za4_=&P2vX!v-P#9UO*07Ff+D7g1L9HZ_sTA0k`;M>*xn8FW53}1S%Z0W89DsbMqi) zk{`nyhGOPTUWsCbehG~WZWtCcS*UZoK5`+1`^hBV&Qm(oziR&)-{&w*pU`f%;g#_9 zm8U1ZI{HBE$lCoqhwoPZ4F2)R>Pv_vqhIZ#s?Z-c z{O(Nc8tH4*`F!rUaP43bt)0Mnb2Ha_Epy2zb+re<+v5-1&v(8u;{*4X@@%ETl~Jvy z!%ol8vc7wT_i3(S{OJQVi_XRz>$*An52I1^l7o^NPbP28NUNOMdiKcrLjsAXU3kMD zTvA{6*S=t**oD|?)qMPwCV*<&Aj_}yH9ob-z}Oe`O0e2%imhR?Ml<-IcIcM zs4e*OW##R;3SQ0U_H;ipvt>$}U2a}@bG7HE3tANv{_=b2-glMC4-b8BU~e&U@6#%De6c+{Z=SCAjvp~A zPpn|DW))WT^1r|^F?dSd@^{BHbrPS1F4%ehBFp3x{H#(M$t}lq=5YJn|C2k(Kwt}d zk}~Uk^&PXh#h*8w*WdRiG>I){xtQp?-KOSu7!RMgJtul1NBLWAb1%i!+GqF=Ea#8c z%w4hM(51H2)i1;9n~u*@u1-Jg6j}Byvk0N1%5`Tzg` diff --git a/ChaosDataPlayer/images/imgDatamodel/wave-h.png b/ChaosDataPlayer/images/imgDatamodel/wave-h.png new file mode 100644 index 0000000000000000000000000000000000000000..b0be3d504aea5ccb058b0762eaca83d4fb48270c GIT binary patch literal 689 zcmV;i0#5yjP)L{0maPeB8j2+ahr=PAJ2*XTJ=ue>UDS)> zNx{4R75)k0Ne|wHdD3~&og6)Er+FFOVOYkXV}hj;(p{F0f_$Ik4L#KS=&I=s>v9YBC`sZtD4 z1{9?XC`zF~GqbaJ_~hy20HvXG0WpImt2|cjsZnpNt*qkK(z5h7zkb2~UL#$gg`11m z-u#BVrlDG^jSVQWWVu`pEB7CWxd{QkR0P>?Gz7#bm_g|@O~~qWmn#Xagg_EumWQ{Plm#dOB!j24N7K>6c2I#bZ$ymV;{5O@#mH;wyEGzu1?S9{p zb6yWqsHvx?^T7kz;G0=xiEmEjH606!p1(XlS#q5v()86>FQOC*bavK5&vk>^vwwv_ zG+q3o#x-4&u>i_6z0#OopZBRU(~BbmIkqjO`ut%{&biW9K7#N_U%~eXy~BXa4(F@6 z%nUQQvHmeuh7#@6e7j*gbEn-F5SEn?YK)LtbampU|%BSyVtLhJU%%PgS~(IM*1}MppukjY(T?6 z#;xoxY?LMrDAYsTQ;u6}|BogsSqx=BQJTzE#*an(K9i=%pn&TAe*c=?@qV#W6;S^J XL0RPg3{R!500000NkvXXu0mjfU3o|E literal 0 HcmV?d00001 diff --git a/ChaosDataPlayer/images/imgDatamodel/wave-p.png b/ChaosDataPlayer/images/imgDatamodel/wave-p.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e45dafd5f590ebd48bac29d7dd03cf86f4fe96 GIT binary patch literal 661 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 Z|KDgR$-=_@#}m}Q*7tApFZs{vzW_w{5ugA7 diff --git a/ChaosDataPlayer/images/加载条.gif/__MACOSX/._加载条.gif b/ChaosDataPlayer/images/加载条.gif/__MACOSX/._加载条.gif deleted file mode 100644 index 2e91f3e6fe5d9e8edebb3be0c37bf76a4124bdb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 284 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 c@?5u@@Ld1PIsboVqd))>d@2%}?S%wcDS*{rvUo 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

ct-~v zc$#fkgL`6}ar5=0IJ<#jS3y)H{1R@f$K#Bj4AIN>bd(f9RIb?h)_&8`@tY{AtubRC z6@;**PlcA^7})jPppU>Ecb$Y>Z&fs$*GR&yELXa++{co$SJ5xO-mK+0pYziP^61m| z?n}Tg4k4j%-*!b_7KE4m9hp0nwURU=`l69A{`;Ch%KxGulliyRYo$XmKPa0v4t6^g z?f~LIkR_KMWwHkQPfeFF3mo!)0f!|$G*SEwj!+o3FM}U8M-#HU-1DcVOOcgjgR-QD z?YNz8tDE~}Icz|hvPW*Pq=!HB(lLoF>7mHHG(9tuVtJLry5^lD5TsdbUC=c+_N>CW zrVLDLsBo%216BHFEkL^yhahAxD@j*OH%ZFMoSZ(vn-r(NcJ8z!ar3n&5yE~HVWswx zWzU4>x;`bPG|=Ej3SE0~00wO9Y}6JCS{kH4&g50R-0l?3S^o4>tToC}KPOejZRV@` ztAXl>&2jGwEW?(gjZ8W&(6qfMg+Zv#tcJMtkfFa6ueDzs;Lq_w^cu(9U7Vim(cOz3 zV>T^I^>k&NxlU-A$DQ|bekM)7esT9J(o?rGZr}M1Q9~-XU}Kbz>!oieJcM$xE9U)()7>OKd*>7%eS~+S2Z+lV3t-ME6egsovm9qm0I0}G@u7b~a>^_0 z7&-?gO%T<3o%e<%Ms0qc2B4;lW~2AiMrzzr1VkW5Qrk(RLl2BDC0~6XaU)0(TIRY?S;Z zR&UH+HW^++0$*Og_mSXx)42}cqUv^sK2?N6<%zbULyNa6JF zKu|m@SX3}XyCo2xb>->Q(9H@Si23iR<)kdBj%B;_h8tB}j)3=?3z(IaEUjzb4Xc5i zB)n|I>bc($A@@e34@xYp>p~t1@oETdxj>xmU^+U(X%A~yT360%X|axnugAGa1;Ghc zl(LZm)8WDb!Md)-La4nnr~3}9C)I0A;%NKYVq)-J!itJHWrfjKa^$@JcO928rhEC^ zj0r<@xcfd!>&mUp|Dn+xIyXP!a|SF)9~{2>2pw+RH1q}OrAoDl{SLsJNl`E3$g}5i z#3c#*d$2X^g+I^(ju)BGu4&|UFxokq`<&1$a+gypmmdu3cG>?kcy0djXjj->7ZIWI z*+A5G55rZgwp`kuhnH_k27IzvBn9ce=6LOZ+@NzB6Dp8|zrK@_if>?)FWoF`QCM(Q z-~I?nNG+(L+;q;l_42sOvr?A%+tKMa5)>K~xZyi_l21@lVt2{Nu3Bf==tSe;`vpmG z*)n`;0FapL4nMc1U?HFsU>AJvf!rNIUxl@M`EYHa;?xE*%_x3n7j`qa>ec!~Wjow! zFtvYAG#m?GVAR@u=LGz3*5r{`T2wq{M zzSW3%k41wSDWcnu3|45Rc`e}%3*NLl0!{zVTGvOXx}j!KxGrw+Ph8i1oNV{ zj9Tr0k@EQa>Oqrtnu$X?x+!(WQC|^t&;5|S-EC5-r$3DP-HH2bWTcDKm^`W0sBJ6+ zK@UQYN!tqdiBnmBPI)@3VsFA`^3q0QjM=O1JO_@d`f7CSv3Qeb1UKKH(d=7IA>c43 zvN`Z;?Rz^T31W$B zn9ygi$q?~yC3&K0R+n;GwP`Wlf1o`+?N~~;6zC0@?XX7_)vBPv^M2)df#QHL<$rGP TSW0;S#Cib;DDZ{l$PWB}c3{&1 diff --git a/ChaosDataPlayer/qrc.qrc b/ChaosDataPlayer/qrc.qrc index 0360cd9..ac454bc 100644 --- a/ChaosDataPlayer/qrc.qrc +++ b/ChaosDataPlayer/qrc.qrc @@ -175,6 +175,9 @@ images/imgModelAction/realTime-d.png images/logo1.png images/loading.gif + images/imgDatamodel/wave.png + images/imgDatamodel/wave-h.png + images/imgDatamodel/wave-p.png mainui.css