2025-05-26T14:32:01

This commit is contained in:
yuntang 2025-05-26 14:32:01 +08:00
parent dd3d99a8a2
commit cfcf8b0ecf
15 changed files with 2860 additions and 91 deletions

View File

@ -133,3 +133,6 @@ RESOURCES += \
DISTFILES += \ DISTFILES += \
logger/log.conf logger/log.conf
TRANSLATIONS = language/cn.ts \
language/en.ts

1
src/FvbVvC.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,7 @@ void ConfigHandler::reader()
{ {
// 检查文件是否已经存在 // 检查文件是否已经存在
if (QFile::exists(ConConfigFilePath)) { if (QFile::exists(ConConfigFilePath)) {
logde << "config config file existed. "; logde << "config file existed. ";
}else{ }else{
writer(false); writer(false);
} }

View File

@ -748,10 +748,10 @@ QPair<Global::ExperimentData, Global::ExperimentData> PointCalculate::calculateS
{ {
QPair<QPointF,QPointF> leftAndRightPair = calculateStartAndEndPoint(); QPair<QPointF,QPointF> leftAndRightPair = calculateStartAndEndPoint();
ExperimentData leftEd = getClosestDataByTemperature(leftAndRightPair.first.x()); ExperimentData leftEd = getClosestDataByTemperature(leftAndRightPair.first.x());
ExperimentData rightEd = getClosestDataByTemperature(leftAndRightPair.second.x()); ExperimentData rightEd = getClosestDataByTemperature(leftAndRightPair.second.x());
return qMakePair<Global::ExperimentData, Global::ExperimentData> (leftEd,rightEd); return qMakePair<Global::ExperimentData, Global::ExperimentData> (leftEd,rightEd);
} }
QPair<float, float> PointCalculate::getMinAndMaxOfRunTime() QPair<float, float> PointCalculate::getMinAndMaxOfRunTime()
@ -770,6 +770,59 @@ QPair<float, float> PointCalculate::getMinAndMaxOfRunTime()
return qMakePair<float,float>(runTimeMin,runTimeMax); return qMakePair<float,float>(runTimeMin,runTimeMax);
} }
Global::ExperimentData PointCalculate::findOnSetDataByTemperature(const double x1,const double x2)
{
Global::ExperimentData resultEd;
QVector<Global::ExperimentData> edVtr = getDataInXRange(x1,x2);
if(edVtr.empty()){
return resultEd;
}
double maxDsc = std::numeric_limits<float>::min();
for(Global::ExperimentData& ed:edVtr){
if(ed.dsc > maxDsc){
maxDsc = ed.dsc;
}
}
// 从后往前遍历,找到第一个 dsc 与 standardDsc 相等的 ExperimentData
for (auto it = edVtr.rbegin(); it != edVtr.rend(); ++it) {
if(std::abs(it->dsc - maxDsc) < Global::OnsetAndEndSetRate * maxDsc){
resultEd = *it; // 找到匹配项,返回该值
break;
}
}
return resultEd;
}
Global::ExperimentData PointCalculate::findEndSetDataByTemperature(const double x1, const double x2)
{
Global::ExperimentData resultEd;
QVector<Global::ExperimentData> edVtr = getDataInXRange(x1,x2);
if(edVtr.empty()){
return resultEd;
}
double maxDsc = std::numeric_limits<float>::min();
for(Global::ExperimentData& ed:edVtr){
if(ed.dsc > maxDsc){
maxDsc = ed.dsc;
}
}
// 从后往前遍历,找到第一个 dsc 与 standardDsc 相等的 ExperimentData
for (auto it = edVtr.begin(); it != edVtr.end(); ++it) {
if(std::abs(it->dsc - maxDsc) < Global::OnsetAndEndSetRate * maxDsc){
resultEd = *it; // 找到匹配项,返回该值
break;
}
}
return resultEd;
}
QPair<float, float> PointCalculate::getMinAndMaxOfDSC() QPair<float, float> PointCalculate::getMinAndMaxOfDSC()
{ {
@ -820,3 +873,5 @@ QString PointCalculate::textFormatGlassTranstionWithTime(const float t1, const f
.arg(QString::number(tg, 'f', 3)) .arg(QString::number(tg, 'f', 3))
.arg(QString::number(t2, 'f', 3)); .arg(QString::number(t2, 'f', 3));
} }

View File

@ -41,6 +41,10 @@ QPair<ExperimentData,ExperimentData> calculateStartAndEndData();
float calculateArea(); float calculateArea();
double obtainTimeValueBasedOnTemperatureValue(const double sampleTemp); double obtainTimeValueBasedOnTemperatureValue(const double sampleTemp);
ExperimentData findOnSetDataByTemperature(const double x1,const double x2);
ExperimentData findEndSetDataByTemperature(const double x1,const double x2);
// text format // text format
QString textFormatPeakPoint(const float enthalpyValue, QString textFormatPeakPoint(const float enthalpyValue,
const float peakValue, const float peakValue,

View File

@ -18,6 +18,8 @@ QVector<double> _enthalpyCoefficientVtr;
bool _displayTimeValue = false; bool _displayTimeValue = false;
LanguageType _languageType = LanguageType::Chinese;
QString converDoubleToStr(const double num) QString converDoubleToStr(const double num)
{ {
return QString::number(num,'f',3); return QString::number(num,'f',3);

View File

@ -30,8 +30,16 @@ const QString RateStr("rate");
// //
const double DefaultParamter = 8.177; const double DefaultParamter = 8.177;
const double OnsetAndEndSetRate = 0.01;
// //
enum LanguageType{
Chinese,
English
};
const QString EnglishStr("English");
const QString ChineseStr("中文");
enum Mode{ enum Mode{
None, None,
Analysis, Analysis,
@ -110,6 +118,8 @@ extern bool _enthalpyCoefficientEnableFlag;
extern QVector<double> _enthalpyCoefficientVtr; extern QVector<double> _enthalpyCoefficientVtr;
// peak comprehensive ananlysis // peak comprehensive ananlysis
extern bool _displayTimeValue; extern bool _displayTimeValue;
//
extern LanguageType _languageType;
// common func // common func
QString converDoubleToStr(const double); QString converDoubleToStr(const double);

1364
src/language/cn.ts Normal file

File diff suppressed because it is too large Load Diff

1364
src/language/en.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -514,3 +514,15 @@ void MainWindow::on_actionSaveas_triggered()
saveFile(Global::_experimentInfo.sampleName,Global::Mode::None); saveFile(Global::_experimentInfo.sampleName,Global::Mode::None);
_leftWidget->reloadFileName(); _leftWidget->reloadFileName();
} }
void MainWindow::on_actionLanguage_triggered()
{
if(Global::_languageType == Global::LanguageType::Chinese){
Global::_languageType = Global::LanguageType::English;
ui->actionLanguage->setText(Global::EnglishStr);
}else{
Global::_languageType = Global::LanguageType::Chinese;
ui->actionLanguage->setText(Global::ChineseStr);
}
}

View File

@ -96,6 +96,8 @@ private slots:
void on_actionSaveas_triggered(); void on_actionSaveas_triggered();
void on_actionLanguage_triggered();
private: private:
void connections(); void connections();
void setActionEnable(const bool); void setActionEnable(const bool);

View File

@ -78,6 +78,7 @@
<property name="title"> <property name="title">
<string>语言</string> <string>语言</string>
</property> </property>
<addaction name="actionLanguage"/>
</widget> </widget>
<widget class="QMenu" name="menu_7"> <widget class="QMenu" name="menu_7">
<property name="title"> <property name="title">
@ -335,6 +336,11 @@
<string>另存为</string> <string>另存为</string>
</property> </property>
</action> </action>
<action name="actionLanguage">
<property name="text">
<string>language</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="images.qrc"/> <include location="images.qrc"/>

View File

@ -7,8 +7,6 @@ AxisSettingForm::AxisSettingForm(QWidget *parent) :
ui(new Ui::AxisSettingForm) ui(new Ui::AxisSettingForm)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
AxisSettingForm::~AxisSettingForm() AxisSettingForm::~AxisSettingForm()

View File

@ -184,7 +184,7 @@ void CentralWidget::slotRecvCommonData(const CommonData &cd)
_currentCurve->addData(index++,cd.sample_temp, cd.dsc); _currentCurve->addData(index++,cd.sample_temp, cd.dsc);
// _customPlot->rescaleAxes(); // _customPlot->rescaleAxes();
_customPlot->replot(); _customPlot->replot();
// return; // return;
@ -211,6 +211,7 @@ void CentralWidget::slotRecvCommonData(const CommonData &cd)
logde<<"_currentCurveExperimentDataPtr dataVtr size:" logde<<"_currentCurveExperimentDataPtr dataVtr size:"
<<Global::_currentCurveExperimentDataPtr->dataVtr.size(); <<Global::_currentCurveExperimentDataPtr->dataVtr.size();
#endif #endif
} }
void CentralWidget::slotRecvAnalysisFileName(const QString &filePath) void CentralWidget::slotRecvAnalysisFileName(const QString &filePath)
@ -232,56 +233,6 @@ void CentralWidget::slotRecvAnalysisFileName(const QString &filePath)
// //
uiLoadXlsxFileData(); uiLoadXlsxFileData();
#if 0
for(int i = 0;i < cfd.phaseTotalVtr.size();i++){
Global::PhaseTotalInfo& pti = cfd.phaseTotalVtr[i];
PointCalculate::setAnalysisData(pti.dataVtr);
QPair<QPointF,QPointF>startEndPointPair = PointCalculate::getStartAndEndPoint();
QPointF endPoint = startEndPointPair.second;
_customPlot->xAxis->setRange(0, endPoint.x() / 3 * 4);
QPair<float, float> maxMinPair = PointCalculate::getMaxMinValue();
float absY = std::abs(maxMinPair.first - maxMinPair.second);
_customPlot->yAxis->setRange(- absY * 2,absY *2);
_customPlot->yAxis->setLabel("DSC/mW");
_customPlot->xAxis->setLabel("Temp/℃");
QVector<Global::ExperimentData> dataVtr;
QVector<double> tVtr,xVtr, yVtr;
int index = 0;
for (Global::ExperimentData &ed : pti.dataVtr)
{
tVtr.push_back(index++);
xVtr.push_back(ed.sampleTemp);
yVtr.push_back(ed.dsc);
}
_currentCurve = new QCPCurve(_customPlot->xAxis, _customPlot->yAxis);
_currentCurve->setData(tVtr, xVtr, yVtr);
_currentCurve->setSelectable(QCP::stWhole); // 设置曲线可选
_currentCurve->setLineStyle(QCPCurve::lsLine); // 线性连接
_currentCurve->setObjectName(filePath);
pti.curve = _currentCurve;
}
// Add analysis operation data.
if(cfd.analysisOperationVtr.size() > 0){
for(AnaOpRecorder::AnalysisOperation& ao
:cfd.analysisOperationVtr){
loadAnalysisData(ao.mode,ao.x1,ao.x2,filePath);
}
}
// Refresh ui.
_customPlot->rescaleAxes();
_customPlot->replot();
#endif
} }
void CentralWidget::slotAnalysisSettingApply() void CentralWidget::slotAnalysisSettingApply()
@ -796,30 +747,26 @@ PointCalculate::Line CentralWidget::calculateLinearRegression(const QVector<doub
return line; return line;
} }
QPointF CentralWidget::OnsetTemperaturePointHandle(const double x1,const double x2) QPointF CentralWidget::onsetTemperaturePointHandle(const double x1,const double x2)
{ {
QVector<QPointF> rowPointVtr = PointCalculate::getPointVtrInXRange(x1,x2); Global::ExperimentData ed = PointCalculate::findOnSetDataByTemperature(x1,x2);
QVector<QPointF> pointVtr = PointCalculate::movingAveragePoint(rowPointVtr,5); if(_axisMode == AxisMode::SingleY){
return QPointF(ed.sampleTemp,ed.dsc);
QVector<double> xVtr,yVtr; }else{
for (QPointF &point : pointVtr) { return QPointF(ed.runTime,ed.dsc);
xVtr.push_back(point.x());
yVtr.push_back(point.y());
} }
}
double coeff[3] = {0}; QPointF CentralWidget::endSetTemperaturePointHandle(const double x1, const double x2)
Global::quadraticLeastSquaresFit(xVtr.data(),yVtr.data(),xVtr.size(),coeff); {
Global::ExperimentData ed = PointCalculate::findEndSetDataByTemperature(x1,x2);
// derivative if(_axisMode == AxisMode::SingleY){
double a = coeff[0] * 2; return QPointF(ed.sampleTemp,ed.dsc);
double b = coeff[1]; }else{
return QPointF(ed.runTime,ed.dsc);
double targetX = Global::findNegativeStartPoint(a,b,pointVtr.first().x(),pointVtr.last().x()); }
logde<<"traget x:"<<targetX;
// QPointF targetPoint = PointCalculate::getClosestPointByX(targetX);
return PointCalculate::getClosestPointByX(targetX);
} }
// 二次多项式拟合函数 // 二次多项式拟合函数
@ -884,6 +831,7 @@ void CentralWidget::setEventHandlerEnable(const bool flag)
_line2->point1->setCoords(xRight,_line2->point1->coords().y()); _line2->point1->setCoords(xRight,_line2->point1->coords().y());
_line2->point2->setCoords(xRight,_line2->point2->coords().y()); _line2->point2->setCoords(xRight,_line2->point2->coords().y());
#endif #endif
lineVisiableFunc(_line1); lineVisiableFunc(_line1);
if(AnalysisMode::NumericalLabel != _analysisMode){ if(AnalysisMode::NumericalLabel != _analysisMode){
lineVisiableFunc(_line2); lineVisiableFunc(_line2);
@ -901,8 +849,7 @@ QPointF CentralWidget::getTheCoordinatesOfTheTextBox(const QPointF point)
QVector<double> ticks = _customPlot->xAxis->tickVector(); QVector<double> ticks = _customPlot->xAxis->tickVector();
int numTicks = ticks.size(); int numTicks = ticks.size();
logde<<"ticks:"<<numTicks; // logde<<"ticks:"<<numTicks;
double distance = (xMax - xMin) / ticks.size(); double distance = (xMax - xMin) / ticks.size();
@ -1033,7 +980,7 @@ void CentralWidget::clearData(const CentralWidget::ClearDataMode mode)
QCPAbstractPlottable* plottable = _customPlot->plottable(i); QCPAbstractPlottable* plottable = _customPlot->plottable(i);
if (auto curve = dynamic_cast<QCPCurve*>(plottable)) { if (auto curve = dynamic_cast<QCPCurve*>(plottable)) {
logde<<"clear data,curve object Name:"<<curve->objectName().toStdString(); logde<<"clear data,curve object Name:"<<curve->objectName().toStdString();
if(curve->objectName() == ItemManager::TemporaryStr){ if(curve->objectName().contains( ItemManager::TemporaryStr)){
_customPlot->removePlottable(curve); _customPlot->removePlottable(curve);
ItemManager::removeItem(curve); ItemManager::removeItem(curve);
@ -1045,7 +992,7 @@ void CentralWidget::clearData(const CentralWidget::ClearDataMode mode)
for (int i = _customPlot->graphCount() - 1; i >= 0; --i) { for (int i = _customPlot->graphCount() - 1; i >= 0; --i) {
QCPGraph *graph = _customPlot->graph(i); QCPGraph *graph = _customPlot->graph(i);
logde<<"clear data,graph object Name:"<<graph->objectName().toStdString(); logde<<"clear data,graph object Name:"<<graph->objectName().toStdString();
if(graph && graph->objectName() == ItemManager::TemporaryStr){ if(graph && graph->objectName().contains(ItemManager::TemporaryStr)){
_customPlot->removeGraph(graph); _customPlot->removeGraph(graph);
ItemManager::removeItem(graph); ItemManager::removeItem(graph);
@ -1060,7 +1007,7 @@ void CentralWidget::clearData(const CentralWidget::ClearDataMode mode)
QCPAbstractItem *item = _customPlot->item(i); QCPAbstractItem *item = _customPlot->item(i);
logde<<"item data,graph object Name:"<<item->objectName().toStdString(); logde<<"item data,graph object Name:"<<item->objectName().toStdString();
if(item && !itemsToKeep.contains(item) if(item && !itemsToKeep.contains(item)
&& item->objectName() == ItemManager::TemporaryStr){ && item->objectName().contains(ItemManager::TemporaryStr)){
_customPlot->removeItem(item); _customPlot->removeItem(item);
ItemManager::removeItem(item); ItemManager::removeItem(item);
@ -1324,21 +1271,21 @@ void CentralWidget::loadAnalysisData(
break; break;
} }
case AnalysisMode::OnsetTemperaturePoint:{ case AnalysisMode::OnsetTemperaturePoint:{
#if 0 QPointF point = onsetTemperaturePointHandle(x1,x2);
QPointF point = OnsetTemperaturePointHandle(x1,x2); logde<<"onset point:"<<point.x()<<","<<point.y();
QString str = QString::number(point.y(),'f',3);
drawText(point,str);
#endif
QPointF point = OnsetTemperaturePointHandle(x1,x2);
QString str = QString::number(point.x(),'f',3); QString str = QString::number(point.x(),'f',3);
drawText(point,str,objectName); drawText(point,str,objectName);
break; break;
} }
case AnalysisMode::EndsetTemperaturePoint:{ case AnalysisMode::EndsetTemperaturePoint:{
QPointF point = endSetTemperaturePointHandle(x1,x2);
QString str = QString::number(point.x(),'f',3);
logde<<"object name:"<<objectName.toStdString();
drawText(point,str,objectName);
break; break;
} }
default: default:

View File

@ -86,7 +86,8 @@ private:
PointCalculate::Line calculateLinearRegression(const QVector<double>& x, PointCalculate::Line calculateLinearRegression(const QVector<double>& x,
const QVector<double>& y); const QVector<double>& y);
QPointF OnsetTemperaturePointHandle(const double x1,const double x2); QPointF onsetTemperaturePointHandle(const double x1,const double x2);
QPointF endSetTemperaturePointHandle(const double x1,const double x2);
void setEventHandlerEnable(const bool); void setEventHandlerEnable(const bool);
QPointF getTheCoordinatesOfTheTextBox(const QPointF point); QPointF getTheCoordinatesOfTheTextBox(const QPointF point);