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;
};