diff --git a/Source/src/CMakeLists.txt b/Source/src/CMakeLists.txt index 4600a883..f4bd7c0e 100644 --- a/Source/src/CMakeLists.txt +++ b/Source/src/CMakeLists.txt @@ -169,6 +169,9 @@ target_link_libraries( osgSim libMatlabDataArray libMatlabEngine + libeng + libmx + libmat # python39 ) diff --git a/Source/src/translations/Dyt_zh_CN.ts b/Source/src/translations/Dyt_zh_CN.ts index 8796220c..3d828672 100644 --- a/Source/src/translations/Dyt_zh_CN.ts +++ b/Source/src/translations/Dyt_zh_CN.ts @@ -4,7 +4,7 @@ AddParamSetting - + ParamSetting 参数设置 @@ -52,17 +52,22 @@ 初始值 - + + 数据输入示例 + + + + 添加 添加 - + 删除 删除 - + 应用 应用 @@ -90,6 +95,21 @@ 3D画布 + + CodeEdtUI + + ParamSetting + 参数设置 + + + + CodeEdtUIClass + + + CodeEdtUI + + + DYTChart @@ -388,37 +408,37 @@ 主窗口 - + model elements 模型元素 - + attribte 属性 - + Wave Curve 波浪曲线 - + Speed Curve 速度曲线 - + 3D Curve 3D曲线 - + Report Table 报表 - + Report 上报 diff --git a/Source/src/ui/Layout/AddParamSetting.cpp b/Source/src/ui/Layout/AddParamSetting.cpp index 9b4d7850..572034d5 100644 --- a/Source/src/ui/Layout/AddParamSetting.cpp +++ b/Source/src/ui/Layout/AddParamSetting.cpp @@ -12,6 +12,8 @@ #include "python/PythonModule.h" + + AddParamSetting::AddParamSetting(const QString& strDir, QWidget* parent) : QWidget(parent) { @@ -19,6 +21,16 @@ AddParamSetting::AddParamSetting(const QString& strDir, QWidget* parent) setWindowFlags(/*Qt::FramelessWindowHint | */Qt::Window); + listType << "String" << "Int" << "Double" << "Int[]" << "Double[]" << "String[]" << "a+bi"; + + mapDataDes["String"] = "Value"; + mapDataDes["Int"] = "1"; + mapDataDes["Double"] = "1.0"; + mapDataDes["Int[]"] = u8"һά[1,2,3,4,5....]ά[1,2,3,4,5;6,7,8,9,10]"; + mapDataDes["Double[]"] = u8"һά[1.0,2.0,3.0,...]ά[1.0,2.0,3.0;6.0,7.0,8.0]"; + mapDataDes["String[]"] = u8"һά[s1,s2,s3,s4,s5....]ά[s1,s2,s3,s4,s5;s6,s7,s8,s9,s10]"; + mapDataDes["a+bi"] = "1+2(i)"; + m_strDir = strDir; QHeaderView* horizontalHeader = ui.tableWidget->horizontalHeader(); @@ -70,7 +82,7 @@ void AddParamSetting::InitTable() QString strMaxValue = sett.value("MaxValue").toString(); QString strMinValue = sett.value("MinValue").toString(); QString strDecimal = sett.value("Decimal").toString(); - QString strValue = sett.value("Value","0").toString(); + QString strValue = sett.value("Value", "0").toString(); QStringList values; values << strName << strDes << strType << strMaxValue << strMinValue << strDecimal << strValue; @@ -103,9 +115,6 @@ void AddParamSetting::InsertRow() // { - QStringList listType; - listType << "String" << "Int" << "Float"; - QComboBox* pCombox = new QComboBox; pCombox->addItems(listType); pCombox->setCurrentIndex(0); @@ -150,13 +159,20 @@ void AddParamSetting::InsertRow() iCol++; } - // + // { QString strText = u8"ֵ"; QLineEdit* pValue = new QLineEdit; pValue->setText(strText); pValue->setProperty("Row", iRow); ui.tableWidget->setCellWidget(iRow, iCol, pValue); + iCol++; + } + + { + QString strText = mapDataDes["String"]; + ui.tableWidget->setItem(iRow, iCol, new QTableWidgetItem(strText)); + ui.tableWidget->item(iRow, iCol)->setSelected(false); } } @@ -182,9 +198,6 @@ void AddParamSetting::InsertRow(QStringList values) // { - QStringList listType; - listType << "String" << "Int" << "Float"; - QComboBox* pCombox = new QComboBox; pCombox->addItems(listType); pCombox->setCurrentText(values[2]); @@ -196,7 +209,7 @@ void AddParamSetting::InsertRow(QStringList values) iCol++; } - if (values[2] == "Float") + if (values[2] == "Double") { // ֵ { @@ -350,6 +363,13 @@ void AddParamSetting::InsertRow(QStringList values) ui.tableWidget->setItem(iRow, iCol, new QTableWidgetItem(strText)); } } + + { + iCol++; + QString strText = mapDataDes[values[2]]; + ui.tableWidget->setItem(iRow, iCol, new QTableWidgetItem(strText)); + ui.tableWidget->item(iRow, iCol)->setSelected(false); + } } void AddParamSetting::RemoveRow() @@ -388,7 +408,7 @@ void AddParamSetting::slotButtonCommit() sett.clear(); sett.sync(); - for (int iRow = 0; iRow < ui.tableWidget->rowCount(); iRow++) + for (int iRow = 0; iRow < ui.tableWidget->rowCount()-1; iRow++) { QString strGroup = QString::number(iRow + 1); QString strName = ui.tableWidget->item(iRow, 0)->text(); @@ -415,7 +435,7 @@ void AddParamSetting::slotButtonCommit() QSpinBox* pCuralue = (QSpinBox*)ui.tableWidget->cellWidget(iRow, 6); sett.setValue("Value", pCuralue->value()); } - else if (strType == "Float") + else if (strType == "Double") { QDoubleSpinBox* pMaxValue = (QDoubleSpinBox*)ui.tableWidget->cellWidget(iRow, 3); sett.setValue("MaxValue", pMaxValue->value()); @@ -438,7 +458,7 @@ void AddParamSetting::slotButtonCommit() QLineEdit* pCuralue = (QLineEdit*)ui.tableWidget->cellWidget(iRow, 6); sett.setValue("Value", pCuralue->text()); } - + sett.endGroup(); } @@ -452,7 +472,7 @@ void AddParamSetting::slotIntMaxValueChanged(int iValue) int iRow = pSender->property("Row").toInt(); // жСֵǷСڵǰõֵ - QSpinBox* pMinValue = (QSpinBox*)ui.tableWidget->cellWidget(iRow,4); + QSpinBox* pMinValue = (QSpinBox*)ui.tableWidget->cellWidget(iRow, 4); if (pMinValue->value() >= iValue) { // ûԭֵ @@ -655,5 +675,11 @@ void AddParamSetting::slotSelectDataType(const QString& strType) QWidget* pDecimalValue = ui.tableWidget->cellWidget(iRow, 5); pDecimalValue->setDisabled(true); } + + { + QString strText = mapDataDes[strType]; + ui.tableWidget->setItem(iRow, 7, new QTableWidgetItem(strText)); + ui.tableWidget->item(iRow, 7)->setSelected(false); + } } } diff --git a/Source/src/ui/Layout/AddParamSetting.h b/Source/src/ui/Layout/AddParamSetting.h index 8f6f5d59..f94e21f0 100644 --- a/Source/src/ui/Layout/AddParamSetting.h +++ b/Source/src/ui/Layout/AddParamSetting.h @@ -40,4 +40,7 @@ private: Ui::AddParamSettingClass ui; QString m_strDir; + + QStringList listType; + QMap mapDataDes; }; diff --git a/Source/src/ui/Layout/AddParamSetting.ui b/Source/src/ui/Layout/AddParamSetting.ui index 7206e230..82dc229a 100644 --- a/Source/src/ui/Layout/AddParamSetting.ui +++ b/Source/src/ui/Layout/AddParamSetting.ui @@ -51,6 +51,11 @@ 初始值 + + + 数据输入示例 + + diff --git a/Source/src/ui/Layout/CodeEdtUI.cpp b/Source/src/ui/Layout/CodeEdtUI.cpp new file mode 100644 index 00000000..82060a03 --- /dev/null +++ b/Source/src/ui/Layout/CodeEdtUI.cpp @@ -0,0 +1,86 @@ +#include "CodeEdtUI.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SyntaxHighlighter.h" + +#include "../DockTitleBar.h" +#include "../DockWidget.h" + +CodeEdtUI::CodeEdtUI(QWidget *parent) + : QMainWindow(parent) +{ + ui.setupUi(this); + + // ༭ + editor = new QPlainTextEdit(this); + + QFont serifFont("Times", 20, QFont::Bold); + editor->setFont(serifFont); + + syntaxHighlighter = new SyntaxHighlighter(editor->document()); + + setCentralWidget(editor); + + // ˵ + QMenu* fileMenu = menuBar()->addMenu(u8"&ļ"); + QAction* openAction = new QAction(u8"&ģ", this); + QAction* saveAction = new QAction(u8"&", this); + fileMenu->addAction(openAction); + fileMenu->addAction(saveAction); + + connect(openAction, &QAction::triggered, this, &CodeEdtUI::openFile); + connect(saveAction, &QAction::triggered, this, &CodeEdtUI::saveFile); + + // ״̬ + statusBar(); +} + +void CodeEdtUI::AttachDock(DockWidget* dockWidget) +{ + if (nullptr == dockWidget) { + qDebug() << __FUNCTION__ << "dockwidget is nullptr"; + return; + } + + dockWidget->SetDockWidgetTitleBar(nullptr); + dockWidget->setWidget(this); + + DockTitleBar* dockTitleBar = new DockTitleBar; + + dockTitleBar->SetTitle(u8"matlab༭"); + + dockWidget->SetDockWidgetTitleBar(dockTitleBar); +} + +void CodeEdtUI::openFile() { + QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Matlab Files (*.m)"); + if (!fileName.isEmpty()) { + QFile file(fileName); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&file); + editor->setPlainText(in.readAll()); + file.close(); + } + } +} + +void CodeEdtUI::saveFile() { + QString fileName = QFileDialog::getSaveFileName(this, "Save File", "", "Matlab Files (*.m)"); + if (!fileName.isEmpty()) { + QFile file(fileName); + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&file); + out << editor->toPlainText(); + file.close(); + } + } +} \ No newline at end of file diff --git a/Source/src/ui/Layout/CodeEdtUI.h b/Source/src/ui/Layout/CodeEdtUI.h new file mode 100644 index 00000000..c6e98a64 --- /dev/null +++ b/Source/src/ui/Layout/CodeEdtUI.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include "ui_CodeEdtUI.h" + +class CodeEdtUI : public QMainWindow +{ + Q_OBJECT + +public: + CodeEdtUI(QWidget *parent = Q_NULLPTR); + void AttachDock(class DockWidget* dockWidget); + +protected slots: + void openFile(); + void saveFile(); + +private: + Ui::CodeEdtUIClass ui; + + class QPlainTextEdit* editor; + + class SyntaxHighlighter* syntaxHighlighter{ nullptr }; +}; diff --git a/Source/src/ui/Layout/CodeEdtUI.ui b/Source/src/ui/Layout/CodeEdtUI.ui new file mode 100644 index 00000000..e6c647ac --- /dev/null +++ b/Source/src/ui/Layout/CodeEdtUI.ui @@ -0,0 +1,28 @@ + + CodeEdtUIClass + + + CodeEdtUIClass + + + + 0 + 0 + 600 + 400 + + + + CodeEdtUI + + + + + + + + + + + + diff --git a/Source/src/ui/Layout/SyntaxHighlighter.cpp b/Source/src/ui/Layout/SyntaxHighlighter.cpp new file mode 100644 index 00000000..83414838 --- /dev/null +++ b/Source/src/ui/Layout/SyntaxHighlighter.cpp @@ -0,0 +1,58 @@ +#include "SyntaxHighlighter.h" + +SyntaxHighlighter::SyntaxHighlighter(QTextDocument* parent) + : QSyntaxHighlighter(parent) +{ + HighlightingRule rule; + + // ؼָ + QStringList keywordPatterns; + keywordPatterns << "\\bif\\b" << "\\belse\\b" << "\\bwhile\\b" << "\\bfor\\b" + << "\\bclass\\b" << "\\bstruct\\b" << "\\bpublic\\b" + << "\\bprivate\\b" << "\\bprotected\\b" << "\\bvoid\\b" + << "\\bint\\b" << "\\bfloat\\b" << "\\bdouble\\b" + << "\\bfunction\\b" << "\\bconst\\b" << "\\bbool\\b" + << "\\bforeach\\b" << "\\bfor\\b" << "\\bauto\\b" << "\\bcase\\b" + << "\\bdefault\\b"; + + foreach(const QString & pattern, keywordPatterns) { + rule.pattern = QRegularExpression(pattern); + rule.format.setForeground(Qt::blue); + highlightingRules.append(rule); + } + + // + rule.pattern = QRegularExpression("\\b[A-Z][a-zA-Z0-9_]*\\b"); + rule.format.setForeground(Qt::darkGreen); + highlightingRules.append(rule); + + // ַ + rule.pattern = QRegularExpression("\".*\""); + rule.format.setForeground(Qt::darkMagenta); + highlightingRules.append(rule); + + // ע͸ + rule.pattern = QRegularExpression("//[^\n]*"); + rule.format.setForeground(Qt::gray); + highlightingRules.append(rule); + + // ע͸ + rule.pattern = QRegularExpression("/\\*.*?\\*/", QRegularExpression::DotMatchesEverythingOption); + rule.format.setForeground(Qt::gray); + highlightingRules.append(rule); +} + +SyntaxHighlighter::~SyntaxHighlighter() +{ +} + +void SyntaxHighlighter::highlightBlock(const QString& text) +{ + foreach(const HighlightingRule & rule, highlightingRules) { + QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text); + while (matchIterator.hasNext()) { + QRegularExpressionMatch match = matchIterator.next(); + setFormat(match.capturedStart(), match.capturedLength(), rule.format); + } + } +} diff --git a/Source/src/ui/Layout/SyntaxHighlighter.h b/Source/src/ui/Layout/SyntaxHighlighter.h new file mode 100644 index 00000000..e3c7d6c7 --- /dev/null +++ b/Source/src/ui/Layout/SyntaxHighlighter.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +class SyntaxHighlighter : public QSyntaxHighlighter +{ + Q_OBJECT + +public: + SyntaxHighlighter(QTextDocument* parent = nullptr); + ~SyntaxHighlighter(); + +protected: + void highlightBlock(const QString& text) override; + +private: + struct HighlightingRule { + QRegularExpression pattern; + QTextCharFormat format; + }; + + QVector highlightingRules; +}; diff --git a/Source/src/ui/MainFrame.cpp b/Source/src/ui/MainFrame.cpp index fb250859..d71cd058 100644 --- a/Source/src/ui/MainFrame.cpp +++ b/Source/src/ui/MainFrame.cpp @@ -118,6 +118,7 @@ void MainFrame::InitUI() { QtOsgViewWidget* viewWidget = mainWindow->GetViewWidget(); connect(fileMenu, &FileManagerMenu::LoadDyt, viewWidget, &QtOsgViewWidget::OnLoadDyt); + connect(viewWidget, &QtOsgViewWidget::signalResetWorkSpace, mainWindow, &MainWindow::slotResetWorkSpace); //connect(chartMenu, &ChartPlotMenu::signalAddCurve, mainWindow->GetFitCurveDlg(), &FitCurveDialog::slotAddSeries); //connect(chartMenu, &ChartPlotMenu::signalDelCurve, mainWindow->GetFitCurveDlg(), &FitCurveDialog::slotDelCurve); diff --git a/Source/src/ui/MainWindow.cpp b/Source/src/ui/MainWindow.cpp index 6fb8fcc1..80859e9f 100644 --- a/Source/src/ui/MainWindow.cpp +++ b/Source/src/ui/MainWindow.cpp @@ -21,6 +21,7 @@ #include "Layout/LayoutSettingUI.h" #include "Layout/SignalIndicatorLampUI.h" #include "Layout/AddParamSetting.h" +#include "Layout/CodeEdtUI.h" #include "Table/targetlistwgt.h" #include "common/RecourceHelper.h" @@ -111,6 +112,8 @@ void MainWindow::InitUI() { WorkSpaceManager::Get().SetDYTRDFile(rdPath); } // const QString rdPath = RecourceHelper::Get().GetBasePath() + "/workspace/RD.txt"; + + const QString lampPath = RecourceHelper::Get().GetBasePath() + "/workspace/Lamp.txt"; DockWidget* fitCurveDock = new DockWidget(tr("Wave Curve"), 0); // addDockWidget(pSettingUI->GetArea("2DCurveDialog"), fitCurveDock); @@ -191,9 +194,6 @@ void MainWindow::InitUI() { connect(WorkSpaceManager::Get().GetCurrent()->GetTimestep(), SIGNAL(TimeChanged(double)), targetUI_, SLOT(slotTimeChanged(double))); } - - const QString lampPath = RecourceHelper::Get().GetBasePath() + "/workspace/Lamp.txt"; - DockWidget* signalIndicatorLampDock = new DockWidget(tr("Signal Indicator Lamp"), 0); signalIndicatorLampUI_ = new SignalIndicatorLampUI; signalIndicatorLampUI_->AttachDock(signalIndicatorLampDock); @@ -204,7 +204,7 @@ void MainWindow::InitUI() { const QString iniPath = RecourceHelper::Get().GetBasePath() + "/workspace/ParamSetting.ini"; DockWidget* addParamSettingDock = new DockWidget(tr("ParamSetting"), 0); - addParamDlg_ = new AddParamSetting(iniPath); + addParamDlg_ = new CodeEdtUI; addParamDlg_->AttachDock(addParamSettingDock); m_mapDockWidget.insert("ParamSetting", addParamSettingDock); @@ -213,7 +213,7 @@ void MainWindow::InitUI() { InitDockLayout(); -#if 0 +#if 1 MatlabObject* mtlb = new MatlabObject; mtlb->RunMatlabFile("D:\\DYT\\TestGUI\\TestGUI\\LDPlatformTest.m"); #endif // 1 @@ -401,3 +401,32 @@ void MainWindow::slotShowUISetting() { pSettingUI->show(); } + +void MainWindow::slotResetWorkSpace() +{ + QString wavePath = WorkSpaceManager::Get().GetDYTWaveFile(); + if (wavePath.isEmpty()) + { + wavePath = RecourceHelper::Get().GetBasePath() + "/workspace/Wave.txt"; + WorkSpaceManager::Get().SetDYTWaveFile(wavePath); + } + + QString speedPath = WorkSpaceManager::Get().GetDYTReportFile(); + if (speedPath.isEmpty()) + { + speedPath = RecourceHelper::Get().GetBasePath() + "/workspace/Report.txt"; + WorkSpaceManager::Get().SetDYTReportFile(speedPath); + } + + QString rdPath = WorkSpaceManager::Get().GetDYTRDFile(); + if (rdPath.isEmpty()) + { + rdPath = RecourceHelper::Get().GetBasePath() + "/workspace/RD.txt"; + WorkSpaceManager::Get().SetDYTRDFile(rdPath); + } + + fitCurveDlg_->InitWaveFile(wavePath); + fitYLgCurveDlg_->InitReportFile(speedPath); + surfaceDlg_->InitRD(rdPath); + targetUITable_->InitFile(speedPath, 50); +} diff --git a/Source/src/ui/MainWindow.h b/Source/src/ui/MainWindow.h index 9c093330..a2bf163a 100644 --- a/Source/src/ui/MainWindow.h +++ b/Source/src/ui/MainWindow.h @@ -37,6 +37,9 @@ public: void slotShowUISetting(); +public slots: + void slotResetWorkSpace(); + private: void InitUI(); @@ -62,7 +65,7 @@ private: class TargetListWgt* targetUITable_{ nullptr }; class QTabWidget* tabWidget_{ nullptr }; class SignalIndicatorLampUI* signalIndicatorLampUI_{ nullptr }; - class AddParamSetting* addParamDlg_{ nullptr }; + class CodeEdtUI* addParamDlg_{ nullptr }; QMap m_mapDockWidget; diff --git a/Source/src/ui/Matlab/MatlabObject.cpp b/Source/src/ui/Matlab/MatlabObject.cpp index 98bc715b..334347c1 100644 --- a/Source/src/ui/Matlab/MatlabObject.cpp +++ b/Source/src/ui/Matlab/MatlabObject.cpp @@ -2,10 +2,7 @@ #include -#include -#include - -using namespace matlab::engine; +#include "engine.h" MatlabObject::MatlabObject(QObject *parent) : QObject(parent) @@ -25,20 +22,12 @@ void MatlabObject::RunMatlabFile(const QString& strFile) QTextCodec* code = QTextCodec::codecForName("utf-8"); std::string strRun = code->fromUnicode(strMatlabRun.toUtf8().data()).data(); - std::u16string utf16_str = string2u16string(strRun); - // MATLAB Engine - std::unique_ptr matlabPtr = startMATLAB(); - if (matlabPtr) - { - // Mļ - matlabPtr->eval(utf16_str); + Engine* ep; + if (!(ep = engOpen("\0"))) { + fprintf(stderr, "\nCan't start MATLAB engine\n"); + return; // EXIT_FAILURE; } + + engClose(ep); } -std::u16string MatlabObject::string2u16string(std::string& str) -{ - std::wstring_convert, char16_t> convert; - std::u16string utf16_str = convert.from_bytes(str); - - return utf16_str; -} diff --git a/Source/src/ui/Matlab/MatlabObject.h b/Source/src/ui/Matlab/MatlabObject.h index a9973e1b..c0c960d8 100644 --- a/Source/src/ui/Matlab/MatlabObject.h +++ b/Source/src/ui/Matlab/MatlabObject.h @@ -14,5 +14,5 @@ public: protected: - std::u16string string2u16string(std::string& str); + //std::u16string string2u16string(std::string& str); }; diff --git a/Source/src/viewer/QtOsgViewWidget.cpp b/Source/src/viewer/QtOsgViewWidget.cpp index f6bc22c2..bfa27549 100644 --- a/Source/src/viewer/QtOsgViewWidget.cpp +++ b/Source/src/viewer/QtOsgViewWidget.cpp @@ -142,6 +142,8 @@ void QtOsgViewWidget::OnLoadDyt(const QString& path) { } workspace_ = workSpace; + + emit signalResetWorkSpace(); } void QtOsgViewWidget::resizeEvent(QResizeEvent* event) { diff --git a/Source/src/viewer/QtOsgViewWidget.h b/Source/src/viewer/QtOsgViewWidget.h index 452ddc69..ce0b2293 100644 --- a/Source/src/viewer/QtOsgViewWidget.h +++ b/Source/src/viewer/QtOsgViewWidget.h @@ -29,6 +29,9 @@ public: void OnLoadDyt(const QString& path); // void setKeyboardModifiers(QInputEvent* event); +signals: + void signalResetWorkSpace(); + protected: //void InitEventHandle(Core::ICameraManipulator* pCameraMainp, Core::IView* pView); diff --git a/Source/workspace/UILayout.xml b/Source/workspace/UILayout.xml index 56fe68b8..9d2b9ffd 100644 --- a/Source/workspace/UILayout.xml +++ b/Source/workspace/UILayout.xml @@ -1,41 +1,40 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +