From fe19f5ff17046483bb3417e058b08727c5c5df28 Mon Sep 17 00:00:00 2001 From: yuntang <123@qq.com> Date: Thu, 15 May 2025 17:31:03 +0800 Subject: [PATCH] 2025-05-15T17:31:02 --- .../sample_data/experiment-2-new.xlsx | Bin 0 -> 6373 bytes .../sample_data/experment-new.xlsx | Bin 0 -> 6099 bytes experiment_data/sample_data/new.xlsx | Bin 19835 -> 9450 bytes src/AnalysisTool.pro | 5 +- src/data/xlsxhandler.cpp | 35 +- src/global.cpp | 6 + src/global.h | 2 + src/main.cpp | 2 - src/mainwindow.cpp | 43 +- src/mainwindow.h | 5 +- src/serialport/dataparser.cpp | 10 +- src/serialport/dataparser.h | 3 +- src/serialport/serialport.cpp | 45 +- src/serialport/serialport.h | 5 +- src/ui/centralwidget.cpp | 4 +- src/ui/experimentsettingform.cpp | 6 +- src/ui/printereditform.cpp | 14 + src/ui/printereditform.h | 22 + src/ui/printereditform.ui | 661 ++++++++++++++++++ 19 files changed, 806 insertions(+), 62 deletions(-) create mode 100644 experiment_data/sample_data/experiment-2-new.xlsx create mode 100644 experiment_data/sample_data/experment-new.xlsx create mode 100644 src/ui/printereditform.cpp create mode 100644 src/ui/printereditform.h create mode 100644 src/ui/printereditform.ui diff --git a/experiment_data/sample_data/experiment-2-new.xlsx b/experiment_data/sample_data/experiment-2-new.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..aa09a92cbb32e9efcf42c51f285a361f90f8441d GIT binary patch literal 6373 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 M?|YyM;jgFv12j7)I{*Lx literal 0 HcmV?d00001 diff --git a/experiment_data/sample_data/experment-new.xlsx b/experiment_data/sample_data/experment-new.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7ec2c009f1d9ab16fe44af15370cfdea65eba07a GIT binary patch literal 6099 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

K5@V^ZVz|;VU_5dTVP`7x>w~Otw~~p^EhrT zfynK~D)}{X*tz=h-Pt!ajOYKQdmZT&IEQG6g1zBkU?8t(VfkL^zE0|Q9n@lNHuR}NlT)hguYGptGZMyTAeNe143fpaOw%(Zhf~> z!zt;sl=?A zkfZ(k%Q}TOEc*X`q8w@ajt{yhGVdL+$al!AWr#LGc8=D@c6QcKXH`*vg@b|rpU2Jh z)P&625T(~ayqgH}^S@tTza8^Ox?zz-l2f6+&|{$@hC>&ORG=cG`2UNF|Jhd|6#0{i z90|JU#j=rQRJd?hB9XmR?_LNULI}-@Mj}%azYsDAEWEFN4FmIu7zPIWzf>SUzkah9 zkCdXOeA#13O)Q`(3j<^5Xlmoc$^!lVe+7BOH}U!a@uIL-|Cf%rTx1J14Z@~8l=}Yz DHP;Tw diff --git a/src/AnalysisTool.pro b/src/AnalysisTool.pro index 007e5c8..48a86ab 100644 --- a/src/AnalysisTool.pro +++ b/src/AnalysisTool.pro @@ -8,7 +8,7 @@ CONFIG+=precompile_header PRECOMPILED_HEADER=stable.h # -VERSION = 0.9.7.3 +VERSION = 0.9.7.4 # 设置目标文件名,包含版本号 TARGET = AnalysisTool_$${VERSION} @@ -39,6 +39,7 @@ SOURCES += \ ui/enthalpydatacorrectionform.cpp \ ui/itemmanager.cpp \ ui/localcustomplot.cpp \ + ui/printereditform.cpp \ ui/printpreviewform.cpp \ ui/rightwidget.cpp \ thirdparty/easylogging/easylogging++.cc \ @@ -75,6 +76,7 @@ HEADERS += \ ui/enthalpydatacorrectionform.h \ ui/itemmanager.h \ ui/localcustomplot.h \ + ui/printereditform.h \ ui/printpreviewform.h \ ui/rightwidget.h \ thirdparty/easylogging/easylogging++.h \ @@ -107,6 +109,7 @@ FORMS += \ ui/experimentsettingform.ui \ ui/instrumentcoefficientform.ui \ ui/oitautoanalysisparamform.ui \ + ui/printereditform.ui \ ui/printpreviewform.ui \ ui/realtimedataform.ui \ ui/specificheatcomparisonmethodform.ui diff --git a/src/data/xlsxhandler.cpp b/src/data/xlsxhandler.cpp index 5d52585..1bbbec9 100644 --- a/src/data/xlsxhandler.cpp +++ b/src/data/xlsxhandler.cpp @@ -116,6 +116,11 @@ void XlsxHandler::readPhaseData(QXlsx::Worksheet *workSheet, int &startLineIndex void XlsxHandler::writeFile(const QString filePath) { + if(Global::_curveExperimentDataVtr.empty()){ + logde<<"_curveExperimentDataVtr empty..."; + return; + } + Global::ExperimentInfo& ei = Global::_experimentInfo; QXlsx::Document xlsx; @@ -230,6 +235,8 @@ void XlsxHandler::writeFile(const QString filePath) row++; // phase data. + logde<<"Global::_curveExperimentDataVtr size:" + <& edVtr = Global::_curveExperimentDataVtr.at(i).dataVtr; @@ -257,6 +264,9 @@ void XlsxHandler::writeFile(const QString filePath) xlsx.write(phaseSizeRow , 1, ConPhaseSize); xlsx.write(phaseSizeRow , 2, phaseCount); + // Clear data. + Global::clearExperimentData(); + // logde<<"before xlsx save as..."; if (!xlsx.saveAs(filePath)) { @@ -348,31 +358,6 @@ void XlsxHandler::writeAnalysisOperation(const QString filePath) } #endif -#if 0 - if (!xlsx->saveAs(filePath)) { - qDebug() << "Failed to save xlsx file:" << filePath; - // 检查和创建目录 - QDir dir(filePath); - if (!dir.exists()) { - qDebug() << "Directory does not exist. Creating directory..."; - dir.mkpath("."); - } - // 检查权限 - QFile file(filePath); - if (!file.open(QIODevice::WriteOnly)) { - qDebug() << "Permission denied:" << file.errorString(); - } - // 检查磁盘空间 - QStorageInfo storageInfo(QDir::rootPath()); - if (storageInfo.bytesFree() < 1024 * 1024 * 10) { // 假设文件大小至少为10MB - qDebug() << "Disk space is insufficient."; - } - // 尝试重新保存 - if (!xlsx->saveAs(filePath)) { - qDebug() << "Save xlsx failed after retrying."; - } - } -#endif // delete xlsx; logde<<"Save xlsx succ."; diff --git a/src/global.cpp b/src/global.cpp index 914f7b4..7e92d2b 100644 --- a/src/global.cpp +++ b/src/global.cpp @@ -123,6 +123,12 @@ double findNegativeStartPoint(double m, double b, double start, double end) { return std::numeric_limits::infinity(); } +void clearExperimentData() +{ + _curveExperimentDataVtr.clear(); + _currentCurveExperimentDataPtr = nullptr; +} + } diff --git a/src/global.h b/src/global.h index e30a9b3..bd33d04 100644 --- a/src/global.h +++ b/src/global.h @@ -121,6 +121,8 @@ extern ExperimentInfo _experimentInfo; extern QVector _curveExperimentDataVtr; extern CurveExperimentData* _currentCurveExperimentDataPtr; +void clearExperimentData(); + // Instrument coefficient. extern bool _enthalpyCoefficientEnableFlag; ///abc diff --git a/src/main.cpp b/src/main.cpp index 0b852a7..9ddeee0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,8 +59,6 @@ int main(int argc, char *argv[]) w.show(); #endif - qDebug() << "Application version:" << qApp->applicationVersion(); - // EnthalpyDataCorrectionForm edf; // edf.show(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 179ca0d..38f0f0d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -29,6 +29,7 @@ MainWindow::MainWindow(QWidget *parent) ,_coefficientSelectionForm(new CoefficientSelectionForm(this)) ,_printPreviewForm(new PrintPreviewForm(this)) ,_axisSettingForm(new AxisSettingForm(this)) + ,_manuallyStopTheExperimentFlag(false) { ui->setupUi(this); this->setToolTip("....."); @@ -106,7 +107,7 @@ void MainWindow::connections() connect(_expertmentSettingForm, &ExperimentSettingForm::sigDeliverData, SerialPort::instance(), &SerialPort::slotDeliverData); #if 1 - // dynamic data + // SerialPort. connect(SerialPort::instance(), &SerialPort::sigSendCommonData, _centralWidget, &CentralWidget::slotRecvCommonData); connect(SerialPort::instance(), &SerialPort::sigSendCommonData, @@ -124,6 +125,8 @@ void MainWindow::connections() connect(SerialPort::instance(), &SerialPort::sigUpdateStatusbarMsg, this,&MainWindow::slotUpdateStatusbarMsg); + connect(SerialPort::instance(), &SerialPort::sigSaveExperimentalDataMsgBox, + this,&MainWindow::slotSaveExperimentalDataMsgBox); #endif // mode @@ -235,7 +238,7 @@ bool MainWindow::saveAnalysisFile(const QString fileName) return true; } #endif -bool MainWindow::saveFile(const QString fileName) +bool MainWindow::saveFile(const QString fileName,const Global::Mode mode) { QString localFileName = fileName; if(fileName.isEmpty()){ @@ -243,9 +246,9 @@ bool MainWindow::saveFile(const QString fileName) } QString folder; - if(Global::_mode == Global::Mode::Analysis){ + if(mode == Global::Mode::Analysis){ folder = Global::AnalysisStateFolder; - }else if(Global::_mode == Global::Mode::Experiment){ + }else if(mode == Global::Mode::Experiment){ folder = Global::SampleDataFloder; } @@ -259,9 +262,9 @@ bool MainWindow::saveFile(const QString fileName) return false; } - if(Global::_mode == Global::Mode::Analysis){ + if(mode == Global::Mode::Analysis){ XlsxHandler::writeAnalysisOperation(filePath); - }else if(Global::_mode == Global::Mode::Experiment){ + }else if(mode == Global::Mode::Experiment){ XlsxHandler::writeFile(filePath); } @@ -280,13 +283,15 @@ void MainWindow::on_actionStop_triggered() // if(saveExperimentFile(Global::_experimentInfo.sampleName)){ // _leftWidget->reloadFileName(); // } - if(saveFile(Global::_experimentInfo.sampleName)){ + if(saveFile(Global::_experimentInfo.sampleName,Global::Mode::Experiment)){ _leftWidget->reloadFileName(); } #endif // Set software mode to analysis. Global::_mode = Global::Mode::Analysis; + + _manuallyStopTheExperimentFlag = true; } } @@ -297,6 +302,8 @@ void MainWindow::on_actionNew_triggered() void MainWindow::on_actionStart_triggered() { + on_actionClearAllData_triggered(); + QByteArray ba = DataParser::setDeviceStartStop(DeviceStartMode::Start); QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数 @@ -307,6 +314,8 @@ void MainWindow::on_actionStart_triggered() Global::_mode = Global::Mode::Experiment; logde<<"start experiment,set soft into experiment mode."; + + _manuallyStopTheExperimentFlag = false; } void MainWindow::on_actionReadOnly_triggered() @@ -320,6 +329,24 @@ void MainWindow::on_actionRealTimeWidget_triggered() _realTimeDataForm->show(); } +void MainWindow::slotSaveExperimentalDataMsgBox() +{ + if(_manuallyStopTheExperimentFlag){ + return; + } + + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, "数据保存提示", "是否保存实验数据?", + QMessageBox::Yes | QMessageBox::No); + if (reply == QMessageBox::Yes) { + saveFile(Global::_experimentInfo.sampleName,Global::Mode::Experiment); + } else { + on_actionClearAllData_triggered(); + // Clear data. + Global::clearExperimentData(); + } +} + void MainWindow::on_actionConnectToDev_triggered() { if (SerialPort::instance()->openSp()) @@ -462,5 +489,5 @@ void MainWindow::on_actionAxisSetting_triggered() void MainWindow::on_actionSaveData_triggered() { - saveFile(Global::_experimentInfo.sampleName); + saveFile(Global::_experimentInfo.sampleName,Global::_mode); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 0838e2e..4f55603 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -49,6 +49,8 @@ private slots: void on_actionReadOnly_triggered(); void on_actionRealTimeWidget_triggered(); + void slotSaveExperimentalDataMsgBox(); + //analysis void on_actionNumericalLabel_triggered(); void on_actionStartPoint_triggered(); @@ -101,8 +103,9 @@ private: bool saveAnalysisFile(const QString fileName); #endif - bool saveFile(const QString fileName); + bool saveFile(const QString fileName,const Global::Mode); private: + bool _manuallyStopTheExperimentFlag; Ui::MainWindow *ui; CentralWidget *_centralWidget; EventHandler *_eventHandler; diff --git a/src/serialport/dataparser.cpp b/src/serialport/dataparser.cpp index bc9ddc5..015bca1 100644 --- a/src/serialport/dataparser.cpp +++ b/src/serialport/dataparser.cpp @@ -39,7 +39,7 @@ bool commonDataParser(const QByteArray &ba, CommonData &cd) -QByteArray connectToDevice(const QVector &vtr) +QByteArray setExperimentInfo(const QVector &vtr) { // const int phaseLength = sizeof(Phase); const int phaseLength = PHASE_BYTE_SIZE; @@ -168,9 +168,11 @@ void experimentalStateSwitching(const CommonData &cd) #endif } - // logde<<"phase:"<<(int)cd.current_phase; - // logde<<"run type:"<<(int)cd.run_type; - // logde<<"software mode:"<&); + +QByteArray setExperimentInfo(const QVector&); QByteArray inquirePhaseInfo(); QByteArray setDeviceStartStop(const DeviceStartMode); diff --git a/src/serialport/serialport.cpp b/src/serialport/serialport.cpp index 857ac17..84053cd 100644 --- a/src/serialport/serialport.cpp +++ b/src/serialport/serialport.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "protocol.h" @@ -98,10 +99,12 @@ void SerialPort::slotReadData() if(ba.size() == 0){ return; } -#if 1 + +#if 0 QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数 - qDebug() << "receive info (hex):" << hexData; + logde << "receive info (hex):" << hexData.toStdString(); #endif + SerialPortProtocol *spp = (SerialPortProtocol *)ba.data(); if (FRANE_HEAD != spp->head) { @@ -128,8 +131,7 @@ void SerialPort::slotReadData() else if (READ_CMD == spp->cmd) { DataParser::experimentalStateSwitching(cd); - setAxis(); - updateStatusbarMsg(cd); + updateStatus(cd); if (spp->addr == 0) { @@ -137,19 +139,23 @@ void SerialPort::slotReadData() { emit sigSendCommonData(cd); } - // emit sigSendCommonDataToRealDataForm(cd); + // emit sigSendCommonDataToRealDataForm(cd); } } } -void SerialPort::updateStatusbarMsg(const CommonData &cd) +void SerialPort::updateStatus(const CommonData &cd) { #if 1 - logde<<"phase:"<<(int)cd.current_phase; - logde<<"run type:"<<(int)cd.run_type; +// logde<<"phase:"<<(int)cd.current_phase; +// logde<<"run type:"<<(int)cd.run_type; logde<<"software mode:"<isOpen()) diff --git a/src/serialport/serialport.h b/src/serialport/serialport.h index 972aadc..2749258 100644 --- a/src/serialport/serialport.h +++ b/src/serialport/serialport.h @@ -36,6 +36,7 @@ signals: void sigSendPhaseInfo(const QByteArray &); void sigAxisModify(const float temp); void sigUpdateStatusbarMsg(const QString &); + void sigSaveExperimentalDataMsgBox(); public slots: void slotDeliverData(const QByteArray &); // void slotConnectToDevice(const QByteArray&); @@ -45,11 +46,11 @@ private slots: void slotReadData(); private: - void updateStatusbarMsg(const CommonData &cd); + void updateStatus(const CommonData &cd); + void updateAxis(); void commonDataParser(const int dataLength, const u16 addr, const CommonData &cd); void to_hex(char *in_char, int char_length, char *out_char); void displayPortInfo(); - void setAxis(); private: SerialPort(QObject *parent = nullptr); QSerialPort *_sp; diff --git a/src/ui/centralwidget.cpp b/src/ui/centralwidget.cpp index 03e46e0..cb88328 100644 --- a/src/ui/centralwidget.cpp +++ b/src/ui/centralwidget.cpp @@ -211,8 +211,6 @@ void CentralWidget::slotModeModify(const Global::Mode mode) void CentralWidget::slotRecvCommonData(const CommonData &cd) { - // logde<<"slotRecvCommonData..."; - static double index = 0.0; if(!_currentCurve){ @@ -220,7 +218,7 @@ void CentralWidget::slotRecvCommonData(const CommonData &cd) _currentCurve = new QCPCurve(_customPlot->xAxis, _customPlot->yAxis); } - // logde<<"temp:"<addData(index++,cd.sample_temp, cd.dsc); diff --git a/src/ui/experimentsettingform.cpp b/src/ui/experimentsettingform.cpp index eba777c..066ee08 100644 --- a/src/ui/experimentsettingform.cpp +++ b/src/ui/experimentsettingform.cpp @@ -425,8 +425,10 @@ void ExperimentSettingForm::on_pushButton_deliverData_clicked() ei.initialAtmosPhere = (GasType)(ui->comboBox_phase_1_atmosphere->currentIndex()); #endif + // - QByteArray ba = DataParser::connectToDevice(phaseVtr); + QByteArray ba = DataParser::setExperimentInfo(phaseVtr); + qDebug() << "ba size:" << ba.size(); emit sigDeliverData(ba); hide(); @@ -493,7 +495,7 @@ void ExperimentSettingForm::slotPhaseCheck() void ExperimentSettingForm::slotRecvPhaseInfo(const QByteArray &ba) { - logde<<"-----------------------"; + logde<<"----------------------- recv"; QString hexData = ba.toHex(' '); // ' ' 作为分隔符,可选参数 qDebug() << "slotRecvPhaseInfo hex:" << hexData; diff --git a/src/ui/printereditform.cpp b/src/ui/printereditform.cpp new file mode 100644 index 0000000..256bcca --- /dev/null +++ b/src/ui/printereditform.cpp @@ -0,0 +1,14 @@ +#include "printereditform.h" +#include "ui_printereditform.h" + +PrinterEditForm::PrinterEditForm(QWidget *parent) : + QWidget(parent), + ui(new Ui::PrinterEditForm) +{ + ui->setupUi(this); +} + +PrinterEditForm::~PrinterEditForm() +{ + delete ui; +} diff --git a/src/ui/printereditform.h b/src/ui/printereditform.h new file mode 100644 index 0000000..9e0c4da --- /dev/null +++ b/src/ui/printereditform.h @@ -0,0 +1,22 @@ +#ifndef PRINTEREDITFORM_H +#define PRINTEREDITFORM_H + +#include + +namespace Ui { +class PrinterEditForm; +} + +class PrinterEditForm : public QWidget +{ + Q_OBJECT + +public: + explicit PrinterEditForm(QWidget *parent = nullptr); + ~PrinterEditForm(); + +private: + Ui::PrinterEditForm *ui; +}; + +#endif // PRINTEREDITFORM_H diff --git a/src/ui/printereditform.ui b/src/ui/printereditform.ui new file mode 100644 index 0000000..7c8121f --- /dev/null +++ b/src/ui/printereditform.ui @@ -0,0 +1,661 @@ + + + PrinterEditForm + + + + 0 + 0 + 790 + 366 + + + + Form + + + + + 10 + 10 + 281 + 181 + + + + GroupBox + + + + + 20 + 30 + 241 + 121 + + + + + + + 样品名称: + + + + + + + + + + 样品质量: + + + + + + + + + + 实验日期: + + + + + + + + + + 操作员: + + + + + + + + + + + + + 300 + 10 + 481 + 301 + + + + GroupBox + + + + + 5 + 37 + 471 + 251 + + + + + QLayout::SetDefaultConstraint + + + + + + NC + + + + + N2 + + + + + O2 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + 2 + + + + + + + + 0 + 0 + + + + + + + + + NC + + + + + N2 + + + + + O2 + + + + + + + + + 0 + 0 + + + + 4 + + + + + + + 初始气氛: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 100 + 0 + + + + + + + + + 100 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + 3 + + + + + + + 截止温度 + + + Qt::AlignCenter + + + + + + + + NC + + + + + N2 + + + + + O2 + + + + + + + + + 0 + 0 + + + + 阶段 + + + Qt::AlignCenter + + + + + + + + 100 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + NC + + + + + N2 + + + + + O2 + + + + + + + + 气氛 + + + Qt::AlignCenter + + + + + + + 非OIT + + + + + + + + NC + + + + + N2 + + + + + O2 + + + + + + + + + 0 + 0 + + + + 5 + + + + + + + OIT + + + + + + + + 0 + 0 + + + + + + + + 测试类型: + + + + + + + + 100 + 0 + + + + + + + + + 0 + 0 + + + + 1 + + + + + + + + 100 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 100 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 100 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 100 + 0 + + + + + + + + 恒温时间 + + + Qt::AlignCenter + + + + + + + + NC + + + + + N2 + + + + + O2 + + + + + + + + + 0 + 0 + + + + 6 + + + + + + + + 100 + 0 + + + + + + + + 扫描速率 + + + Qt::AlignCenter + + + + + + + + NC + + + + + N2 + + + + + O2 + + + + + + + + + 100 + 0 + + + + + + + + + + + 10 + 190 + 281 + 121 + + + + GroupBox + + + + + 70 + 30 + 141 + 61 + + + + + + + X: + + + + + + + + + + Y: + + + + + + + + + + + + + 380 + 330 + 80 + 20 + + + + 确定 + + + + + + 500 + 330 + 80 + 20 + + + + 取消 + + + + + +