logplus/DataMgr/src/StatisticsDlg.cpp
2026-01-29 16:57:06 +08:00

412 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma warning(push,0)
// #include "Family.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QPixmap>
#include <QDesktopServices>
#include <QRegExpValidator>
#include "StatisticsDlg.h"
#include "ui_Statistics.h"
#include "CStringType.h"
#include "Well.h"
#pragma warning(pop)
using namespace pai::ios::welllog;
BEGIN_OSGGRAPHICS_NAMESPACE
CStatisticsDlg::CStatisticsDlg(QWidget * parent, Qt::WindowFlags flags)
: QWidget(parent,flags)
{
m_pUI = new Ui_Statistics();
m_pUI->setupUi(this);
int w=width();
int h=height();
if(NULL != parent)
{
parent->setFixedSize(w,h);
}
m_pUI->cancelbtn->hide();
QObject::connect(m_pUI->okbtn, SIGNAL(clicked()), this, SLOT(slotSave()));
QObject::connect(m_pUI->cancelbtn, SIGNAL(clicked()), this, SLOT(slotCancel()));
QObject::connect(m_pUI->checkBox, SIGNAL(clicked()), this, SLOT(slotCheckLjpl()));
QObject::connect(m_pUI->lineEditName, SIGNAL(textChanged( QString )),this,SLOT(slotChangeName(QString)));
QObject::connect(m_pUI->lineEditUnit, SIGNAL(textChanged( QString )),this,SLOT(slotChangeUnit(QString)));
QObject::connect(m_pUI->lineEditXmin, SIGNAL(textChanged( QString )),this,SLOT(slotChangeXmin(QString)));
QObject::connect(m_pUI->lineEditXmin2, SIGNAL(textChanged( QString )),this,SLOT(slotChangeXmin2(QString)));
QObject::connect(m_pUI->lineEditYmin, SIGNAL(textChanged( QString )),this,SLOT(slotChangeYmin(QString)));
QObject::connect(m_pUI->lineEditXmax, SIGNAL(textChanged( QString )),this,SLOT(slotChangeXmax(QString)));
QObject::connect(m_pUI->lineEditXmax2, SIGNAL(textChanged( QString )),this,SLOT(slotChangeXmax2(QString)));
QObject::connect(m_pUI->lineEditYmax, SIGNAL(textChanged( QString )),this,SLOT(slotChangeYmax(QString)));
QObject::connect(m_pUI->lineEditSdep, SIGNAL(textChanged( QString )),this,SLOT(slotChangeSdep(QString)));
QObject::connect(m_pUI->lineEditEdep, SIGNAL(textChanged( QString )),this,SLOT(slotChangeEdep(QString)));
QObject::connect(m_pUI->lineEditSmallGrid, SIGNAL(textChanged( QString )),this,SLOT(slotChangeSmallGrid(QString)));
QObject::connect(m_pUI->horizontalSliderSdep, SIGNAL(valueChanged(int)),this, SLOT(slotSetSdep(int)));
QObject::connect(m_pUI->horizontalSliderEdep, SIGNAL(valueChanged(int)),this, SLOT(slotSetEdep(int)));
m_SmallGrid=10;
fmin=0,fmax=0;
m_Xmin=0;
m_Xmax=9999;
m_Ymin=0;
m_Ymax=100;
m_Xmin2=0;
m_Xmax2=0;
m_DrawLjpl=0;
QPalette pal;
m_pUI->widgetPlot->setStyleSheet("background:lightgray");
m_pUI->widgetPlot->setPalette(pal);
m_view.setParent(m_pUI->widgetPlot);
QRect rec=m_pUI->widgetPlot->geometry();
m_view.widgetRec=QRect(0,0,rec.width(),rec.height());
val=NULL;
}
void CStatisticsDlg::slotSave()
{
// //保存位图,该部分需要罗林配合
// QString desktopPath=QDesktopServices::storageLocation(QDesktopServices::HomeLocation);
// desktopPath=desktopPath+QString("/statistics.jpg");
// QString imagePath=QFileDialog::getSaveFileName(this,"(Save Image)",desktopPath,"JPG File(*.jpg)");
// if(imagePath.isEmpty())
// {
// return;
// }
// QSize vSize=m_view.size();
// QPixmap image(vSize);
// m_view.render(&image);
// bool isSave=image.save(imagePath,"JPG");
// QMessageBox::information(this,"提示","图片保存成功!");
// //accept();
}
/**
*@brief 取消槽函数
*/
void CStatisticsDlg::slotCancel()
{
delete []val;
val=NULL;
//reject ();
}
void CStatisticsDlg::slotCheckLjpl()
{
m_DrawLjpl=!m_DrawLjpl;
m_view.m_DrawLjpl=m_DrawLjpl;
m_view.update();
}
void CStatisticsDlg::slotChangeName(const QString &text)
{
m_CurveName=text;//m_pUI->lineEditName->text();
m_view.m_CurveName=m_CurveName;
m_view.update();
}
void CStatisticsDlg::slotChangeUnit(const QString &text)
{
m_CurveUnit=text;//m_pUI->lineEditUnit->text();
m_view.m_CurveUnit=m_CurveUnit;
m_view.update();
}
void CStatisticsDlg::slotChangeXmin(const QString &text)
{
m_Xmin=text.toFloat();
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotChangeXmax(const QString &text)
{
m_Xmax=text.toFloat();
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotChangeXmin2(const QString &text)
{
m_Xmin2=text.toFloat();
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotChangeXmax2(const QString &text)
{
m_Xmax2=text.toFloat();
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotChangeYmin(const QString &text)
{
m_Ymin=text.toFloat();
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotChangeYmax(const QString &text)
{
m_Ymax=text.toFloat();
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotChangeSdep(const QString &text)
{
sdep=text.toFloat();
if(sdep<m_flStDepth)sdep=m_flStDepth;
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotChangeEdep(const QString &text)
{
edep=text.toFloat();
if(edep>m_flEnDepth)edep=m_flEnDepth;
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotChangeSmallGrid(const QString &text)
{
m_SmallGrid=text.toInt();
if(m_SmallGrid<1)
{
m_SmallGrid=1;
m_pUI->lineEditSmallGrid->setText(QString::number(m_SmallGrid));
}
if(m_SmallGrid>10)
{
m_SmallGrid=10;
m_pUI->lineEditSmallGrid->setText(QString::number(m_SmallGrid));
}
Refurbish();
m_view.update();
}
void CStatisticsDlg::slotSetSdep(const int &dep)
{
m_pUI->lineEditSdep->setText(QString::number(dep/100.));
}
void CStatisticsDlg::slotSetEdep(const int &dep)
{
m_pUI->lineEditEdep->setText(QString::number(dep/100.));
}
void CStatisticsDlg::init()
{
CLogIO logio(FileName.toStdString().c_str(),(unsigned int)CLogIO::modeReadWrite);
int index=logio.OpenCurve(CurveName.toStdString().c_str());
if(index<0) return;
logio.GetCurveInfo(index,&info);
num=(info.EndDepth-info.StartDepth)/info.DepLevel+1.5;
// value.reserve(num);
val=new float[num];
logio.ReadCurve(index,info.StartDepth,num,&val[0]);
logio.CloseCurve(index);
logio.Close();
d_min=info.StartDepth;
d_max=info.EndDepth;
m_flEnDepth = d_max;
m_flStDepth = d_min;
sdep=d_min;
edep=d_max;
rlev=info.DepLevel;
sample=num;
m_CurveName=CurveName,m_CurveUnit="("+QLatin1String(info.Unit)+")";
m_pUI->lineEditName->setText(CurveName);
QRegExp regExp("[A-Za-z0-9]{0,100}");//正则表达式第一位数字为a-z的数字第二位为1-9的数字后边是0-2位0-9的数字
m_pUI->lineEditName->setValidator(new QRegExpValidator(regExp,this));
m_pUI->lineEditUnit->setText(m_CurveUnit);
m_pUI->lineEditUnit->setValidator(new QRegExpValidator(regExp,this));
m_pUI->lineEditSdep1->setText(QString::number(sdep));
m_pUI->lineEditSdep1->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->lineEditEdep1->setText(QString::number(edep));
m_pUI->lineEditEdep1->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->horizontalSliderSdep->setRange(d_min*100,d_max*100);
m_pUI->horizontalSliderSdep->setValue(d_min*100);
m_pUI->horizontalSliderEdep->setRange(d_min*100,d_max*100);
m_pUI->horizontalSliderEdep->setValue(d_max*100);
m_pUI->lineEditSdep->setText(QString::number(sdep));
m_pUI->lineEditSdep->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->lineEditEdep->setText(QString::number(edep));
m_pUI->lineEditEdep->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->lineEditSmallGrid->setText(QString::number(m_SmallGrid));
m_pUI->lineEditSmallGrid->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
statistics();
m_Xmin=min;
m_Xmax=max;
m_pUI->lineEditXmin->setText(QString::number(min));
m_pUI->lineEditXmin->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->lineEditXmax->setText(QString::number(max));
m_pUI->lineEditXmax->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->lineEditYmin->setText(QString::number(m_Ymin));
m_pUI->lineEditYmin->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->lineEditYmax->setText(QString::number(m_Ymax));
m_pUI->lineEditYmax->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
Refurbish();
//初始化主频刻度范围15%————85%
int pp=0;
for(int i=0;i<10*m_SmallGrid;i++)
{
pp+=point[i];
if((float)pp/(float)ShowPoint>=0.15)
{
m_Xmin2=m_Xmin+i*(m_Xmax-m_Xmin)/(10.*m_SmallGrid);
ibegin=i;
break;
}
}
pp=0;
for(int i=0;i<10*m_SmallGrid;i++)
{
pp+=point[i];
if((float)pp/(float)ShowPoint>=0.85)
{
m_Xmax2=m_Xmin+i*(m_Xmax-m_Xmin)/(10.*m_SmallGrid);
iend=i;
break;
}
}
m_pUI->lineEditXmin2->setText(QString::number(m_Xmin2));
m_pUI->lineEditXmin2->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->lineEditXmax2->setText(QString::number(m_Xmax2));
m_pUI->lineEditXmax2->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
//频率刻度取整
if(fmax>50.)fmax=100.;
else if(fmax>20.)fmax=50.;
else if(fmax>10.)fmax=20.;
else if(fmax>5.)fmax=10.;
else fmax=5.;
m_Ymax=fmax;
m_Ymin=0;
m_pUI->lineEditYmin->setText(QString::number(m_Ymin));
m_pUI->lineEditYmin->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
m_pUI->lineEditYmax->setText(QString::number(m_Ymax));
m_pUI->lineEditYmax->setValidator(new QDoubleValidator(-9999999,9999999,6,this));
//for plot
m_view.m_CurveName=m_CurveName;m_view.m_CurveUnit=m_CurveUnit;//显示的曲线名称和单位
for(int i=0;i<100;i++)m_view.point[i]=point[i];
m_view.ShowPoint=ShowPoint;
m_view.m_SmallGrid=m_SmallGrid;
m_view.m_Ymax=m_Ymax;
m_view.m_Xmin=m_Xmin,m_view.m_Xmax=m_Xmax;
m_view.m_DrawLjpl=m_DrawLjpl;
m_view.m_Xmin2=m_Xmin2,m_view.m_Xmax2=m_Xmax2;
m_view.update();
}
void CStatisticsDlg::statistics()
{
int ist=(sdep-d_min)/rlev+0.5;
if(ist<0) ist=0;
tpoint=(edep-sdep)/rlev;
if(tpoint<0) return;
sample=tpoint;
min=99999;max=-99999;
average=0;
depmin=depmax=d_min;
int InvalidNum=0;
for(int i=ist;i<ist+tpoint;i++)
{
if(val[i]==-9999.||val[i]==-999.25||val[i]==-99999.||val[i]==-9999.25)
{
InvalidNum++;
continue;
}
if(min>val[i]){min=val[i];depmin=d_min+i*rlev;}
if(max<val[i]){max=val[i];depmax=d_min+i*rlev;}
average+=val[i];
}
//剔除无效点
//average/=tpoint;
if(tpoint>InvalidNum)average/=(tpoint-InvalidNum);
else average=val[ist+1];
float del=(m_Xmax-m_Xmin)/(10*m_SmallGrid);//del=(max-min)/(10*m_SmallGrid);
for(int j=0;j<100;j++)point[j]=0;
double vvv,v1,v2;
Variance=0.;
for(int i=ist+1;i<ist+tpoint;i++)
{
if(val[i]==-9999.||val[i]==-999.25||val[i]==-99999.||val[i]==-9999.25)continue;
Variance+=(val[i]-average)*(val[i]-average);
for(int j=0;j<10*m_SmallGrid;j++)
{
vvv=val[i],v1=m_Xmin+j*del,v2=m_Xmin+(float)(j+1)*del;
/*if(j==0)
{
if(vvv>=v1&&vvv<=v2)
{
point[j]++;
break;
}
}
else
{
if(vvv>v1&&vvv<=v2)
{
point[j]++;
break;
}
}*/
if(vvv>v1&&vvv<=v2)
{
point[j]++;
break;
}
}
}
if(tpoint>InvalidNum)Variance/=(tpoint-InvalidNum);
else Variance=0;
Variance=sqrt(Variance);
int maxpoint=-1;//point[0];
ShowPoint=0;//point[0];
for(int j=0;j<10*m_SmallGrid;j++)
{
if(maxpoint<point[j])
{
maxpoint=point[j];
m_PVmin=m_Xmin+(float)j*del,m_PVmax=m_Xmin+(float)(j+1)*del;
}
ShowPoint+=point[j];
}
fmax=(float)maxpoint/(float)ShowPoint*100.;//(float)tpoint*100.;
}
/*
void CStatisticsDlg::slotRefurbish(const QString &text)
{
Refurbish();
m_view.update();
}
*/
void CStatisticsDlg::Refurbish()
{
if(sdep<d_min||edep>d_max)
{
AfxMessageBox("深度超界!");
return;
}
if(sdep>=edep)return;
if(m_Xmin>=m_Xmax)return;
if(m_Ymin>=m_Ymax)return;
statistics();
QString str,jieguo;
str="开始深度 : "+QString::number(sdep)+"(m)";jieguo="\r\n"+str;
str="结束深度 : "+QString::number(edep)+"(m)";jieguo+="\r\n\r\n"+str;
str="统计深度段 : "+QString::number(edep-sdep)+"(m)";jieguo+="\r\n\r\n"+str;
str="有效数据点数 : "+QString::number(ShowPoint);jieguo+="\r\n\r\n"+str;//tpoint);
str="最小值 : "+QString::number(min)+m_CurveUnit;jieguo+="\r\n\r\n"+str;
str="最小值深度 : "+QString::number(depmin)+"(m)";jieguo+="\r\n\r\n"+str;
str="最大值 : "+QString::number(max)+m_CurveUnit;jieguo+="\r\n\r\n"+str;
str="最大值深度 : "+QString::number(depmax)+"(m)";jieguo+="\r\n\r\n"+str;
str="平均值 : "+QString::number(average)+m_CurveUnit;jieguo+="\r\n\r\n"+str;
str="最大频率 : "+QString::number(fmax);str+="(%)";jieguo+="\r\n\r\n"+str;
str="最大频率数值范围 : "+QString::number(m_PVmin)+" -- "+QString::number(m_PVmax);jieguo+="\r\n\r\n"+str;
str="标准偏差 "+QString::number(Variance);jieguo+="\r\n\r\n"+str;
m_pUI->textEditJieGuo->setText(jieguo);
//for plot
m_view.m_CurveName=m_CurveName;m_view.m_CurveUnit=m_CurveUnit;//显示的曲线名称和单位
for(int i=0;i<100;i++)m_view.point[i]=point[i];
m_view.ShowPoint=ShowPoint;
m_view.m_SmallGrid=m_SmallGrid;
m_view.m_Ymax=m_Ymax;
m_view.m_Xmin=m_Xmin,m_view.m_Xmax=m_Xmax;
m_view.m_DrawLjpl=m_DrawLjpl;
m_view.m_Xmin2=m_Xmin2,m_view.m_Xmax2=m_Xmax2;
}
END_OSGGRAPHICS_NAMESPACE