diff --git a/src/translations/Dyt_zh_CN.ts b/src/translations/Dyt_zh_CN.ts index b1ba8005..b0e5580f 100644 --- a/src/translations/Dyt_zh_CN.ts +++ b/src/translations/Dyt_zh_CN.ts @@ -515,12 +515,12 @@ - + 2D Curve - + 2D(y(lg)) Curve @@ -724,11 +724,6 @@ ModelTreeWidget - - - Release Track - - Add boke Entity @@ -759,6 +754,11 @@ Add satellite Entity + + + Release Track + + Track @@ -1864,7 +1864,7 @@ - + %1 -- %2 @@ -1989,13 +1989,18 @@ - + save spaceWork directory - - select commond file directory + + select command xml file + + + + + XML files (*.xml);;All files (*.*) diff --git a/src/ui/Layout/SignalIndicatorLampUI.cpp b/src/ui/Layout/SignalIndicatorLampUI.cpp index 06185846..91756a75 100644 --- a/src/ui/Layout/SignalIndicatorLampUI.cpp +++ b/src/ui/Layout/SignalIndicatorLampUI.cpp @@ -1,4 +1,4 @@ -#include "SignalIndicatorLampUI.h" +#include "SignalIndicatorLampUI.h" #include #include @@ -37,215 +37,130 @@ void SignalIndicatorLampUI::AttachDock(DockWidget* dockWidget) return; } - if (nullptr != dockWidget) { - m_titleText = dockWidget->windowTitle(); - } - dockWidget->SetDockWidgetTitleBar(nullptr); dockWidget->setWidget(this); DockTitleBar* dockTitleBar = new DockTitleBar; m_pDockTitleBar = dockTitleBar; - if (m_titleText.isEmpty()) { - dockTitleBar->SetTitle(tr("Signal Indicator Lamp")); - } else { - dockTitleBar->SetTitle(m_titleText); - } - dockWidget->SetDockWidgetTitleBar(dockTitleBar); } -void SignalIndicatorLampUI::InitIndicatorLamp(QStringList& lamps, LayoutType type, int nColCount) +void SignalIndicatorLampUI::updateTitle(const QString & title) { - QGridLayout* pMainLyt = new QGridLayout(this); - - int nColIndex = 0; - int nRowIndex = 0; - - for (auto i = 0; i < lamps.size(); ++i) + if (nullptr != m_pDockTitleBar) { - SignalLabel* pLampLab = new SignalLabel; - pLampLab->setFixedSize(24, 24); - pLampLab->setStyleSheet("QLabel{background-color: rgb(255, 0, 0);border-radius: 10px;}; "); - m_listLampPtr.push_back(pLampLab); - - QLabel* pTextLab = new QLabel; - pTextLab->setText(lamps[i]); - - QHBoxLayout* pLyt = new QHBoxLayout; - pLyt->addWidget(pLampLab); - pLyt->addWidget(pTextLab); - - switch (type) - { - case SignalIndicatorLampUI::HLyt: - { - pMainLyt->addLayout(pLyt, 0, i); - } - break; - case SignalIndicatorLampUI::VLyt: - { - pMainLyt->addLayout(pLyt, i, 0); - } - break; - case SignalIndicatorLampUI::GLyt: - { - pMainLyt->addLayout(pLyt, nRowIndex, nColIndex); - nColIndex++; - - if (nColIndex >= nColCount) - { - nRowIndex++; - nColIndex = 0; - } - } - break; - default: - break; - } + m_pDockTitleBar->SetTitle(title); } } -void SignalIndicatorLampUI::SetLampState(std::vector vecStatus) +void SignalIndicatorLampUI::updateParseFile(const QString & strFile, int nT, QVariantList listCurve) { - int nIndexCount = 0; - if (m_listLampPtr.size() >= vecStatus.size()) - { - nIndexCount = vecStatus.size(); - } - else - { - nIndexCount = m_listLampPtr.size(); - } - - for (auto i = 0; i < nIndexCount; ++i) - { - QLabel* pLampLab = m_listLampPtr[i]; - if (1 == vecStatus[i]) - { - pLampLab->setStyleSheet("QLabel{background-color: rgb(0, 255, 0);border-radius: 10px;}; "); - } - else - { - pLampLab->setStyleSheet("QLabel{background-color: rgb(255, 0, 0);border-radius: 10px;}; "); - } - } -} - -void SignalIndicatorLampUI::UpdateIndicatorLamp(QStringList& lamps, LayoutType type, int nColCount) -{ - QGridLayout* pMainLyt = (QGridLayout*)this->layout(); - if (pMainLyt) - { - QList listChild = pMainLyt->children(); - for (size_t i = 0; i < listChild.size(); i++) - { - pMainLyt->removeWidget((QWidget*)listChild[i]); - } - } - - int nColIndex = 0; - int nRowIndex = 0; - - for (auto i = 0; i < lamps.size(); ++i) - { - SignalLabel* pLampLab = new SignalLabel; - pLampLab->setFixedSize(24, 24); - pLampLab->setStyleSheet("QLabel{background-color: rgb(255, 0, 0);border-radius: 10px;}; "); - m_listLampPtr.push_back(pLampLab); - - QLabel* pTextLab = new QLabel; - pTextLab->setText(lamps[i]); - - QHBoxLayout* pLyt = new QHBoxLayout; - pLyt->addWidget(pLampLab); - pLyt->addWidget(pTextLab); - - switch (type) - { - case SignalIndicatorLampUI::HLyt: - { - pMainLyt->addLayout(pLyt, 0, i); - } - break; - case SignalIndicatorLampUI::VLyt: - { - pMainLyt->addLayout(pLyt, i, 0); - } - break; - case SignalIndicatorLampUI::GLyt: - { - pMainLyt->addLayout(pLyt, nRowIndex, nColIndex); - nColIndex++; - - if (nColIndex >= nColCount) - { - nRowIndex++; - nColIndex = 0; - } - } - break; - default: - break; - } - } -} - -void SignalIndicatorLampUI::InitLamp(const QString& strFile) -{ - bool bRet = ParseLamp(strFile); - if (nullptr != m_pDockTitleBar && bRet) { - QFileInfo fileInfo(strFile); - m_pDockTitleBar->SetTitle(tr("%1 -- %2").arg(m_titleText).arg(fileInfo.fileName())); - } - - QStringList listLamp; - for (size_t i = 0; i < m_iLampCount; i++) - { - listLamp <= m_lampStatus.size()) + QFile file(strFile); + if (file.open(QIODevice::ReadOnly)) { - return; + QGridLayout* pMainLyt = new QGridLayout(this); + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + QString strName = mapCurve.value("Name").toString(); + QStringList lamps = strName.split(","); + + for (auto i = 0; i < lamps.size(); ++i) + { + SignalLabel* pLampLab = new SignalLabel; + pLampLab->setFixedSize(24, 24); + + QString strStyle = m_lampColor.value(0); + pLampLab->setStyleSheet(strStyle); + + QLabel* pTextLab = new QLabel; + pTextLab->setText(lamps[i]); + + QHBoxLayout* pLyt = new QHBoxLayout; + pLyt->addWidget(pLampLab); + pLyt->addWidget(pTextLab); + + pMainLyt->addLayout(pLyt, nI, i); + + QString strKey = QString::number(nI) + "-" + QString::number(i); + m_mapLamp.insert(strKey, pLampLab); + } + } + + while (!file.atEnd()) + { + QString strLine = file.readLine().simplified(); + if (!strLine.isEmpty()) + { + QStringList listLine = strLine.split(" "); + double t = listLine.at(nT).toDouble(); + + QVariantMap mapData; + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + QString strData = mapCurve.value("Data").toString(); + QStringList lamps = strData.split(","); + + for (int nJ = 0; nJ < lamps.size(); ++nJ) + { + int nIndex = lamps.at(nJ).toInt(); + QString nState = listLine.at(nIndex); + QString strKey = QString::number(nI) + "-" + QString::number(nJ); + mapData.insert(strKey, nState); + } + } + m_dataLamp.insert(t, mapData); + } + } + + file.close(); } - - std::vector vecStatus; - for (size_t i = 0; i < m_iLampCount; i++) - { - vecStatus.push_back(0); - } - - int iStatus = m_lampStatus[dTime - 1]; - vecStatus[iStatus-1] = 1; - - SetLampState(vecStatus); } -void SignalIndicatorLampUI::onStatusChanged(int status) { - if ((status) >= m_lampStatus.size()) { - return; - } +void SignalIndicatorLampUI::updateLampColor(const QString & strOpenColor, const QString & strCloseColor) +{ + { + QString strStyle = "QLabel{background-color: rgb(" + strCloseColor + ");border-radius: 10px;}; "; + m_lampColor.insert(0, strStyle); + } + { + QString strStyle = "QLabel{background-color: rgb(" + strOpenColor + ");border-radius: 10px;}; "; + m_lampColor.insert(1, strStyle); + } +} - std::vector vecStatus; - for (size_t i = 0; i < m_iLampCount; i++) { - vecStatus.push_back(0); - } +void SignalIndicatorLampUI::slotUpdateTime(double t) +{ + if (m_dataLamp.size() > 0) + { + QMap< double, QVariantMap >::const_iterator ite = m_dataLamp.lowerBound(t); + if (ite == m_dataLamp.end()) + { + ite--; + } - vecStatus[status - 1] = 1; + QVariantMap mapData = ite.value(); + for (QVariantMap::Iterator it = mapData.begin(); it != mapData.end(); it++) + { + QString strKey = it.key(); + int nState = it.value().toFloat(); - SetLampState(vecStatus); + SignalLabel* pLampLab = m_mapLamp.value(strKey); + if (pLampLab) + { + QString strStyle = m_lampColor.value(nState); + pLampLab->setStyleSheet(strStyle); + } + } + } } void SignalIndicatorLampUI::OnWorkSpaceChanged(WorkSpace* worksapce) { @@ -255,12 +170,6 @@ void SignalIndicatorLampUI::OnWorkSpaceChanged(WorkSpace* worksapce) { } connect(worksapce, &WorkSpace::TimestepChanged, this, &SignalIndicatorLampUI::OnTimestepChanged); - auto lamp = worksapce->GetLampStatus(); - if (nullptr != lamp) { - InitLamp(lamp->GetPath()); - } - // Initialize the lamp with the current workspace's lamp file - } void SignalIndicatorLampUI::OnTimestepChanged(Timestep* timestep) { @@ -283,37 +192,3 @@ void SignalIndicatorLampUI::paintEvent(QPaintEvent* event) painter.drawRect(QRect(5,5,rect().width() - 10, rect().height() - 10)); } - -bool SignalIndicatorLampUI::ParseLamp(const QString& strFile) -{ - if (strFile.isEmpty()) - { - QMessageBox::information(nullptr, QString::fromLocal8Bit("��ʾ"), QString::fromLocal8Bit("��������Lamp�ļ�·����")); - return false; - } - - m_lampStatus.clear(); - - QFile file(strFile); - if (file.open(QIODevice::ReadOnly)) - { - while (!file.atEnd()) - { - QString strLine = file.readLine().simplified(); - if (!strLine.isEmpty()) - { - int iLamp = (int)strLine.toDouble(); - m_lampStatus.push_back(iLamp); - - if (m_iLampCount < iLamp) - { - m_iLampCount = iLamp; - } - } - } - - file.close(); - } - - return true; -} diff --git a/src/ui/Layout/SignalIndicatorLampUI.h b/src/ui/Layout/SignalIndicatorLampUI.h index aea971c8..8e061137 100644 --- a/src/ui/Layout/SignalIndicatorLampUI.h +++ b/src/ui/Layout/SignalIndicatorLampUI.h @@ -13,45 +13,29 @@ class SignalIndicatorLampUI : public QWidget Q_OBJECT public: - enum LayoutType // �źŵƲ������� - { - HLyt, // ˮƽ - VLyt, // ��ֱ - GLyt, // ���� - }; - SignalIndicatorLampUI( QWidget *parent = Q_NULLPTR); ~SignalIndicatorLampUI(); void AttachDock(class DockWidget* dockWidget); - void InitIndicatorLamp(QStringList &lamps, LayoutType type, int nColCount = 4); - - void SetLampState(std::vector vecStatus); - - void UpdateIndicatorLamp(QStringList& lamps, LayoutType type, int nColCount = 4); - - void InitLamp(const QString& strFile); + void updateTitle(const QString& title); + void updateParseFile(const QString& strFile, int nT, QVariantList listCurve); + void updateLampColor(const QString& strOpenColor, const QString& strCloseColor); protected slots: - void slotUpdateTime(double dTime); - void onStatusChanged(int status); + void slotUpdateTime(double t); void OnWorkSpaceChanged(class WorkSpace*); void OnTimestepChanged(class Timestep*); protected: void paintEvent(QPaintEvent* event); - bool ParseLamp(const QString& strFile); - private: Ui::SignalIndicatorLampUI ui; - QList m_listLampPtr; - - QList m_lampStatus; - int m_iLampCount = 0; - - QString m_titleText; class DockTitleBar* m_pDockTitleBar { nullptr }; + + QMap m_lampColor; + QMap m_mapLamp; + QMap< double, QVariantMap > m_dataLamp; }; diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index de1bfdec..95a34c94 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -116,24 +116,24 @@ void MainWindow::InitUI() { DockWidget* fitCurveDock = new DockWidget(tr("Wave Curve"), 0); fitCurveDock->SetDockWidgetTitleBar(new DockTitleBar(fitCurveDock)); fitCurveDock->setObjectName("Dock.WaveCurveDialog"); - fitCurveDlg_ = new FitCurveDialog(1); + fitCurveDlg_ = new FitCurveDialog(); fitCurveDlg_->AttachDock(fitCurveDock); m_mapDockWidget.insert("WaveCurveDialog", fitCurveDock); addDockWidget(Qt::BottomDockWidgetArea, fitCurveDock); - fitCurveDlg_->InitWaveFile(wavePath); + //fitCurveDlg_->InitWaveFile(wavePath); DockWidget* fitLgCurveDock = new DockWidget(tr("Speed Curve"), 0); fitLgCurveDock->SetDockWidgetTitleBar(new DockTitleBar(fitLgCurveDock)); fitLgCurveDock->setObjectName("Dock.SpeedCurveDialog"); - fitYLgCurveDlg_ = new FitCurveDialog(1); + fitYLgCurveDlg_ = new FitCurveDialog(); fitYLgCurveDlg_->AttachDock(fitLgCurveDock); m_mapDockWidget.insert("SpeedCurveDialog", fitLgCurveDock); addDockWidget(Qt::BottomDockWidgetArea, fitLgCurveDock); tabifyDockWidget(fitCurveDock, fitLgCurveDock); - fitYLgCurveDlg_->InitReportFile(speedPath); + //fitYLgCurveDlg_->InitReportFile(speedPath); DockWidget* surfaceCurveDock = new DockWidget(tr("3D Curve"), 0); surfaceCurveDock->SetDockWidgetTitleBar(new DockTitleBar(surfaceCurveDock)); @@ -145,7 +145,7 @@ void MainWindow::InitUI() { addDockWidget(Qt::BottomDockWidgetArea, surfaceCurveDock); tabifyDockWidget(fitCurveDock, surfaceCurveDock); - surfaceDlg_->InitRD(rdPath); + //surfaceDlg_->InitRD(rdPath); { targetUITable_ = new TargetListWgt; @@ -162,7 +162,7 @@ void MainWindow::InitUI() { targetUITable_->SetHeader(headerLabels); //const QString reportPath = RecourceHelper::Get().GetBasePath() + "/workspace/Report.txt"; - targetUITable_->InitFile(speedPath, 50); + //targetUITable_->InitFile(speedPath, 50); DockWidget* dataTableDock = new DockWidget(tr("Report Table"), 0); dataTableDock->SetDockWidgetTitleBar(new DockTitleBar(dataTableDock)); @@ -182,7 +182,7 @@ void MainWindow::InitUI() { signalIndicatorLampDock->setObjectName("Dock.SignalIndicatorLampUI"); signalIndicatorLampUI_ = new SignalIndicatorLampUI; signalIndicatorLampUI_->AttachDock(signalIndicatorLampDock); - signalIndicatorLampUI_->InitLamp(lampPath); + //signalIndicatorLampUI_->InitLamp(lampPath); m_mapDockWidget.insert("SignalIndicatorLampUI", signalIndicatorLampDock); addDockWidget(Qt::BottomDockWidgetArea, signalIndicatorLampDock); @@ -214,6 +214,8 @@ void MainWindow::InitUI() { // Restore previous UI layout if available UiLayoutManager::Restore(this, 1); + InitChartLayout(); + //ui->viewWidget->layout()->addWidget(qtOsgViewWidget_); qtOsgViewWidget_->LoadDefaultScene(); /*OsgViewer::Get().Initialize(); @@ -256,8 +258,149 @@ void MainWindow::slotResetWorkSpace() } } - fitCurveDlg_->InitWaveFile(wavePath); - fitYLgCurveDlg_->InitReportFile(speedPath); - surfaceDlg_->InitRD(rdPath); - targetUITable_->InitFile(speedPath, 50); + //fitCurveDlg_->InitWaveFile(wavePath); + //fitYLgCurveDlg_->InitReportFile(speedPath); + //surfaceDlg_->InitRD(rdPath); + //targetUITable_->InitFile(speedPath, 50); +} + +void MainWindow::InitChartLayout() +{ + QString strChart = RecourceHelper::Get().GetBasePath() + "/workspace/Chart.xml"; + m_mgrChart.Load(strChart); + + QVariantList varList = m_mgrChart.GetChartWgt(); + for (int nI = 0; nI < varList.size(); nI++) + { + QVariantMap mapWgt = varList.at(nI).toMap(); + QString strWgt = mapWgt.value("Name").toString(); + QVariantList listChart = mapWgt.value("Chart").toList(); + + QMainWindow* mainWindow_ = new QMainWindow; + //connect(mainWindow_, &QMainWindow::tabifiedDockWidgetActivated, this, &MainWindow::OnTabifiedDockWidgetActivated); + + DockWidget* wgtDock = new DockWidget(strWgt, 0); + wgtDock->SetDockWidgetTitleBar(new DockTitleBar(wgtDock)); + wgtDock->setWidget(mainWindow_); + addDockWidget(Qt::BottomDockWidgetArea, wgtDock); + + for (int nJ = 0; nJ < listChart.size(); nJ++) + { + QVariantMap mapChart = listChart.at(nJ).toMap(); + InitChart(mapChart, mainWindow_); + } + } +} + +QDockWidget *MainWindow::InitChart(QVariantMap mapChart, QMainWindow* mainWindow) +{ + QString strName = mapChart.value("Name").toString(); + QString strType = mapChart.value("Type").toString(); + QString after = mapChart.value("after").toString(); + QString orientation = mapChart.value("orientation").toString(); + int nT = mapChart.value("t").toInt(); + QString strFile = mapChart.value("File").toString(); + + DockWidget* pDock = new DockWidget(strName, 0); + + if (strType == "Wave" || strType == "Report") + { + QString xTitle = mapChart.value("xTitle").toString(); + QString yTitle = mapChart.value("yTitle").toString(); + float xMin = mapChart.value("xMin").toFloat(); + float xMax = mapChart.value("xMax").toFloat(); + int xCount = mapChart.value("xCount").toInt(); + float yMin = mapChart.value("yMin").toFloat(); + float yMax = mapChart.value("yMax").toFloat(); + int yCount = mapChart.value("yCount").toInt(); + QVariantList listCurve = mapChart.value("Curve").toList(); + + FitCurveDialog *fitCurveDlg = new FitCurveDialog(); + fitCurveDlg->AttachDock(pDock); + fitCurveDlg->updateTitle(strName + "-" + strFile); + fitCurveDlg->updateTitleAxis(xTitle, yTitle); + fitCurveDlg->updateMinMaxX(xMin, xMax, xCount); + fitCurveDlg->updateMinMaxY(yMin, yMax, yCount); + + if (strType == "Wave") + { + fitCurveDlg->updateParseWaveFile(strFile, nT, listCurve); + } + else if (strType == "Report") + { + fitCurveDlg->updateParseReportFile(strFile, nT, listCurve); + } + } + else if (strType == "Table") + { + QString head = mapChart.value("head").toString(); + QVariantList listCurve = mapChart.value("Curve").toList(); + + TargetListWgt *targetUITable = new TargetListWgt; + targetUITable->AttachDock(pDock); + targetUITable->SetHead(head); + targetUITable->updateTitle(strName + "-" + strFile); + targetUITable->updateParseFile(strFile, nT, listCurve); + } + else if (strType == "Lamp") + { + QString openColor = mapChart.value("openColor").toString(); + QString closeColor = mapChart.value("closeColor").toString(); + QVariantList listCurve = mapChart.value("Curve").toList(); + + SignalIndicatorLampUI *signalIndicatorLamp = new SignalIndicatorLampUI; + signalIndicatorLamp->AttachDock(pDock); + signalIndicatorLamp->updateTitle(strName + "-" + strFile); + signalIndicatorLamp->updateLampColor(openColor, closeColor); + signalIndicatorLamp->updateParseFile(strFile, nT, listCurve); + } + else if (strType == "Surface") + { + QString xTitle = mapChart.value("xTitle").toString(); + QString yTitle = mapChart.value("yTitle").toString(); + QString zTitle = mapChart.value("zTitle").toString(); + float xMin = mapChart.value("xMin").toFloat(); + float xMax = mapChart.value("xMax").toFloat(); + int xCount = mapChart.value("xCount").toInt(); + float yMin = mapChart.value("yMin").toFloat(); + float yMax = mapChart.value("yMax").toFloat(); + int yCount = mapChart.value("yCount").toInt(); + float zMin = mapChart.value("zMin").toFloat(); + float zMax = mapChart.value("zMax").toFloat(); + int zCount = mapChart.value("zCount").toInt(); + QVariantList listCurve = mapChart.value("Curve").toList(); + + SurfaceDialog *surfaceDlg = new SurfaceDialog(); + surfaceDlg->AttachDock(pDock); + surfaceDlg->updateTitle(strName + "-" + strFile); + surfaceDlg->updateTitleAxis(xTitle, yTitle, zTitle); + surfaceDlg->updateMinMaxX(xMin, xMax, xCount); + surfaceDlg->updateMinMaxY(yMin, yMax, yCount); + surfaceDlg->updateMinMaxZ(zMin, zMax, zCount); + surfaceDlg->updateParseFile(strFile, nT, listCurve); + } + + mainWindow->addDockWidget(Qt::LeftDockWidgetArea, pDock); + + QDockWidget* afterDock = m_mapChartWidget.value(after); + if (afterDock) + { + if (orientation == QString("Horizontal")) + { + mainWindow->splitDockWidget(afterDock, pDock, Qt::Horizontal); + } + else if (orientation == QString("Vertical")) + { + mainWindow->splitDockWidget(afterDock, pDock, Qt::Vertical); + } + } + + m_mapChartWidget.insert(strName, pDock); + + return pDock; +} + +QDockWidget * MainWindow::InitCurveChart(QVariantMap mapChart, QMainWindow * mainWindow) +{ + return nullptr; } diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 8b77370b..65c484e6 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -46,6 +46,10 @@ private: void InitUI(); void UninitUI(); + void InitChartLayout(); + QDockWidget *InitChart(QVariantMap mapChart, QMainWindow* mainWindow); + QDockWidget *InitCurveChart(QVariantMap mapChart, QMainWindow* mainWindow); + private: Ui::MainWindow* ui; @@ -67,4 +71,6 @@ private: QMap m_mapDockWidget; ChartXMLMgr m_mgrChart; + + QMap m_mapChartWidget; }; \ No newline at end of file diff --git a/src/ui/Table/targetlistwgt.cpp b/src/ui/Table/targetlistwgt.cpp index f4d09300..1ba0c782 100644 --- a/src/ui/Table/targetlistwgt.cpp +++ b/src/ui/Table/targetlistwgt.cpp @@ -27,10 +27,6 @@ TargetListWgt::TargetListWgt(QWidget * parent) : QWidget(parent) { setWindowTitle(QString::fromLocal8Bit("数据列表")); setWindowFlags(/*Qt::FramelessWindowHint | */Qt::Window); - m_nCurTabPage = 0; - - m_nBoundaryWth = 4; - QHeaderView* horizontalHeader = ui.tableWidget->horizontalHeader(); QColor headerColor = QColor(100, 100, 100); // 灰色 horizontalHeader->setStyleSheet(QString("QHeaderView::section {background-color: %1;}").arg(headerColor.name())); @@ -38,10 +34,6 @@ TargetListWgt::TargetListWgt(QWidget * parent) : QWidget(parent) { InitWgt(); - ui.lineEdit->setText("1"); - ui.lineEdit_2->setText("1"); - ui.spinBox_2->setValue(1); - connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, this, &TargetListWgt::OnWorkSpaceChanged); } @@ -56,157 +48,101 @@ void TargetListWgt::AttachDock(DockWidget* dockWidget) return; } - if (nullptr != dockWidget) { - m_titleText = dockWidget->windowTitle(); - } - dockWidget->SetDockWidgetTitleBar(nullptr); dockWidget->setWidget(this); DockTitleBar* dockTitleBar = new DockTitleBar; m_pDockTitleBar = dockTitleBar; - if (m_titleText.isEmpty()) { - dockTitleBar->SetTitle(tr("Data Table")); - } else { - dockTitleBar->SetTitle(m_titleText); - } - dockWidget->SetDockWidgetTitleBar(dockTitleBar); } +void TargetListWgt::updateTitle(const QString & title) +{ + if (nullptr != m_pDockTitleBar) + { + m_pDockTitleBar->SetTitle(title); + } +} + +void TargetListWgt::SetHead(const QString & headers) +{ + QStringList headerLabels = headers.split(","); + SetHeader(headerLabels); +} + void TargetListWgt::SetHeader(const QStringList& headerLabels) { ui.tableWidget->clear(); ui.tableWidget->setColumnCount(headerLabels.size()); ui.tableWidget->setHorizontalHeaderLabels(headerLabels); - } -void TargetListWgt::AddRowData(QVariant& var) -{ - if (!var.isValid()) - { - return; - } - - if (var.type() != QVariant::List) - { - return; - } - - QVariantList varRowList = var.toList(); - if (varRowList.size() < ui.tableWidget->columnCount()) - { - return; - } - - m_varRowDataList.push_back(var); - - UpdatePageNum(); - - int nCurPage = ui.lineEdit->text().toInt(); - UpdatePageData(nCurPage); -} - -void TargetListWgt::InitFile(const QString& strFile, int iBatchCount) +void TargetListWgt::updateParseFile(const QString & strFile, int nT, QVariantList listCurve) { if (strFile.isEmpty()) { + QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据文件路径!")); return; } - m_iBatchCount = iBatchCount; - m_strFile = strFile; - m_vecReportPoint.clear(); - bool bRet = ParseReport(strFile, m_vecReportPoint, m_iBatchCount); - - if (nullptr != m_pDockTitleBar && bRet) { - QFileInfo fileInfo(strFile); - m_pDockTitleBar->SetTitle(tr("%1 -- %2").arg(m_titleText).arg(fileInfo.fileName())); - } - - UpdateTable(1); - - UpdatePageNum(); - - UpdatePageData(1); -} - -void TargetListWgt::InitWgt() -{ - ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); - - ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); - - ui.tableWidget->setContextMenuPolicy(Qt::CustomContextMenu); - - //UpdateButtonEnable(); - - connect(ui.toolButton, SIGNAL(clicked()), this, SLOT(slotForwardPage())); - connect(ui.toolButton_2, SIGNAL(clicked()), this, SLOT(slotNextPage())); - - connect(ui.spinBox, SIGNAL(valueChanged(int)), - this, SLOT(slotRowCountChanged(int))); // 行数改变 - - connect(ui.spinBox_2, SIGNAL(valueChanged(int)), - this, SLOT(slotSelPage(int))); // 跳转 - - connect(ui.tableWidget, SIGNAL( itemDoubleClicked (QTableWidgetItem *)), - this, SLOT(slotDoubleClickedItem(QTableWidgetItem *))); - - - connect(ui.tableWidget, SIGNAL(itemClicked(QTableWidgetItem *)), - this, SLOT(slotClickedItem(QTableWidgetItem *))); - - - connect(ui.tableWidget->horizontalHeader(),SIGNAL(sectionClicked(int)), this, SLOT(slotSortTabCol(int))); -} - -bool TargetListWgt::ParseReport(const QString& strFile, std::vector>>& vecReportPoint, int iRowCount) -{ - if (strFile.isEmpty()) - { - QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据Report文件路径!")); - return false; - } - QFile file(strFile); if (file.open(QIODevice::ReadOnly)) { - int iRow = 1; - - std::vector> batch; + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + QString strName = mapCurve.value("Name").toString(); + QString strColor = mapCurve.value("Color").toString(); + m_tableSetting.insert(nI, mapCurve); + } + while (!file.atEnd()) { QString strLine = file.readLine().simplified(); if (!strLine.isEmpty()) { QStringList listLine = strLine.split(" "); - std::vector vecLine; - for (size_t i = 0; i < listLine.size(); i++) + double t = listLine.at(nT).toDouble(); + + QMap mapData; + for (int nI = 0; nI < listCurve.size(); nI++) { - vecLine.push_back(listLine[i].toFloat()); + QVariantMap mapCurve = listCurve.at(nI).toMap(); + QString strData = mapCurve.value("Data").toString(); + QStringList listData = strData.split(","); + + QVariantList varList; + for (int nJ = 0; nJ < listData.size(); nJ++) + { + int nIndex = listData.at(nJ).toInt(); + double data = listLine.at(nIndex).toDouble(); + varList.push_back(data); + } + mapData.insert(nI, varList); } - - batch.push_back(vecLine); + m_dataTable.insert(t, mapData); } - - // 批次 - if (iRow % iRowCount == 0) - { - vecReportPoint.push_back(batch); - batch.clear(); - } - - iRow++; } - file.close(); } +} - return true; +void TargetListWgt::InitWgt() +{ + ui.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); + ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + ui.tableWidget->setContextMenuPolicy(Qt::CustomContextMenu); + //ui.tableWidget->setSortingEnabled(true); + + connect(ui.tableWidget, SIGNAL( itemDoubleClicked (QTableWidgetItem *)), + this, SLOT(slotDoubleClickedItem(QTableWidgetItem *))); + + connect(ui.tableWidget, SIGNAL(itemClicked(QTableWidgetItem *)), + this, SLOT(slotClickedItem(QTableWidgetItem *))); + + //connect(ui.tableWidget->horizontalHeader(),SIGNAL(sectionClicked(int)), this, SLOT(slotSortTabCol(int))); } void TargetListWgt::slotSortTabCol(int nCol) @@ -215,38 +151,6 @@ void TargetListWgt::slotSortTabCol(int nCol) QTableWidget *pParen = (QTableWidget *)(pSender->parent()); pParen->sortItems(nCol, Qt::DescendingOrder); //pParen->sortItems(nCol, Qt::AscendingOrder); - -} - -void TargetListWgt::slotForwardPage() -{ - int nCurPage = ui.lineEdit->text().toInt(); - if (nCurPage == 1) - { - return; - } - - nCurPage -= 1; - - ui.lineEdit->setText(QString::number(nCurPage)); - - UpdatePageData(nCurPage); -} - -void TargetListWgt::slotNextPage() -{ - // 当前tab页显示的数据页数 - int nCurPage = ui.lineEdit->text().toInt(); - int iPageCount = ui.lineEdit_2->text().toInt(); - if (nCurPage == iPageCount) - { - return; - } - - nCurPage += 1; // 下一页 - ui.lineEdit->setText(QString::number(nCurPage)); - - UpdatePageData(nCurPage); } void TargetListWgt::OnWorkSpaceChanged(WorkSpace* worksapce) { @@ -254,12 +158,7 @@ void TargetListWgt::OnWorkSpaceChanged(WorkSpace* worksapce) { LOG_ERROR("worksapce is nullptr"); return; } - connect(worksapce, &WorkSpace::TimestepChanged, this, &TargetListWgt::OnTimestepChanged); - Timestep* timestep = worksapce->GetTimestep(); - if (nullptr != timestep) { - InitFile(worksapce->GetReportPath(), timestep->GetSteps().size()); - } } void TargetListWgt::OnTimestepChanged(Timestep* timestep) { @@ -268,17 +167,11 @@ void TargetListWgt::OnTimestepChanged(Timestep* timestep) { return; } connect(timestep, SIGNAL(TimeChanged(double)), this, SLOT(slotUpdateTime(double))); - - auto worksapce = timestep->GetWorkSpace(); - if (nullptr != worksapce) { - InitFile(worksapce->GetReportPath(), timestep->GetSteps().size()); - } } -void TargetListWgt::slotTimeChanged(double dTime) +void TargetListWgt::slotUpdateTime(double dTime) { UpdateTable(dTime); - UpdatePageData(1); } void TargetListWgt::slotDoubleClickedItem(QTableWidgetItem *pItem) @@ -296,134 +189,44 @@ void TargetListWgt::timerEvent(QTimerEvent *event) } -void TargetListWgt::UpdateTable(int iTime) +void TargetListWgt::UpdateTable(double t) { - if (iTime < 1) + if (m_dataTable.size() > 0) { - return; - } + clearTable(); - if ((iTime - 1) >= m_vecReportPoint.size()) - { - return; - } - - m_varRowDataList.clear(); - - if (iTime-1 < m_vecReportPoint.size()) - { - std::vector> batch = m_vecReportPoint[iTime-1]; - - ui.tableWidget->setRowCount(0); - - for (int i = 0; i < batch.size(); i++) + QMap< double, QMap >::const_iterator ite = m_dataTable.lowerBound(t); + if (ite == m_dataTable.end()) { - ui.tableWidget->insertRow(i); + ite--; + } - std::vector rowData = batch[i]; + QMap mapData = ite.value(); + for (QMap::Iterator it = mapData.begin(); it != mapData.end(); it++) + { + int nRow = it.key(); + QVariantList dataList = it.value(); - QVariantList varRow; - for (int j = 0; j < ui.tableWidget->columnCount(); j++) + ui.tableWidget->insertRow(nRow); + + for (int nI = 0; nI < dataList.size(); nI++) { - if (rowData.size() > j) - { - varRow.push_back(rowData[j]); - } + QString strVal; + strVal.sprintf("%.6f", dataList.at(nI).toFloat()); + QTableWidgetItem *item = new QTableWidgetItem(strVal); + item->setTextAlignment(Qt::AlignCenter); + ui.tableWidget->setItem(nRow, nI, item); } - - m_varRowDataList.push_back(varRow); } } } -void TargetListWgt::UpdatePageNum() +void TargetListWgt::clearTable() { - m_nPageShowLineNum = ui.spinBox->value(); // 每页显示的行数 - - int iPageCount = 1; - - int iDataCount = m_varRowDataList.size(); - if (iDataCount > m_nPageShowLineNum) - { - iPageCount = m_varRowDataList.size() / m_nPageShowLineNum; - if (m_varRowDataList.size() % m_nPageShowLineNum > 0) - { - iPageCount++; - } - } - - ui.spinBox_2->setRange(1, iPageCount); - ui.lineEdit_2->setText(QString::number(iPageCount)); -} - -void TargetListWgt::UpdateButtonEnable() -{ - m_nPageShowLineNum = ui.spinBox->value(); // 每页显示的行数 - - // 当前tab页显示的数据页数 - int nCurPage = 1; - - if (1 == nCurPage) // 首页 - { - ui.toolButton->setDisabled(true); // 前一页按钮 - } - else - { - ui.toolButton->setDisabled(false); // 前一页按钮 - } - - // 总页数 - int nPageCount = 1; - if (nCurPage == nPageCount) // 最后一页 - { - ui.toolButton_2->setDisabled(true); // 后一页按钮 - } - else - { - ui.toolButton_2->setDisabled(false); // 后一页按钮 - } - - // 当前页码数 - ui.lineEdit->setText(QString::number(nCurPage)); - // 总页码数 - ui.lineEdit_2->setText(QString::number(nPageCount)); - - // 设置页码数范围 - ui.spinBox_2->setRange(1,nPageCount); - ui.spinBox_2->setValue(nCurPage); -} - -void TargetListWgt::UpdatePageData(int iPageNum) -{ - m_nPageShowLineNum = ui.spinBox->value(); // 每页显示的行数 - - int iIndex = (iPageNum-1) * m_nPageShowLineNum; // 每页显示的行数 - int iEndIndex = iIndex + m_nPageShowLineNum; - if (iEndIndex > m_varRowDataList.size()) - { - iEndIndex = m_varRowDataList.size(); - } - - while (ui.tableWidget->rowCount() > 0) + int nCount = ui.tableWidget->rowCount(); + for (int nI = 0; nI < nCount; ) { ui.tableWidget->removeRow(0); - } - - int iRow = 0; - - for (; iIndex < iEndIndex; iIndex++) - { - QVariantList varColList = m_varRowDataList[iIndex].toList(); - - ui.tableWidget->insertRow(iRow); - - for (int iCol = 0; iCol < varColList.size(); iCol++) - { - QString strVal; - strVal.sprintf("%.6f", varColList[iCol].toFloat()); - ui.tableWidget->setItem(iRow, iCol, new QTableWidgetItem(strVal)); - } - - iRow++; + nCount = ui.tableWidget->rowCount(); } } diff --git a/src/ui/Table/targetlistwgt.h b/src/ui/Table/targetlistwgt.h index d2fc8f75..82dad9db 100644 --- a/src/ui/Table/targetlistwgt.h +++ b/src/ui/Table/targetlistwgt.h @@ -1,16 +1,15 @@ #pragma once + #include - #include "ui/Dialog.h" - #include "ui_targetlistwgt.h" - #include #include class QCheckBox; -class TargetListWgt : public QWidget { +class TargetListWgt : public QWidget +{ Q_OBJECT public: @@ -19,68 +18,36 @@ public: void AttachDock(class DockWidget* dockWidget); + void updateTitle(const QString& title); + void SetHead(const QString& headers); void SetHeader(const QStringList& headerLabels); - void AddRowData(QVariant &var); - void InitFile(const QString& strFile, int iBatchCount); - - QString GetFile() - { - return m_strFile; - } - - int GetBatch() - { - return m_iBatchCount; - } + void updateParseFile(const QString& strFile, int nT, QVariantList listCurve); protected: void InitWgt(); - bool ParseReport(const QString& strFile, std::vector>>& vecReportPoint, int iRowCount = 50); - - void UpdatePageNum(); - void UpdateButtonEnable(); // 更新按钮状态 - void UpdatePageData(int iPageNum); - void timerEvent(QTimerEvent *event); - void UpdateTable(int iTime); + void UpdateTable(double t); + + void clearTable(); protected slots: - - - void slotSortTabCol(int nCol); - void slotTimeChanged(double dTime); + void slotSortTabCol(int nCol); + void slotUpdateTime(double dTime); void slotDoubleClickedItem(QTableWidgetItem *pItem); // 双击行 void slotClickedItem(QTableWidgetItem *pItem); - void slotForwardPage(); // 前一页 - void slotNextPage(); // 下一页 - void OnWorkSpaceChanged(class WorkSpace*); void OnTimestepChanged(class Timestep*); -signals: - - private: Ui::TargetListWgt ui; - - - int m_nCurTabPage; // 当前tab页 - int m_nPageShowLineNum; // 页显示的行数 - int m_nBoundaryWth; - - QVariantList m_varRowDataList; - - QString m_strFile; - - std::vector>> m_vecReportPoint; - int m_iBatchCount; - - QString m_titleText; class DockTitleBar* m_pDockTitleBar { nullptr }; + + QMap m_tableSetting; + QMap< double, QMap > m_dataTable; }; diff --git a/src/ui/Table/targetlistwgt.ui b/src/ui/Table/targetlistwgt.ui index 1a49d0f4..a5c67eff 100644 --- a/src/ui/Table/targetlistwgt.ui +++ b/src/ui/Table/targetlistwgt.ui @@ -24,144 +24,6 @@ - - - - - - 停止更新 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - 显示行数 - - - - - - - 20 - - - 3000 - - - - - - - - - - 0 - 0 - - - - 前一页 - - - - - - - - 60 - 16777215 - - - - true - - - - - - - / - - - - - - - - 60 - 16777215 - - - - true - - - - - - - - 0 - 0 - - - - 后一页 - - - - - - - 跳转 - - - - - - - 1 - - - 3000 - - - - - - - diff --git a/src/ui/chartPlot/ChartXMLMgr.cpp b/src/ui/chartPlot/ChartXMLMgr.cpp new file mode 100644 index 00000000..b7a6d1a6 --- /dev/null +++ b/src/ui/chartPlot/ChartXMLMgr.cpp @@ -0,0 +1,119 @@ +#include "ChartXMLMgr.h" +#include "common/SpdLogger.h" + +ChartXMLMgr::ChartXMLMgr(QObject* parent) noexcept + : QObject(parent) +{ +} + +bool ChartXMLMgr::Load(const QString& file) { + std::string path = file.toLocal8Bit().constData(); + LOG_INFO("load ChartXML path:{}", path); + tinyxml2::XMLDocument xmlDocument; + tinyxml2::XMLError error = xmlDocument.LoadFile(path.c_str()); + if (tinyxml2::XMLError::XML_SUCCESS != error) { + LOG_INFO("load ChartXML feiled:{}", static_cast(error)); + return false; + } + + const tinyxml2::XMLElement* root = xmlDocument.RootElement(); + + const tinyxml2::XMLElement* xmlElement = root->FirstChildElement(); + while (nullptr != xmlElement) { + const char* name = xmlElement->Name(); + if (0 == strcmp(name, "Widget")) { + ParseWidget(xmlElement); + } + xmlElement = xmlElement->NextSiblingElement(); + } + + return true; +} + +bool ChartXMLMgr::ParseWidget(const tinyxml2::XMLElement* element) +{ + if (nullptr == element) { + LOG_WARN("element is nullptr"); + return false; + } + + const tinyxml2::XMLAttribute* current = element->FirstAttribute(); + QString strWgt = ""; + while (nullptr != current) { + const char* eleName = current->Name(); + if (0 == strcmp(eleName, "Name")) { + const char* name = current->Value(); + strWgt = QString(name); + } + current = current->Next(); + } + + QVariantList listChart; + const tinyxml2::XMLElement* xmlElement = element->FirstChildElement(); + while (nullptr != xmlElement) { + const char* name = xmlElement->Name(); + if (0 == strcmp(name, "Chart")) { + ParseChart(xmlElement, listChart); + } + xmlElement = xmlElement->NextSiblingElement(); + } + + QVariantMap mapWgt; + mapWgt.insert("Name", QVariant(strWgt)); + mapWgt.insert("Chart", QVariant(listChart)); + m_listWgt.push_back(QVariant(mapWgt)); + + return true; +} + +bool ChartXMLMgr::ParseChart(const tinyxml2::XMLElement * element, QVariantList &listChart) +{ + if (nullptr == element) { + LOG_WARN("element is nullptr"); + return false; + } + + const tinyxml2::XMLAttribute* current = element->FirstAttribute(); + QVariantMap mapChart; + while (nullptr != current) { + const char* eleName = current->Name(); + const char* value = current->Value(); + mapChart.insert(QString(eleName), QString(value)); + current = current->Next(); + } + + QVariantList listCurve; + const tinyxml2::XMLElement* xmlElement = element->FirstChildElement(); + while (nullptr != xmlElement) { + const char* name = xmlElement->Name(); + if (0 == strcmp(name, "Curve")) { + ParseCurve(xmlElement, listCurve); + } + xmlElement = xmlElement->NextSiblingElement(); + } + mapChart.insert("Curve", QVariant(listCurve)); + + listChart.push_back(QVariant(mapChart)); + + return true; +} + +bool ChartXMLMgr::ParseCurve(const tinyxml2::XMLElement * element, QVariantList &listCurve) +{ + if (nullptr == element) { + LOG_WARN("element is nullptr"); + return false; + } + + const tinyxml2::XMLAttribute* current = element->FirstAttribute(); + QVariantMap mapCurve; + while (nullptr != current) { + const char* eleName = current->Name(); + const char* value = current->Value(); + mapCurve.insert(QString(eleName), QString(value)); + current = current->Next(); + } + listCurve.push_back(QVariant(mapCurve)); + + return true; +} diff --git a/src/ui/chartPlot/ChartXMLMgr.h b/src/ui/chartPlot/ChartXMLMgr.h new file mode 100644 index 00000000..431eab10 --- /dev/null +++ b/src/ui/chartPlot/ChartXMLMgr.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +#include "xml/tinyxml2.h" + +class ChartXMLMgr : public QObject { + Q_OBJECT + +public: + explicit ChartXMLMgr(QObject* parent = nullptr) noexcept; + ~ChartXMLMgr() override = default; + + bool Load(const QString& file); + + QVariantList GetChartWgt() + { + return m_listWgt; + } + +private: + bool ParseWidget(const tinyxml2::XMLElement* element); + bool ParseChart(const tinyxml2::XMLElement* element, QVariantList &listChart); + bool ParseCurve(const tinyxml2::XMLElement* element, QVariantList &listCurve); + +private: + QVariantList m_listWgt; +}; + diff --git a/src/ui/chartPlot/FitCurveDialog.cpp b/src/ui/chartPlot/FitCurveDialog.cpp index 55169db0..39abb4bc 100644 --- a/src/ui/chartPlot/FitCurveDialog.cpp +++ b/src/ui/chartPlot/FitCurveDialog.cpp @@ -10,20 +10,14 @@ #include "workspace/Timestep.h" #include "workspace/WorkSpaceManager.h" -FitCurveDialog::FitCurveDialog(int iType, QWidget* parent) : +FitCurveDialog::FitCurveDialog(QWidget* parent) : QDialog(parent), ui(new Ui::FitCurveDialog) { - m_iType = iType; - - if (1 == m_iType) - { - setWindowTitle("2D Curve"); - } - else - { - setWindowTitle("2D(y(lg)) Curve"); - } + m_iXMin = 0; + m_iXMax = 0; + m_iYMax = 0; + m_iYMin = 0; initQChartView(); @@ -43,77 +37,26 @@ void FitCurveDialog::initQChartView() { curveChart->setBackgroundRoundness(0); //设置表格边框圆角半径 curveChartView->setChart(curveChart); - //QObject::connect(fitPointsSeriesS, &QSplineSeries::clicked, [=](const QPointF& point)mutable { - // QPointF tempPoint; - // QVector tempList(fitPointsSeriesS->pointsVector()); //复制曲线中的数据进行计算, 因为直接使用会导致卡顿 - // int tempX = qRound(point.x()); - // int tempY = -999; - // for (int i = 0; i < tempList.size(); i++) { - // if (tempList[i].x() == tempX) { - // tempY = tempList[i].y(); - // tempPoint.setX(tempX); - // tempPoint.setY(tempY); - // break; - // } - // } - // if (tempY != -999) { - // QToolTip::showText(QCursor::pos(), QString("(%1,%2)").arg(tempX).arg(tempY)); - // QVector tipList; - // tipList.append(tempPoint); - // tipSeries->replace(tipList); - // updateXYGuideLine(); - // } - // }); - //创建坐标轴 m_pAxisX = new QValueAxis; m_pAxisX->setRange(0, 10); - m_pAxisX->setTickCount(21); - m_pAxisX->setLabelFormat("%d"); + //m_pAxisX->setTickCount(21); + //m_pAxisX->setLabelFormat("%d"); m_pAxisX->setLabelsAngle(-90); //坐标刻度文字显示角度 curveChart->addAxis(m_pAxisX, Qt::AlignBottom); - //xGuideSeries->attachAxis(m_pAxisX); - //yGuideSeries->attachAxis(m_pAxisX); - // fitPointsSeriesS->attachAxis(m_pAxisX); - // tipSeries->attachAxis(m_pAxisX); + m_pAxisY = new QValueAxis; + m_pAxisY->setRange(0, 10); + //m_pAxisY->setTickCount(11); + //m_pAxisY->setLabelFormat("%d"); + curveChart->addAxis(m_pAxisY, Qt::AlignLeft); - if (1 == m_iType) - { - m_pAxisY = new QValueAxis; - m_pAxisY->setRange(0, 10); - m_pAxisY->setTickCount(11); - m_pAxisY->setLabelFormat("%d"); - curveChart->addAxis(m_pAxisY, Qt::AlignLeft); - } - else - { - m_pLgAxisY = new QLogValueAxis(); - m_pLgAxisY->setLabelFormat("%e"); - m_pLgAxisY->setMinorTickCount(9); - //axisY->setMinorTickLineVisible(true); - m_pLgAxisY->setLabelsAngle(90); - m_pLgAxisY->setRange(1, 100); - - curveChart->addAxis(m_pLgAxisY, Qt::AlignLeft); - } - - // axisX->setGridLineVisible(false); //隐藏背景网格X轴框线 - // axisY->setGridLineVisible(false); //隐藏背景网格Y轴框线 - /*curveChart->legend()->markers()[0]->setVisible(false); - curveChart->legend()->markers()[1]->setVisible(false); - curveChart->legend()->markers()[2]->setVisible(false); - curveChart->legend()->markers()[3]->setVisible(false);*/ curveChartView->setRenderHint(QPainter::Antialiasing); //除锯齿 - connect(curveChartView, &FitCurveChartView::signalMouseEvent, this, &FitCurveDialog::theSlotMouseEvent); - connect(curveChartView, &FitCurveChartView::signalWheelEvent, this, &FitCurveDialog::theSlotWheelEvent); - - //curveChartView->show(); + //connect(curveChartView, &FitCurveChartView::signalMouseEvent, this, &FitCurveDialog::theSlotMouseEvent); + //connect(curveChartView, &FitCurveChartView::signalWheelEvent, this, &FitCurveDialog::theSlotWheelEvent); QHBoxLayout* pLayout = new QHBoxLayout(this); pLayout->addWidget(curveChartView); - - // ui->chartLayout->addWidget(curveChartView); } void FitCurveDialog::theSlotMouseEvent(int eventId, QMouseEvent* event) { @@ -127,7 +70,6 @@ void FitCurveDialog::theSlotMouseEvent(int eventId, QMouseEvent* event) { QMouseEvent* mouseEvent = static_cast(event); curveChart->scroll(-(mouseEvent->pos().x() - pressedPoint.x()) / 10, (mouseEvent->pos().y() - pressedPoint.y()) / 10); - updateXYGuideLine(); } } else if (eventId == 2) { //单击抬起 @@ -135,7 +77,6 @@ void FitCurveDialog::theSlotMouseEvent(int eventId, QMouseEvent* event) { } else if (eventId == 3) { //双击 resetZoomAndScroll(); - updateXYGuideLine(); } } @@ -147,462 +88,12 @@ void FitCurveDialog::theSlotWheelEvent(QWheelEvent* event) { else { curveChart->zoom(1.05); } - - updateXYGuideLine(); -} - -void FitCurveDialog::slotAddSeries(QVariant varSeriesData) -{ - // 数据无效 - if (!varSeriesData.isValid()) - { - return; - } - - QString strName = varSeriesData.toMap().value("Name").toString(); // 曲线名称 - QVariantList varCurDataList = varSeriesData.toMap().value("Data").toList(); // 数据 - int iYType = varSeriesData.toMap().value("yType").toInt(); // y轴类型 - QColor color = varSeriesData.toMap().value("Color").value(); // 曲线颜色 - QString strXName = varSeriesData.toMap().value("xTitle").toString(); // x轴名称 - QString strYName = varSeriesData.toMap().value("yTitle").toString(); // y轴名称 - QString strZName = varSeriesData.toMap().value("zTitle").toString(); // z轴名称 - int iCurveType = varSeriesData.toMap().value("curveType").toInt(); // 曲线类型 - int iID = varSeriesData.toMap().value("ID").toInt(); // y轴类型 - bool bAdd = varSeriesData.toMap().value("Add").toBool(); // 曲线名称 - - if (iCurveType == 3) // 非二维曲线 - { - return; - } - - bool bNew = false; - QSplineSeries* pSeries = NULL; - if (m_seriesIDMap.contains(iID)) - { - pSeries = m_seriesIDMap.value(iID); - pSeries->setName(strName); // 设置曲线名称 - pSeries->setColor(color); // 设置曲线颜色 - pSeries->setUseOpenGL(true); - } - else - { - if (!bAdd) - { - return; - } - - pSeries = new QSplineSeries(this); - pSeries->setName(strName); // 设置曲线名称 - pSeries->setColor(color); // 设置曲线颜色 - pSeries->setUseOpenGL(true); - - bNew = true; - } - - m_pAxisX->setTitleText(strXName); // 设置x轴名称 - - // xy轴的范围 - m_iXMax = m_pAxisX->max(); // 当前x轴的最大值 - m_iXMin = m_pAxisX->min(); // 当前x轴的最小值 - - if (0 == iYType) // 一般曲线 - { - m_iYMax = m_pAxisY->max(); // 当前y轴的最大值 - m_iYMin = m_pAxisY->min(); // 当前y轴的最大值 - } - else // 对数曲线 - { - m_iYMax = m_pLgAxisY->max(); // 当前y轴的最大值 - m_iYMin = m_pLgAxisY->min(); // 当前y轴的最大值 - } - - // 曲线数据 - QVector listKey; - for (size_t i = 0; i < varCurDataList.size(); i++) - { - QPointF ptKey = varCurDataList[i].toPointF(); - listKey.push_back(ptKey); - - // 更新x轴最大值最小值 - if (m_iXMin > ptKey.x()) - { - m_iXMin = ptKey.x(); - } - - if (m_iXMax < ptKey.x()) - { - m_iXMax = ptKey.x(); - } - - if (m_iYMin > ptKey.y()) - { - m_iYMin = ptKey.y(); - } - - if (m_iYMax < ptKey.y()) - { - m_iYMax = ptKey.y(); - } - } - - // 更新x轴范围 - m_pAxisX->setRange(m_iXMin, m_iXMax); - pSeries->replace(listKey); - - if (bNew) - { - curveChart->addSeries(pSeries); - } - - // 更新y轴范围 - if (iYType == 0) - { - m_pAxisY->setRange(m_iYMin, m_iYMax); - - if (bNew) - { - pSeries->attachAxis(m_pAxisY); - } - - m_pAxisY->setTitleText(strYName); - } - else - { - m_pLgAxisY->setRange(m_iYMin, m_iYMax); - - if (bNew) - { - pSeries->attachAxis(m_pLgAxisY); - } - - m_pLgAxisY->setTitleText(strYName); - } - - if (bNew) - { - pSeries->attachAxis(m_pAxisX); - m_seriesIDMap.insert(iID, pSeries); - } - - //QObject::connect(fitPointsSeriesS, &QSplineSeries::clicked, [=](const QPointF& point)mutable { - // QPointF tempPoint; - // QVector tempList(fitPointsSeriesS->pointsVector()); //复制曲线中的数据进行计算, 因为直接使用会导致卡顿 - // int tempX = qRound(point.x()); - // int tempY = -999; - // for (int i = 0; i < tempList.size(); i++) { - // if (tempList[i].x() == tempX) { - // tempY = tempList[i].y(); - // tempPoint.setX(tempX); - // tempPoint.setY(tempY); - // break; - // } - // } - // if (tempY != -999) { - // QToolTip::showText(QCursor::pos(), QString("(%1,%2)").arg(tempX).arg(tempY)); - // QVector tipList; - // tipList.append(tempPoint); - // tipSeries->replace(tipList); - // updateXYGuideLine(); - // } - // }); -} - -void FitCurveDialog::slotDelCurve(int iID) -{ - QSplineSeries* pSeries = NULL; - if (m_seriesIDMap.contains(iID)) - { - pSeries = m_seriesIDMap.value(iID); - curveChart->removeSeries(pSeries); - - m_seriesIDMap.remove(iID); - } -} - -void FitCurveDialog::slotInserKeyPoint(int iID, float xValue, float yValue) -{ - QSplineSeries* pSeries = NULL; - if (m_seriesIDMap.contains(iID)) - { - pSeries = m_seriesIDMap.value(iID); - } - - if (pSeries) - { - QVector vecKeyPoints = pSeries->pointsVector(); - vecKeyPoints.push_back(QPointF(xValue, yValue)); - - if (m_iXMax < xValue) - { - m_iXMax = xValue; - } - - if (m_iXMin > xValue) - { - m_iXMin = xValue; - } - - if (m_iYMax < yValue) - { - m_iYMax = yValue; - } - - if (m_iYMin > yValue) - { - m_iYMin = yValue; - } - - if (1 == m_iType) - { - m_pAxisY->setRange(m_iXMin, m_iXMax); - } - else - { - m_pLgAxisY->setRange(m_iYMin, m_iYMax); - } - - pSeries->replace(vecKeyPoints); - } } void FitCurveDialog::slotUpdateTime(double dTime) { - if (m_vecWavePoint.size() > 0) - { - if (dTime < 1) - { - QMap::iterator pItor = m_seriesIDMap.begin(); - while (pItor != m_seriesIDMap.end()) - { - pItor.value()->clear(); - pItor++; - } - - return; - } - - if ((dTime - 1) >= m_vecWavePoint.size()) - { - return; - } - - std::vector> batch = m_vecWavePoint[dTime - 1]; - - m_pAxisX->setTitleText("x"); // 设置x轴名称 - - // xy轴的范围 - m_iXMax = m_pAxisX->max(); // 当前x轴的最大值 - m_iXMin = m_pAxisX->min(); // 当前x轴的最小值 - - m_iYMax = m_pAxisY->max(); // 当前y轴的最大值 - m_iYMin = m_pAxisY->min(); // 当前y轴的最大值 - - - m_iXMin = 0; - m_iYMin = 0; - - for (int i = 0; i < batch.size(); i++) - { - bool bNew = false; - QSplineSeries* pSeries = nullptr; - if (m_seriesIDMap.contains(i+1)) - { - pSeries = m_seriesIDMap.value(i + 1); - } - else - { - pSeries = new QSplineSeries(this); - m_seriesIDMap.insert(i + 1, pSeries); - bNew = true; - } - - QString strName = QString::fromLocal8Bit("目标") + QString::number(i+1); - pSeries->setName(strName); // 设置曲线名称 - - if (bNew) - { - qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); // 初始化随机数生成器 - QColor color(QRandomGenerator::global()->bounded(255), QRandomGenerator::global()->bounded(255), QRandomGenerator::global()->bounded(255)); - pSeries->setColor(color); // 设置曲线颜色 - } - - pSeries->setUseOpenGL(true); - - std::vector vecData = batch[i]; - if (m_iXMax < vecData.size()) - { - m_iXMax = vecData.size(); - } - - QList listKey; - for (int j = 0; j < vecData.size(); j++) - { - float fY = vecData[j]; - - listKey.push_back(QPointF(j+1, fY)); - - if (m_iYMax < fY) - { - m_iYMax = fY; - } - - if (m_iYMin > fY) - { - m_iYMin = fY; - } - } - - m_pAxisX->setRange(m_iXMin, m_iXMax); - pSeries->replace(listKey); - - if (bNew) - { - curveChart->addSeries(pSeries); - } - - m_pAxisY->setRange(m_iYMin, m_iYMax); - - if (bNew) - { - pSeries->attachAxis(m_pAxisY); - } - - m_pAxisY->setTitleText(QString::fromLocal8Bit("幅值")); - - if (bNew) - { - pSeries->attachAxis(m_pAxisX); - } - } - } - - if (m_vecReportPoint.size() > 0) - { - if (dTime < 1) - { - QMap::iterator pItor = m_seriesIDMap.begin(); - while (pItor != m_seriesIDMap.end()) - { - pItor.value()->clear(); - pItor++; - } - - return; - } - - if ((dTime - 1) >= m_vecReportPoint.size()) - { - return; - } - - std::vector> batch = m_vecReportPoint[dTime - 1]; - - m_pAxisX->setTitleText(QString::fromLocal8Bit("距离")); // 设置x轴名称 - - - // xy轴的范围 - m_iXMax = m_pAxisX->max(); // 当前x轴的最大值 - m_iXMin = m_pAxisX->min(); // 当前x轴的最小值 - - m_iYMax = m_pAxisY->max(); // 当前y轴的最大值 - m_iYMin = m_pAxisY->min(); // 当前y轴的最大值 - - for (int i = 0; i < batch.size(); i++) - { - bool bNew = false; - QSplineSeries* pSeries = nullptr; - if (m_seriesIDMap.contains(i + 1)) - { - pSeries = m_seriesIDMap.value(i + 1); - } - else - { - pSeries = new QSplineSeries(this); - m_seriesIDMap.insert(i + 1, pSeries); - bNew = true; - } - - QString strName = QString::fromLocal8Bit("目标") + QString::number(i + 1); - pSeries->setName(strName); // 设置曲线名称 - - if (bNew) - { - qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); // 初始化随机数生成器 - QColor color(QRandomGenerator::global()->bounded(255), QRandomGenerator::global()->bounded(255), QRandomGenerator::global()->bounded(255)); - pSeries->setColor(color); // 设置曲线颜色 - } - - pSeries->setUseOpenGL(true); - - std::vector vecData = batch[i]; - - - float fX = vecData[0]; - float fY = vecData[1]; - - if (m_iYMax < fY) - { - m_iYMax = fY; - } - - if (m_iYMin > fY) - { - m_iYMin = fY; - } - - if (m_iXMax < fX) - { - m_iXMax = fX; - } - - if (m_iXMin > fX) - { - m_iXMax = fX; - } - - m_pAxisX->setRange(m_iXMin, m_iXMax); - pSeries->append(QPointF(fX,fY)); - - if (bNew) - { - curveChart->addSeries(pSeries); - } - - m_pAxisY->setRange(m_iYMin, m_iYMax); - - if (bNew) - { - pSeries->attachAxis(m_pAxisY); - } - - m_pAxisY->setTitleText(QString::fromLocal8Bit("速度")); - - if (bNew) - { - pSeries->attachAxis(m_pAxisX); - } - } - } -} - -void FitCurveDialog::updateXYGuideLine() { - /* if (tipSeries->points().size() > 0) { - QVector axisRanges = getAxisRanges(); - QVector xGuideList, yGuideList; - int tempX = tipSeries->points()[0].x(); - int tempY = tipSeries->points()[0].y(); - xGuideList.append(QPointF(tempX, axisRanges[2])); - xGuideList.append(QPointF(tempX, tempY)); - yGuideList.append(QPointF(axisRanges[0], tempY)); - yGuideList.append(QPointF(tempX, tempY)); - xGuideSeries->replace(xGuideList); - yGuideSeries->replace(yGuideList); - } - else - { - xGuideSeries->clear(); - yGuideSeries->clear(); - }*/ + updateWaveData(dTime); + updateReportData(dTime); } void FitCurveDialog::resetZoomAndScroll() { @@ -626,187 +117,305 @@ QVector FitCurveDialog::getAxisRanges() { return ranges; } -void FitCurveDialog::InitWaveFile(const QString& strFile, int iBatchCount) +void FitCurveDialog::updateTitle(const QString & title) { - if (strFile.isEmpty()) - return; - - m_vecWavePoint.clear(); - bool bRet = ParseWave(strFile, m_vecWavePoint, iBatchCount); - if (nullptr != m_pDockTitleBar && bRet) { - QFileInfo fileInfo(strFile); - if (1 == m_iType) { - if (m_titleText.isEmpty()) { - m_pDockTitleBar->SetTitle(tr("2D Curve -- %1").arg(fileInfo.fileName())); - } else { - m_pDockTitleBar->SetTitle(tr("%1 -- %2").arg(m_titleText).arg(fileInfo.fileName())); - } - - } else { - if (m_titleText.isEmpty()) { - m_pDockTitleBar->SetTitle(tr("2D(y(lg)) Curve -- %1").arg(fileInfo.fileName())); - } else { - m_pDockTitleBar->SetTitle(tr("%1 -- %2").arg(m_titleText).arg(fileInfo.fileName())); - } - } - } + if (nullptr != m_pDockTitleBar) + { + m_pDockTitleBar->SetTitle(title); + } } -void FitCurveDialog::InitReportFile(const QString& strFile, int iBatchCount) -{ - if (strFile.isEmpty()) - return; - - m_vecReportPoint.clear(); - bool bRet = ParseReport(strFile, m_vecReportPoint, iBatchCount); - if (nullptr != m_pDockTitleBar && bRet) { - QFileInfo fileInfo(strFile); - if (1 == m_iType) { - if (m_titleText.isEmpty()) { - m_pDockTitleBar->SetTitle(tr("2D Curve -- %1").arg(fileInfo.fileName())); - } - else { - m_pDockTitleBar->SetTitle(tr("%1 -- %2").arg(m_titleText).arg(fileInfo.fileName())); - } - - } else { - if (m_titleText.isEmpty()) { - m_pDockTitleBar->SetTitle(tr("2D(y(lg)) Curve -- %1").arg(fileInfo.fileName())); - } - else { - m_pDockTitleBar->SetTitle(tr("%1 -- %2").arg(m_titleText).arg(fileInfo.fileName())); - } - - } - } -} - -void FitCurveDialog::updateTitle(const QString & xTitle, const QString & yTitle) +void FitCurveDialog::updateTitleAxis(const QString & xTitle, const QString & yTitle) { if (m_pAxisX) { - m_pAxisX->setTitleText(xTitle); + if (!xTitle.isEmpty()) + { + m_pAxisX->setTitleText(xTitle); + } } if (m_pAxisY) { - m_pAxisY->setTitleText(yTitle); + if (!yTitle.isEmpty()) + { + m_pAxisY->setTitleText(yTitle); + } } } void FitCurveDialog::updateMinMaxX(float min, float max, int count) { - m_iXMin = min; - m_iXMax = max; + if (max > min) + { + m_iXMin = min; + m_iXMax = max; - QList axesX; - axesX = curveChart->axes(Qt::Horizontal); - QValueAxis* curAxisX = (QValueAxis*)axesX[0]; - curAxisX->setRange(m_iXMin, m_iXMax); - curAxisX->setTickCount(count); + QList axesX; + axesX = curveChart->axes(Qt::Horizontal); + QValueAxis* curAxisX = (QValueAxis*)axesX[0]; + curAxisX->setRange(m_iXMin, m_iXMax); + + if (count > 0) + { + curAxisX->setTickCount(count); + curAxisX->setLabelFormat("%d"); + } + } } -void FitCurveDialog::updateMinMaxY(float min, float max) +void FitCurveDialog::updateMinMaxY(float min, float max, int count) { - m_iYMin = min; - m_iYMax = max; + if (max > min) + { + m_iYMin = min; + m_iYMax = max; - QList axesY; - axesY = curveChart->axes(Qt::Vertical); - QValueAxis* curAxisY = (QValueAxis*)axesY[0]; - curAxisY->setRange(m_iYMin, m_iYMax); + QList axesY; + axesY = curveChart->axes(Qt::Vertical); + QValueAxis* curAxisY = (QValueAxis*)axesY[0]; + curAxisY->setRange(m_iYMin, m_iYMax); + + if (count > 0) + { + curAxisY->setTickCount(count); + curAxisY->setLabelFormat("%d"); + } + } } -bool FitCurveDialog::ParseWave(const QString& strFile, std::vector>>& vecWavePoint, int iRowCount) +void FitCurveDialog::updateParseWaveFile(const QString& strFile, int nT, QVariantList listCurve) { - if (strFile.isEmpty()) - { - QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据Wave文件路径!")); - return false; - } + if (strFile.isEmpty()) + { + QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据Wave文件路径!")); + return; + } - QFile file(strFile); - if (file.open(QIODevice::ReadOnly)) - { - std::vector> batch; + QFile file(strFile); + if (file.open(QIODevice::ReadOnly)) + { + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + QString strName = mapCurve.value("Name").toString(); + QString strColor = mapCurve.value("Color").toString(); + QColor color = QColor(strColor.section(",", 0, 0).toInt(), strColor.section(",", 1, 1).toInt(), strColor.section(",", 2, 2).toInt()); - int iRow = 1; - while (!file.atEnd()) - { - QString strLine = file.readLine().simplified(); - if (!strLine.isEmpty()) - { - QStringList listLine = strLine.split(" "); - std::vector vecLine; - for (size_t i = 0; i < listLine.size(); i++) - { - vecLine.push_back(listLine[i].toFloat()); - } + QSplineSeries *pSeries = new QSplineSeries(this); + pSeries->setName(strName); + pSeries->setColor(color); + pSeries->setUseOpenGL(true); + //pSeries->attachAxis(m_pAxisY); + //pSeries->attachAxis(m_pAxisX); + curveChart->addSeries(pSeries); + m_seriesIDMap.insert(nI, pSeries); - batch.push_back(vecLine); + QPen pen(color); + pen.setWidth(2); + pSeries->setPen(pen); - if (iRow % iRowCount == 0) - { - vecWavePoint.push_back(batch); - batch.clear(); - } - } + QList axesX; + axesX = curveChart->axes(Qt::Horizontal); + QValueAxis* curAxisX = (QValueAxis*)axesX[0]; + pSeries->attachAxis(curAxisX); - iRow++; - } + QList axesY; + axesY = curveChart->axes(Qt::Vertical); + QValueAxis* curAxisY = (QValueAxis*)axesY[0]; + pSeries->attachAxis(curAxisY); + } - file.close(); - } + bool bResetAxisX = false; + if (m_iXMax == m_iXMin) + { + bResetAxisX = true; + } + bool bResetAxisY = false; + if (m_iYMax == m_iYMin) + { + bResetAxisY = true; + } - return true; + float maxY = -10000000.0; + float minY = 10000000.0; + + while (!file.atEnd()) + { + QString strLine = file.readLine().simplified(); + if (!strLine.isEmpty()) + { + QStringList listLine = strLine.split(" "); + double t = listLine.at(nT).toDouble(); + + QMap mapData; + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + int nStart = mapCurve.value("Start").toInt(); + int nStop = mapCurve.value("Stop").toInt(); + + if (bResetAxisX) + { + int nMax = nStop - nStart; + if (m_iXMax < nMax) + { + m_iXMax = nMax; + } + } + + QVariantList listData; + for (int nJ = nStart; nJ < nStop; nJ++) + { + double value = listLine.at(nJ).toDouble(); + listData.push_back(value); + + if (bResetAxisY) + { + if (value < minY) + { + minY = value; + } + if (value > maxY) + { + maxY = value; + } + } + } + mapData.insert(nI, listData); + } + m_dataWava.insert(t, mapData); + } + } + + if (bResetAxisX) + { + updateMinMaxX(0, m_iXMax * 1.1, 0); + } + if (bResetAxisY) + { + updateMinMaxY(minY * 0.9, maxY * 1.1, 0); + } + + file.close(); + } } -bool FitCurveDialog::ParseReport(const QString& strFile, std::vector>>& vecReportPoint, int iRowCount) +void FitCurveDialog::updateParseReportFile(const QString & strFile, int nT, QVariantList listCurve) { - if (strFile.isEmpty()) - { - QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据Report文件路径!")); - return false; - } + if (strFile.isEmpty()) + { + QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据文件路径!")); + return; + } - QFile file(strFile); - if (file.open(QIODevice::ReadOnly)) - { - std::vector> batch; + QFile file(strFile); + if (file.open(QIODevice::ReadOnly)) + { + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + QString strName = mapCurve.value("Name").toString(); + QString strColor = mapCurve.value("Color").toString(); + QColor color = QColor(strColor.section(",", 0, 0).toInt(), strColor.section(",", 1, 1).toInt(), strColor.section(",", 2, 2).toInt()); - int iRow = 1; - while (!file.atEnd()) - { - QString strLine = file.readLine().simplified(); - if (!strLine.isEmpty()) - { - QStringList listLine = strLine.split(" "); - std::vector vecLine; - for (size_t i = 0; i < listLine.size(); i++) - { - if (12 == i || i == 13) // 距离、速度 - { - vecLine.push_back(listLine[i].toFloat()); - } - } + QSplineSeries *pSeries = new QSplineSeries(this); + pSeries->setName(strName); + pSeries->setColor(color); + pSeries->setUseOpenGL(true); + //pSeries->attachAxis(m_pAxisY); + //pSeries->attachAxis(m_pAxisX); + curveChart->addSeries(pSeries); + m_seriesIDMap.insert(nI, pSeries); - batch.push_back(vecLine); + QPen pen(color); + pen.setWidth(2); + pSeries->setPen(pen); - if (iRow % iRowCount == 0) - { - vecReportPoint.push_back(batch); - batch.clear(); - } - } + QList axesX; + axesX = curveChart->axes(Qt::Horizontal); + QValueAxis* curAxisX = (QValueAxis*)axesX[0]; + pSeries->attachAxis(curAxisX); - iRow++; - } + QList axesY; + axesY = curveChart->axes(Qt::Vertical); + QValueAxis* curAxisY = (QValueAxis*)axesY[0]; + pSeries->attachAxis(curAxisY); + } - file.close(); - } + bool bResetAxisX = false; + if (m_iXMax == m_iXMin) + { + bResetAxisX = true; + } + bool bResetAxisY = false; + if (m_iYMax == m_iYMin) + { + bResetAxisY = true; + } - slotUpdateTime(1); + float maxX = -10000000.0; + float minX = 10000000.0; + float maxY = -10000000.0; + float minY = 10000000.0; - return true; + while (!file.atEnd()) + { + QString strLine = file.readLine().simplified(); + if (!strLine.isEmpty()) + { + QStringList listLine = strLine.split(" "); + double t = listLine.at(nT).toDouble(); + + QMap mapData; + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + int xIndex = mapCurve.value("x").toInt(); + int yIndex = mapCurve.value("y").toInt(); + double x = listLine.at(xIndex).toDouble(); + double y = listLine.at(yIndex).toDouble(); + + QPointF ptData = QPointF(x, y); + mapData.insert(nI, ptData); + + if (bResetAxisX) + { + if (x < minX) + { + minX = x; + } + if (x > maxX) + { + maxX = x; + } + } + if (bResetAxisY) + { + if (y < minY) + { + minY = y; + } + if (y > maxY) + { + maxY = y; + } + } + } + m_dataReport.insert(t, mapData); + } + } + + if (bResetAxisX) + { + updateMinMaxX(minX * 0.9, maxX * 1.1, 0); + } + if (bResetAxisY) + { + updateMinMaxY(minY * 0.9, maxY * 1.1, 0); + } + + file.close(); + } } void FitCurveDialog::OnWorkSpaceChanged(WorkSpace* worksapce) { @@ -816,7 +425,6 @@ void FitCurveDialog::OnWorkSpaceChanged(WorkSpace* worksapce) { } connect(worksapce, &WorkSpace::TimestepChanged, this, &FitCurveDialog::OnTimestepChanged); - InitWaveFile(worksapce->GetWavePath()); } void FitCurveDialog::OnTimestepChanged(Timestep* timestep) { @@ -842,33 +450,78 @@ void FitCurveDialog::AttachDock(DockWidget* dockWidget) dockWidget->SetDockWidgetTitleBar(nullptr); dockWidget->setWidget(this); - if (nullptr != dockWidget) { - m_titleText = dockWidget->windowTitle(); - } DockTitleBar* dockTitleBar = new DockTitleBar; m_pDockTitleBar = dockTitleBar; - - if (1 == m_iType) - { - if (m_titleText.isEmpty()) - { - dockTitleBar->SetTitle(tr("2D Curve")); - } - else - { - dockTitleBar->SetTitle(m_titleText); - } - } - else - { - if (m_titleText.isEmpty()) - { - dockTitleBar->SetTitle(tr("2D(y(lg)) Curve")); - } - else { - dockTitleBar->SetTitle(m_titleText); - } - } dockWidget->SetDockWidgetTitleBar(dockTitleBar); } + +void FitCurveDialog::updateWaveData(double t) +{ + if (m_dataWava.size() > 0) + { + QMap< double, QMap >::const_iterator ite = m_dataWava.lowerBound(t); + if (ite == m_dataWava.end()) + { + ite--; + } + + QMap mapData = ite.value(); + for (QMap::Iterator it = mapData.begin(); it != mapData.end(); it++) + { + int nIndex = it.key(); + QVariantList dataList = it.value(); + + QSplineSeries* pSeries = m_seriesIDMap.value(nIndex); + if (pSeries) + { + pSeries->clear(); + for (int nI = 0; nI < dataList.size(); nI++) + { + float fY = dataList.at(nI).toFloat(); + pSeries->append(QPointF(nI, fY)); + } + } + } + } +} + +void FitCurveDialog::updateReportData(double t) +{ + if (m_dataReport.size() > 0) + { + for (QMap::Iterator itSeries = m_seriesIDMap.begin(); itSeries != m_seriesIDMap.end(); itSeries++) + { + QSplineSeries* pSeries = itSeries.value(); + if (pSeries) + { + pSeries->clear(); + } + } + + QMap< double, QMap >::const_iterator ite = m_dataReport.lowerBound(t); + if (ite != m_dataReport.end()) + { + ite++; + } + + for (QMap< double, QMap >::Iterator itA = m_dataReport.begin(); itA != ite; itA++) + { + double dTime = itA.key(); + QMap mapData = itA.value(); + for (QMap::Iterator it = mapData.begin(); it != mapData.end(); it++) + { + int nIndex = it.key(); + QPointF data = it.value(); + + QSplineSeries* pSeries = m_seriesIDMap.value(nIndex); + if (pSeries) + { + pSeries->append(data); + } + } + } + + + } +} diff --git a/src/ui/chartPlot/FitCurveDialog.h b/src/ui/chartPlot/FitCurveDialog.h index ce433263..486976f5 100644 --- a/src/ui/chartPlot/FitCurveDialog.h +++ b/src/ui/chartPlot/FitCurveDialog.h @@ -15,39 +15,32 @@ class FitCurveDialog : public QDialog Q_OBJECT public: - explicit FitCurveDialog(int iType=1, QWidget* parent = nullptr); + explicit FitCurveDialog(QWidget* parent = nullptr); ~FitCurveDialog(); void AttachDock(class DockWidget* dockWidget); void initQChartView(); - void updateXYGuideLine(); void resetZoomAndScroll(); QVector getAxisRanges(); - void InitWaveFile(const QString& strFile, int iBatchCount = 50); - void InitReportFile(const QString& strFile, int iBatchCount = 50); - - void updateTitle(const QString& xTitle, const QString& yTitle); + void updateTitle(const QString& title); + void updateTitleAxis(const QString& xTitle, const QString& yTitle); void updateMinMaxX(float min, float max, int count); - void updateMinMaxY(float min, float max); + void updateMinMaxY(float min, float max, int count); + void updateParseWaveFile(const QString& strFile, int nT, QVariantList listCurve); + void updateParseReportFile(const QString& strFile, int nT, QVariantList listCurve); protected: - bool ParseWave(const QString& strFile, std::vector < std::vector>>& vecWavePoint, int iRowCount = 50); - bool ParseReport(const QString& strFile, std::vector>>& vecReportPoint, int iRowCount = 50); void OnWorkSpaceChanged(class WorkSpace*); void OnTimestepChanged(class Timestep*); + void updateWaveData(double t); + void updateReportData(double t); public slots: void theSlotMouseEvent(int eventId, QMouseEvent* event); void theSlotWheelEvent(QWheelEvent* event); - void slotAddSeries(QVariant varSeriesData); - - void slotDelCurve(int iID); // ɾ������ - - void slotInserKeyPoint(int iID,float xValue, float yValue); - void slotUpdateTime(double dTime); private: @@ -55,18 +48,11 @@ private: FitCurveChartView* curveChartView; QChart* curveChart; - //QSplineSeries* fitPointsSeriesS; //Ҫ��ʾ������ԭʼ���� - //QScatterSeries* tipSeries; - //QSplineSeries* xGuideSeries; //�������λ�õ��x�Ḩ���� - //QSplineSeries* yGuideSeries; //�������λ�õ��y�Ḩ���� - bool isPressed = false; //ͼ���Ƿ�����ק�� - QPoint pressedPoint; //�����ק��� - - int m_iType; // y������ + bool isPressed = false; + QPoint pressedPoint; QValueAxis* m_pAxisX = NULL; QValueAxis* m_pAxisY = NULL; - QLogValueAxis* m_pLgAxisY = NULL; float m_iXMax; float m_iXMin; float m_iYMax; @@ -74,12 +60,10 @@ private: QMap m_seriesIDMap; - std::vector>> m_vecWavePoint; - std::vector>> m_vecReportPoint; - - int m_iID = 1; - QString m_titleText; class DockTitleBar* m_pDockTitleBar { nullptr }; + + QMap< double, QMap > m_dataWava; + QMap< double, QMap > m_dataReport; }; #endif // FITCURVEDIALOG_H \ No newline at end of file diff --git a/src/ui/chartPlot/SurfaceDialog.cpp b/src/ui/chartPlot/SurfaceDialog.cpp index 42936a8a..30d0debb 100644 --- a/src/ui/chartPlot/SurfaceDialog.cpp +++ b/src/ui/chartPlot/SurfaceDialog.cpp @@ -21,7 +21,12 @@ SurfaceDialog::SurfaceDialog(QWidget *parent) setWindowTitle("3D Curve"); + m_iMinX = 0; m_iMaxX = 0; + m_iMinY = 0; m_iMaxY = 0; + m_iMinZ = 0; m_iMaxZ = 0; + InitSurface(); + connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, this, &SurfaceDialog::OnWorkSpaceChanged); } @@ -42,247 +47,275 @@ void SurfaceDialog::AttachDock(DockWidget* dockWidget) m_pDockTitleBar = new DockTitleBar; - m_pDockTitleBar->SetTitle(tr("3D Curve")); - dockWidget->SetDockWidgetTitleBar(m_pDockTitleBar); } -void SurfaceDialog::InitRD(const QString& strFile, int iBatch, int iRowCount) +void SurfaceDialog::updateTitle(const QString & title) { - if (strFile.isEmpty()) - return; - - m_vecRDPoint.clear(); - bool bRet = ParseRD(strFile, m_vecRDPoint,iBatch, iRowCount); - - if (nullptr != m_pDockTitleBar && bRet) { - QFileInfo fileInfo(strFile); - m_pDockTitleBar->SetTitle(tr("3D Curve -- %1").arg(fileInfo.fileName())); - } + if (nullptr != m_pDockTitleBar) + { + m_pDockTitleBar->SetTitle(title); + } } -void SurfaceDialog::slotAddSeries(QVariant varSeriesData) +void SurfaceDialog::updateTitleAxis(const QString & xTitle, const QString & yTitle, const QString & zTitle) { - // ������Ч - if (!varSeriesData.isValid()) - { - return; - } - - QVariantList varCurDataList = varSeriesData.toMap().value("Data").toList(); // ���� - QColor color = varSeriesData.toMap().value("Color").value(); // ������ɫ - QString strXName = varSeriesData.toMap().value("xTitle").toString(); // x������ - QString strYName = varSeriesData.toMap().value("yTitle").toString(); // y������ - QString strZName = varSeriesData.toMap().value("zTitle").toString(); // z������ - int iID = varSeriesData.toMap().value("ID").toInt(); // y������ - bool bAdd = varSeriesData.toMap().value("Add").toBool(); // �������� - int iCurveType = varSeriesData.toMap().value("curveType").toInt(); // �������� - if (iCurveType != 3) // ��ά���� - { - return; - } - - m_p3DXAxis->setTitle(strXName); - m_p3DXAxis->setTitleVisible(true); - m_p3DYAxis->setTitle(strYName); - m_p3DYAxis->setTitleVisible(true); - m_p3DZAxis->setTitle(strZName); - m_p3DZAxis->setTitleVisible(true); - - QSurfaceDataArray* data = new QSurfaceDataArray; - - m_iMinX = 0; m_iMaxX = 0; - m_iMinY = 0; m_iMaxY = 0; - m_iMinZ = 0; m_iMaxZ = 0; - - for (size_t i = 0; i < varCurDataList.size(); i++) - { - QVariantList varRow = varCurDataList[i].toList(); - if (varRow.size() > 2) - { - QSurfaceDataRow* dataRow = new QSurfaceDataRow; - - float fX = varRow[0].toFloat(); - - QVariantList varY = varRow[1].toList(); - QVariantList varZ = varRow[2].toList(); - - if (m_iMinX > fX) - { - m_iMinX = fX; - } - - if (m_iMaxX < fX) - { - m_iMaxX = fX; - } - - for (size_t j = 0; j < varY.size(); j++) - { - float fY = varY[j].toFloat(); - float fZ = varZ[j].toFloat(); - - if (m_iMinY > fY) - { - m_iMinY = fY; - } - - if (m_iMaxY < fY) - { - m_iMaxY = fY; - } - - if (m_iMinZ > fZ) - { - m_iMinZ = fZ; - } - - if (m_iMaxZ < fZ) - { - m_iMaxZ = fZ; - } - - *dataRow << QVector3D(fX, fY, fZ); - } - - *data << dataRow; - } - } - - m_pSeries->dataProxy()->resetArray(data); - - m_p3DXAxis->setRange(m_iMinX, m_iMaxX); - m_p3DYAxis->setRange(m_iMinZ, m_iMaxZ); - m_p3DZAxis->setRange(m_iMinY, m_iMaxY); - - // ������ɫ��ʽ - m_pSeries->setBaseColor(color); - m_pSeries->setColorStyle(Q3DTheme::ColorStyleUniform); - m_pSeries->setSingleHighlightColor(color); + m_p3DXAxis->setTitle(xTitle); + m_p3DXAxis->setTitleVisible(true); + m_p3DYAxis->setTitle(yTitle); + m_p3DYAxis->setTitleVisible(true); + m_p3DZAxis->setTitle(zTitle); + m_p3DZAxis->setTitleVisible(true); } -void SurfaceDialog::slotInserKeyPoint(float xValue, float yValue, float zValue) +void SurfaceDialog::updateMinMaxX(float min, float max, int count) { - QVector3D vecItem(xValue, yValue, zValue); - // ����x�����ֵ��Сֵ - if (m_iMinX > xValue) - { - m_iMinX = xValue; - } + if (max > min) + { + m_iMinX = min; + m_iMaxX = max; - if (m_iMaxX < xValue) - { - m_iMaxX = xValue; - } - - if (m_iMinY > yValue) - { - m_iMinY = yValue; - } - - if (m_iMaxY < yValue) - { - m_iMaxY = yValue; - } - - if (m_iMinZ > zValue) - { - m_iMinZ = zValue; - } - - if (m_iMaxZ < zValue) - { - m_iMaxZ = zValue; - } - - m_p3DXAxis->setRange(m_iMinX, m_iMaxX); - m_p3DYAxis->setRange(m_iMinY, m_iMaxY); - m_p3DZAxis->setRange(m_iMinZ, m_iMaxZ); - - int iRowCount = m_pSeries->dataProxy()->rowCount(); - QList dataArry = *(m_pSeries->dataProxy()->array()); - for (size_t i = 0; i < iRowCount; i++) - { - QSurfaceDataRow* dataRow = dataArry[i]; - if (dataRow) - { - *dataRow << vecItem; - } - } - - m_pSeries->dataProxy()->resetArray(&dataArry); + if (count > 0) + { + m_p3DXAxis->setSegmentCount(count); + } + m_p3DXAxis->setRange(min, max); + } } -void SurfaceDialog::slotUpdateTime(double dTime) +void SurfaceDialog::updateMinMaxY(float min, float max, int count) { - if (dTime < 1) - { - return; - } + if (max > min) + { + m_iMinY = min; + m_iMaxY = max; - if ((dTime - 1) >= m_vecRDPoint.size()) - { - return; - } + if (count > 0) + { + m_p3DYAxis->setSegmentCount(count); + } + m_p3DYAxis->setRange(min, max); + } +} - std::vector> batch = m_vecRDPoint[dTime - 1]; +void SurfaceDialog::updateMinMaxZ(float min, float max, int count) +{ + if (max > min) + { + m_iMinZ = min; + m_iMaxZ = max; - m_p3DXAxis->setTitle("x"); - m_p3DXAxis->setTitleVisible(true); - m_p3DYAxis->setTitle("y"); - m_p3DYAxis->setTitleVisible(true); - m_p3DZAxis->setTitle("z"); - m_p3DZAxis->setTitleVisible(true); + if (count > 0) + { + m_p3DZAxis->setSegmentCount(count); + } + m_p3DZAxis->setRange(min, max); + } +} - m_pSeries->dataProxy()->resetArray(nullptr); +void SurfaceDialog::updateParseFile(const QString & strFile, int nT, QVariantList listCurve) +{ + if (strFile.isEmpty()) + { + QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据文件路径!")); + return; + } - QSurfaceDataArray* data = new QSurfaceDataArray; + QFile file(strFile); + if (file.open(QIODevice::ReadOnly)) + { + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + QString strName = mapCurve.value("Name").toString(); + QString strColor = mapCurve.value("Color").toString(); + QColor color = QColor(strColor.section(",", 0, 0).toInt(), strColor.section(",", 1, 1).toInt(), strColor.section(",", 2, 2).toInt()); - m_iMinX = 0; m_iMaxX = 0; - m_iMinY = 0; m_iMaxY = 0; - m_iMinZ = 0; m_iMaxZ = 0; + QLinearGradient gr; + gr.setColorAt(0.0, color); + gr.setColorAt(0.5, Qt::yellow); + gr.setColorAt(0.8, Qt::red); + gr.setColorAt(1.0, Qt::darkRed); - m_iMaxX = batch.size(); - - for (int i = 0; i < batch.size(); i++) - { - std::vector rowData = batch[i]; + m_pSeries->setBaseGradient(gr); + m_pSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient); + //m_pSeries->setSingleHighlightColor(Qt::green); + } - QSurfaceDataRow* dataRow = new QSurfaceDataRow; + bool bResetAxisX = false; + if (m_iMaxX == m_iMinX) + { + bResetAxisX = true; + } + bool bResetAxisY = false; + if (m_iMaxZ == m_iMinZ) + { + bResetAxisY = true; + } + bool bResetAxisZ = false; + if (m_iMaxY == m_iMinY) + { + bResetAxisZ = true; + } - if (m_iMaxY < rowData.size()) - { - m_iMaxY = rowData.size(); - } - - for (int j = 0; j < rowData.size(); j++) - { - float fZ = abs(rowData[j]); + while (!file.atEnd()) + { + QString strLine = file.readLine().simplified(); + if (!strLine.isEmpty()) + { + QStringList listLine = strLine.split(" "); + double t = listLine.at(nT).toDouble(); - if (m_iMinZ > fZ) - { - m_iMinZ = fZ; - } + QMap< int, QVector< QVector > > mapData; + for (int nI = 0; nI < listCurve.size(); nI++) + { + QVariantMap mapCurve = listCurve.at(nI).toMap(); + int nStart = mapCurve.value("Start").toInt(); + int nStop = mapCurve.value("Stop").toInt(); + if (nStart == 0) + { + nStart = 1; + } + if (nStop == 0) + { + nStop = listLine.size(); + } + QString strX = mapCurve.value("x").toString(); + QString strY = mapCurve.value("y").toString(); + QString strZ = mapCurve.value("z").toString(); - if (m_iMaxZ < fZ) - { - m_iMaxZ = fZ; - } + double xInput = 0; + double yInput = 0; + double zInput = 0.0; + QVector< QVector > listRowData; + int nRow = 0; + int nCol = 0; + for (int nJ = nStart; nJ < nStop; nJ+=3) + { + int x = listLine.at(nJ).toDouble(); + int y = listLine.at(nJ+1).toDouble(); + double z = listLine.at(nJ+2).toDouble(); + + if (strX == "x") + { + xInput = x; + } + else if (strX == "y") + { + xInput = y; + } + else if (strX == "z") + { + xInput = z; + } - *dataRow << QVector3D(i+1, fZ, j+1); - } + if (strY == "x") + { + yInput = x; + } + else if (strY == "y") + { + yInput = y; + } + else if (strY == "z") + { + yInput = z; + } - *data << dataRow; - } + if (strZ == "x") + { + zInput = x; + } + else if (strZ == "y") + { + zInput = y; + } + else if (strZ == "z") + { + zInput = z; + } - m_pSeries->dataProxy()->resetArray(data); + QVector3D v3d = QVector3D(xInput, yInput, zInput); + if (nRow == x) + { + int nIndex = listRowData.size() - 1; + QVector listColData = listRowData[nIndex]; + listColData.push_back(v3d); + listRowData.replace(nIndex, listColData); + } + else + { + QVector listColData; + listColData.push_back(v3d); + listRowData.push_back(listColData); + } - m_p3DXAxis->setRange(m_iMinX, m_iMaxX); - m_p3DYAxis->setRange(m_iMinZ, m_iMaxZ); - m_p3DZAxis->setRange(m_iMinY, m_iMaxY); + nRow = x; + nCol = y; + } + mapData.insert(nI, listRowData); + } + m_data.insert(t, mapData); + } + } + if (m_iMaxX == m_iMinX) + { + m_p3DXAxis->setAutoAdjustRange(true); + } + if (m_iMaxZ == m_iMinZ) + { + m_p3DZAxis->setAutoAdjustRange(true); + } + if (m_iMaxY == m_iMinY) + { + m_p3DYAxis->setAutoAdjustRange(true); + } + + m_Surface.setHorizontalAspectRatio(1.0); + + file.close(); + } +} + +void SurfaceDialog::slotUpdateTime(double t) +{ + if (m_data.size() > 0) + { + m_pSeries->dataProxy()->resetArray(nullptr); + + QMap< double, QMap< int, QVector< QVector > > >::const_iterator ite = m_data.lowerBound(t); + if (ite == m_data.end()) + { + ite--; + } + + QMap< int, QVector< QVector > > mapData = ite.value(); + for (QMap< int, QVector< QVector > >::Iterator it = mapData.begin(); it != mapData.end(); it++) + { + int nIndex = it.key(); + QVector< QVector > listRowData = it.value(); + + QSurfaceDataArray* data = new QSurfaceDataArray; + + for (int nI = 0; nI < listRowData.size(); nI++) + { + QSurfaceDataRow* dataRow = new QSurfaceDataRow; + + QVector listColData = listRowData[nI]; + for (int nJ = 0; nJ < listColData.size(); nJ++) + { + QVector3D v3d = listColData[nJ]; + *dataRow << v3d; + } + + *data << dataRow; + } + + m_pSeries->dataProxy()->resetArray(data); + } + } - m_Surface.setHorizontalAspectRatio(2.1); m_Surface.setShadowQuality(QAbstract3DGraph::ShadowQuality::ShadowQualityNone); } @@ -293,7 +326,6 @@ void SurfaceDialog::OnWorkSpaceChanged(WorkSpace* worksapce) { } connect(worksapce, &WorkSpace::TimestepChanged, this, &SurfaceDialog::OnTimestepChanged); - InitRD(worksapce->GetRDPath()); } void SurfaceDialog::OnTimestepChanged(Timestep* timestep) { @@ -304,7 +336,6 @@ void SurfaceDialog::OnTimestepChanged(Timestep* timestep) { connect(timestep, SIGNAL(TimeChanged(double)), this, SLOT(slotUpdateTime(double))); } - void SurfaceDialog::InitSurface() { m_Surface.setFlags(m_Surface.flags()); @@ -322,9 +353,11 @@ void SurfaceDialog::InitSurface() m_p3DZAxis->setSegmentCount(10); m_p3DZAxis->setRange(-10, 10); - m_Surface.setAxisX(m_p3DXAxis); - m_Surface.setAxisY(m_p3DYAxis); - m_Surface.setAxisZ(m_p3DZAxis); + m_Surface.setAxisX(m_p3DXAxis); + m_Surface.setAxisY(m_p3DYAxis); + m_Surface.setAxisZ(m_p3DZAxis); + + m_Surface.activeTheme()->setType(Q3DTheme::Theme(2)); m_pSeries = new QSurface3DSeries; m_pSeries->setDrawMode(QSurface3DSeries::DrawSurface); @@ -339,70 +372,12 @@ void SurfaceDialog::InitSurface() QHBoxLayout* pLyt = new QHBoxLayout(this); pLyt->addWidget(containerHandle); - - // ������ɫ��ʽ m_pSeries->setBaseColor(Qt::green); m_pSeries->setColorStyle(Q3DTheme::ColorStyleUniform); m_pSeries->setSingleHighlightColor(Qt::green); - m_pSeries->setMeshSmooth(false); // ���������Ƿ�ƽ�� - m_pSeries->setFlatShadingEnabled(false); // ���û����ƽ����ɫ -} - -void SurfaceDialog::InitScatter() -{ - m_Scatter.setFlags(m_Scatter.flags() ^ Qt::FramelessWindowHint); - QScatter3DSeries* series = new QScatter3DSeries; - QScatterDataArray data; - data << QVector3D(0.5f, 0.5f, 0.5f) << QVector3D(-0.3f, -0.5f, -0.4f) << QVector3D(0.0f, -0.3f, 0.2f); - series->dataProxy()->addItems(data); - m_Scatter.addSeries(series); - - QWidget* container = QWidget::createWindowContainer(&m_Scatter); - - QHBoxLayout* pLyt = new QHBoxLayout(this); - pLyt->addWidget(container); -} - -bool SurfaceDialog::ParseRD(const QString& strFile, std::vector < std::vector>>& vecRDPoint, int iBatchCount, int iRowCount) -{ - if (strFile.isEmpty()) - { - QMessageBox::information(nullptr, QString::fromLocal8Bit("��ʾ"), QString::fromLocal8Bit("��������RD�ļ�·����")); - return false; - } - - QFile file(strFile); - if (file.open(QIODevice::ReadOnly)) - { - std::vector> vecBatch; - - int iRow = 1; - while (!file.atEnd()) - { - QString strLine = file.readLine().simplified(); - if (!strLine.isEmpty()) - { - QStringList listLine = strLine.split(" "); - std::vector vecLine; - for (size_t i = 0; i < listLine.size(); i++) - { - vecLine.push_back(listLine[i].toFloat()); - } - - vecBatch.push_back(vecLine); - - if (iRow % iRowCount == 0) - { - vecRDPoint.push_back(vecBatch); - vecBatch.clear(); - } - } - - iRow++; - } - - file.close(); - } - return true; + m_pSeries->setMeshSmooth(false); + m_pSeries->setFlatShadingEnabled(false); + + m_Surface.scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPreset(13)); } diff --git a/src/ui/chartPlot/SurfaceDialog.h b/src/ui/chartPlot/SurfaceDialog.h index 1cd0a84e..2634fb01 100644 --- a/src/ui/chartPlot/SurfaceDialog.h +++ b/src/ui/chartPlot/SurfaceDialog.h @@ -19,26 +19,25 @@ public: void AttachDock(class DockWidget* dockWidget); - void InitRD(const QString& strFile, int iBatch = 50, int iRowCount = 64); + void updateTitle(const QString& title); + void updateTitleAxis(const QString& xTitle, const QString& yTitle, const QString& zTitle); + void updateMinMaxX(float min, float max, int count); + void updateMinMaxY(float min, float max, int count); + void updateMinMaxZ(float min, float max, int count); + void updateParseFile(const QString& strFile, int nT, QVariantList listCurve); public slots: - void slotAddSeries(QVariant varSeriesData); - void slotInserKeyPoint(float xValue, float yValue, float zValue); - void slotUpdateTime(double dTime); + void slotUpdateTime(double t); void OnWorkSpaceChanged(class WorkSpace*); void OnTimestepChanged(class Timestep*); protected: void InitSurface(); - void InitScatter(); - - bool ParseRD(const QString& strFile, std::vector>>& vecRDPoint, int iBatchCount = 50, int iRowCount = 64); private: Ui::SurfaceDialog ui; Q3DSurface m_Surface; - Q3DScatter m_Scatter; QSurface3DSeries* m_pSeries; @@ -53,6 +52,7 @@ private: float m_iMinZ = 0; float m_iMaxZ = 10; - std::vector>> m_vecRDPoint; class DockTitleBar* m_pDockTitleBar { nullptr }; + + QMap< double, QMap< int, QVector< QVector > > > m_data; };