2025-03-27T17:31:17
This commit is contained in:
parent
86dbbe706d
commit
6021f8132a
@ -19,7 +19,9 @@ SOURCES += \
|
|||||||
data/filemanager.cpp \
|
data/filemanager.cpp \
|
||||||
data/peakpoint.cpp \
|
data/peakpoint.cpp \
|
||||||
global.cpp \
|
global.cpp \
|
||||||
|
logger/logger.cpp \
|
||||||
rightwidget.cpp \
|
rightwidget.cpp \
|
||||||
|
thirdparty/easylogging/easylogging++.cc \
|
||||||
ui/analysissettingform.cpp \
|
ui/analysissettingform.cpp \
|
||||||
ui/centralwidget.cpp \
|
ui/centralwidget.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
@ -37,7 +39,9 @@ HEADERS += \
|
|||||||
data/peakpoint.h \
|
data/peakpoint.h \
|
||||||
defines.h \
|
defines.h \
|
||||||
global.h \
|
global.h \
|
||||||
|
logger/logger.h \
|
||||||
rightwidget.h \
|
rightwidget.h \
|
||||||
|
thirdparty/easylogging/easylogging++.h \
|
||||||
ui/analysissettingform.h \
|
ui/analysissettingform.h \
|
||||||
ui/centralwidget.h \
|
ui/centralwidget.h \
|
||||||
mainwindow.h \
|
mainwindow.h \
|
||||||
@ -57,6 +61,8 @@ FORMS += \
|
|||||||
|
|
||||||
INCLUDEPATH += serialport \
|
INCLUDEPATH += serialport \
|
||||||
ui \
|
ui \
|
||||||
|
logger \
|
||||||
|
thirdparty/easylogging \
|
||||||
thirdparty/qcustomplot \
|
thirdparty/qcustomplot \
|
||||||
data
|
data
|
||||||
|
|
||||||
@ -67,3 +73,6 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
|
|||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
images.qrc
|
images.qrc
|
||||||
|
|
||||||
|
DISTFILES += \
|
||||||
|
logger/log.conf
|
||||||
|
|||||||
@ -3,9 +3,9 @@
|
|||||||
#include "peakpoint.h"
|
#include "peakpoint.h"
|
||||||
|
|
||||||
QVector<FileManager::ExperimentData>PeakPoint:: _dataVtr;
|
QVector<FileManager::ExperimentData>PeakPoint:: _dataVtr;
|
||||||
double PeakPoint::_leftPointX,PeakPoint::_rightPointX;
|
float PeakPoint::_leftPointX,PeakPoint::_rightPointX;
|
||||||
QPointF PeakPoint::_peakPoint;
|
QPointF PeakPoint::_peakPoint;
|
||||||
QPointF PeakPoint::_leftSelectedPoint,PeakPoint::_rightSelectedPoint;
|
QPointF PeakPoint::_leftSelectedPoint,PeakPoint::_rightSelectedPoint;
|
||||||
|
|
||||||
void PeakPoint::setExperimentData(const QVector<FileManager::ExperimentData> &dataVtr)
|
void PeakPoint::setExperimentData(const QVector<FileManager::ExperimentData> &dataVtr)
|
||||||
{
|
{
|
||||||
@ -20,14 +20,14 @@ QPointF PeakPoint::findPeakPoint(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
QPointF uniquePeak;
|
QPointF uniquePeak;
|
||||||
// 初始化为 double 类型能表示的最小负数,确保能处理负数 y 值
|
// 初始化为 float 类型能表示的最小负数,确保能处理负数 y 值
|
||||||
double maxY = 0.0;
|
float maxY = 0.0;
|
||||||
bool findFlag = false;
|
bool findFlag = false;
|
||||||
|
|
||||||
// 直接在遍历过程中找出最大波峰
|
// 直接在遍历过程中找出最大波峰
|
||||||
for (int i = 1; i < n - 1; ++i) {
|
for (int i = 1; i < n - 1; ++i) {
|
||||||
const double currentX = _dataVtr.at(i).sampleTemp;
|
const float currentX = _dataVtr.at(i).sampleTemp;
|
||||||
const double currentY = _dataVtr.at(i).dsc;
|
const float currentY = _dataVtr.at(i).dsc;
|
||||||
|
|
||||||
if(currentX < _leftPointX){
|
if(currentX < _leftPointX){
|
||||||
continue;
|
continue;
|
||||||
@ -36,8 +36,8 @@ QPointF PeakPoint::findPeakPoint(){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const double preY = _dataVtr.at(i - 1).dsc;
|
const float preY = _dataVtr.at(i - 1).dsc;
|
||||||
const double lastY = _dataVtr.at(i + 1).dsc;
|
const float lastY = _dataVtr.at(i + 1).dsc;
|
||||||
|
|
||||||
findFlag = false;
|
findFlag = false;
|
||||||
if(currentY >= preY && currentY >= lastY){
|
if(currentY >= preY && currentY >= lastY){
|
||||||
@ -47,7 +47,7 @@ QPointF PeakPoint::findPeakPoint(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(findFlag){
|
if(findFlag){
|
||||||
double absY = std::abs(currentY);
|
float absY = std::abs(currentY);
|
||||||
if(absY >= maxY){
|
if(absY >= maxY){
|
||||||
maxY = absY;
|
maxY = absY;
|
||||||
uniquePeak = QPointF(currentX,currentY);
|
uniquePeak = QPointF(currentX,currentY);
|
||||||
@ -60,17 +60,16 @@ QPointF PeakPoint::findPeakPoint(){
|
|||||||
return uniquePeak;
|
return uniquePeak;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QPair<QPointF, QPointF> PeakPoint::calculateMaxDiffPointDetail(
|
QPair<QPointF, QPointF> PeakPoint::calculateMaxDiffPointDetail(
|
||||||
const PeakPoint::MaxDiffPointDetailType type)
|
const PeakPoint::MaxDiffPointDetailType type)
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
double maxDiff = std::numeric_limits<double>::min();
|
float maxDiff = std::numeric_limits<float>::min();
|
||||||
QPointF currentPoint,lastPoint;
|
QPointF currentPoint,lastPoint;
|
||||||
|
|
||||||
for (int i = 0; i < _dataVtr.size() - 1; ++i) {
|
for (int i = 0; i < _dataVtr.size() - 1; ++i) {
|
||||||
const double currentX = _dataVtr.at(i).sampleTemp;
|
const float currentX = _dataVtr.at(i).sampleTemp;
|
||||||
const double currentY = _dataVtr.at(i).dsc;
|
const float currentY = _dataVtr.at(i).dsc;
|
||||||
|
|
||||||
if(type == MaxDiffPointDetailType::Left){
|
if(type == MaxDiffPointDetailType::Left){
|
||||||
if(currentX <= _leftPointX){
|
if(currentX <= _leftPointX){
|
||||||
@ -88,9 +87,9 @@ QPair<QPointF, QPointF> PeakPoint::calculateMaxDiffPointDetail(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
const double lastX = _dataVtr.at(i + 1).sampleTemp;
|
const float lastX = _dataVtr.at(i + 1).sampleTemp;
|
||||||
const double lastY = _dataVtr.at(i + 1).dsc;
|
const float lastY = _dataVtr.at(i + 1).dsc;
|
||||||
double diff = std::abs(currentY - lastY);
|
float diff = std::abs(currentY - lastY);
|
||||||
if(diff > maxDiff){
|
if(diff > maxDiff){
|
||||||
maxDiff = diff;
|
maxDiff = diff;
|
||||||
|
|
||||||
@ -116,14 +115,14 @@ QPair<QPointF, QPointF> PeakPoint::calculateMaxDiffPointRight()
|
|||||||
return calculateMaxDiffPointDetail(MaxDiffPointDetailType::Right);
|
return calculateMaxDiffPointDetail(MaxDiffPointDetailType::Right);
|
||||||
}
|
}
|
||||||
|
|
||||||
double PeakPoint::findClosestY(double targetX)
|
float PeakPoint::findClosestY(float targetX)
|
||||||
{
|
{
|
||||||
double minDiff = std::numeric_limits<double>::max();
|
float minDiff = std::numeric_limits<float>::max();
|
||||||
double closestY = 0.0;
|
float closestY = 0.0;
|
||||||
|
|
||||||
for(FileManager::ExperimentData &ed:_dataVtr){
|
for(FileManager::ExperimentData &ed:_dataVtr){
|
||||||
// 计算当前 x 与目标 x 的差值的绝对值
|
// 计算当前 x 与目标 x 的差值的绝对值
|
||||||
double diff = std::abs(ed.sampleTemp - targetX);
|
float diff = std::abs(ed.sampleTemp - targetX);
|
||||||
// 更新最小差值和对应的 y 值
|
// 更新最小差值和对应的 y 值
|
||||||
if (diff < minDiff) {
|
if (diff < minDiff) {
|
||||||
minDiff = diff;
|
minDiff = diff;
|
||||||
@ -134,7 +133,7 @@ double PeakPoint::findClosestY(double targetX)
|
|||||||
return closestY;
|
return closestY;
|
||||||
}
|
}
|
||||||
|
|
||||||
QPointF PeakPoint::findClosestPointByX(double x) {
|
QPointF PeakPoint::findClosestPointByX(float x) {
|
||||||
int left = 0;
|
int left = 0;
|
||||||
int right = _dataVtr.size() - 1;
|
int right = _dataVtr.size() - 1;
|
||||||
|
|
||||||
@ -161,7 +160,7 @@ QPointF PeakPoint::findClosestPointByX(double x) {
|
|||||||
return targetPoint;
|
return targetPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PeakPoint::setRegionPointX(const double left, const double right)
|
void PeakPoint::setRegionPointX(const float left, const float right)
|
||||||
{
|
{
|
||||||
_leftPointX = left;
|
_leftPointX = left;
|
||||||
_rightPointX = right;
|
_rightPointX = right;
|
||||||
@ -169,14 +168,64 @@ void PeakPoint::setRegionPointX(const double left, const double right)
|
|||||||
_leftSelectedPoint = findClosestPointByX(_leftPointX);
|
_leftSelectedPoint = findClosestPointByX(_leftPointX);
|
||||||
_rightSelectedPoint = findClosestPointByX(_rightPointX);
|
_rightSelectedPoint = findClosestPointByX(_rightPointX);
|
||||||
|
|
||||||
|
findPeakPoint();
|
||||||
|
|
||||||
|
updateStartEndPoint();
|
||||||
|
|
||||||
qDebug()<<"left,right point:"<<_leftSelectedPoint
|
qDebug()<<"left,right point:"<<_leftSelectedPoint
|
||||||
<<","<<_rightSelectedPoint;
|
<<","<<_rightSelectedPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString PeakPoint::textFormat(const double enthalpyValue,
|
QVector<QPointF> PeakPoint::getPeakPointGroup()
|
||||||
const double peakValue,
|
{
|
||||||
const double startPoint,
|
QVector<QPointF> pointVtr;
|
||||||
const double endPoint)
|
for(FileManager::ExperimentData& ed:_dataVtr) {
|
||||||
|
if(ed.sampleTemp >= _leftSelectedPoint.x() && ed.sampleTemp <= _rightSelectedPoint.x()){
|
||||||
|
pointVtr.push_back(QPointF(ed.sampleTemp,ed.dsc));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pointVtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPair<QPointF, QPointF> PeakPoint::calculateStartAndEndPoint()
|
||||||
|
{
|
||||||
|
QPair<QPointF,QPointF> leftMaxDiffPointPair = PeakPoint::calculateMaxDiffPointLeft();
|
||||||
|
QPair<QPointF,QPointF> rightMaxDiffPointPair = PeakPoint::calculateMaxDiffPointRight();
|
||||||
|
|
||||||
|
QPointF startPoint = calculateIntersection(_leftSelectedPoint,_rightSelectedPoint,
|
||||||
|
leftMaxDiffPointPair.first,leftMaxDiffPointPair.second);
|
||||||
|
|
||||||
|
QPointF endPoint = calculateIntersection(_leftSelectedPoint,_rightSelectedPoint,
|
||||||
|
rightMaxDiffPointPair.first,rightMaxDiffPointPair.second);
|
||||||
|
|
||||||
|
return qMakePair(startPoint,endPoint);
|
||||||
|
}
|
||||||
|
void PeakPoint::updateStartEndPoint()
|
||||||
|
{
|
||||||
|
//需要在a1和a2之间查询是否有高于a1和a2之间的点,若存在,则重新给a1、a2赋值
|
||||||
|
|
||||||
|
for(FileManager::ExperimentData& ed:_dataVtr){
|
||||||
|
if(ed.sampleTemp > _leftSelectedPoint.x() && ed.sampleTemp < _peakPoint.x()){
|
||||||
|
if(ed.dsc > _leftSelectedPoint.y()){
|
||||||
|
_leftSelectedPoint.setX(ed.sampleTemp);
|
||||||
|
_leftSelectedPoint.setY(ed.dsc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ed.sampleTemp < _rightSelectedPoint.x() && ed.sampleTemp > _peakPoint.x()){
|
||||||
|
if(ed.dsc > _rightSelectedPoint.y()){
|
||||||
|
_rightSelectedPoint.setX(ed.sampleTemp);
|
||||||
|
_rightSelectedPoint.setY(ed.dsc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QString PeakPoint::textFormat(const float enthalpyValue,
|
||||||
|
const float peakValue,
|
||||||
|
const float startPoint,
|
||||||
|
const float endPoint)
|
||||||
{
|
{
|
||||||
return QString("峰的综合信息:\n"
|
return QString("峰的综合信息:\n"
|
||||||
"焓值:%1 J/g \n"
|
"焓值:%1 J/g \n"
|
||||||
@ -193,28 +242,40 @@ QString PeakPoint::textFormat(const double enthalpyValue,
|
|||||||
QPointF PeakPoint::calculateIntersection(const QPointF p1,const QPointF p2,
|
QPointF PeakPoint::calculateIntersection(const QPointF p1,const QPointF p2,
|
||||||
const QPointF p3, const QPointF p4){
|
const QPointF p3, const QPointF p4){
|
||||||
// 直线的一般式: A1x + B1y + C1 = 0 和 A2x + B2y + C2 = 0
|
// 直线的一般式: A1x + B1y + C1 = 0 和 A2x + B2y + C2 = 0
|
||||||
double A1 = p2.y() - p1.y();
|
float A1 = p2.y() - p1.y();
|
||||||
double B1 = p1.x() - p2.x();
|
float B1 = p1.x() - p2.x();
|
||||||
double C1 = A1 * p1.x() + B1 * p1.y();
|
float C1 = A1 * p1.x() + B1 * p1.y();
|
||||||
|
|
||||||
double A2 = p4.y() - p3.y();
|
float A2 = p4.y() - p3.y();
|
||||||
double B2 = p3.x() - p4.x();
|
float B2 = p3.x() - p4.x();
|
||||||
double C2 = A2 * p3.x() + B2 * p3.y();
|
float C2 = A2 * p3.x() + B2 * p3.y();
|
||||||
|
|
||||||
double determinant = A1 * B2 - A2 * B1;
|
float determinant = A1 * B2 - A2 * B1;
|
||||||
|
|
||||||
if (determinant == 0) {
|
if (determinant == 0) {
|
||||||
// 两条直线平行或重合,无交点或无限交点
|
// 两条直线平行或重合,无交点或无限交点
|
||||||
return {0, 0};
|
return {0, 0};
|
||||||
} else {
|
} else {
|
||||||
double x = (B2 * C1 - B1 * C2) / determinant;
|
float x = (B2 * C1 - B1 * C2) / determinant;
|
||||||
double y = (A1 * C2 - A2 * C1) / determinant;
|
float y = (A1 * C2 - A2 * C1) / determinant;
|
||||||
return {x, y};
|
return {x, y};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double PeakPoint::calculateArea(const std::vector<QPointF> &points) {
|
float PeakPoint::calculateArea() {
|
||||||
double integral = 0.0;
|
//getPoint group
|
||||||
|
QVector<QPointF> points = getPeakPointGroup();
|
||||||
|
#if 0
|
||||||
|
for(QPointF point:points){
|
||||||
|
qDebug()<<"x,y:"<<QString::number(point.x(),'f',3)<<","
|
||||||
|
<<QString::number(point.y(),'f',3);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
qDebug()<<QString::number(points.at(0).x(),'f',3)<<","<<
|
||||||
|
QString::number(points.at(points.size() - 1).x(),'f',3);
|
||||||
|
|
||||||
|
//calculate Area
|
||||||
|
float integral = 0.0;
|
||||||
size_t n = points.size();
|
size_t n = points.size();
|
||||||
|
|
||||||
if (n < 2) {
|
if (n < 2) {
|
||||||
@ -222,11 +283,20 @@ double PeakPoint::calculateArea(const std::vector<QPointF> &points) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 1; i < n; ++i) {
|
for (size_t i = 1; i < n; ++i) {
|
||||||
double dx = points[i].x() - points[i - 1].x();
|
float dx = points[i].x() - points[i - 1].x();
|
||||||
double avg_y = (points[i].y() + points[i - 1].y()) / 2.0;
|
float avg_y = (points[i].y() + points[i - 1].y()) / 2.0;
|
||||||
integral += dx * avg_y;
|
|
||||||
|
float step = dx * std::abs(avg_y);
|
||||||
|
qDebug()<<points[i].x()<<","<<points[i].y()<<"integral:"<<integral<<","<<step;
|
||||||
|
|
||||||
|
integral += dx * std::abs(avg_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
return integral;
|
return integral;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -8,16 +8,17 @@
|
|||||||
|
|
||||||
namespace PeakPoint{
|
namespace PeakPoint{
|
||||||
void setExperimentData(const QVector<FileManager::ExperimentData>&);
|
void setExperimentData(const QVector<FileManager::ExperimentData>&);
|
||||||
void setRegionPointX(const double,const double);
|
void setRegionPointX(const float,const float);
|
||||||
double findClosestY(double targetX);
|
float findClosestY(float targetX);
|
||||||
QPointF findPeakPoint();
|
QPointF findPeakPoint();
|
||||||
QString textFormat(const double enthalpyValue,
|
QString textFormat(const float enthalpyValue,
|
||||||
const double peakValue,
|
const float peakValue,
|
||||||
const double startPoint,
|
const float startPoint,
|
||||||
const double endPoint);
|
const float endPoint);
|
||||||
|
QPair<QPointF,QPointF> calculateStartAndEndPoint();
|
||||||
|
float calculateArea();
|
||||||
//private
|
//private
|
||||||
|
void updateStartEndPoint();
|
||||||
QPair<QPointF,QPointF> calculateMaxDiffPointLeft();
|
QPair<QPointF,QPointF> calculateMaxDiffPointLeft();
|
||||||
QPair<QPointF,QPointF> calculateMaxDiffPointRight();
|
QPair<QPointF,QPointF> calculateMaxDiffPointRight();
|
||||||
enum MaxDiffPointDetailType{
|
enum MaxDiffPointDetailType{
|
||||||
@ -28,11 +29,11 @@ QPair<QPointF,QPointF> calculateMaxDiffPointDetail(const MaxDiffPointDetailType
|
|||||||
|
|
||||||
QPointF calculateIntersection(const QPointF p1,const QPointF p2,
|
QPointF calculateIntersection(const QPointF p1,const QPointF p2,
|
||||||
const QPointF p3, const QPointF p4);
|
const QPointF p3, const QPointF p4);
|
||||||
double calculateArea(const std::vector<QPointF> &points);
|
QPointF findClosestPointByX(float target);
|
||||||
QPointF findClosestPointByX(double target);
|
QVector<QPointF> getPeakPointGroup();
|
||||||
|
|
||||||
extern QVector<FileManager::ExperimentData> _dataVtr;
|
extern QVector<FileManager::ExperimentData> _dataVtr;
|
||||||
extern double _leftPointX,_rightPointX;
|
extern float _leftPointX,_rightPointX;
|
||||||
extern QPointF _peakPoint;
|
extern QPointF _peakPoint;
|
||||||
extern QPointF _leftSelectedPoint,_rightSelectedPoint;
|
extern QPointF _leftSelectedPoint,_rightSelectedPoint;
|
||||||
}
|
}
|
||||||
|
|||||||
11
src/logger/log.conf
Normal file
11
src/logger/log.conf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
*GLOBAL:
|
||||||
|
ENABLED = true
|
||||||
|
TO_FILE = true
|
||||||
|
TO_STANDARD_OUTPUT = true
|
||||||
|
FORMAT = "[%datetime] %msg"
|
||||||
|
FILENAME = "log-sdk/%datetime{%Y%M%d}.log"
|
||||||
|
MILLISECONDS_WIDTH = 3
|
||||||
|
PERFORMANCE_TRACKING = false
|
||||||
|
MAX_LOG_FILE_SIZE = 104857600
|
||||||
|
LOG_FLUSH_THRESHOLD = 0
|
||||||
|
|
||||||
15
src/logger/logger.cpp
Normal file
15
src/logger/logger.cpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#include "logger.h"
|
||||||
|
|
||||||
|
INITIALIZE_EASYLOGGINGPP
|
||||||
|
|
||||||
|
Logger::Logger()
|
||||||
|
{
|
||||||
|
el::Configurations conf("log.conf");
|
||||||
|
el::Loggers::reconfigureAllLoggers(conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger *Logger::instance()
|
||||||
|
{
|
||||||
|
static Logger ins;
|
||||||
|
return &ins;
|
||||||
|
}
|
||||||
20
src/logger/logger.h
Normal file
20
src/logger/logger.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef LOGGER_H
|
||||||
|
#define LOGGER_H
|
||||||
|
|
||||||
|
#include "easylogging++.h"
|
||||||
|
|
||||||
|
#define logde LOG(DEBUG)
|
||||||
|
#define loger LOG(ERROR)
|
||||||
|
#define logfa LOG(FATAL)
|
||||||
|
|
||||||
|
#define logFeature LOG(INFO)
|
||||||
|
#define logMatch LOG(WARNING)
|
||||||
|
|
||||||
|
class Logger
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit Logger();
|
||||||
|
static Logger *instance();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // LOGGER_H
|
||||||
@ -8,9 +8,13 @@
|
|||||||
#include "realtimedataform.h"
|
#include "realtimedataform.h"
|
||||||
#include "experimentsettingform.h"
|
#include "experimentsettingform.h"
|
||||||
#include "filemanager.h"
|
#include "filemanager.h"
|
||||||
|
#include "logger.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
Logger::instance();
|
||||||
|
logde<<"main...";
|
||||||
|
|
||||||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 启用高DPI缩放
|
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 启用高DPI缩放
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
|
|||||||
3112
src/thirdparty/easylogging/easylogging++.cc
vendored
Normal file
3112
src/thirdparty/easylogging/easylogging++.cc
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4577
src/thirdparty/easylogging/easylogging++.h
vendored
Normal file
4577
src/thirdparty/easylogging/easylogging++.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -22,8 +22,8 @@ public slots:
|
|||||||
void slotRecvLineXCoord(const int,const double);
|
void slotRecvLineXCoord(const int,const double);
|
||||||
private slots:
|
private slots:
|
||||||
void slotApply();
|
void slotApply();
|
||||||
void slotConfirm();
|
|
||||||
void slotUndo();
|
void slotUndo();
|
||||||
|
void slotConfirm();
|
||||||
void slotCancel();
|
void slotCancel();
|
||||||
private:
|
private:
|
||||||
QDoubleSpinBox *_leftBorderSpinBox,*_rightBorderSpinBox;
|
QDoubleSpinBox *_leftBorderSpinBox,*_rightBorderSpinBox;
|
||||||
|
|||||||
@ -7,6 +7,7 @@
|
|||||||
#include "centralwidget.h"
|
#include "centralwidget.h"
|
||||||
#include "filemanager.h"
|
#include "filemanager.h"
|
||||||
#include "peakpoint.h"
|
#include "peakpoint.h"
|
||||||
|
#include "logger.h"
|
||||||
|
|
||||||
CentralWidget::CentralWidget(QWidget *parent)
|
CentralWidget::CentralWidget(QWidget *parent)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
@ -73,11 +74,14 @@ CentralWidget::~CentralWidget()
|
|||||||
|
|
||||||
void CentralWidget::setAnalysisMode(const CentralWidget::AnalysisMode mode)
|
void CentralWidget::setAnalysisMode(const CentralWidget::AnalysisMode mode)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
if(_nanlysisMode == mode){
|
if(_nanlysisMode == mode){
|
||||||
return;
|
return;
|
||||||
}else{
|
}else{
|
||||||
_nanlysisMode = mode;
|
_nanlysisMode = mode;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
_nanlysisMode = mode;
|
||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
@ -194,25 +198,20 @@ void CentralWidget::slotAnalysisSettingApply()
|
|||||||
|
|
||||||
PeakPoint::setRegionPointX(x1,x2);
|
PeakPoint::setRegionPointX(x1,x2);
|
||||||
|
|
||||||
QPointF point = PeakPoint::findPeakPoint();
|
//enthalpy
|
||||||
qDebug()<<"peak point:"<<point;
|
double enthalpyValue = PeakPoint::calculateArea();
|
||||||
|
//peak
|
||||||
|
QPointF peakPoint = PeakPoint::findPeakPoint();
|
||||||
|
// qDebug()<<"peak point:"<<point;
|
||||||
|
//start point and end point
|
||||||
|
QPair<QPointF, QPointF> startEndPointPair = PeakPoint::calculateStartAndEndPoint();
|
||||||
|
|
||||||
double enthalpyValue = 1.1;
|
drawText(peakPoint,PeakPoint::textFormat(enthalpyValue,
|
||||||
double peakValue = 3.1;
|
peakPoint.x(),
|
||||||
double startPoint = 4.1;
|
startEndPointPair.first.x(),
|
||||||
double endPoint = 5.1;
|
startEndPointPair.second.x()));
|
||||||
|
//
|
||||||
drawText(point,PeakPoint::textFormat(
|
break;
|
||||||
enthalpyValue,peakValue,startPoint,endPoint));
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
QString PeakPoint::textFormat(const double enthalpyValue,
|
|
||||||
const double peakValue,
|
|
||||||
const double startPoint,
|
|
||||||
const double endPoint)
|
|
||||||
#endif
|
|
||||||
//
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -274,16 +273,18 @@ void CentralWidget::contextMenuEvent(QContextMenuEvent *event)
|
|||||||
|
|
||||||
void CentralWidget::setEventHandlerEnable(const bool flag)
|
void CentralWidget::setEventHandlerEnable(const bool flag)
|
||||||
{
|
{
|
||||||
// 当竖线隐藏时,需要设置不可选择模式。
|
logde<<"setEventHandlerEnable..."<<flag;
|
||||||
// _line1->setSelectable(false);
|
|
||||||
_eventHandler->setEnable(flag);
|
|
||||||
_line1->setVisible(flag);
|
|
||||||
|
|
||||||
|
// todo. 当竖线隐藏时,需要设置不可选择模式。
|
||||||
|
_eventHandler->setEnable(flag);
|
||||||
|
|
||||||
|
_line1->setVisible(flag);
|
||||||
if(AnalysisMode::NumericalLabel != _nanlysisMode){
|
if(AnalysisMode::NumericalLabel != _nanlysisMode){
|
||||||
_line2->setVisible(flag);
|
_line2->setVisible(flag);
|
||||||
}
|
}
|
||||||
_customPlot->replot();
|
_customPlot->replot();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CentralWidget::drawText(const QPointF point, const QString text)
|
void CentralWidget::drawText(const QPointF point, const QString text)
|
||||||
{
|
{
|
||||||
// double y = PeakPoint::findClosestY(x);
|
// double y = PeakPoint::findClosestY(x);
|
||||||
@ -417,6 +418,39 @@ void CentralWidget::fillGraph(const double x1, const double x2)
|
|||||||
|
|
||||||
void CentralWidget::clearAllData()
|
void CentralWidget::clearAllData()
|
||||||
{
|
{
|
||||||
|
#if 1
|
||||||
|
// Set lines visiable false.
|
||||||
|
_line1->setVisible(false);
|
||||||
|
_line2->setVisible(false);
|
||||||
|
|
||||||
|
// Clear the data of graph.
|
||||||
|
if (_customPlot->graphCount() > 0 && _graph)
|
||||||
|
{
|
||||||
|
_graph->setData(QVector<double>(), QVector<double>());
|
||||||
|
}
|
||||||
|
_graph->setBrush(QBrush(Qt::transparent));
|
||||||
|
|
||||||
|
// Clear graph on plot.
|
||||||
|
for (int i = _customPlot->graphCount() - 1; i >= 0; --i) {
|
||||||
|
QCPGraph *graph = _customPlot->graph(i);
|
||||||
|
if (graph != _graph) {
|
||||||
|
_customPlot->removeGraph(graph);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Delete items.
|
||||||
|
QList<QCPAbstractItem *> itemsToKeep;
|
||||||
|
itemsToKeep << _line1 << _line2;
|
||||||
|
|
||||||
|
for (int i = _customPlot->itemCount() - 1; i >= 0; --i) {
|
||||||
|
QCPAbstractItem *item = _customPlot->item(i);
|
||||||
|
if (!itemsToKeep.contains(item)) {
|
||||||
|
_customPlot->removeItem(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重绘图表以显示更改
|
||||||
|
_customPlot->replot();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// 删除不需要的 Item
|
// 删除不需要的 Item
|
||||||
@ -448,39 +482,6 @@ void CentralWidget::clearAllData()
|
|||||||
_customPlot->replot();
|
_customPlot->replot();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
|
||||||
_line1->setVisible(false);
|
|
||||||
_line2->setVisible(false);
|
|
||||||
|
|
||||||
|
|
||||||
if (_customPlot->graphCount() > 0 && _graph)
|
|
||||||
{
|
|
||||||
// 清除第一个图表上的数据
|
|
||||||
_graph->setData(QVector<double>(), QVector<double>());
|
|
||||||
}
|
|
||||||
|
|
||||||
// 保留的元素列表
|
|
||||||
QList<QCPAbstractItem *> itemsToKeep;
|
|
||||||
itemsToKeep << _line1 << _line2;
|
|
||||||
|
|
||||||
// 遍历所有项并移除不在保留列表中的项
|
|
||||||
// QCPAbstractItem
|
|
||||||
// QList<QCPAbstractItem *> allItems = _customPlot->item();
|
|
||||||
for (int i = _customPlot->itemCount() - 1; i >= 0; --i) {
|
|
||||||
QCPAbstractItem *item = _customPlot->item(i);
|
|
||||||
if (!itemsToKeep.contains(item)) {
|
|
||||||
// 从图表中移除项
|
|
||||||
_customPlot->removeItem(item);
|
|
||||||
// 删除项,释放内存
|
|
||||||
// delete item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 重绘图表以显示更改
|
|
||||||
_customPlot->replot();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// 遍历并删除所有图形元素,除了指定的元素
|
// 遍历并删除所有图形元素,除了指定的元素
|
||||||
for (int i = _customPlot->itemCount() - 1; i >= 0; --i) {
|
for (int i = _customPlot->itemCount() - 1; i >= 0; --i) {
|
||||||
|
|||||||
@ -67,7 +67,7 @@ bool DragLineHandler::eventFilter(QObject *obj, QEvent *event)
|
|||||||
}
|
}
|
||||||
else if (event->type() == QEvent::MouseButtonPress)
|
else if (event->type() == QEvent::MouseButtonPress)
|
||||||
{
|
{
|
||||||
qDebug()<<"mouse press...";
|
// qDebug()<<"mouse press...";
|
||||||
|
|
||||||
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
|
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
|
||||||
if (mouseEvent->button() == Qt::LeftButton)
|
if (mouseEvent->button() == Qt::LeftButton)
|
||||||
@ -125,7 +125,7 @@ void DragLineHandler::updateSelectedRegion()
|
|||||||
int index1 = findClosestIndex(xData, x1);
|
int index1 = findClosestIndex(xData, x1);
|
||||||
int index2 = findClosestIndex(xData, x2);
|
int index2 = findClosestIndex(xData, x2);
|
||||||
|
|
||||||
qDebug() << "Selected region: [" << xData[index1] << ", " << xData[index2] << "]";
|
// qDebug() << "Selected region: [" << xData[index1] << ", " << xData[index2] << "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
int DragLineHandler::findClosestIndex(const QVector<double> &data, double target)
|
int DragLineHandler::findClosestIndex(const QVector<double> &data, double target)
|
||||||
|
|||||||
@ -25,7 +25,6 @@ public slots:
|
|||||||
void slotRecvPhaseInfo(const QByteArray &);
|
void slotRecvPhaseInfo(const QByteArray &);
|
||||||
private slots:
|
private slots:
|
||||||
void on_pushButton_deliverData_clicked();
|
void on_pushButton_deliverData_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//ui
|
//ui
|
||||||
void uiReset();
|
void uiReset();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user