logplus/DataMgr/src/Statistics2Dlg.cpp

483 lines
16 KiB
C++
Raw Normal View History

2026-05-15 09:36:23 +08:00
#pragma warning(push,0)
// #include "Family.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QPixmap>
#include <QDesktopServices>
#include <QtMath>
#include "Statistics2Dlg.h"
#include "ui_Statistics2.h"
#include "CStringType.h"
#include "Well.h"
#pragma warning(pop)
using namespace pai::ios::welllog;
BEGIN_OSGGRAPHICS_NAMESPACE
static float ReadSdep=9999999.,ReadEdep=-9999999;
CStatistics2Dlg::~CStatistics2Dlg()
{
if(m_pUI) delete m_pUI;
ReadSdep=9999999.,ReadEdep=-9999999;
}
CStatistics2Dlg::CStatistics2Dlg(QWidget * parent, Qt::WindowFlags flags)
: QWidget(parent,flags)//: QDialog(parent,flags)
{
m_pUI = new Ui_Statistics2();
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->okbtn_Refurbish, SIGNAL(clicked()), this, SLOT(slotRefurbish()));
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)));
//time
QObject::connect(m_pUI->lineEditStime, SIGNAL(textChanged( QString )),this,SLOT(slotChangeStime(QString)));
QObject::connect(m_pUI->lineEditEtime, SIGNAL(textChanged( QString )),this,SLOT(slotChangeEtime(QString)));
QObject::connect(m_pUI->horizontalSliderStime, SIGNAL(valueChanged(int)),this, SLOT(slotSetStime(int)));
QObject::connect(m_pUI->horizontalSliderEtime, SIGNAL(valueChanged(int)),this, SLOT(slotSetEtime(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;
val=NULL;
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());
}
void CStatistics2Dlg::slotSave()
{
// //保存位图,该部分需要罗林配合
// //QMessageBox::about(NULL,"提示","暂时未作");
// QString desktopPath=QDesktopServices::storageLocation(QDesktopServices::HomeLocation);
// desktopPath=desktopPath+QString("/Statistics2.jpg");
// QString imagePath=QFileDialog::getSaveFileName(this,"(Save Image)",desktopPath,"JPG File(*.jpg)");
// QSize vSize=m_view.size();
// QPixmap image(vSize);
// m_view.render(&image);
// bool isSave=image.save(imagePath,"JPG");
// QMessageBox::information(this,"提示","图片保存成功!");
// //accept();
}
/**
*@brief
*/
void CStatistics2Dlg::slotCancel()
{
delete []val;
//reject ();
}
void CStatistics2Dlg::slotCheckLjpl()
{
m_DrawLjpl=!m_DrawLjpl;
m_view.m_DrawLjpl=m_DrawLjpl;
m_view.update();
}
void CStatistics2Dlg::slotChangeName(const QString &text)
{
m_CurveName=text;//m_pUI->lineEditName->text();
m_view.m_CurveName=m_CurveName;
m_view.update();
}
void CStatistics2Dlg::slotChangeUnit(const QString &text)
{
m_CurveUnit=text;//m_pUI->lineEditUnit->text();
m_view.m_CurveUnit=m_CurveUnit;
m_view.update();
}
void CStatistics2Dlg::slotChangeXmin(const QString &text)
{
m_Xmin=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeXmax(const QString &text)
{
m_Xmax=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeXmin2(const QString &text)
{
m_Xmin2=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeXmax2(const QString &text)
{
m_Xmax2=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeYmin(const QString &text)
{
m_Ymin=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeYmax(const QString &text)
{
m_Ymax=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeSdep(const QString &text)
{
sdep=text.toFloat();
if(sdep<m_flStDepth)sdep=m_flStDepth;
//Refurbish();
//m_view.update();
}
void CStatistics2Dlg::slotChangeEdep(const QString &text)
{
edep=text.toFloat();
if(edep>m_flEnDepth)edep=m_flEnDepth;
//Refurbish();
//m_view.update();
}
void CStatistics2Dlg::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 CStatistics2Dlg::slotSetSdep(const int &dep)
{
m_pUI->lineEditSdep->setText(QString::number(dep/100.));
}
void CStatistics2Dlg::slotSetEdep(const int &dep)
{
m_pUI->lineEditEdep->setText(QString::number(dep/100.));
}
//time
void CStatistics2Dlg::slotChangeStime(const QString &text)
{
stime=text.toFloat();
if(stime<m_flStTime)stime=m_flStTime;
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeEtime(const QString &text)
{
etime=text.toFloat();
if(etime>m_flEndTime)etime=m_flEndTime;
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotSetStime(const int &time)
{
m_pUI->lineEditStime->setText(QString::number(time/100.));
}
void CStatistics2Dlg::slotSetEtime(const int &time)
{
m_pUI->lineEditEtime->setText(QString::number(time/100.));
}
//
void CStatistics2Dlg::init()
{
CLogIO logio(FileName.toStdString().c_str(),(unsigned int)CLogIO::modeReadWrite);
int index=logio.OpenWave(CurveName.toStdString().c_str());
if(index<0) return;
logio.GetWaveInfo(index,&info);
num=(info.EndDepth-info.StartDepth)/info.DepLevel+1.5;
logio.CloseWave(index);
logio.Close();
d_min=info.StartDepth;
d_max=info.EndDepth;
m_flEnDepth = d_max;
m_flStDepth = d_min;
rlev=info.DepLevel;
m_flStTime=info.StartTime;
m_flEndTime=info.StartTime+info.TimeSamples*info.TimeLevel;
m_CurveName=CurveName,m_CurveUnit="("+QLatin1String(info.Unit)+")";
m_pUI->lineEditName->setText(CurveName);
m_pUI->lineEditUnit->setText(m_CurveUnit);
m_pUI->lineEditSdep1->setText(QString::number(d_min));
m_pUI->lineEditEdep1->setText(QString::number(d_max));
m_pUI->horizontalSliderSdep->setRange(d_min*100,d_max*100);
m_pUI->horizontalSliderEdep->setRange(d_min*100,d_max*100);
if(num*info.TimeSamples<=100000)//当数据点较少时全部统计
{
sdep=d_min;
edep=d_max;
}
else//当数据点较多时统计中间的5000个深度点
{
int m_ShowDepPoint=100000./info.TimeSamples;
m_ShowDepPoint/=2;
sdep=d_min+(num/2.-m_ShowDepPoint)*rlev;
edep=sdep+2.*m_ShowDepPoint*rlev;
}
m_pUI->lineEditSdep->setText(QString::number(sdep));
m_pUI->lineEditEdep->setText(QString::number(edep));
m_pUI->horizontalSliderSdep->setValue(sdep*100);
m_pUI->horizontalSliderEdep->setValue(edep*100);
m_pUI->lineEditSmallGrid->setText(QString::number(m_SmallGrid));
//time
m_pUI->lineEditStime1->setText(QString::number(m_flStTime));
m_pUI->lineEditEtime1->setText(QString::number(m_flEndTime));
m_pUI->horizontalSliderStime->setRange(m_flStTime*100,m_flEndTime*100);
m_pUI->horizontalSliderEtime->setRange(m_flStTime*100,m_flEndTime*100);
stime=m_flStTime;etime=m_flEndTime;
m_pUI->lineEditStime->setText(QString::number(stime));
m_pUI->lineEditEtime->setText(QString::number(etime));
m_pUI->horizontalSliderStime->setValue(stime*100);
m_pUI->horizontalSliderEtime->setValue(etime*100);
//
Statistics2();
m_Xmin=min;
m_Xmax=max;
m_pUI->lineEditXmin->setText(QString::number(min));
m_pUI->lineEditXmax->setText(QString::number(max));
m_pUI->lineEditYmin->setText(QString::number(m_Ymin));
m_pUI->lineEditYmax->setText(QString::number(m_Ymax));
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->lineEditXmax2->setText(QString::number(m_Xmax2));
//频率刻度取整
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->lineEditYmax->setText(QString::number(m_Ymax));
//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 CStatistics2Dlg::Statistics2()
{
bool ReReadData=1;
d_min=sdep;
d_max=edep;
if(val!=NULL){
if((sdep>=ReadSdep&&sdep<=ReadEdep)&&(edep>=ReadSdep&&edep<=ReadEdep))ReReadData=0;}//如果要统计的深度在读取的深度范围内,就不在读数据
if(ReReadData)
{
CLogIO logio(FileName.toStdString().c_str(),(unsigned int)CLogIO::modeReadWrite);
int index=logio.OpenWave(CurveName.toStdString().c_str());
if(index<0) return;
if(val!=NULL)delete []val;
num=(edep-sdep)/rlev+1.5;
val=new float[num*info.TimeSamples];
logio.ReadWave(index,sdep,num,&val[0]);
logio.CloseWave(index);
logio.Close();
ReadSdep=sdep;
ReadEdep=edep;
}
int ist=(sdep-ReadSdep)/rlev+0.5;
int dpoint=(edep-sdep)/rlev+0.5;//深度点数
int timepoint=(etime-stime)/info.TimeLevel+0.5;
tpoint=dpoint*timepoint;
min=99999;max=-99999;
average=0;
depmin=depmax=d_min;
timemin=timemax=stime;
int InvalidNum=0;
for(int i=ist;i<ist+dpoint;i++)
{
for(int j=(stime-m_flStTime)/info.TimeLevel;j<(etime-m_flStTime)/info.TimeLevel;j++)
{
int pos=i*info.TimeSamples+j;
if(val[pos]==-9999.||val[pos]==-999.25||val[pos]==-99999.||val[pos]==-9999.25)
{
InvalidNum++;
continue;
}
if(min>val[pos]){min=val[pos];depmin=d_min+i*rlev;timemin=j*info.TimeLevel+m_flStTime;}
if(max<val[pos]){max=val[pos];depmax=d_min+i*rlev;timemax=j*info.TimeLevel+m_flStTime;}
average+=val[pos];
}
}
//剔除无效点
if(tpoint>InvalidNum)average/=(tpoint-InvalidNum);
else average=val[(ist+1)*info.TimeSamples+int((stime-m_flStTime)/info.TimeLevel+0.5)];
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;i<ist+dpoint;i++)
{
for(int k=(stime-m_flStTime)/info.TimeLevel;k<(etime-m_flStTime)/info.TimeLevel;k++)
{
int pos=i*info.TimeSamples+k;
if(val[pos]==-9999.||val[pos]==-999.25||val[pos]==-99999.||val[pos]==-9999.25)continue;
Variance+=(val[pos]-average)*(val[pos]-average);
for(int j=0;j<10*m_SmallGrid;j++)
{
vvv=val[pos],v1=m_Xmin+j*del,v2=m_Xmin+(float)(j+1)*del;
if(vvv>=v1&&vvv<=v2)
{
point[j]++;
break;
}
}
}
}
if(tpoint>InvalidNum)Variance/=(tpoint-InvalidNum);
else Variance=0;
Variance=qSqrt(Variance);
DWORD maxpoint=0;//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 CStatistics2Dlg::slotRefurbish()
{
Refurbish();
m_view.update();
}
void CStatistics2Dlg::Refurbish()
{
if(val==NULL)return;
/*sdep=m_pUI->lineEditSdep->text().toFloat();
edep=m_pUI->lineEditEdep->text().toFloat();
m_Xmin=m_pUI->lineEditXmin->text().toFloat();
m_Xmax=m_pUI->lineEditXmax->text().toFloat();
m_Xmin2=m_pUI->lineEditXmin2->text().toFloat();
m_Xmax2=m_pUI->lineEditXmax2->text().toFloat();
m_Ymin=m_pUI->lineEditYmin->text().toFloat();
m_Ymax=m_pUI->lineEditYmax->text().toFloat();
if(sdep<m_flStDepth)sdep=m_flStDepth;
if(edep>m_flEnDepth)edep=m_flEnDepth;
if(sdep>=edep)return;
if(m_Xmin>=m_Xmax)return;
if(m_Ymin>=m_Ymax)return;
m_SmallGrid=m_pUI->lineEditSmallGrid->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));
}*/
if(sdep>=edep)return;
if(m_Xmin>=m_Xmax)return;
if(m_Ymin>=m_Ymax)return;
Statistics2();
QString str,jieguo;
str="开始深度 : "+QString::number(sdep)+"("+QLatin1String(info.DepthUnit)+")";jieguo="\r\n"+str;
str="结束深度 : "+QString::number(edep)+"("+QLatin1String(info.DepthUnit)+")";jieguo+="\r\n\r\n"+str;
str="统计深度段: "+QString::number(edep-sdep)+"("+QLatin1String(info.DepthUnit)+")";jieguo+="\r\n\r\n"+str;
str="开始时间 : "+QString::number(stime)+"("+QLatin1String(info.TimeUnit)+")";jieguo+="\r\n\r\n"+str;
str="结束时间 : "+QString::number(etime)+"("+QLatin1String(info.TimeUnit)+")";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)+"("+QLatin1String(info.DepthUnit)+"),"+QString::number(timemin)+"("+QLatin1String(info.TimeUnit)+")";jieguo+="\r\n\r\n"+str;
str="最大值 : "+QString::number(max)+m_CurveUnit;jieguo+="\r\n\r\n"+str;
str="最大值深度、时间 : "+QString::number(depmax)+"("+QLatin1String(info.DepthUnit)+"),"+QString::number(timemax)+"("+QLatin1String(info.TimeUnit)+")";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