logplus/DataMgr/src/StatisticsDlg.cpp

412 lines
13 KiB
C++
Raw Normal View History

2026-01-29 16:57:06 +08:00
#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